Update timetable to next day if there is no more lessons today
MODIFY
.idea/codeStyles/Project.xml
.idea/codeStyles/Project.xml
<code_scheme name="Project" version="173">
<option name="LINE_SEPARATOR" value="&#10;" />
<JetCodeStyleSettings>
- <option name="PACKAGES_TO_USE_STAR_IMPORTS">
- <value>
- <package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
- </value>
- </option>
- <option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
- <option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
- <option name="WRAP_ELVIS_EXPRESSIONS" value="0" />
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
- <option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
- <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
- <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
- <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
- <indentOptions>
- <option name="CONTINUATION_INDENT_SIZE" value="4" />
- </indentOptions>
</codeStyleSettings>
</code_scheme>
</component>
\ No newline at end of file

MODIFY
app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt
app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt
@@ -22,12 +22,14 @@ import io.github.wulkanowy.data.repositories.TimetableRepository
import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getCurrentThemeWidgetKey
import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getDateWidgetKey
import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getStudentWidgetKey
+import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getTodayLastLessonEndDateTimeWidgetKey
import io.github.wulkanowy.utils.getCompatColor
import io.github.wulkanowy.utils.toFirstResult
import io.github.wulkanowy.utils.toFormattedString
import kotlinx.coroutines.runBlocking
import timber.log.Timber
import java.time.LocalDate
+import java.time.ZoneOffset
class TimetableWidgetFactory(
private val timetableRepository: TimetableRepository,
@@ -70,6 +72,16 @@ class TimetableWidgetFactory(
updateTheme(appWidgetId)
lessons = getLessons(date, studentId)
+
+ if (date == LocalDate.now()) {
+ val todayLastLessonEndTimestamp =
+ lessons.maxOf { it.end }.toEpochSecond(ZoneOffset.UTC)
+ sharedPref.putLong(
+ getTodayLastLessonEndDateTimeWidgetKey(appWidgetId),
+ todayLastLessonEndTimestamp,
+ true
+ )
+ }
}
}

MODIFY
app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt
app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt
@@ -3,10 +3,7 @@ package io.github.wulkanowy.ui.modules.timetablewidget
import android.annotation.SuppressLint
import android.app.PendingIntent
import android.appwidget.AppWidgetManager
-import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_DELETED
-import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE
-import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID
-import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS
+import android.appwidget.AppWidgetManager.*
import android.content.Context
import android.content.Intent
import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK
@@ -25,22 +22,14 @@ import io.github.wulkanowy.services.HiltBroadcastReceiver
import io.github.wulkanowy.services.widgets.TimetableWidgetService
import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.splash.SplashActivity
-import io.github.wulkanowy.utils.AnalyticsHelper
-import io.github.wulkanowy.utils.PendingIntentCompat
-import io.github.wulkanowy.utils.capitalise
-import io.github.wulkanowy.utils.createNameInitialsDrawable
-import io.github.wulkanowy.utils.getCompatColor
-import io.github.wulkanowy.utils.nextOrSameSchoolDay
-import io.github.wulkanowy.utils.nextSchoolDay
-import io.github.wulkanowy.utils.nickOrName
-import io.github.wulkanowy.utils.previousSchoolDay
-import io.github.wulkanowy.utils.toFormattedString
+import io.github.wulkanowy.utils.*
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import timber.log.Timber
import java.time.LocalDate
-import java.time.LocalDate.now
+import java.time.LocalDateTime
+import java.time.ZoneOffset
import javax.inject.Inject
@AndroidEntryPoint
@@ -76,6 +65,9 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() {
fun getDateWidgetKey(appWidgetId: Int) = "timetable_widget_date_$appWidgetId"
+ fun getTodayLastLessonEndDateTimeWidgetKey(appWidgetId: Int) =
+ "timetable_widget_today_last_lesson_end_date_time_$appWidgetId"
+
fun getStudentWidgetKey(appWidgetId: Int) = "timetable_widget_student_$appWidgetId"
fun getThemeWidgetKey(appWidgetId: Int) = "timetable_widget_theme_$appWidgetId"
@@ -100,7 +92,8 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() {
intent.getIntArrayExtra(EXTRA_APPWIDGET_IDS)?.forEach { appWidgetId ->
val student =
getStudent(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId)
- updateWidget(context, appWidgetId, now().nextOrSameSchoolDay, student)
+
+ updateWidget(context, appWidgetId, getWidgetDateToLoad(appWidgetId), student)
}
} else {
val buttonType = intent.getStringExtra(EXTRA_BUTTON_TYPE)
@@ -112,15 +105,17 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() {
val savedDate =
LocalDate.ofEpochDay(sharedPref.getLong(getDateWidgetKey(toggledWidgetId), 0))
val date = when (buttonType) {
- BUTTON_RESET -> now().nextOrSameSchoolDay
+ BUTTON_RESET -> getWidgetDateToLoad(toggledWidgetId)
BUTTON_NEXT -> savedDate.nextSchoolDay
BUTTON_PREV -> savedDate.previousSchoolDay
- else -> now().nextOrSameSchoolDay
+ else -> getWidgetDateToLoad(toggledWidgetId)
}
- if (!buttonType.isNullOrBlank()) analytics.logEvent(
+ if (!buttonType.isNullOrBlank()) {
+ analytics.logEvent(
"changed_timetable_widget_day",
"button" to buttonType
)
+ }
updateWidget(context, toggledWidgetId, date, student)
}
}
@@ -278,4 +273,21 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() {
avatarDrawable.draw(canvas)
return avatarBitmap
}
+
+ private fun getWidgetDateToLoad(appWidgetId: Int): LocalDate {
+ val lastLessonEndTimestamp =
+ sharedPref.getLong(getTodayLastLessonEndDateTimeWidgetKey(appWidgetId), 0)
+ val lastLessonEndDateTime =
+ LocalDateTime.ofEpochSecond(lastLessonEndTimestamp, 0, ZoneOffset.UTC)
+
+ val todayDate = LocalDate.now()
+ val isLastLessonEndDateNow = lastLessonEndDateTime.toLocalDate() == todayDate
+ val isLastLessonEndDateAfterNowTime = LocalDateTime.now() > lastLessonEndDateTime
+
+ return if (isLastLessonEndDateNow && isLastLessonEndDateAfterNowTime) {
+ todayDate.nextSchoolDay
+ } else {
+ todayDate.nextOrSameSchoolDay
+ }
+ }
}

Update timetable to next day if there is no more lessons today (#1551)