From 843786507f9f6287d28f257c73b4ed8ab158134b Mon Sep 17 00:00:00 2001 From: Damocles Date: Wed, 22 Apr 2026 23:00:57 +0200 Subject: [PATCH] add text shadow for transparent mode, replace alarm emoji with tinted icon --- .../nova/android/widget/ClockWidget.kt | 105 +++++++++++++----- 1 file changed, 76 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/space/darkest/nova/android/widget/ClockWidget.kt b/app/src/main/java/space/darkest/nova/android/widget/ClockWidget.kt index 3c61a92..ffe2dbb 100644 --- a/app/src/main/java/space/darkest/nova/android/widget/ClockWidget.kt +++ b/app/src/main/java/space/darkest/nova/android/widget/ClockWidget.kt @@ -5,9 +5,12 @@ import android.content.Context import android.content.Intent import android.provider.AlarmClock import androidx.compose.runtime.Composable -import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.glance.ColorFilter +import androidx.glance.Image +import androidx.glance.ImageProvider import androidx.glance.GlanceId import androidx.glance.GlanceModifier import androidx.glance.GlanceTheme @@ -18,8 +21,8 @@ import androidx.glance.appwidget.GlanceAppWidgetReceiver import androidx.glance.appwidget.SizeMode import androidx.glance.appwidget.action.actionStartActivity import androidx.glance.appwidget.provideContent -import androidx.compose.ui.graphics.Color import androidx.glance.background +import androidx.glance.color.ColorProvider import androidx.glance.color.DynamicThemeColorProviders import space.darkest.nova.android.data.WidgetPreferences import androidx.glance.layout.Alignment @@ -30,6 +33,7 @@ import androidx.glance.layout.Spacer import androidx.glance.layout.fillMaxSize import androidx.glance.layout.height import androidx.glance.layout.padding +import androidx.glance.layout.size import androidx.glance.layout.width import androidx.glance.text.FontWeight import androidx.glance.text.Text @@ -76,7 +80,7 @@ class ClockWidget : GlanceAppWidget() { "$day, $date" } val alarmStr = if (alarmTime != null && alarmDate != null) { - "\u23F0 ${formatAlarm(alarmTime, alarmDate)}" + formatAlarm(alarmTime, alarmDate) } else null Box( @@ -91,101 +95,144 @@ class ClockWidget : GlanceAppWidget() { contentAlignment = Alignment.CenterStart, ) { if (compact) { - CompactLayout(hours, minutes, dateStr, alarmStr) + CompactLayout(hours, minutes, dateStr, alarmStr, transparentBg) } else { - FullLayout(hours, minutes, dateStr, alarmStr) + FullLayout(hours, minutes, dateStr, alarmStr, transparentBg) } } } + // text with a dark shadow layer behind it for readability on wallpapers @Composable - private fun TimeRow(hours: String, minutes: String, fontSize: Int = 48) { + private fun ShadowText( + text: String, + style: TextStyle, + shadow: Boolean, + maxLines: Int = Int.MAX_VALUE, + ) { + if (shadow) { + Box { + Text( + text = text, + style = style.copy( + color = ColorProvider(Color(0x90000000)), + ), + maxLines = maxLines, + modifier = GlanceModifier.padding(start = 1.dp, top = 1.dp), + ) + Text(text = text, style = style, maxLines = maxLines) + } + } else { + Text(text = text, style = style, maxLines = maxLines) + } + } + + @Composable + private fun TimeRow(hours: String, minutes: String, fontSize: Int = 48, shadow: Boolean = false) { Row(verticalAlignment = Alignment.Bottom) { - Text( + ShadowText( text = hours, style = TextStyle( color = GlanceTheme.colors.primary, fontSize = fontSize.sp, fontWeight = FontWeight.Bold, ), + shadow = shadow, ) - Text( + ShadowText( text = ":", style = TextStyle( color = GlanceTheme.colors.onSurfaceVariant, fontSize = fontSize.sp, fontWeight = FontWeight.Bold, ), + shadow = shadow, ) - Text( + ShadowText( text = minutes, style = TextStyle( color = GlanceTheme.colors.tertiary, fontSize = fontSize.sp, fontWeight = FontWeight.Bold, ), + shadow = shadow, ) } } @Composable - private fun CompactLayout(hours: String, minutes: String, dateStr: String, alarmStr: String?) { + private fun CompactLayout( + hours: String, minutes: String, dateStr: String, alarmStr: String?, shadow: Boolean, + ) { Row( verticalAlignment = Alignment.CenterVertically, modifier = GlanceModifier.fillMaxSize(), ) { - TimeRow(hours, minutes, fontSize = 36) + TimeRow(hours, minutes, fontSize = 36, shadow = shadow) Spacer(GlanceModifier.width(12.dp)) Column { - Text( + ShadowText( text = dateStr, style = TextStyle( color = GlanceTheme.colors.onSurfaceVariant, fontSize = 12.sp, ), + shadow = shadow, ) if (alarmStr != null) { Spacer(GlanceModifier.height(2.dp)) - Text( - text = alarmStr, - style = TextStyle( - color = GlanceTheme.colors.secondary, - fontSize = 11.sp, - ), - ) + AlarmRow(alarmStr, 11, shadow) } } } } @Composable - private fun FullLayout(hours: String, minutes: String, dateStr: String, alarmStr: String?) { + private fun FullLayout( + hours: String, minutes: String, dateStr: String, alarmStr: String?, shadow: Boolean, + ) { Column { - TimeRow(hours, minutes) + TimeRow(hours, minutes, shadow = shadow) Spacer(GlanceModifier.height(2.dp)) - Text( + ShadowText( text = dateStr, style = TextStyle( color = GlanceTheme.colors.onSurfaceVariant, fontSize = 14.sp, ), + shadow = shadow, ) if (alarmStr != null) { Spacer(GlanceModifier.height(4.dp)) - Text( - text = alarmStr, - style = TextStyle( - color = GlanceTheme.colors.secondary, - fontSize = 12.sp, - ), - ) + AlarmRow(alarmStr, 12, shadow) } } } + @Composable + private fun AlarmRow(text: String, fontSize: Int, shadow: Boolean) { + Row(verticalAlignment = Alignment.CenterVertically) { + Image( + provider = ImageProvider(android.R.drawable.ic_lock_idle_alarm), + contentDescription = "Alarm", + modifier = GlanceModifier.size(fontSize.dp), + colorFilter = ColorFilter.tint(GlanceTheme.colors.secondary), + ) + Spacer(GlanceModifier.width(4.dp)) + ShadowText( + text = text, + style = TextStyle( + color = GlanceTheme.colors.secondary, + fontSize = fontSize.sp, + ), + shadow = shadow, + ) + } + } + private fun formatAlarm(time: LocalTime, date: LocalDate): String { val today = LocalDate.now() val timeStr = time.format(DateTimeFormatter.ofPattern("HH:mm"))