summaryrefslogtreecommitdiff
path: root/android/app/src/main/java/org/terst/doot/widget/ui/EventDetailActivity.kt
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-07-12 11:18:37 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-07-12 11:18:37 +0000
commit4126fe4f56a6eb9703a084d4793a597f37bf2867 (patch)
treeb2b7c07ed7376a5c31495d37bd35dfece3e2643c /android/app/src/main/java/org/terst/doot/widget/ui/EventDetailActivity.kt
parent6fdd09bfe030ce91ee188f18c198fd6a57c7b42f (diff)
feat(widget): add event detail popup showing recurrence scheduleHEADmaster
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VTUSAEKfsPc6WGDq45yPHD
Diffstat (limited to 'android/app/src/main/java/org/terst/doot/widget/ui/EventDetailActivity.kt')
-rw-r--r--android/app/src/main/java/org/terst/doot/widget/ui/EventDetailActivity.kt145
1 files changed, 145 insertions, 0 deletions
diff --git a/android/app/src/main/java/org/terst/doot/widget/ui/EventDetailActivity.kt b/android/app/src/main/java/org/terst/doot/widget/ui/EventDetailActivity.kt
new file mode 100644
index 0000000..b8423ce
--- /dev/null
+++ b/android/app/src/main/java/org/terst/doot/widget/ui/EventDetailActivity.kt
@@ -0,0 +1,145 @@
+package org.terst.doot.widget.ui
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.*
+import androidx.compose.runtime.*
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.lifecycle.lifecycleScope
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.launch
+import okhttp3.OkHttpClient
+import org.terst.doot.widget.data.Keys
+import org.terst.doot.widget.data.WidgetRepository
+import org.terst.doot.widget.data.dataStore
+
+class EventDetailActivity : ComponentActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ val title = intent.getStringExtra(EXTRA_TITLE) ?: ""
+ val source = intent.getStringExtra(EXTRA_SOURCE) ?: "calendar"
+ val url = intent.getStringExtra(EXTRA_URL) ?: ""
+ val recurringEventId = intent.getStringExtra(EXTRA_RECURRING_EVENT_ID)
+
+ setContent {
+ MaterialTheme(colorScheme = darkColorScheme()) {
+ EventDetailSheet(
+ title = title,
+ source = source,
+ recurringEventId = recurringEventId,
+ onOpenCalendar = {
+ startActivity(
+ Intent(Intent.ACTION_VIEW, Uri.parse(url.ifEmpty { "https://calendar.google.com" }))
+ )
+ finish()
+ },
+ onDismiss = ::finish
+ )
+ }
+ }
+ }
+
+ companion object {
+ const val EXTRA_TITLE = "event_title"
+ const val EXTRA_SOURCE = "event_source"
+ const val EXTRA_URL = "event_url"
+ const val EXTRA_RECURRING_EVENT_ID = "event_recurring_id"
+ }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun EventDetailSheet(
+ title: String,
+ source: String,
+ recurringEventId: String?,
+ onOpenCalendar: () -> Unit,
+ onDismiss: () -> Unit
+) {
+ val context = LocalContext.current
+ var recurrenceText by remember { mutableStateOf<String?>(null) }
+
+ LaunchedEffect(recurringEventId) {
+ if (recurringEventId == null) return@LaunchedEffect
+ recurrenceText = "Loading…"
+ val prefs = context.dataStore.data.first()
+ val url = prefs[Keys.SERVER_URL]?.trimEnd('/') ?: return@LaunchedEffect
+ val token = prefs[Keys.TOKEN] ?: return@LaunchedEffect
+ val repo = WidgetRepository(OkHttpClient(), url, token)
+ repo.getRecurrence(recurringEventId).onSuccess { text ->
+ recurrenceText = text
+ }.onFailure {
+ recurrenceText = null
+ }
+ }
+
+ ModalBottomSheet(
+ onDismissRequest = onDismiss,
+ sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true),
+ containerColor = Color(0xFF1E293B),
+ tonalElevation = 0.dp,
+ dragHandle = {
+ Box(
+ modifier = Modifier
+ .padding(vertical = 12.dp)
+ .width(36.dp)
+ .height(4.dp)
+ .background(Color.White.copy(alpha = 0.25f), RoundedCornerShape(2.dp))
+ )
+ }
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 20.dp)
+ .navigationBarsPadding()
+ ) {
+ Row(verticalAlignment = androidx.compose.ui.Alignment.CenterVertically) {
+ Box(
+ modifier = Modifier
+ .size(10.dp)
+ .background(sourceColor(source), RoundedCornerShape(5.dp))
+ )
+ Spacer(Modifier.width(10.dp))
+ Text(
+ text = title,
+ fontSize = 17.sp,
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White,
+ modifier = Modifier.weight(1f)
+ )
+ }
+ recurrenceText?.let { text ->
+ Spacer(Modifier.height(8.dp))
+ Text(
+ text = text,
+ fontSize = 13.sp,
+ color = Color.White.copy(alpha = 0.6f)
+ )
+ }
+ Spacer(Modifier.height(20.dp))
+ OutlinedButton(
+ onClick = onOpenCalendar,
+ modifier = Modifier.fillMaxWidth(),
+ colors = ButtonDefaults.outlinedButtonColors(contentColor = Color.White),
+ border = androidx.compose.foundation.BorderStroke(1.dp, Color.White.copy(alpha = 0.3f))
+ ) {
+ Text("Open in Calendar", fontSize = 15.sp)
+ }
+ Spacer(Modifier.height(20.dp))
+ }
+ }
+}