From f2041e51c2f2664351f866e0c86a734167dd8692 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Tue, 12 Apr 2022 19:25:17 +0200 Subject: [PATCH] =?UTF-8?q?Transform=20wallpaper=20color=20scheme=20into?= =?UTF-8?q?=20Material=20You=20compat=20color=20scheme=20on=20Android=208.?= =?UTF-8?q?1=20=E2=80=93=2011=20and=20make=20it=20the=20default=20on=20the?= =?UTF-8?q?se=20platforms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- i18n/src/main/res/values/strings.xml | 1 - preferences/src/main/proto/settings.proto | 1 - .../appearance/AppearanceSettingsScreen.kt | 1 - .../colorscheme/ColorSchemeSettingsScreen.kt | 11 --- .../mm20/launcher2/ui/theme/LauncherTheme.kt | 48 +++++----- .../launcher2/ui/theme/WallpaperColors.kt | 13 +-- .../launcher2/ui/theme/colorscheme/Default.kt | 4 +- .../ui/theme/colorscheme/Wallpaper.kt | 90 +++++++------------ 8 files changed, 70 insertions(+), 99 deletions(-) diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index 89676ed8..97b16574 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -387,7 +387,6 @@ Color scheme Default Black and White - From wallpaper About Version Links diff --git a/preferences/src/main/proto/settings.proto b/preferences/src/main/proto/settings.proto index 0fb45030..6d7e52d0 100644 --- a/preferences/src/main/proto/settings.proto +++ b/preferences/src/main/proto/settings.proto @@ -15,7 +15,6 @@ message Settings { enum ColorScheme { Default = 0; BlackAndWhite = 1; - Wallpaper = 2; } ColorScheme color_scheme = 6; bool dim_wallpaper = 7; diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt index 2049709b..7a6b160a 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt @@ -71,7 +71,6 @@ fun AppearanceSettingsScreen() { summary = when (colorScheme) { ColorScheme.Default -> stringResource(R.string.preference_colors_default) ColorScheme.BlackAndWhite -> stringResource(R.string.preference_colors_bw) - ColorScheme.Wallpaper -> stringResource(R.string.preference_colors_wallpaper) else -> null }, onClick = { diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt index 0d47d8ea..5adfd3cc 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt @@ -1,8 +1,5 @@ package de.mm20.launcher2.ui.settings.colorscheme -import android.os.Build -import androidx.compose.foundation.background -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.RadioButtonChecked @@ -15,11 +12,9 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.preferences.Settings.AppearanceSettings import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference @@ -41,12 +36,6 @@ fun ColorSchemeSettingsScreen() { AppearanceSettings.ColorScheme.BlackAndWhite to R.string.preference_colors_bw, ) - if (isAtLeastApiLevel(Build.VERSION_CODES.O_MR1)) { - items.add( - AppearanceSettings.ColorScheme.Wallpaper to R.string.preference_colors_wallpaper - ) - } - for (cs in items) { val scheme by colorSchemeAsState(cs.first) Preference( diff --git a/ui/src/main/java/de/mm20/launcher2/ui/theme/LauncherTheme.kt b/ui/src/main/java/de/mm20/launcher2/ui/theme/LauncherTheme.kt index c13405f8..70d917b7 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/theme/LauncherTheme.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/theme/LauncherTheme.kt @@ -8,7 +8,6 @@ import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext -import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.Settings.AppearanceSettings import de.mm20.launcher2.preferences.Settings.AppearanceSettings.Theme @@ -49,31 +48,38 @@ fun colorSchemeAsState(colorScheme: AppearanceSettings.ColorScheme): MutableStat val darkTheme = themePreference == Theme.Dark || themePreference == Theme.System && isSystemInDarkTheme() - val state = remember(colorScheme, darkTheme) { - mutableStateOf( - when (colorScheme) { - AppearanceSettings.ColorScheme.BlackAndWhite -> { + + when (colorScheme) { + AppearanceSettings.ColorScheme.BlackAndWhite -> { + return remember(darkTheme) { + mutableStateOf( if (darkTheme) DarkBlackAndWhiteColorScheme else LightBlackAndWhiteColorScheme - } - else -> { - if (darkTheme) { - if (isAtLeastApiLevel(31)) dynamicDarkColorScheme(context) - else DarkPre31DefaultColorScheme - } else { - if (isAtLeastApiLevel(31)) dynamicLightColorScheme(context) - else LightPre31DefaultColorScheme - } + ) + } + } + else -> { + if (Build.VERSION.SDK_INT >= 31) { + return remember(darkTheme) { + mutableStateOf( + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + ) } } - ) - } - if (colorScheme == AppearanceSettings.ColorScheme.Wallpaper && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { - val wallpaperColors by wallpaperColorsAsState() - LaunchedEffect(wallpaperColors, darkTheme) { - state.value = WallpaperColorScheme(wallpaperColors, darkTheme) + if (Build.VERSION.SDK_INT >= 27 && Build.VERSION.SDK_INT < 31) { + val wallpaperColors by wallpaperColorsAsState() + val state = remember(wallpaperColors, darkTheme) { + mutableStateOf( + wallpaperColors?.let { MaterialYouCompatScheme(it, darkTheme) } + ?: if (darkTheme) DarkDefaultColorScheme else LightDefaultColorScheme + ) + } + return state + } + + return remember { mutableStateOf(if (darkTheme) DarkDefaultColorScheme else LightDefaultColorScheme) } + } } - return state } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/theme/WallpaperColors.kt b/ui/src/main/java/de/mm20/launcher2/ui/theme/WallpaperColors.kt index 3e6b62cf..8433f9f9 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/theme/WallpaperColors.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/theme/WallpaperColors.kt @@ -4,13 +4,11 @@ import android.app.WallpaperManager import android.os.Build import android.os.Handler import android.os.Looper -import android.util.Log import androidx.annotation.RequiresApi import androidx.compose.runtime.* import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -29,15 +27,18 @@ data class WallpaperColors(val primary: Color, val secondary: Color?, val tertia @RequiresApi(Build.VERSION_CODES.O_MR1) @Composable -fun wallpaperColorsAsState(): State { +fun wallpaperColorsAsState(): State { val scope = rememberCoroutineScope() val context = LocalContext.current - val state = remember { mutableStateOf(DefaultWallpaperColors) } + val state = remember { mutableStateOf(null) } DisposableEffect(null) { val wallpaperManager = WallpaperManager.getInstance(context) - val callback = { colors: android.app.WallpaperColors?, which: Int -> - if (colors != null && which or WallpaperManager.FLAG_SYSTEM != 0) { + val callback = callback@{ colors: android.app.WallpaperColors?, which: Int -> + if (which or WallpaperManager.FLAG_SYSTEM == 0) return@callback + if (colors != null) { state.value = WallpaperColors.fromPlatformType(colors) + } else { + state.value = null } } wallpaperManager.addOnColorsChangedListener( diff --git a/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Default.kt b/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Default.kt index dd06f9a3..c719431d 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Default.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Default.kt @@ -4,7 +4,7 @@ import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color -val LightPre31DefaultColorScheme = lightColorScheme( +val LightDefaultColorScheme = lightColorScheme( primary = Color(0xFF3C6089), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFFD1E4FF), @@ -33,7 +33,7 @@ val LightPre31DefaultColorScheme = lightColorScheme( outline = Color(0xFF6D778C), ) -val DarkPre31DefaultColorScheme = darkColorScheme( +val DarkDefaultColorScheme = darkColorScheme( primary = Color(0xFFA6C9F8), onPrimary = Color(0xFF033259), primaryContainer = Color(0xFF234870), diff --git a/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Wallpaper.kt b/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Wallpaper.kt index 780954cb..f0e405a9 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Wallpaper.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/theme/colorscheme/Wallpaper.kt @@ -7,63 +7,41 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import de.mm20.launcher2.ui.theme.WallpaperColors import palettes.TonalPalette +import scheme.Scheme -fun WallpaperColorScheme(wallpaperColors: WallpaperColors, darkTheme: Boolean): ColorScheme { - val primary = TonalPalette.fromInt(wallpaperColors.primary.toArgb()) - val secondary = TonalPalette.fromInt((wallpaperColors.secondary ?: wallpaperColors.primary).toArgb()) - val tertiary = TonalPalette.fromInt((wallpaperColors.tertiary ?: wallpaperColors.primary).toArgb()) - - val neutral1 = TonalPalette.fromInt(Color.Black.toArgb()) - val neutral2 = TonalPalette.fromInt(Color.Black.toArgb()) - - return if(darkTheme) { - darkColorScheme( - primary = Color(primary.tone(80)), - onPrimary = Color(primary.tone(20)), - primaryContainer = Color(primary.tone(30)), - onPrimaryContainer = Color(primary.tone(90)), - secondary = Color(secondary.tone(80)), - onSecondary = Color(secondary.tone(20)), - secondaryContainer = Color(secondary.tone(30)), - onSecondaryContainer = Color(secondary.tone(90)), - tertiary = Color(tertiary.tone(80)), - onTertiary = Color(tertiary.tone(20)), - tertiaryContainer = Color(tertiary.tone(30)), - onTertiaryContainer = Color(tertiary.tone(90)), - background = Color(neutral1.tone(10)), - onBackground = Color(neutral1.tone(90)), - surface = Color(neutral1.tone(10)), - onSurface = Color(neutral1.tone(90)), - surfaceVariant = Color(neutral2.tone(30)), - onSurfaceVariant = Color(neutral2.tone(80)), - outline = Color(neutral2.tone(60)), - inverseSurface = Color(neutral1.tone(90)), - inverseOnSurface = Color(neutral1.tone(20)), - inversePrimary = Color(primary.tone(40)), - ) +fun MaterialYouCompatScheme(wallpaperColors: WallpaperColors, darkTheme: Boolean): ColorScheme { + val scheme = if (darkTheme) { + Scheme.dark(wallpaperColors.primary.toArgb()) } else { - lightColorScheme( - primary = Color(primary.tone(40)), - onPrimary = Color(primary.tone(100)), - primaryContainer = Color(primary.tone(90)), - onPrimaryContainer = Color(primary.tone(10)), - secondary = Color(secondary.tone(40)), - onSecondary = Color(secondary.tone(100)), - secondaryContainer = Color(secondary.tone(90)), - onSecondaryContainer = Color(secondary.tone(10)), - tertiary = Color(tertiary.tone(40)), - onTertiary = Color(tertiary.tone(100)), - tertiaryContainer = Color(tertiary.tone(90)), - onTertiaryContainer = Color(tertiary.tone(10)), - background = Color(neutral1.tone(99)), - onBackground = Color(neutral1.tone(10)), - surface = Color(neutral1.tone(99)), - onSurface = Color(neutral1.tone(10)), - surfaceVariant = Color(neutral2.tone(90)), - onSurfaceVariant = Color(neutral2.tone(30)), - outline = Color(neutral2.tone(50)), - inverseSurface = Color(neutral1.tone(20)), - inverseOnSurface = Color(neutral1.tone(95)), - inversePrimary = Color(primary.tone(80)),) + Scheme.light(wallpaperColors.primary.toArgb()) } + return ColorScheme( + primary = Color(scheme.primary), + onPrimary = Color(scheme.onPrimary), + primaryContainer = Color(scheme.primaryContainer), + onPrimaryContainer = Color(scheme.onPrimaryContainer), + secondary = Color(scheme.secondary), + onSecondary = Color(scheme.onSecondary), + secondaryContainer = Color(scheme.secondaryContainer), + onSecondaryContainer = Color(scheme.onSecondaryContainer), + tertiary = Color(scheme.tertiary), + onTertiary = Color(scheme.onTertiary), + tertiaryContainer = Color(scheme.tertiaryContainer), + onTertiaryContainer = Color(scheme.onTertiaryContainer), + background = Color(scheme.background), + onBackground = Color(scheme.onBackground), + surface = Color(scheme.surface), + onSurface = Color(scheme.onSurface), + surfaceVariant = Color(scheme.surfaceVariant), + onSurfaceVariant = Color(scheme.onSurfaceVariant), + outline = Color(scheme.outline), + inverseSurface = Color(scheme.inverseSurface), + inverseOnSurface = Color(scheme.inverseOnSurface), + inversePrimary = Color(scheme.inversePrimary), + surfaceTint = Color(scheme.primary), + error = Color(scheme.error), + onError = Color(scheme.onError), + errorContainer = Color(scheme.errorContainer), + onErrorContainer = Color(scheme.onErrorContainer), + ) } \ No newline at end of file