1+ package io.pslab.widget
2+
3+ import android.content.Context
4+ import android.content.Intent
5+ import androidx.compose.runtime.Composable
6+ import androidx.compose.ui.unit.dp
7+ import androidx.compose.ui.unit.sp
8+ import androidx.glance.GlanceId
9+ import androidx.glance.GlanceModifier
10+ import androidx.glance.action.clickable
11+ import androidx.glance.appwidget.GlanceAppWidget
12+ import androidx.glance.appwidget.action.actionStartActivity
13+ import androidx.glance.appwidget.lazy.LazyColumn
14+ import androidx.glance.appwidget.lazy.items
15+ import androidx.glance.appwidget.provideContent
16+ import androidx.glance.background
17+ import androidx.glance.layout.*
18+ import androidx.glance.text.Text
19+ import androidx.glance.text.TextStyle
20+ import androidx.glance.text.FontWeight
21+ import androidx.glance.unit.ColorProvider
22+ import androidx.compose.ui.graphics.Color
23+ import org.json.JSONArray
24+ import org.json.JSONException
25+ import io.pslab.MainActivity
26+
27+ data class LogItem (val fileName : String , val instrument : String )
28+
29+ class WidgetProvider : GlanceAppWidget () {
30+
31+ override suspend fun provideGlance (context : Context , id : GlanceId ) {
32+ val prefs = context.getSharedPreferences(" HomeWidgetPreferences" , Context .MODE_PRIVATE )
33+ val jsonString = prefs.getString(" logs_json_key" , " []" ) ? : " []"
34+ val logList = mutableListOf<LogItem >()
35+
36+ try {
37+ val jsonArray = JSONArray (jsonString)
38+ for (i in 0 until jsonArray.length()) {
39+ val obj = jsonArray.getJSONObject(i)
40+ logList.add(
41+ LogItem (
42+ fileName = obj.optString(" fileName" , " Unknown File" ),
43+ instrument = obj.optString(" instrument" , " General" )
44+ )
45+ )
46+ }
47+ } catch (e: JSONException ) {
48+ // fallback
49+ }
50+
51+ provideContent {
52+ GlanceWidgetLayout (context, logList)
53+ }
54+ }
55+
56+ @Composable
57+ private fun GlanceWidgetLayout (context : Context , logs : List <LogItem >) {
58+ val openAppAction = actionStartActivity(Intent (context, MainActivity ::class .java))
59+
60+ Column (
61+ modifier = GlanceModifier
62+ .fillMaxSize()
63+ .background(Color (0xFFF5F5F5 )),
64+ verticalAlignment = Alignment .Top ,
65+ horizontalAlignment = Alignment .Start
66+ ) {
67+ Row (
68+ modifier = GlanceModifier
69+ .fillMaxWidth()
70+ .background(Color (0xFFD32F2F ))
71+ .padding(horizontal = 16 .dp, vertical = 12 .dp)
72+ .clickable(openAppAction),
73+ verticalAlignment = Alignment .CenterVertically
74+ ) {
75+ Text (
76+ text = " PSLab Saved Logs" ,
77+ style = TextStyle (
78+ color = ColorProvider (Color .White ),
79+ fontSize = 16 .sp,
80+ fontWeight = FontWeight .Bold
81+ )
82+ )
83+ }
84+
85+ if (logs.isEmpty()) {
86+ Box (
87+ modifier = GlanceModifier
88+ .fillMaxSize()
89+ .padding(16 .dp)
90+ .clickable(openAppAction),
91+ contentAlignment = Alignment .Center
92+ ) {
93+ Text (
94+ text = " No logged data found" ,
95+ style = TextStyle (color = ColorProvider (Color .Gray ), fontSize = 14 .sp)
96+ )
97+ }
98+ } else {
99+ LazyColumn (
100+ modifier = GlanceModifier
101+ .fillMaxWidth()
102+ .defaultWeight()
103+ .padding(horizontal = 8 .dp, vertical = 4 .dp)
104+ ) {
105+ items(logs) { log ->
106+ LogItemCard (log, context)
107+ }
108+ }
109+ }
110+ }
111+ }
112+
113+ @Composable
114+ private fun LogItemCard (log : LogItem , context : Context ) {
115+ Box (
116+ modifier = GlanceModifier
117+ .fillMaxWidth()
118+ .padding(vertical = 4 .dp, horizontal = 4 .dp)
119+ .background(Color .White )
120+ .clickable(actionStartActivity(Intent (context, MainActivity ::class .java)))
121+ ) {
122+ Column (
123+ modifier = GlanceModifier
124+ .fillMaxWidth()
125+ .padding(12 .dp)
126+ ) {
127+ Text (
128+ text = log.fileName,
129+ style = TextStyle (
130+ color = ColorProvider (Color (0xFF212121 )),
131+ fontSize = 14 .sp,
132+ fontWeight = FontWeight .Medium
133+ )
134+ )
135+ Text (
136+ text = log.instrument.uppercase(),
137+ style = TextStyle (
138+ color = ColorProvider (Color (0xFFD32F2F )),
139+ fontSize = 11 .sp,
140+ fontWeight = FontWeight .Bold
141+ ),
142+ modifier = GlanceModifier .padding(top = 4 .dp)
143+ )
144+ }
145+ }
146+ }
147+ }
0 commit comments