From cd2de7f75c5bfe88ef9cffd4e5ed232930cedf5f Mon Sep 17 00:00:00 2001 From: PranshulGG Date: Wed, 8 Jul 2026 15:08:31 +0530 Subject: [PATCH] Glance widget text color can now be changed closes #942 --- .../widgets/glance/GlanceWidget.kt | 17 +++++-- .../widgets/glance/ui/GlanceWidgetConfig.kt | 50 ++++++++++++++++--- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/widgets/glance/GlanceWidget.kt b/app/src/main/java/com/pranshulgg/weather_master_app/widgets/glance/GlanceWidget.kt index 2b485bdf6..04d969748 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/widgets/glance/GlanceWidget.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/widgets/glance/GlanceWidget.kt @@ -6,6 +6,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.glance.GlanceId import androidx.glance.GlanceModifier +import androidx.glance.GlanceTheme import androidx.glance.Image import androidx.glance.ImageProvider import androidx.glance.LocalContext @@ -36,6 +37,7 @@ import com.pranshulgg.weather_master_app.widgets.WeatherWidgetStateJson import com.pranshulgg.weather_master_app.widgets.model.WidgetWeather import com.pranshulgg.weather_master_app.widgets.params.WidgetSizePoints import com.pranshulgg.weather_master_app.widgets.ui.ReloadButton +import com.pranshulgg.weather_master_app.widgets.ui.colors.WidgetColors import com.pranshulgg.weather_master_app.widgets.ui.views.WidgetClock import com.pranshulgg.weather_master_app.widgets.ui.views.WidgetDate import kotlinx.serialization.json.Json @@ -60,6 +62,7 @@ class GlanceWidget : GlanceAppWidget() { val size = LocalSize.current val widgetState = currentState() val context = LocalContext.current + val widgetColors = WidgetColors() val json = widgetState.json val state = json?.let { @@ -71,12 +74,16 @@ class GlanceWidget : GlanceAppWidget() { .clickable(actionStartActivity()) ) { if (state != null) { + val textColor = widgetColors + .getTextColor(config.widgetTextTheme, config.widgetTheme) + ?: Pair(GlanceTheme.colors.onSurface, null) + Column(GlanceModifier.fillMaxWidth().padding(16.dp)) { if (config.showClock) { - WidgetClock(config.clockSize, context, R.color.white) + WidgetClock(config.clockSize, context, textColor.second) } - WidgetDate(config.dateFormat, context, size = 20f, color = R.color.white) + WidgetDate(config.dateFormat, context, size = 20f, color = textColor.second) Spacer(GlanceModifier.height(5.dp)) Row() { @@ -98,9 +105,9 @@ class GlanceWidget : GlanceAppWidget() { Text( "${state.currentTemp} • ", style = TextStyle( - color = ColorProvider(R.color.white), + color = textColor.first, fontSize = 18.sp - ) + ), ) } Box { @@ -115,7 +122,7 @@ class GlanceWidget : GlanceAppWidget() { Text( state.currentCondition, style = TextStyle( - color = ColorProvider(R.color.white), + color = textColor.first, fontSize = 18.sp ) ) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/widgets/glance/ui/GlanceWidgetConfig.kt b/app/src/main/java/com/pranshulgg/weather_master_app/widgets/glance/ui/GlanceWidgetConfig.kt index a7c980d89..815b8058b 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/widgets/glance/ui/GlanceWidgetConfig.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/widgets/glance/ui/GlanceWidgetConfig.kt @@ -45,6 +45,8 @@ import com.pranshulgg.weather_master_app.core.ui.components.tiles.DialogOption import com.pranshulgg.weather_master_app.core.ui.theme.ShapeRadius import com.pranshulgg.weather_master_app.core.utils.formatters.toSafeDouble import com.pranshulgg.weather_master_app.widgets.config.WidgetConfig +import com.pranshulgg.weather_master_app.widgets.ui.colors.WidgetTextTheme +import com.pranshulgg.weather_master_app.widgets.ui.colors.WidgetTheme import kotlin.math.roundToInt @OptIn(ExperimentalMaterial3ExpressiveApi::class) @@ -73,6 +75,10 @@ fun GlanceWidgetConfig(onDone: (WidgetConfig) -> Unit = {}) { val formatsOptions = formats.map { DialogOption(it, it) } val clockSizeOptions = clockSizes.map { DialogOption(it.toString(), "${it.roundToInt()}.sp") } + var widgetTextTheme by remember { mutableStateOf(WidgetTextTheme.WHITE) } + val widgetTextThemeOptions = + WidgetTextTheme.entries.filter { it != WidgetTextTheme.AUTO } + .map { DialogOption(it.toString(), stringResource(it.label)) } Scaffold( containerColor = MaterialTheme.colorScheme.surfaceContainer @@ -90,7 +96,7 @@ fun GlanceWidgetConfig(onDone: (WidgetConfig) -> Unit = {}) { .fillMaxWidth() .padding(16.dp) ) { - GlanceWidgetPreview(clockSize, showClock, dateFormat) + GlanceWidgetPreview(clockSize, showClock, dateFormat, widgetTextTheme) } SettingSection( @@ -121,6 +127,21 @@ fun GlanceWidgetConfig(onDone: (WidgetConfig) -> Unit = {}) { onOptionSelected = { dateFormat = it } + ), + SettingTile.DialogOptionTile( + leading = { SettingsTileIcon(R.drawable.format_paint_24px) }, + title = "Widget text color", + options = widgetTextThemeOptions, + selectedOption = widgetTextTheme.toString(), + onOptionSelected = { + val selected = when (it) { + "WHITE" -> WidgetTextTheme.WHITE + "BLACK" -> WidgetTextTheme.BLACK + else -> WidgetTextTheme.WHITE + } + + widgetTextTheme = selected + } ) ) ) @@ -132,7 +153,8 @@ fun GlanceWidgetConfig(onDone: (WidgetConfig) -> Unit = {}) { WidgetConfig( clockSize = clockSize, showClock = showClock, - dateFormat = dateFormat + dateFormat = dateFormat, + widgetTextTheme = widgetTextTheme ) ) }, @@ -151,11 +173,21 @@ fun GlanceWidgetConfig(onDone: (WidgetConfig) -> Unit = {}) { } @Composable -private fun GlanceWidgetPreview(clockSize: Float = 32f, showClock: Boolean = true, format: String) { +private fun GlanceWidgetPreview( + clockSize: Float = 32f, + showClock: Boolean = true, + format: String, + textTheme: WidgetTextTheme +) { + val textColor = when (textTheme) { + WidgetTextTheme.BLACK -> Color.Black + WidgetTextTheme.WHITE -> Color.White + else -> Color.White + } val style = TextStyle( shadow = Shadow( - color = Color(0xFF000000).copy(alpha = 0.8f), + color = Color.Black.copy(alpha = 0.8f), blurRadius = 4f, offset = Offset(2f, 2f) ) @@ -168,12 +200,14 @@ private fun GlanceWidgetPreview(clockSize: Float = 32f, showClock: Boolean = tru else -> "Thu 18 Jun" } + + Column(Modifier.padding(16.dp)) { if (showClock) { Text( "03:23", fontSize = clockSize.sp, - color = Color(0xFFEEF0FF), + color = textColor, fontWeight = FontWeight.Bold, style = style ) @@ -181,15 +215,15 @@ private fun GlanceWidgetPreview(clockSize: Float = 32f, showClock: Boolean = tru Text( date, fontSize = 20.sp, - color = Color(0xFFEEF0FF), + color = textColor, style = style ) Gap(5.dp) Row(verticalAlignment = Alignment.CenterVertically) { WeatherIconBox(R.drawable.weather_partly_cloudy_day, size = 24.dp) Gap(horizontal = 5.dp) - Text("29° • ", color = Color(0xFFEEF0FF), fontSize = 18.sp, style = style) - Text("Clear sky", color = Color(0xFFEEF0FF), fontSize = 18.sp, style = style) + Text("29° • ", color = textColor, fontSize = 18.sp, style = style) + Text("Clear sky", color = textColor, fontSize = 18.sp, style = style) } } } \ No newline at end of file