mirror of
https://github.com/wulkanowy/wulkanowy.git
synced 2025-01-31 13:08:21 +01:00
Fix loading timetable and attendance when should be refreshed returns true (#2436)
This commit is contained in:
parent
31854fc4b8
commit
e378b4c70a
@ -15,5 +15,5 @@ interface TimetableDao : BaseDao<Timetable> {
|
|||||||
fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow<List<Timetable>>
|
fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow<List<Timetable>>
|
||||||
|
|
||||||
@Query("SELECT * FROM Timetable WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
@Query("SELECT * FROM Timetable WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
||||||
fun load(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List<Timetable>
|
suspend fun load(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List<Timetable>
|
||||||
}
|
}
|
||||||
|
@ -16,10 +16,8 @@ import io.github.wulkanowy.utils.monday
|
|||||||
import io.github.wulkanowy.utils.sunday
|
import io.github.wulkanowy.utils.sunday
|
||||||
import io.github.wulkanowy.utils.switchSemester
|
import io.github.wulkanowy.utils.switchSemester
|
||||||
import io.github.wulkanowy.utils.uniqueSubtract
|
import io.github.wulkanowy.utils.uniqueSubtract
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.withContext
|
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
import java.time.LocalTime
|
import java.time.LocalTime
|
||||||
@ -58,11 +56,9 @@ class AttendanceRepository @Inject constructor(
|
|||||||
attendanceDb.loadAll(semester.diaryId, semester.studentId, start.monday, end.sunday)
|
attendanceDb.loadAll(semester.diaryId, semester.studentId, start.monday, end.sunday)
|
||||||
},
|
},
|
||||||
fetch = {
|
fetch = {
|
||||||
val lessons = withContext(Dispatchers.IO) {
|
val lessons = timetableDb.load(
|
||||||
timetableDb.load(
|
semester.diaryId, semester.studentId, start.monday, end.sunday
|
||||||
semester.diaryId, semester.studentId, start.monday, end.sunday
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
sdk.init(student)
|
sdk.init(student)
|
||||||
.switchSemester(semester)
|
.switchSemester(semester)
|
||||||
.getAttendance(start.monday, end.sunday)
|
.getAttendance(start.monday, end.sunday)
|
||||||
|
@ -3,13 +3,23 @@ package io.github.wulkanowy.data.repositories
|
|||||||
import io.github.wulkanowy.data.db.dao.TimetableAdditionalDao
|
import io.github.wulkanowy.data.db.dao.TimetableAdditionalDao
|
||||||
import io.github.wulkanowy.data.db.dao.TimetableDao
|
import io.github.wulkanowy.data.db.dao.TimetableDao
|
||||||
import io.github.wulkanowy.data.db.dao.TimetableHeaderDao
|
import io.github.wulkanowy.data.db.dao.TimetableHeaderDao
|
||||||
import io.github.wulkanowy.data.db.entities.*
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import io.github.wulkanowy.data.db.entities.Timetable
|
||||||
|
import io.github.wulkanowy.data.db.entities.TimetableAdditional
|
||||||
|
import io.github.wulkanowy.data.db.entities.TimetableHeader
|
||||||
import io.github.wulkanowy.data.mappers.mapToEntities
|
import io.github.wulkanowy.data.mappers.mapToEntities
|
||||||
import io.github.wulkanowy.data.networkBoundResource
|
import io.github.wulkanowy.data.networkBoundResource
|
||||||
import io.github.wulkanowy.data.pojos.TimetableFull
|
import io.github.wulkanowy.data.pojos.TimetableFull
|
||||||
import io.github.wulkanowy.sdk.Sdk
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper
|
import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper
|
||||||
import io.github.wulkanowy.utils.*
|
import io.github.wulkanowy.utils.AutoRefreshHelper
|
||||||
|
import io.github.wulkanowy.utils.getRefreshKey
|
||||||
|
import io.github.wulkanowy.utils.init
|
||||||
|
import io.github.wulkanowy.utils.monday
|
||||||
|
import io.github.wulkanowy.utils.sunday
|
||||||
|
import io.github.wulkanowy.utils.switchSemester
|
||||||
|
import io.github.wulkanowy.utils.uniqueSubtract
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
@ -121,12 +131,12 @@ class TimetableRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getTimetableFromDatabase(
|
suspend fun getTimetableFromDatabase(
|
||||||
semester: Semester,
|
semester: Semester,
|
||||||
from: LocalDate,
|
start: LocalDate,
|
||||||
end: LocalDate
|
end: LocalDate
|
||||||
): Flow<List<Timetable>> {
|
): List<Timetable> {
|
||||||
return timetableDb.loadAll(semester.diaryId, semester.studentId, from, end)
|
return timetableDb.load(semester.diaryId, semester.studentId, start, end)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun updateTimetable(timetable: List<Timetable>) {
|
suspend fun updateTimetable(timetable: List<Timetable>) {
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
package io.github.wulkanowy.domain.timetable
|
package io.github.wulkanowy.domain.timetable
|
||||||
|
|
||||||
import io.github.wulkanowy.data.dataOrNull
|
|
||||||
import io.github.wulkanowy.data.db.entities.Semester
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
import io.github.wulkanowy.data.db.entities.Student
|
|
||||||
import io.github.wulkanowy.data.repositories.TimetableRepository
|
import io.github.wulkanowy.data.repositories.TimetableRepository
|
||||||
import io.github.wulkanowy.data.toFirstResult
|
|
||||||
import io.github.wulkanowy.utils.monday
|
import io.github.wulkanowy.utils.monday
|
||||||
import io.github.wulkanowy.utils.sunday
|
import io.github.wulkanowy.utils.sunday
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
@ -16,18 +13,14 @@ class IsStudentHasLessonsOnWeekendUseCase @Inject constructor(
|
|||||||
) {
|
) {
|
||||||
|
|
||||||
suspend operator fun invoke(
|
suspend operator fun invoke(
|
||||||
student: Student,
|
|
||||||
semester: Semester,
|
semester: Semester,
|
||||||
currentDate: LocalDate = LocalDate.now(),
|
currentDate: LocalDate = LocalDate.now(),
|
||||||
): Boolean {
|
): Boolean {
|
||||||
val lessons = timetableRepository.getTimetable(
|
val lessons = timetableRepository.getTimetableFromDatabase(
|
||||||
student = student,
|
|
||||||
semester = semester,
|
semester = semester,
|
||||||
start = currentDate.monday,
|
start = currentDate.monday,
|
||||||
end = currentDate.sunday,
|
end = currentDate.sunday,
|
||||||
forceRefresh = false,
|
)
|
||||||
timetableType = TimetableRepository.TimetableType.NORMAL
|
|
||||||
).toFirstResult().dataOrNull?.lessons.orEmpty()
|
|
||||||
return isWeekendHasLessonsUseCase(lessons)
|
return isWeekendHasLessonsUseCase(lessons)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ import io.github.wulkanowy.data.repositories.TimetableRepository
|
|||||||
import io.github.wulkanowy.data.waitForResult
|
import io.github.wulkanowy.data.waitForResult
|
||||||
import io.github.wulkanowy.services.sync.notifications.ChangeTimetableNotification
|
import io.github.wulkanowy.services.sync.notifications.ChangeTimetableNotification
|
||||||
import io.github.wulkanowy.utils.nextOrSameSchoolDay
|
import io.github.wulkanowy.utils.nextOrSameSchoolDay
|
||||||
import kotlinx.coroutines.flow.first
|
|
||||||
import java.time.LocalDate.now
|
import java.time.LocalDate.now
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ -31,10 +30,9 @@ class TimetableWork @Inject constructor(
|
|||||||
|
|
||||||
timetableRepository.getTimetableFromDatabase(
|
timetableRepository.getTimetableFromDatabase(
|
||||||
semester = semester,
|
semester = semester,
|
||||||
from = startDate,
|
start = startDate,
|
||||||
end = endDate,
|
end = endDate,
|
||||||
)
|
)
|
||||||
.first()
|
|
||||||
.filterNot { it.isNotified }
|
.filterNot { it.isNotified }
|
||||||
.let {
|
.let {
|
||||||
if (it.isNotEmpty()) changeTimetableNotification.notify(it, student)
|
if (it.isNotEmpty()) changeTimetableNotification.notify(it, student)
|
||||||
|
@ -4,18 +4,14 @@ import android.annotation.SuppressLint
|
|||||||
import io.github.wulkanowy.data.*
|
import io.github.wulkanowy.data.*
|
||||||
import io.github.wulkanowy.data.db.entities.Attendance
|
import io.github.wulkanowy.data.db.entities.Attendance
|
||||||
import io.github.wulkanowy.data.db.entities.Semester
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
import io.github.wulkanowy.data.db.entities.Student
|
|
||||||
import io.github.wulkanowy.data.db.entities.Timetable
|
|
||||||
import io.github.wulkanowy.data.repositories.AttendanceRepository
|
import io.github.wulkanowy.data.repositories.AttendanceRepository
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
import io.github.wulkanowy.data.repositories.SemesterRepository
|
import io.github.wulkanowy.data.repositories.SemesterRepository
|
||||||
import io.github.wulkanowy.data.repositories.StudentRepository
|
import io.github.wulkanowy.data.repositories.StudentRepository
|
||||||
import io.github.wulkanowy.data.repositories.TimetableRepository
|
|
||||||
import io.github.wulkanowy.ui.base.BasePresenter
|
import io.github.wulkanowy.ui.base.BasePresenter
|
||||||
import io.github.wulkanowy.ui.base.ErrorHandler
|
import io.github.wulkanowy.ui.base.ErrorHandler
|
||||||
import io.github.wulkanowy.utils.*
|
import io.github.wulkanowy.utils.*
|
||||||
import kotlinx.coroutines.flow.catch
|
import kotlinx.coroutines.flow.firstOrNull
|
||||||
import kotlinx.coroutines.flow.flow
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.time.DayOfWeek
|
import java.time.DayOfWeek
|
||||||
@ -210,7 +206,7 @@ class AttendancePresenter @Inject constructor(
|
|||||||
|
|
||||||
val semester = semesterRepository.getCurrentSemester(student)
|
val semester = semesterRepository.getCurrentSemester(student)
|
||||||
|
|
||||||
checkInitialAndCurrentDate(student, semester)
|
checkInitialAndCurrentDate(semester)
|
||||||
attendanceRepository.getAttendance(
|
attendanceRepository.getAttendance(
|
||||||
student = student,
|
student = student,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
@ -266,15 +262,13 @@ class AttendancePresenter @Inject constructor(
|
|||||||
.launch()
|
.launch()
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun checkInitialAndCurrentDate(student: Student, semester: Semester) {
|
private suspend fun checkInitialAndCurrentDate(semester: Semester) {
|
||||||
if (initialDate == null) {
|
if (initialDate == null) {
|
||||||
val lessons = attendanceRepository.getAttendance(
|
val lessons = attendanceRepository.getAttendanceFromDatabase(
|
||||||
student = student,
|
|
||||||
semester = semester,
|
semester = semester,
|
||||||
start = now().monday,
|
start = now().monday,
|
||||||
end = now().sunday,
|
end = now().sunday,
|
||||||
forceRefresh = false,
|
).firstOrNull().orEmpty()
|
||||||
).toFirstResult().dataOrNull.orEmpty()
|
|
||||||
isWeekendHasLessons = isWeekendHasLessons(lessons)
|
isWeekendHasLessons = isWeekendHasLessons(lessons)
|
||||||
initialDate = getInitialDate(semester)
|
initialDate = getInitialDate(semester)
|
||||||
}
|
}
|
||||||
@ -316,6 +310,7 @@ class AttendancePresenter @Inject constructor(
|
|||||||
showContent(false)
|
showContent(false)
|
||||||
showExcuseButton(false)
|
showExcuseButton(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
is Resource.Success -> {
|
is Resource.Success -> {
|
||||||
Timber.i("Excusing for absence result: Success")
|
Timber.i("Excusing for absence result: Success")
|
||||||
analytics.logEvent("excuse_absence", "items" to attendanceToExcuseList.size)
|
analytics.logEvent("excuse_absence", "items" to attendanceToExcuseList.size)
|
||||||
@ -328,6 +323,7 @@ class AttendancePresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
loadData(forceRefresh = true)
|
loadData(forceRefresh = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
is Resource.Error -> {
|
is Resource.Error -> {
|
||||||
Timber.i("Excusing for absence result: An exception occurred")
|
Timber.i("Excusing for absence result: An exception occurred")
|
||||||
errorHandler.dispatch(it.error)
|
errorHandler.dispatch(it.error)
|
||||||
|
@ -438,7 +438,7 @@ class DashboardPresenter @Inject constructor(
|
|||||||
private fun loadLessons(student: Student, forceRefresh: Boolean) {
|
private fun loadLessons(student: Student, forceRefresh: Boolean) {
|
||||||
flatResourceFlow {
|
flatResourceFlow {
|
||||||
val semester = semesterRepository.getCurrentSemester(student)
|
val semester = semesterRepository.getCurrentSemester(student)
|
||||||
val date = when (isStudentHasLessonsOnWeekendUseCase(student, semester)) {
|
val date = when (isStudentHasLessonsOnWeekendUseCase(semester)) {
|
||||||
true -> LocalDate.now()
|
true -> LocalDate.now()
|
||||||
else -> LocalDate.now().nextOrSameSchoolDay
|
else -> LocalDate.now().nextOrSameSchoolDay
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ package io.github.wulkanowy.ui.modules.timetable
|
|||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import io.github.wulkanowy.data.db.entities.Semester
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
import io.github.wulkanowy.data.db.entities.Student
|
|
||||||
import io.github.wulkanowy.data.db.entities.Timetable
|
import io.github.wulkanowy.data.db.entities.Timetable
|
||||||
import io.github.wulkanowy.data.enums.TimetableGapsMode.BETWEEN_AND_BEFORE_LESSONS
|
import io.github.wulkanowy.data.enums.TimetableGapsMode.BETWEEN_AND_BEFORE_LESSONS
|
||||||
import io.github.wulkanowy.data.enums.TimetableGapsMode.NO_GAPS
|
import io.github.wulkanowy.data.enums.TimetableGapsMode.NO_GAPS
|
||||||
@ -150,7 +149,7 @@ class TimetablePresenter @Inject constructor(
|
|||||||
val student = studentRepository.getCurrentStudent()
|
val student = studentRepository.getCurrentStudent()
|
||||||
val semester = semesterRepository.getCurrentSemester(student)
|
val semester = semesterRepository.getCurrentSemester(student)
|
||||||
|
|
||||||
checkInitialAndCurrentDate(student, semester)
|
checkInitialAndCurrentDate(semester)
|
||||||
timetableRepository.getTimetable(
|
timetableRepository.getTimetable(
|
||||||
student = student,
|
student = student,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
@ -194,9 +193,9 @@ class TimetablePresenter @Inject constructor(
|
|||||||
.launch()
|
.launch()
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun checkInitialAndCurrentDate(student: Student, semester: Semester) {
|
private suspend fun checkInitialAndCurrentDate(semester: Semester) {
|
||||||
if (initialDate == null) {
|
if (initialDate == null) {
|
||||||
isWeekendHasLessons = isStudentHasLessonsOnWeekendUseCase(student, semester)
|
isWeekendHasLessons = isStudentHasLessonsOnWeekendUseCase(semester)
|
||||||
initialDate = getInitialDate(semester)
|
initialDate = getInitialDate(semester)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user