From a16c6ea226f8164ed9485ff2e7dc914abd309cae Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sun, 29 May 2022 16:44:43 +0200 Subject: [PATCH] Adjust calendar color according to theme --- calendar/build.gradle.kts | 1 + .../launcher2/search/data/CalendarEvent.kt | 52 +++---------------- .../launcher/search/calendar/CalendarItem.kt | 9 +++- .../launcher2/ui/locals/CompositionLocals.kt | 3 +- .../colorscheme/ColorSchemeSettingsScreen.kt | 3 +- .../mm20/launcher2/ui/theme/LauncherTheme.kt | 32 +++++++----- 6 files changed, 38 insertions(+), 62 deletions(-) diff --git a/calendar/build.gradle.kts b/calendar/build.gradle.kts index 7234ea5d..3ef4a695 100644 --- a/calendar/build.gradle.kts +++ b/calendar/build.gradle.kts @@ -48,5 +48,6 @@ dependencies { implementation(project(":base")) implementation(project(":hiddenitems")) implementation(project(":permissions")) + implementation(project(":material-color-utilities")) } \ No newline at end of file diff --git a/calendar/src/main/java/de/mm20/launcher2/search/data/CalendarEvent.kt b/calendar/src/main/java/de/mm20/launcher2/search/data/CalendarEvent.kt index 7235bad3..de2d1b06 100644 --- a/calendar/src/main/java/de/mm20/launcher2/search/data/CalendarEvent.kt +++ b/calendar/src/main/java/de/mm20/launcher2/search/data/CalendarEvent.kt @@ -18,6 +18,9 @@ import de.mm20.launcher2.calendar.R import de.mm20.launcher2.graphics.TextDrawable import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.ktx.dp +import hct.Hct +import palettes.TonalPalette +import scheme.Scheme import java.text.SimpleDateFormat import java.util.* @@ -48,7 +51,7 @@ class CalendarEvent( typeface = Typeface.DEFAULT_BOLD, height = s ) - val background = ColorDrawable(getDisplayColor(context, color)) + val background = ColorDrawable(getDisplayColor()) return LauncherIcon( foreground = foreground, background = background, @@ -61,50 +64,9 @@ class CalendarEvent( return Intent(Intent.ACTION_VIEW).setData(uri).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } - companion object { - fun getDisplayColor(context: Context, color: Int): Int { - val hsl = FloatArray(3).let { - ColorUtils.RGBToHSL(color.red, color.green, color.blue, it) - it - } - return if (context.resources.getBoolean(R.bool.is_dark_theme)) { - if (ColorUtils.calculateContrast( - ContextCompat.getColor( - context, - R.color.calendar_foreground_color - ), color - ) < 2.5 || true - ) { - if (color.red == color.green && color.red == color.blue) { - val level = 0xFF - ((0xFF - color.red) * 0.7f).toInt() - Color.rgb(level, level, level) - } else { - hsl[2] = hsl[2] + (1 - hsl[2]) * 0.2f - hsl[1] = 1 - (1 - hsl[1]) * 0.9f - ColorUtils.HSLToColor(hsl) - } - } else return color - } else { - if (ColorUtils.calculateContrast( - ContextCompat.getColor( - context, - R.color.calendar_foreground_color - ), color - ) < 1.8 - ) { - if (color.red == color.green && color.red == color.blue) { - val level = (color.red * 0.7f).toInt() - Color.rgb(level, level, level) - } else { - hsl[2] = (0.5f - hsl[2]) * 0.8f + hsl[2] - hsl[1] = 1 - (1 - hsl[1]) * 0.8f - ColorUtils.HSLToColor(hsl) - } - } else return color - } - } - - + fun getDisplayColor(): Int { + val palette = TonalPalette.fromInt(color) + return palette.tone(70) } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt index 6a1dfcf7..be6d7091 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt @@ -35,9 +35,11 @@ import de.mm20.launcher2.ui.component.DefaultToolbarAction import de.mm20.launcher2.ui.component.Toolbar import de.mm20.launcher2.ui.component.ToolbarAction import de.mm20.launcher2.ui.ktx.toDp +import de.mm20.launcher2.ui.locals.LocalDarkTheme import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled import de.mm20.launcher2.ui.locals.LocalSnackbarHostState import kotlinx.coroutines.launch +import palettes.TonalPalette @Composable fun CalendarItem( @@ -52,10 +54,15 @@ fun CalendarItem( val lifecycleOwner = LocalLifecycleOwner.current val snackbarHostState = LocalSnackbarHostState.current + val darkMode = LocalDarkTheme.current + Row( modifier = modifier .drawBehind { - drawRect(Color(calendar.color), Offset.Zero, this.size.copy(width = 8.dp.toPx())) + val color = TonalPalette.fromInt(calendar.color).tone( + if (darkMode) 80 else 40 + ) + drawRect(Color(color), Offset.Zero, this.size.copy(width = 8.dp.toPx())) } .padding(start = 8.dp), ) { diff --git a/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt b/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt index 05b115fb..df49dacf 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt @@ -4,7 +4,6 @@ import android.appwidget.AppWidgetHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.geometry.Size -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavController import de.mm20.launcher2.preferences.Settings @@ -25,6 +24,8 @@ val LocalGridIconSize = compositionLocalOf { 48.dp } val LocalSnackbarHostState = compositionLocalOf { SnackbarHostState() } +val LocalDarkTheme = compositionLocalOf { false } + /** * Workaround a bug in Jetpack Compose which incorrectly places popups * that are nested inside other popups. 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 57afdbde..9a3e18d8 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 @@ -22,6 +22,7 @@ import de.mm20.launcher2.ui.R 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.locals.LocalDarkTheme import de.mm20.launcher2.ui.locals.LocalNavController import de.mm20.launcher2.ui.theme.colorSchemeAsState @@ -46,7 +47,7 @@ fun ColorSchemeSettingsScreen() { } for (cs in items) { - val scheme by colorSchemeAsState(cs.first) + val scheme by colorSchemeAsState(cs.first, LocalDarkTheme.current) Preference( title = cs.second, icon = if (colorScheme == cs.first) Icons.Rounded.RadioButtonChecked else Icons.Rounded.RadioButtonUnchecked, 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 10194225..0527e9d9 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 @@ -12,6 +12,7 @@ import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.Settings import de.mm20.launcher2.preferences.Settings.AppearanceSettings import de.mm20.launcher2.preferences.Settings.AppearanceSettings.Theme +import de.mm20.launcher2.ui.locals.LocalDarkTheme import de.mm20.launcher2.ui.theme.colorscheme.* import de.mm20.launcher2.ui.theme.typography.DefaultTypography import kotlinx.coroutines.flow.map @@ -34,26 +35,29 @@ fun LauncherTheme( AppearanceSettings.ColorScheme.Default ) - val colorScheme by colorSchemeAsState(colorSchemePreference) - - MaterialTheme( - colorScheme = colorScheme, - typography = DefaultTypography, - content = content - ) -} - -@Composable -fun colorSchemeAsState(colorScheme: AppearanceSettings.ColorScheme): MutableState { - val context = LocalContext.current - val dataStore: LauncherDataStore by inject() - val themePreference by remember { dataStore.data.map { it.appearance.theme } }.collectAsState( Theme.System ) val darkTheme = themePreference == Theme.Dark || themePreference == Theme.System && isSystemInDarkTheme() + val colorScheme by colorSchemeAsState(colorSchemePreference, darkTheme) + + CompositionLocalProvider( + LocalDarkTheme provides darkTheme + ) { + MaterialTheme( + colorScheme = colorScheme, + typography = DefaultTypography, + content = content + ) + } +} + +@Composable +fun colorSchemeAsState(colorScheme: AppearanceSettings.ColorScheme, darkTheme: Boolean): MutableState { + val context = LocalContext.current + val dataStore: LauncherDataStore by inject() when (colorScheme) { AppearanceSettings.ColorScheme.BlackAndWhite -> {