feat(android): add TimerWidget for home screen
This commit is contained in:
parent
0609281967
commit
b68bd22cc3
@ -0,0 +1,181 @@
|
|||||||
|
package com.chronomind.app.widget
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import androidx.glance.*
|
||||||
|
import androidx.glance.action.actionStartActivity
|
||||||
|
import androidx.glance.appwidget.GlanceAppWidget
|
||||||
|
import androidx.glance.appwidget.GlanceAppWidgetReceiver
|
||||||
|
import androidx.glance.appwidget.provideContent
|
||||||
|
import androidx.glance.layout.*
|
||||||
|
import androidx.glance.text.FontWeight
|
||||||
|
import androidx.glance.text.Text
|
||||||
|
import androidx.glance.text.TextStyle
|
||||||
|
import com.chronomind.app.MainActivity
|
||||||
|
|
||||||
|
// ── Small Widget: Next Timer Countdown ────────────────────────
|
||||||
|
|
||||||
|
class TimerWidgetSmall : GlanceAppWidget() {
|
||||||
|
override suspend fun provideGlance(context: Context, id: GlanceId) {
|
||||||
|
provideContent {
|
||||||
|
SmallTimerContent()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TimerWidgetSmallReceiver : GlanceAppWidgetReceiver() {
|
||||||
|
override val glanceAppWidget: GlanceAppWidget = TimerWidgetSmall()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun SmallTimerContent() {
|
||||||
|
Box(
|
||||||
|
modifier = GlanceModifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.background(Color(0xFF14141F))
|
||||||
|
.padding(12.dp)
|
||||||
|
.clickable(actionStartActivity<MainActivity>()),
|
||||||
|
contentAlignment = Alignment.Center
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = "⏱",
|
||||||
|
style = TextStyle(fontSize = 24.sp)
|
||||||
|
)
|
||||||
|
Spacer(modifier = GlanceModifier.height(4.dp))
|
||||||
|
Text(
|
||||||
|
text = "No active timers",
|
||||||
|
style = TextStyle(
|
||||||
|
color = ColorProvider(Color(0xFFAAAACC)),
|
||||||
|
fontSize = 12.sp
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Medium Widget: Next 3 Timers ──────────────────────────────
|
||||||
|
|
||||||
|
class TimerWidgetMedium : GlanceAppWidget() {
|
||||||
|
override suspend fun provideGlance(context: Context, id: GlanceId) {
|
||||||
|
provideContent {
|
||||||
|
MediumTimerContent()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TimerWidgetMediumReceiver : GlanceAppWidgetReceiver() {
|
||||||
|
override val glanceAppWidget: GlanceAppWidget = TimerWidgetMedium()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun MediumTimerContent() {
|
||||||
|
Column(
|
||||||
|
modifier = GlanceModifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.background(Color(0xFF14141F))
|
||||||
|
.padding(12.dp)
|
||||||
|
.clickable(actionStartActivity<MainActivity>())
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = "ChronoMind",
|
||||||
|
style = TextStyle(
|
||||||
|
color = ColorProvider(Color(0xFFEEEEFF)),
|
||||||
|
fontSize = 14.sp,
|
||||||
|
fontWeight = FontWeight.Bold
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Spacer(modifier = GlanceModifier.height(8.dp))
|
||||||
|
Text(
|
||||||
|
text = "No active timers",
|
||||||
|
style = TextStyle(
|
||||||
|
color = ColorProvider(Color(0xFF666688)),
|
||||||
|
fontSize = 12.sp
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Spacer(modifier = GlanceModifier.height(4.dp))
|
||||||
|
Text(
|
||||||
|
text = "Tap to create one",
|
||||||
|
style = TextStyle(
|
||||||
|
color = ColorProvider(Color(0xFF6C5CE7)),
|
||||||
|
fontSize = 11.sp
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Large Widget: Mini Timeline ───────────────────────────────
|
||||||
|
|
||||||
|
class TimerWidgetLarge : GlanceAppWidget() {
|
||||||
|
override suspend fun provideGlance(context: Context, id: GlanceId) {
|
||||||
|
provideContent {
|
||||||
|
LargeTimerContent()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TimerWidgetLargeReceiver : GlanceAppWidgetReceiver() {
|
||||||
|
override val glanceAppWidget: GlanceAppWidget = TimerWidgetLarge()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun LargeTimerContent() {
|
||||||
|
Column(
|
||||||
|
modifier = GlanceModifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.background(Color(0xFF14141F))
|
||||||
|
.padding(16.dp)
|
||||||
|
.clickable(actionStartActivity<MainActivity>())
|
||||||
|
) {
|
||||||
|
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||||
|
Text(
|
||||||
|
text = "ChronoMind",
|
||||||
|
style = TextStyle(
|
||||||
|
color = ColorProvider(Color(0xFFEEEEFF)),
|
||||||
|
fontSize = 16.sp,
|
||||||
|
fontWeight = FontWeight.Bold
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Spacer(modifier = GlanceModifier.defaultWeight())
|
||||||
|
Text(
|
||||||
|
text = "Timeline",
|
||||||
|
style = TextStyle(
|
||||||
|
color = ColorProvider(Color(0xFF6C5CE7)),
|
||||||
|
fontSize = 12.sp
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer(modifier = GlanceModifier.height(12.dp))
|
||||||
|
|
||||||
|
// Empty state
|
||||||
|
Box(
|
||||||
|
modifier = GlanceModifier.fillMaxSize(),
|
||||||
|
contentAlignment = Alignment.Center
|
||||||
|
) {
|
||||||
|
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
|
Text(
|
||||||
|
text = "No active timers",
|
||||||
|
style = TextStyle(
|
||||||
|
color = ColorProvider(Color(0xFF666688)),
|
||||||
|
fontSize = 14.sp
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Spacer(modifier = GlanceModifier.height(4.dp))
|
||||||
|
Text(
|
||||||
|
text = "Tap to open ChronoMind",
|
||||||
|
style = TextStyle(
|
||||||
|
color = ColorProvider(Color(0xFF6C5CE7)),
|
||||||
|
fontSize = 12.sp
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user