fix transparent bg, responsive compact layout for single-row clock

This commit is contained in:
Damocles 2026-04-22 22:34:27 +02:00
parent a1a80905a1
commit a267aed86f

View file

@ -5,18 +5,20 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.provider.AlarmClock import android.provider.AlarmClock
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.glance.GlanceId import androidx.glance.GlanceId
import androidx.glance.GlanceModifier import androidx.glance.GlanceModifier
import androidx.glance.GlanceTheme import androidx.glance.GlanceTheme
import androidx.glance.LocalSize
import androidx.glance.action.clickable import androidx.glance.action.clickable
import androidx.glance.appwidget.GlanceAppWidget import androidx.glance.appwidget.GlanceAppWidget
import androidx.glance.appwidget.GlanceAppWidgetReceiver import androidx.glance.appwidget.GlanceAppWidgetReceiver
import androidx.glance.appwidget.SizeMode
import androidx.glance.appwidget.action.actionStartActivity import androidx.glance.appwidget.action.actionStartActivity
import androidx.glance.appwidget.provideContent import androidx.glance.appwidget.provideContent
import androidx.glance.background import androidx.glance.background
import androidx.glance.color.ColorProvider
import androidx.glance.color.DynamicThemeColorProviders import androidx.glance.color.DynamicThemeColorProviders
import space.darkest.nova.android.data.WidgetPreferences import space.darkest.nova.android.data.WidgetPreferences
import androidx.glance.layout.Alignment import androidx.glance.layout.Alignment
@ -41,6 +43,8 @@ import java.util.Locale
class ClockWidget : GlanceAppWidget() { class ClockWidget : GlanceAppWidget() {
override val sizeMode = SizeMode.Exact
override suspend fun provideGlance(context: Context, id: GlanceId) { override suspend fun provideGlance(context: Context, id: GlanceId) {
val alarmManager = context.getSystemService(AlarmManager::class.java) val alarmManager = context.getSystemService(AlarmManager::class.java)
val nextAlarm = alarmManager.nextAlarmClock?.let { alarm -> val nextAlarm = alarmManager.nextAlarmClock?.let { alarm ->
@ -59,6 +63,8 @@ class ClockWidget : GlanceAppWidget() {
@Composable @Composable
private fun ClockContent(alarmTime: LocalTime?, alarmDate: LocalDate?, transparentBg: Boolean) { private fun ClockContent(alarmTime: LocalTime?, alarmDate: LocalDate?, transparentBg: Boolean) {
val size = LocalSize.current
val compact = size.height < 120.dp
val now = LocalTime.now() val now = LocalTime.now()
val today = LocalDate.now() val today = LocalDate.now()
val hours = now.format(DateTimeFormatter.ofPattern("HH")) val hours = now.format(DateTimeFormatter.ofPattern("HH"))
@ -68,27 +74,34 @@ class ClockWidget : GlanceAppWidget() {
val date = it.format(DateTimeFormatter.ofPattern("d MMM")) val date = it.format(DateTimeFormatter.ofPattern("d MMM"))
"$day, $date" "$day, $date"
} }
val alarmStr = if (alarmTime != null && alarmDate != null) {
"\u23F0 ${formatAlarm(alarmTime, alarmDate)}"
} else null
val bgModifier = if (transparentBg) {
GlanceModifier
} else {
GlanceModifier.background(GlanceTheme.colors.widgetBackground)
}
Box( Box(
modifier = bgModifier modifier = GlanceModifier
.fillMaxSize() .fillMaxSize()
.let { if (transparentBg) it else it.background(GlanceTheme.colors.widgetBackground) }
.padding(16.dp) .padding(16.dp)
.clickable(actionStartActivity(Intent(AlarmClock.ACTION_SHOW_ALARMS))), .clickable(actionStartActivity(Intent(AlarmClock.ACTION_SHOW_ALARMS))),
contentAlignment = Alignment.CenterStart, contentAlignment = Alignment.CenterStart,
) { ) {
Column { if (compact) {
// time row: hours (primary) : minutes (tertiary) CompactLayout(hours, minutes, dateStr, alarmStr)
} else {
FullLayout(hours, minutes, dateStr, alarmStr)
}
}
}
@Composable
private fun TimeRow(hours: String, minutes: String, fontSize: Int = 48) {
Row(verticalAlignment = Alignment.Bottom) { Row(verticalAlignment = Alignment.Bottom) {
Text( Text(
text = hours, text = hours,
style = TextStyle( style = TextStyle(
color = GlanceTheme.colors.primary, color = GlanceTheme.colors.primary,
fontSize = 48.sp, fontSize = fontSize.sp,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
), ),
) )
@ -96,7 +109,7 @@ class ClockWidget : GlanceAppWidget() {
text = ":", text = ":",
style = TextStyle( style = TextStyle(
color = GlanceTheme.colors.onSurfaceVariant, color = GlanceTheme.colors.onSurfaceVariant,
fontSize = 48.sp, fontSize = fontSize.sp,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
), ),
) )
@ -104,15 +117,50 @@ class ClockWidget : GlanceAppWidget() {
text = minutes, text = minutes,
style = TextStyle( style = TextStyle(
color = GlanceTheme.colors.tertiary, color = GlanceTheme.colors.tertiary,
fontSize = 48.sp, fontSize = fontSize.sp,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
), ),
) )
} }
}
@Composable
private fun CompactLayout(hours: String, minutes: String, dateStr: String, alarmStr: String?) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = GlanceModifier.fillMaxSize(),
) {
TimeRow(hours, minutes, fontSize = 36)
Spacer(GlanceModifier.width(12.dp))
Column {
Text(
text = dateStr,
style = TextStyle(
color = GlanceTheme.colors.onSurfaceVariant,
fontSize = 12.sp,
),
)
if (alarmStr != null) {
Spacer(GlanceModifier.height(2.dp))
Text(
text = alarmStr,
style = TextStyle(
color = GlanceTheme.colors.secondary,
fontSize = 11.sp,
),
)
}
}
}
}
@Composable
private fun FullLayout(hours: String, minutes: String, dateStr: String, alarmStr: String?) {
Column {
TimeRow(hours, minutes)
Spacer(GlanceModifier.height(2.dp)) Spacer(GlanceModifier.height(2.dp))
// date
Text( Text(
text = dateStr, text = dateStr,
style = TextStyle( style = TextStyle(
@ -121,17 +169,10 @@ class ClockWidget : GlanceAppWidget() {
), ),
) )
// next alarm if (alarmStr != null) {
if (alarmTime != null && alarmDate != null) {
Spacer(GlanceModifier.height(4.dp)) Spacer(GlanceModifier.height(4.dp))
Row(verticalAlignment = Alignment.CenterVertically) {
Text( Text(
text = "\u23F0", text = alarmStr,
style = TextStyle(fontSize = 12.sp),
)
Spacer(GlanceModifier.width(4.dp))
Text(
text = formatAlarm(alarmTime, alarmDate),
style = TextStyle( style = TextStyle(
color = GlanceTheme.colors.secondary, color = GlanceTheme.colors.secondary,
fontSize = 12.sp, fontSize = 12.sp,
@ -140,8 +181,6 @@ class ClockWidget : GlanceAppWidget() {
} }
} }
} }
}
}
private fun formatAlarm(time: LocalTime, date: LocalDate): String { private fun formatAlarm(time: LocalTime, date: LocalDate): String {
val today = LocalDate.now() val today = LocalDate.now()