Skip to content

Commit 10e78ab

Browse files
committed
fix: android widget not load tomorrow's exam and experiment data
1 parent 00a1c31 commit 10e78ab

File tree

3 files changed

+70
-46
lines changed

3 files changed

+70
-46
lines changed

android/app/src/main/kotlin/io/github/benderblog/traintime_pda/widget/classtable/ClassTableWidget.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ class ClassTableWidget : GlanceAppWidget() {
214214

215215
Text(
216216
"${
217-
time.plusDays(if (!isShowingToday) 1 else 0).format(formatter)
217+
time.format(formatter)
218218
} " + if (status != ClassTableWidgetLoadState.FINISHED) ""
219219
else if (weekIndex < 0) context.getString(R.string.widget_classtable_on_holiday)
220220
else context.getString(

android/app/src/main/kotlin/io/github/benderblog/traintime_pda/widget/classtable/ClassTableWidgetDataProvider.kt

Lines changed: 68 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -41,33 +41,31 @@ class ClassTableWidgetDataProvider {
4141
private val tag = "[PDA ClassTableWidget][ClassTableWidgetDataProvider]"
4242

4343
fun reloadData(isShowingToday: Boolean, context: Context) {
44-
Log.i(tag, "reloadData() called.")
44+
Log.i("$tag[reloadData]", "reloadData() called.")
4545
timeLineItem.clear()
4646

4747
widgetState = ClassTableWidgetLoadState.LOADING
4848
errorMessage = null
4949

5050
currentTime = LocalDateTime.now()
51+
52+
// Whether get tomorrow's timeline items
53+
if (!isShowingToday) {
54+
Log.i("$tag[reloadData]", "tomorrow data triggered")
55+
currentTime = currentTime.plusDays(1)
56+
}
5157
dayIndex = -1
5258
weekIndex = -1
53-
Log.i(tag, "currentTime is $currentTime")
59+
Log.i("$tag[reloadData]", "currentTime is $currentTime")
5460

5561
// Loading data
5662
loadBasicConfig(context)
5763
if (widgetState != ClassTableWidgetLoadState.LOADING) {
5864
return
5965
}
6066

61-
// Whether get tomorrow's timeline items
62-
if (!isShowingToday) {
63-
dayIndex += 1
64-
if (dayIndex > 7) {
65-
dayIndex = 1
66-
weekIndex += 1
67-
}
68-
}
6967
Log.i(
70-
tag,
68+
"$tag[reloadData]",
7169
"Loading data for ${if (isShowingToday) "today" else "tomorrow"} (Week: $weekIndex, Day: $dayIndex)"
7270
)
7371

@@ -79,7 +77,7 @@ class ClassTableWidgetDataProvider {
7977
timeLineItem.sortBy { it.startTime }
8078
}
8179
} catch (e: Exception) {
82-
Log.e(tag, "Error during reloadData", e)
80+
Log.e("$tag[reloadData]", "Error during reloadData", e)
8381
widgetState = ClassTableWidgetLoadState.ERROR_OTHER
8482
errorMessage = context.getString(
8583
R.string.widget_classtable_on_error,
@@ -91,7 +89,7 @@ class ClassTableWidgetDataProvider {
9189
}
9290

9391
widgetState = ClassTableWidgetLoadState.FINISHED
94-
Log.i(tag, "reloadData() finished. Error: $errorMessage")
92+
Log.i("$tag[reloadData]", "reloadData() finished. Error: $errorMessage")
9593
}
9694

9795
fun getCurrentTime(): LocalDateTime = currentTime
@@ -103,10 +101,10 @@ class ClassTableWidgetDataProvider {
103101
private fun loadBasicConfig(context: Context) {
104102
val lenientJson = Json { ignoreUnknownKeys = true }
105103
try {
106-
Log.i(tag, "loadBasicConfig() triggered")
104+
Log.i("$tag[loadBasicConfig]", "loadBasicConfig() triggered")
107105

108106
val schoolClassTableData = ClassTableDataHolder.schoolClassJsonData.getOrElse {
109-
Log.e(tag, "Failed to load schoolClassJsonData", it)
107+
Log.e("$tag[loadBasicConfig]", "Failed to load schoolClassJsonData", it)
110108
widgetState = ClassTableWidgetLoadState.ERROR_COURSE
111109
errorMessage = it.localizedMessage ?: it.message
112110
?: context.getString(R.string.widget_classtable_unknown_error)
@@ -115,45 +113,45 @@ class ClassTableWidgetDataProvider {
115113
try {
116114
lenientJson.decodeFromString<ClassTableData>(it)
117115
} catch (e: Exception) {
118-
Log.e(tag, "Failed to parse schoolClassJsonData", e)
116+
Log.e("$tag[loadBasicConfig]", "Failed to parse schoolClassJsonData", e)
119117
widgetState = ClassTableWidgetLoadState.ERROR_COURSE
120118
errorMessage = e.localizedMessage ?: e.localizedMessage
121119
?: context.getString(R.string.widget_classtable_unknown_error)
122120
return
123121
}
124122
}
125123
Log.i(
126-
tag,
124+
"$tag[loadBasicConfig]",
127125
"schoolClassTableData loaded, " + "semester code: ${schoolClassTableData.semesterCode}, " + "begin time: ${schoolClassTableData.termStartDay}, " + "semester length: ${schoolClassTableData.semesterLength}, " + "class detail length: ${schoolClassTableData.classDetail.size}, " + "time arrangement length: ${schoolClassTableData.timeArrangement.size}"
128126
)
129127

130128
val userDefinedClassData = ClassTableDataHolder.userDefinedClassJsonData.getOrElse {
131-
Log.e(tag, "Failed to load userDefinedClassJsonData", it)
129+
Log.e("$tag[loadBasicConfig]", "Failed to load userDefinedClassJsonData", it)
132130
widgetState = ClassTableWidgetLoadState.ERROR_COURSE_USER_DEFINED
133131
errorMessage = it.localizedMessage ?: it.message
134132
?: context.getString(R.string.widget_classtable_unknown_error)
135133
return
136134
}?.takeIf {
137-
Log.i(tag, "userDefinedClassJsonData is not blank: ${it.isNotBlank()}")
135+
Log.i("$tag[loadBasicConfig]", "userDefinedClassJsonData is not blank: ${it.isNotBlank()}")
138136
it.isNotBlank()
139137
}?.let {
140138
try {
141139
lenientJson.decodeFromString<UserDefinedClassData>(it)
142140
} catch (e: Exception) {
143-
Log.e(tag, "Failed to parse userDefinedClassJsonData", e)
141+
Log.e("$tag[loadBasicConfig]", "Failed to parse userDefinedClassJsonData", e)
144142
widgetState = ClassTableWidgetLoadState.ERROR_COURSE_USER_DEFINED
145143
errorMessage = e.localizedMessage ?: e.message
146144
?: context.getString(R.string.widget_classtable_unknown_error)
147145
return
148146
}
149147
} ?: UserDefinedClassData.EMPTY
150148
Log.i(
151-
tag,
149+
"$tag[loadBasicConfig]",
152150
"userDefinedClassJsonData loaded, " + "userDefinedDetail length: ${userDefinedClassData.userDefinedDetail.size}, " + "time arrangement length: ${userDefinedClassData.timeArrangement.size}"
153151
)
154152

155153
examData = ClassTableDataHolder.examJsonData.getOrElse {
156-
Log.e(tag, "Failed to load examJsonData", it)
154+
Log.e("$tag[loadBasicConfig]", "Failed to load examJsonData", it)
157155
widgetState = ClassTableWidgetLoadState.ERROR_EXAM
158156
errorMessage = it.localizedMessage ?: it.message
159157
?: context.getString(R.string.widget_classtable_unknown_error)
@@ -162,58 +160,58 @@ class ClassTableWidgetDataProvider {
162160
try {
163161
lenientJson.decodeFromString<ExamData>(it)
164162
} catch (e: Exception) {
165-
Log.e(tag, "Failed to parse examJsonData", e)
163+
Log.e("$tag[loadBasicConfig]", "Failed to parse examJsonData", e)
166164
widgetState = ClassTableWidgetLoadState.ERROR_EXAM
167165
errorMessage = e.localizedMessage ?: e.message
168166
?: context.getString(R.string.widget_classtable_unknown_error)
169167
return
170168
}
171169
}
172-
Log.i(tag, "examJsonData loaded, subject length: ${examData.subject.size}")
170+
Log.i("$tag[loadBasicConfig]", "examJsonData loaded, subject length: ${examData.subject.size}")
173171

174172
val physicsExperimentData = ClassTableDataHolder.physicsExperimentJsonData.getOrElse {
175-
Log.e(tag, "Failed to load PhysicsExperimentData", it)
173+
Log.e("$tag[loadBasicConfig]", "Failed to load PhysicsExperimentData", it)
176174
widgetState = ClassTableWidgetLoadState.ERROR_PHYSICS_EXPERIMENT
177175
errorMessage = it.localizedMessage ?: it.message
178176
?: context.getString(R.string.widget_classtable_unknown_error)
179177
return
180178
}?.takeIf {
181-
Log.i(tag, "physicsExperimentJsonData is not blank: ${it.isNotBlank()}")
179+
Log.i("$tag[loadBasicConfig]", "physicsExperimentJsonData is not blank: ${it.isNotBlank()}")
182180
it.isNotBlank()
183181
}?.let {
184182
try {
185183
lenientJson.decodeFromString<List<ExperimentData>>(it)
186184
} catch (e: Exception) {
187-
Log.e(tag, "Failed to parse PhysicsExperimentData", e)
185+
Log.e("$tag[loadBasicConfig]", "Failed to parse PhysicsExperimentData", e)
188186
widgetState = ClassTableWidgetLoadState.ERROR_PHYSICS_EXPERIMENT
189187
errorMessage = e.localizedMessage ?: e.message
190188
?: context.getString(R.string.widget_classtable_unknown_error)
191189
return
192190
}
193191
} ?: emptyList()
194-
Log.i(tag, "physicsExperimentJsonData loaded, data length: ${physicsExperimentData.size}")
192+
Log.i("$tag[loadBasicConfig]", "physicsExperimentJsonData loaded, data length: ${physicsExperimentData.size}")
195193

196194
val otherExperimentData = ClassTableDataHolder.otherExperimentJsonData.getOrElse {
197-
Log.e(tag, "Failed to load OtherExperimentData", it)
195+
Log.e("$tag[loadBasicConfig]", "Failed to load OtherExperimentData", it)
198196
widgetState = ClassTableWidgetLoadState.ERROR_OTHER_EXPERIMENT
199197
errorMessage = it.localizedMessage ?: it.message
200198
?: context.getString(R.string.widget_classtable_unknown_error)
201199
return
202200
}?.takeIf {
203-
Log.i(tag, "otherExperimentJsonData is not blank: ${it.isNotBlank()}")
201+
Log.i("$tag[loadBasicConfig]", "otherExperimentJsonData is not blank: ${it.isNotBlank()}")
204202
it.isNotBlank()
205203
}?.let {
206204
try {
207205
lenientJson.decodeFromString<List<ExperimentData>>(it)
208206
} catch (e: Exception) {
209-
Log.e(tag, "Failed to parse OtherExperimentData", e)
207+
Log.e("$tag[loadBasicConfig]", "Failed to parse OtherExperimentData", e)
210208
widgetState = ClassTableWidgetLoadState.ERROR_OTHER_EXPERIMENT
211209
errorMessage = e.localizedMessage ?: e.message
212210
?: context.getString(R.string.widget_classtable_unknown_error)
213211
return
214212
}
215213
} ?: emptyList()
216-
Log.i(tag, "otherExperimentJsonData loaded, data length: ${otherExperimentData.size}")
214+
Log.i("$tag[loadBasicConfig]", "otherExperimentJsonData loaded, data length: ${otherExperimentData.size}")
217215

218216
experimentData = physicsExperimentData + otherExperimentData
219217

@@ -222,21 +220,21 @@ class ClassTableWidgetDataProvider {
222220
userDefinedDetail = userDefinedClassData.userDefinedDetail,
223221
timeArrangement = schoolClassTableData.timeArrangement + userDefinedClassData.timeArrangement,
224222
)
225-
Log.i(tag, "Class table merged.")
223+
Log.i("$tag[loadBasicConfig]", "Class table merged.")
226224

227225
// calculate day index of today
228226
val termStartDayStr = classTableData.termStartDay
229227
if (termStartDayStr.isBlank()) {
230228
if (classTableData == ClassTableData.EMPTY && userDefinedClassData == UserDefinedClassData.EMPTY) {
231-
Log.w(tag, "Term start day is blank and no class data loaded.")
229+
Log.w("$tag[loadBasicConfig]", "Term start day is blank and no class data loaded.")
232230
} else {
233-
Log.e(tag, "Term start day is blank, cannot calculate week/day index!")
231+
Log.e("$tag[loadBasicConfig]", "Term start day is blank, cannot calculate week/day index!")
234232
errorMessage =
235233
context.getString(R.string.widget_classtable_parse_term_start_time_error)
236234
}
237235
return
238236
}
239-
Log.i(tag, "Term start day: $termStartDayStr")
237+
Log.i("$tag[loadBasicConfig]", "Term start day: $termStartDayStr")
240238

241239
try {
242240
val weekOffset = ClassTableDataHolder.weekSwift
@@ -245,22 +243,22 @@ class ClassTableWidgetDataProvider {
245243
)
246244
val startDay =
247245
LocalDateTime.parse(termStartDayStr, dateFormat).plusWeeks(weekOffset)
248-
Log.i(tag, "Effective start day (after weekSwift $weekOffset): $startDay")
246+
Log.i("$tag[loadBasicConfig]", "Effective start day (after weekSwift $weekOffset): $startDay")
249247

250248
var deltaDays = ChronoUnit.DAYS.between(startDay, currentTime)
251249
if (deltaDays < 0) {
252250
Log.w(
253-
tag,
251+
"$tag[loadBasicConfig]",
254252
"Current date is before the effective start date. Delta days: $deltaDays. Applying original logic (delta=-7)."
255253
)
256254
deltaDays = -7
257255
}
258256

259257
weekIndex = (deltaDays / 7).toInt()
260258
dayIndex = currentTime.dayOfWeek.value
261-
Log.i(tag, "Calculation finished. curWeekIndex: $weekIndex, todayIndex: $dayIndex")
259+
Log.i("$tag[loadBasicConfig]", "Calculation finished. curWeekIndex: $weekIndex, todayIndex: $dayIndex")
262260
} catch (e: Exception) {
263-
Log.e(tag, "Error calculating date indices", e)
261+
Log.e("$tag[loadBasicConfig]", "Error calculating date indices", e)
264262
widgetState = ClassTableWidgetLoadState.ERROR_OTHER
265263
errorMessage =
266264
e.message ?: context.getString(R.string.widget_classtable_unknown_error)
@@ -269,7 +267,7 @@ class ClassTableWidgetDataProvider {
269267
}
270268
} catch (e: DateTimeParseException) {
271269
Log.e(
272-
tag,
270+
"$tag[loadBasicConfig]",
273271
"Error parsing term start date string: '${classTableData.termStartDay}' " + "with format '${ClassTableConstants.DATE_FORMAT_STR}'",
274272
e
275273
)
@@ -278,7 +276,7 @@ class ClassTableWidgetDataProvider {
278276
R.string.widget_classtable_parse_term_start_time_error,
279277
)
280278
} catch (e: Exception) {
281-
Log.e(tag, "Error calculating date indices (outer catch)", e)
279+
Log.e("$tag[loadBasicConfig]", "Error calculating date indices (outer catch)", e)
282280
widgetState = ClassTableWidgetLoadState.ERROR_OTHER
283281
errorMessage =
284282
"${e.message ?: context.getString(R.string.widget_classtable_unknown_error)} at ${e.stackTrace.first()}"
@@ -317,24 +315,32 @@ class ClassTableWidgetDataProvider {
317315
val curYear: Int = currentTime.year
318316
val curMonth: Int = currentTime.monthValue
319317
val curDay: Int = currentTime.dayOfMonth
318+
Log.i(
319+
"$tag[loadOneDayExam]",
320+
"curTime: $curYear-$curMonth-$curDay",
321+
)
320322
for (subject in examData.subject) {
321323
val startTime = subject.startTime.getOrElse {
322324
Log.e(
323-
tag,
325+
"$tag[loadOneDayExam]",
324326
"Failed to get startTime from subject $subject on loadOneDayExam, this subject will be omitted",
325327
it
326328
)
327329
continue
328330
}
329331
val endTime = subject.endTime.getOrElse {
330332
Log.e(
331-
tag,
333+
"$tag[loadOneDayExam]",
332334
"Failed to get endTime from subject $subject on loadOneDayExam, this subject will be omitted",
333335
it
334336
)
335337
continue
336338
}
337339
if (startTime.year == curYear && startTime.monthValue == curMonth && startTime.dayOfMonth == curDay) {
340+
Log.i(
341+
"$tag[loadOneDayExam]",
342+
"Adding data $subject",
343+
)
338344
timeLineItem.add(
339345
TimeLineItem(
340346
type = Source.EXAM,
@@ -346,6 +352,11 @@ class ClassTableWidgetDataProvider {
346352
colorIndex = examData.subject.indexOf(subject)
347353
)
348354
)
355+
} else {
356+
Log.i(
357+
"$tag[loadOneDayExam]",
358+
"$subject is not at the current day",
359+
)
349360
}
350361
}
351362
}
@@ -354,9 +365,17 @@ class ClassTableWidgetDataProvider {
354365
val curYear: Int = currentTime.year
355366
val curMonth: Int = currentTime.monthValue
356367
val curDay: Int = currentTime.dayOfMonth
368+
Log.i(
369+
"$tag[loadOneDayExperiment]",
370+
"curTime: $curYear-$curMonth-$curDay",
371+
)
357372
for (data in experimentData) {
358373
for (timeRange in data.timeRanges) {
359374
if (timeRange.first.year == curYear && timeRange.first.monthValue == curMonth && timeRange.first.dayOfMonth == curDay) {
375+
Log.i(
376+
"$tag[loadOneDayExperiment]",
377+
"Adding data $data at date ${timeRange.first}",
378+
)
360379
timeLineItem.add(
361380
TimeLineItem(
362381
type = Source.EXPERIMENT,
@@ -368,6 +387,11 @@ class ClassTableWidgetDataProvider {
368387
colorIndex = experimentData.indexOf(data),
369388
)
370389
)
390+
} else {
391+
Log.i(
392+
"$tag[loadOneDayExperiment]",
393+
"$data is not the same day as today",
394+
)
371395
}
372396
}
373397
}

android/app/src/main/kotlin/io/github/benderblog/traintime_pda/widget/classtable/ToggleDayAction.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class ToggleDayAction : ActionCallback {
3535
val newIsShowToday = !currentIsShowToday
3636
Log.i("[PDA ClassTableWidget][ToggleDayAction]", "New showToday value: $newIsShowToday")
3737

38-
prefs.preferences.edit {
38+
prefs.preferences.edit(true) {
3939
putBoolean(ClassTableWidgetKeys.SHOW_TODAY, newIsShowToday)
4040
}
4141
Log.i("[PDA ClassTableWidget][ToggleDayAction]", "Set showToday value to: $newIsShowToday")

0 commit comments

Comments
 (0)