diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt index 20700f08..c295bcda 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt @@ -17,6 +17,7 @@ import de.mm20.launcher2.ui.component.preferences.ListPreference import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.component.preferences.value import de.mm20.launcher2.ui.locals.LocalNavController import de.mm20.launcher2.ui.theme.getTypography @@ -51,6 +52,15 @@ fun AppearanceSettingsScreen() { navController?.navigate("settings/appearance/themes") } ) + val compatMode by viewModel.compatMode.collectAsState() + SwitchPreference( + title = stringResource(id = R.string.preference_force_compat_system_colors), + summary = stringResource(id = R.string.preference_force_compat_system_colors_summary), + value = compatMode, + onValueChanged = { + viewModel.setCompatMode(it) + } + ) val font by viewModel.font.collectAsState() ListPreference( title = stringResource(R.string.preference_font), diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt index c300bb35..2db0d820 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt @@ -47,6 +47,19 @@ class AppearanceSettingsScreenVM : ViewModel(), KoinComponent { } .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) + val compatMode = dataStore.data.map { + it.appearance.forceCompatModeSystemColors + }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), false) + + fun setCompatMode(enabled: Boolean) { + viewModelScope.launch { + dataStore.updateData { + it.toBuilder() + .setAppearance(it.appearance.toBuilder().setForceCompatModeSystemColors(enabled)) + .build() + } + } + } val font = dataStore.data.map { it.appearance.font } .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Custom.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Custom.kt index 0de0bbb1..43e49635 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Custom.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Custom.kt @@ -3,11 +3,14 @@ package de.mm20.launcher2.ui.theme.colorscheme import android.os.Build import androidx.compose.material3.ColorScheme import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.core.content.ContextCompat +import androidx.datastore.core.DataStore import de.mm20.launcher2.preferences.Settings import de.mm20.launcher2.themes.CorePalette import de.mm20.launcher2.themes.DefaultDarkColorScheme @@ -18,6 +21,8 @@ import de.mm20.launcher2.themes.Theme import de.mm20.launcher2.themes.get import de.mm20.launcher2.themes.merge import de.mm20.launcher2.ui.locals.LocalWallpaperColors +import kotlinx.coroutines.flow.map +import org.koin.androidx.compose.inject @Composable fun lightColorSchemeOf(theme: Theme): ColorScheme { @@ -77,8 +82,13 @@ fun colorSchemeOf(colorScheme: FullColorScheme, corePalette: PartialCorePalette) @Composable fun systemCorePalette(): CorePalette { - val context = LocalContext.current - if (Build.VERSION.SDK_INT >= 31) { + val dataStore: DataStore by inject() + val compatMode by remember { + dataStore.data.map { it.appearance.forceCompatModeSystemColors } + }.collectAsState(false) + + if (Build.VERSION.SDK_INT >= 31 && !compatMode) { + val context = LocalContext.current return CorePalette( primary = ContextCompat.getColor(context, android.R.color.system_accent1_500), secondary = ContextCompat.getColor(context, android.R.color.system_accent2_500), diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml index 42c4e299..9cd8e541 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -447,6 +447,8 @@ Generate from primary color Light color scheme Dark color scheme + Ignore system colors + Request color scheme via Material You Compat, if available Font System default About 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 e1608ccb..bec00d01 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 = 18 +internal const val SchemaVersion = 19 internal fun getMigrations(context: Context): List> { return listOf( @@ -44,5 +44,6 @@ internal fun getMigrations(context: Context): List> { Migration_15_16(), Migration_16_17(), Migration_17_18(), + Migration_18_19(), ) } \ 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 2ba95c97..550a002a 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 @@ -18,6 +18,7 @@ fun createFactorySettings(context: Context): Settings { .setBlurWallpaperRadius(32) .setThemeId(UUID(0L, 0L).toString()) .setFont(Settings.AppearanceSettings.Font.Outfit) + .setForceCompatModeSystemColors(false) .build() ) .setWeather( diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_18_19.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_18_19.kt new file mode 100644 index 00000000..b05cd163 --- /dev/null +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_18_19.kt @@ -0,0 +1,12 @@ +package de.mm20.launcher2.preferences.migrations + +import de.mm20.launcher2.preferences.Settings + +class Migration_18_19 : VersionedMigration(18, 19) { + override suspend fun applyMigrations(builder: Settings.Builder): Settings.Builder { + return builder + .setAppearance(builder.appearance.toBuilder() + .setForceCompatModeSystemColors(false) + ) + } +} \ No newline at end of file diff --git a/core/preferences/src/main/proto/settings.proto b/core/preferences/src/main/proto/settings.proto index f57fc567..72e7f97b 100644 --- a/core/preferences/src/main/proto/settings.proto +++ b/core/preferences/src/main/proto/settings.proto @@ -90,6 +90,8 @@ message Settings { // UUID of the selected theme string theme_id = 12; uint32 blur_wallpaper_radius = 13; + + bool force_compat_mode_system_colors = 14; } AppearanceSettings appearance = 2;