From 94033dfa89b1d486103ecc218406fa377dec8afd Mon Sep 17 00:00:00 2001 From: Diego Beraldin Date: Wed, 6 Sep 2023 22:37:07 +0200 Subject: [PATCH] feat(appearance): support material3 dynamic colors --- .../appearance/DefaultColorSchemeProvider.kt | 59 +++++++++++ .../core/appearance/di/Utils.kt | 14 +++ .../appearance/di/CoreAppearanceModule.kt | 2 + .../core/appearance/di/Utils.kt | 4 + .../repository/DefaultThemeRepository.kt | 5 + .../appearance/repository/ThemeRepository.kt | 4 + .../core/appearance/theme/AppTheme.kt | 14 ++- .../appearance/theme/ColorSchemeProvider.kt | 10 ++ .../appearance/DefaultColorSchemeProvider.kt | 21 ++++ .../core/appearance/di/Utils.kt | 12 +++ .../core/preferences/KeyStoreKeys.kt | 1 + .../settings/content/SettingsScreen.kt | 15 +++ .../content/SettingsScreenMviModel.kt | 3 + .../content/SettingsScreenViewModel.kt | 100 ++++++++++-------- .../feature/settings/di/SettingsModule.kt | 1 + .../commonMain/resources/MR/base/strings.xml | 1 + .../commonMain/resources/MR/it/strings.xml | 1 + .../diegoberaldin/raccoonforlemmy/App.kt | 4 + 18 files changed, 223 insertions(+), 48 deletions(-) create mode 100644 core-appearance/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/DefaultColorSchemeProvider.kt create mode 100644 core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/ColorSchemeProvider.kt create mode 100644 core-appearance/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/DefaultColorSchemeProvider.kt diff --git a/core-appearance/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/DefaultColorSchemeProvider.kt b/core-appearance/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/DefaultColorSchemeProvider.kt new file mode 100644 index 000000000..0602f5df1 --- /dev/null +++ b/core-appearance/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/DefaultColorSchemeProvider.kt @@ -0,0 +1,59 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.appearance + +import android.content.Context +import android.os.Build +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.data.ThemeState +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.BlackColors +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.ColorSchemeProvider +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.DarkColors +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.LightColors +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_background +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_errorContainer +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_onBackground +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_onErrorContainer +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_onPrimaryContainer +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_onSecondaryContainer +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_onSurface +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_onSurfaceVariant +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_onTertiaryContainer +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_primaryContainer +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_secondaryContainer +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_surface +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_surfaceVariant +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_tertiaryContainer + +internal class DefaultColorSchemeProvider(private val context: Context) : ColorSchemeProvider { + + override val supportsDynamicColors: Boolean + get() { + return Build.VERSION.SDK_INT >= 31 + } + + override fun getColorScheme(theme: ThemeState, dynamic: Boolean): ColorScheme { + return when (theme) { + ThemeState.Dark -> if (dynamic) dynamicDarkColorScheme(context) else DarkColors + ThemeState.Black -> if (dynamic) dynamicDarkColorScheme(context).copy( + primaryContainer = md_theme_black_primaryContainer, + onPrimaryContainer = md_theme_black_onPrimaryContainer, + secondaryContainer = md_theme_black_secondaryContainer, + onSecondaryContainer = md_theme_black_onSecondaryContainer, + tertiaryContainer = md_theme_black_tertiaryContainer, + onTertiaryContainer = md_theme_black_onTertiaryContainer, + errorContainer = md_theme_black_errorContainer, + onErrorContainer = md_theme_black_onErrorContainer, + background = md_theme_black_background, + onBackground = md_theme_black_onBackground, + surface = md_theme_black_surface, + onSurface = md_theme_black_onSurface, + surfaceVariant = md_theme_black_surfaceVariant, + onSurfaceVariant = md_theme_black_onSurfaceVariant, + + ) else BlackColors + + else -> if (dynamic) dynamicLightColorScheme(context) else LightColors + } + } +} \ No newline at end of file diff --git a/core-appearance/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt b/core-appearance/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt index b9c4bc555..c69dc61b7 100644 --- a/core-appearance/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt +++ b/core-appearance/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt @@ -1,9 +1,23 @@ package com.github.diegoberaldin.raccoonforlemmy.core.appearance.di +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.DefaultColorSchemeProvider import com.github.diegoberaldin.raccoonforlemmy.core.appearance.repository.ThemeRepository +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.ColorSchemeProvider +import org.koin.dsl.module import org.koin.java.KoinJavaComponent.inject actual fun getThemeRepository(): ThemeRepository { val res: ThemeRepository by inject(ThemeRepository::class.java) return res } + +actual val nativeAppearanceModule = module { + single { + DefaultColorSchemeProvider(context = get()) + } +} + +actual fun getColorSchemeProvider(): ColorSchemeProvider { + val res by inject(ColorSchemeProvider::class.java) + return res +} \ No newline at end of file diff --git a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/CoreAppearanceModule.kt b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/CoreAppearanceModule.kt index 6d65439cd..96cf2aef0 100644 --- a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/CoreAppearanceModule.kt +++ b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/CoreAppearanceModule.kt @@ -6,5 +6,7 @@ import org.koin.core.module.dsl.singleOf import org.koin.dsl.module val coreAppearanceModule = module { + includes(nativeAppearanceModule) + singleOf(::DefaultThemeRepository) } diff --git a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt index fa1207fc2..837d4b3de 100644 --- a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt +++ b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt @@ -1,5 +1,9 @@ package com.github.diegoberaldin.raccoonforlemmy.core.appearance.di import com.github.diegoberaldin.raccoonforlemmy.core.appearance.repository.ThemeRepository +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.ColorSchemeProvider +import org.koin.core.module.Module +expect val nativeAppearanceModule: Module expect fun getThemeRepository(): ThemeRepository +expect fun getColorSchemeProvider(): ColorSchemeProvider \ No newline at end of file diff --git a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/repository/DefaultThemeRepository.kt b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/repository/DefaultThemeRepository.kt index a14054e91..48d674e54 100644 --- a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/repository/DefaultThemeRepository.kt +++ b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/repository/DefaultThemeRepository.kt @@ -8,6 +8,7 @@ internal class DefaultThemeRepository : ThemeRepository { override val state = MutableStateFlow(ThemeState.Light) override val contentFontScale = MutableStateFlow(1f) override val navItemTitles = MutableStateFlow(false) + override val dynamicColors = MutableStateFlow(false) override fun changeTheme(value: ThemeState) { state.value = value @@ -20,4 +21,8 @@ internal class DefaultThemeRepository : ThemeRepository { override fun changeNavItemTitles(value: Boolean) { navItemTitles.value = value } + + override fun changeDynamicColors(value: Boolean) { + dynamicColors.value = value + } } diff --git a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/repository/ThemeRepository.kt b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/repository/ThemeRepository.kt index ef1db21f3..9ab08f101 100644 --- a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/repository/ThemeRepository.kt +++ b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/repository/ThemeRepository.kt @@ -11,9 +11,13 @@ interface ThemeRepository { val navItemTitles: StateFlow + val dynamicColors: StateFlow + fun changeTheme(value: ThemeState) fun changeContentFontScale(value: Float) fun changeNavItemTitles(value: Boolean) + + fun changeDynamicColors(value: Boolean) } diff --git a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/AppTheme.kt b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/AppTheme.kt index 18c587ab4..c82a39220 100644 --- a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/AppTheme.kt +++ b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/AppTheme.kt @@ -6,12 +6,14 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import com.github.diegoberaldin.raccoonforlemmy.core.appearance.data.ThemeState +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.di.getColorSchemeProvider import com.github.diegoberaldin.raccoonforlemmy.core.appearance.di.getThemeRepository @Composable fun AppTheme( theme: ThemeState, contentFontScale: Float, + useDynamicColors: Boolean, content: @Composable () -> Unit, ) { val repository = remember { @@ -22,11 +24,13 @@ fun AppTheme( } val themeState by repository.state.collectAsState() - val colorScheme = when (themeState) { - ThemeState.Dark -> DarkColors - ThemeState.Black -> BlackColors - else -> LightColors - } + + val colorSchemeProvider = remember { getColorSchemeProvider() } + val colorScheme = colorSchemeProvider.getColorScheme( + theme = themeState, + dynamic = useDynamicColors + ) + MaterialTheme( colorScheme = colorScheme, typography = typography, diff --git a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/ColorSchemeProvider.kt b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/ColorSchemeProvider.kt new file mode 100644 index 000000000..ad51cd8ec --- /dev/null +++ b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/ColorSchemeProvider.kt @@ -0,0 +1,10 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme + +import androidx.compose.material3.ColorScheme +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.data.ThemeState + +interface ColorSchemeProvider { + + val supportsDynamicColors: Boolean + fun getColorScheme(theme: ThemeState, dynamic: Boolean): ColorScheme +} \ No newline at end of file diff --git a/core-appearance/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/DefaultColorSchemeProvider.kt b/core-appearance/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/DefaultColorSchemeProvider.kt new file mode 100644 index 000000000..c2afb10fd --- /dev/null +++ b/core-appearance/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/DefaultColorSchemeProvider.kt @@ -0,0 +1,21 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.appearance + +import androidx.compose.material3.ColorScheme +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.data.ThemeState +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.BlackColors +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.ColorSchemeProvider +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.DarkColors +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.LightColors + +internal class DefaultColorSchemeProvider : ColorSchemeProvider { + + override val supportsDynamicColors = false + + override fun getColorScheme(theme: ThemeState, dynamic: Boolean): ColorScheme { + return when (theme) { + ThemeState.Dark -> DarkColors + ThemeState.Black -> BlackColors + else -> LightColors + } + } +} \ No newline at end of file diff --git a/core-appearance/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt b/core-appearance/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt index 38f8e6961..26d7a6463 100644 --- a/core-appearance/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt +++ b/core-appearance/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/di/Utils.kt @@ -1,11 +1,23 @@ package com.github.diegoberaldin.raccoonforlemmy.core.appearance.di +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.DefaultColorSchemeProvider import com.github.diegoberaldin.raccoonforlemmy.core.appearance.repository.ThemeRepository +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.ColorSchemeProvider import org.koin.core.component.KoinComponent import org.koin.core.component.inject +import org.koin.dsl.module actual fun getThemeRepository(): ThemeRepository = CoreAppearanceHelper.repository +actual val nativeAppearanceModule = module { + single { + DefaultColorSchemeProvider() + } +} + +actual fun getColorSchemeProvider(): ColorSchemeProvider = CoreAppearanceHelper.colorSchemeProvider + object CoreAppearanceHelper : KoinComponent { internal val repository: ThemeRepository by inject() + internal val colorSchemeProvider: ColorSchemeProvider by inject() } diff --git a/core-preferences/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/preferences/KeyStoreKeys.kt b/core-preferences/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/preferences/KeyStoreKeys.kt index 0f3ab5312..05198aa51 100644 --- a/core-preferences/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/preferences/KeyStoreKeys.kt +++ b/core-preferences/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/preferences/KeyStoreKeys.kt @@ -12,4 +12,5 @@ object KeyStoreKeys { const val IncludeNsfw = "includeNsfw" const val BlurNsfw = "blurNsfw" const val NavItemTitlesVisible = "navItemTitlesVisible" + const val DynamicColors = "dynamicColors" } diff --git a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreen.kt b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreen.kt index 6655821a2..9ba851732 100644 --- a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreen.kt +++ b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreen.kt @@ -229,6 +229,21 @@ class SettingsScreen : Screen { } ) + // dynamic colors + if (uiState.supportsDynamicColors) { + SettingsSwitchRow( + title = stringResource(MR.strings.settings_dynamic_colors), + value = uiState.dynamicColors, + onValueChanged = { value -> + model.reduce( + SettingsScreenMviModel.Intent.ChangeDynamicColors( + value + ) + ) + } + ) + } + // NSFW options SettingsSwitchRow( title = stringResource(MR.strings.settings_include_nsfw), diff --git a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreenMviModel.kt b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreenMviModel.kt index c171dfaa4..24faca524 100644 --- a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreenMviModel.kt +++ b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreenMviModel.kt @@ -17,6 +17,7 @@ interface SettingsScreenMviModel : data class ChangeDefaultPostSortType(val value: SortType) : Intent data class ChangeDefaultCommentSortType(val value: SortType) : Intent data class ChangeNavBarTitlesVisible(val value: Boolean) : Intent + data class ChangeDynamicColors(val value: Boolean) : Intent data class ChangeIncludeNsfw(val value: Boolean) : Intent data class ChangeBlurNsfw(val value: Boolean) : Intent } @@ -30,6 +31,8 @@ interface SettingsScreenMviModel : val defaultPostSortType: SortType = SortType.Active, val defaultCommentSortType: SortType = SortType.New, val navBarTitlesVisible: Boolean = false, + val supportsDynamicColors: Boolean = false, + val dynamicColors: Boolean = false, val includeNsfw: Boolean = true, val blurNsfw: Boolean = true, val appVersion: String = "", diff --git a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreenViewModel.kt b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreenViewModel.kt index 8c6114652..d30bee9c6 100644 --- a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreenViewModel.kt +++ b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/content/SettingsScreenViewModel.kt @@ -6,6 +6,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.appearance.data.ThemeState import com.github.diegoberaldin.raccoonforlemmy.core.appearance.data.toFontScale import com.github.diegoberaldin.raccoonforlemmy.core.appearance.data.toInt import com.github.diegoberaldin.raccoonforlemmy.core.appearance.repository.ThemeRepository +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.ColorSchemeProvider import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel import com.github.diegoberaldin.raccoonforlemmy.core.preferences.KeyStoreKeys @@ -25,6 +26,7 @@ import kotlinx.coroutines.launch class SettingsScreenViewModel( private val mvi: DefaultMviModel, private val themeRepository: ThemeRepository, + private val colorSchemeProvider: ColorSchemeProvider, private val languageRepository: LanguageRepository, private val identityRepository: IdentityRepository, private val keyStore: TemporaryKeyStore, @@ -43,6 +45,9 @@ class SettingsScreenViewModel( themeRepository.navItemTitles.onEach { value -> mvi.updateState { it.copy(navBarTitlesVisible = value) } }.launchIn(this) + themeRepository.dynamicColors.onEach { value -> + mvi.updateState { it.copy(dynamicColors = value) } + }.launchIn(this) languageRepository.currentLanguage.onEach { lang -> mvi.updateState { it.copy(lang = lang) } }.launchIn(this) @@ -62,75 +67,83 @@ class SettingsScreenViewModel( includeNsfw = keyStore[KeyStoreKeys.IncludeNsfw, true], blurNsfw = keyStore[KeyStoreKeys.BlurNsfw, true], appVersion = AppInfo.versionCode, + supportsDynamicColors = colorSchemeProvider.supportsDynamicColors, ) } } override fun reduce(intent: SettingsScreenMviModel.Intent) { when (intent) { - is SettingsScreenMviModel.Intent.ChangeTheme -> applyTheme(intent.value) - is SettingsScreenMviModel.Intent.ChangeContentFontSize -> applyContentFontScale(intent.value) - is SettingsScreenMviModel.Intent.ChangeLanguage -> changeLanguage(intent.value) - is SettingsScreenMviModel.Intent.ChangeDefaultCommentSortType -> changeDefaultCommentSortType( - intent.value, - ) + is SettingsScreenMviModel.Intent.ChangeTheme -> { + changeTheme(intent.value) + } - is SettingsScreenMviModel.Intent.ChangeDefaultListingType -> changeDefaultListingType( - intent.value, - ) + is SettingsScreenMviModel.Intent.ChangeContentFontSize -> { + changeContentFontScale(intent.value) + } - is SettingsScreenMviModel.Intent.ChangeDefaultPostSortType -> changeDefaultPostSortType( - intent.value, - ) + is SettingsScreenMviModel.Intent.ChangeLanguage -> { + changeLanguage(intent.value) + } - is SettingsScreenMviModel.Intent.ChangeBlurNsfw -> changeBlurNsfw(intent.value) - is SettingsScreenMviModel.Intent.ChangeIncludeNsfw -> changeIncludeNsfw(intent.value) - is SettingsScreenMviModel.Intent.ChangeNavBarTitlesVisible -> changeNavBarTitlesVisible( - intent.value - ) + is SettingsScreenMviModel.Intent.ChangeDefaultCommentSortType -> { + changeDefaultCommentSortType(intent.value) + } + + is SettingsScreenMviModel.Intent.ChangeDefaultListingType -> { + changeDefaultListingType(intent.value) + } + + is SettingsScreenMviModel.Intent.ChangeDefaultPostSortType -> { + changeDefaultPostSortType(intent.value) + } + + is SettingsScreenMviModel.Intent.ChangeBlurNsfw -> { + changeBlurNsfw(intent.value) + } + + is SettingsScreenMviModel.Intent.ChangeIncludeNsfw -> { + changeIncludeNsfw(intent.value) + } + + is SettingsScreenMviModel.Intent.ChangeNavBarTitlesVisible -> { + changeNavBarTitlesVisible(intent.value) + } + + is SettingsScreenMviModel.Intent.ChangeDynamicColors -> { + changeDynamicColors(intent.value) + } } } - private fun applyTheme(value: ThemeState) { + private fun changeTheme(value: ThemeState) { themeRepository.changeTheme(value) - mvi.scope.launch(Dispatchers.Main) { - keyStore.save(KeyStoreKeys.UiTheme, value.toInt()) - } + keyStore.save(KeyStoreKeys.UiTheme, value.toInt()) } - private fun applyContentFontScale(value: Float) { + private fun changeContentFontScale(value: Float) { themeRepository.changeContentFontScale(value) - mvi.scope.launch(Dispatchers.Main) { - keyStore.save(KeyStoreKeys.ContentFontScale, value) - } + keyStore.save(KeyStoreKeys.ContentFontScale, value) } private fun changeLanguage(value: String) { languageRepository.changeLanguage(value) - mvi.scope.launch(Dispatchers.Main) { - keyStore.save(KeyStoreKeys.Locale, value) - } + keyStore.save(KeyStoreKeys.Locale, value) } private fun changeDefaultListingType(value: ListingType) { mvi.updateState { it.copy(defaultListingType = value) } - mvi.scope.launch(Dispatchers.Main) { - keyStore.save(KeyStoreKeys.DefaultListingType, value.toInt()) - } + keyStore.save(KeyStoreKeys.DefaultListingType, value.toInt()) } private fun changeDefaultPostSortType(value: SortType) { mvi.updateState { it.copy(defaultPostSortType = value) } - mvi.scope.launch(Dispatchers.Main) { - keyStore.save(KeyStoreKeys.DefaultPostSortType, value.toInt()) - } + keyStore.save(KeyStoreKeys.DefaultPostSortType, value.toInt()) } private fun changeDefaultCommentSortType(value: SortType) { mvi.updateState { it.copy(defaultCommentSortType = value) } - mvi.scope.launch(Dispatchers.Main) { - keyStore.save(KeyStoreKeys.DefaultCommentSortType, value.toInt()) - } + keyStore.save(KeyStoreKeys.DefaultCommentSortType, value.toInt()) } private fun changeNavBarTitlesVisible(value: Boolean) { @@ -140,15 +153,16 @@ class SettingsScreenViewModel( private fun changeIncludeNsfw(value: Boolean) { mvi.updateState { it.copy(includeNsfw = value) } - mvi.scope.launch(Dispatchers.Main) { - keyStore.save(KeyStoreKeys.IncludeNsfw, value) - } + keyStore.save(KeyStoreKeys.IncludeNsfw, value) } private fun changeBlurNsfw(value: Boolean) { mvi.updateState { it.copy(blurNsfw = value) } - mvi.scope.launch(Dispatchers.Main) { - keyStore.save(KeyStoreKeys.BlurNsfw, value) - } + keyStore.save(KeyStoreKeys.BlurNsfw, value) + } + + private fun changeDynamicColors(value: Boolean) { + themeRepository.changeDynamicColors(value) + keyStore.save(KeyStoreKeys.DynamicColors, value) } } diff --git a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/di/SettingsModule.kt b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/di/SettingsModule.kt index bca88d9e6..41095204e 100644 --- a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/di/SettingsModule.kt +++ b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/settings/di/SettingsModule.kt @@ -15,6 +15,7 @@ val settingsTabModule = module { themeRepository = get(), languageRepository = get(), identityRepository = get(), + colorSchemeProvider = get(), ) } } diff --git a/resources/src/commonMain/resources/MR/base/strings.xml b/resources/src/commonMain/resources/MR/base/strings.xml index 8d1132e7f..08dd1a0b3 100644 --- a/resources/src/commonMain/resources/MR/base/strings.xml +++ b/resources/src/commonMain/resources/MR/base/strings.xml @@ -85,6 +85,7 @@ Include NSFW contents Blur NSFW images App version + Use dynamic colors Subscribe Subscribed diff --git a/resources/src/commonMain/resources/MR/it/strings.xml b/resources/src/commonMain/resources/MR/it/strings.xml index 7d3d6b47f..a4b0e1ad8 100644 --- a/resources/src/commonMain/resources/MR/it/strings.xml +++ b/resources/src/commonMain/resources/MR/it/strings.xml @@ -83,6 +83,7 @@ Includi contenuti NSFW Sfuma immagini NSFW Versione app + Usa colori dinamici Iscriviti Iscritto diff --git a/shared/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/App.kt b/shared/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/App.kt index 5035c36ba..784b8289a 100644 --- a/shared/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/App.kt +++ b/shared/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/App.kt @@ -73,13 +73,17 @@ fun App() { val themeRepository = remember { getThemeRepository() } val navTitles = keyStore[KeyStoreKeys.NavItemTitlesVisible, false] + val dynamicColors = keyStore[KeyStoreKeys.DynamicColors, false] LaunchedEffect(Unit) { themeRepository.changeNavItemTitles(navTitles) + themeRepository.changeDynamicColors(dynamicColors) } + val useDynamicColors by themeRepository.dynamicColors.collectAsState() AppTheme( theme = currentTheme, contentFontScale = fontScale, + useDynamicColors = useDynamicColors, ) { val lang by languageRepository.currentLanguage.collectAsState() LaunchedEffect(lang) {}