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