fix transparent bg, responsive compact layout for single-row clock
This commit is contained in:
parent
a1a80905a1
commit
a267aed86f
1 changed files with 96 additions and 57 deletions
|
|
@ -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,81 +74,114 @@ 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,
|
||||||
) {
|
) {
|
||||||
|
if (compact) {
|
||||||
|
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) {
|
||||||
|
Text(
|
||||||
|
text = hours,
|
||||||
|
style = TextStyle(
|
||||||
|
color = GlanceTheme.colors.primary,
|
||||||
|
fontSize = fontSize.sp,
|
||||||
|
fontWeight = FontWeight.Bold,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = ":",
|
||||||
|
style = TextStyle(
|
||||||
|
color = GlanceTheme.colors.onSurfaceVariant,
|
||||||
|
fontSize = fontSize.sp,
|
||||||
|
fontWeight = FontWeight.Bold,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = minutes,
|
||||||
|
style = TextStyle(
|
||||||
|
color = GlanceTheme.colors.tertiary,
|
||||||
|
fontSize = fontSize.sp,
|
||||||
|
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 {
|
Column {
|
||||||
// time row: hours (primary) : minutes (tertiary)
|
|
||||||
Row(verticalAlignment = Alignment.Bottom) {
|
|
||||||
Text(
|
|
||||||
text = hours,
|
|
||||||
style = TextStyle(
|
|
||||||
color = GlanceTheme.colors.primary,
|
|
||||||
fontSize = 48.sp,
|
|
||||||
fontWeight = FontWeight.Bold,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = ":",
|
|
||||||
style = TextStyle(
|
|
||||||
color = GlanceTheme.colors.onSurfaceVariant,
|
|
||||||
fontSize = 48.sp,
|
|
||||||
fontWeight = FontWeight.Bold,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = minutes,
|
|
||||||
style = TextStyle(
|
|
||||||
color = GlanceTheme.colors.tertiary,
|
|
||||||
fontSize = 48.sp,
|
|
||||||
fontWeight = FontWeight.Bold,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
Spacer(GlanceModifier.height(2.dp))
|
|
||||||
|
|
||||||
// date
|
|
||||||
Text(
|
Text(
|
||||||
text = dateStr,
|
text = dateStr,
|
||||||
style = TextStyle(
|
style = TextStyle(
|
||||||
color = GlanceTheme.colors.onSurfaceVariant,
|
color = GlanceTheme.colors.onSurfaceVariant,
|
||||||
fontSize = 14.sp,
|
fontSize = 12.sp,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
if (alarmStr != null) {
|
||||||
// next alarm
|
Spacer(GlanceModifier.height(2.dp))
|
||||||
if (alarmTime != null && alarmDate != null) {
|
Text(
|
||||||
Spacer(GlanceModifier.height(4.dp))
|
text = alarmStr,
|
||||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
style = TextStyle(
|
||||||
Text(
|
color = GlanceTheme.colors.secondary,
|
||||||
text = "\u23F0",
|
fontSize = 11.sp,
|
||||||
style = TextStyle(fontSize = 12.sp),
|
),
|
||||||
)
|
)
|
||||||
Spacer(GlanceModifier.width(4.dp))
|
|
||||||
Text(
|
|
||||||
text = formatAlarm(alarmTime, alarmDate),
|
|
||||||
style = TextStyle(
|
|
||||||
color = GlanceTheme.colors.secondary,
|
|
||||||
fontSize = 12.sp,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun FullLayout(hours: String, minutes: String, dateStr: String, alarmStr: String?) {
|
||||||
|
Column {
|
||||||
|
TimeRow(hours, minutes)
|
||||||
|
|
||||||
|
Spacer(GlanceModifier.height(2.dp))
|
||||||
|
|
||||||
|
Text(
|
||||||
|
text = dateStr,
|
||||||
|
style = TextStyle(
|
||||||
|
color = GlanceTheme.colors.onSurfaceVariant,
|
||||||
|
fontSize = 14.sp,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if (alarmStr != null) {
|
||||||
|
Spacer(GlanceModifier.height(4.dp))
|
||||||
|
Text(
|
||||||
|
text = alarmStr,
|
||||||
|
style = TextStyle(
|
||||||
|
color = GlanceTheme.colors.secondary,
|
||||||
|
fontSize = 12.sp,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun formatAlarm(time: LocalTime, date: LocalDate): String {
|
private fun formatAlarm(time: LocalTime, date: LocalDate): String {
|
||||||
val today = LocalDate.now()
|
val today = LocalDate.now()
|
||||||
val timeStr = time.format(DateTimeFormatter.ofPattern("HH:mm"))
|
val timeStr = time.format(DateTimeFormatter.ofPattern("HH:mm"))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue