forked from github/wulkanowy-mirror
Merge branch 'release/0.20.4' into master
This commit is contained in:
commit
13198f2ab4
@ -14,7 +14,7 @@ cache:
|
|||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- develop
|
- develop
|
||||||
- 0.20.3
|
- 0.20.4
|
||||||
|
|
||||||
android:
|
android:
|
||||||
licenses:
|
licenses:
|
||||||
|
@ -18,8 +18,8 @@ android {
|
|||||||
testApplicationId "io.github.tests.wulkanowy"
|
testApplicationId "io.github.tests.wulkanowy"
|
||||||
minSdkVersion 17
|
minSdkVersion 17
|
||||||
targetSdkVersion 29
|
targetSdkVersion 29
|
||||||
versionCode 67
|
versionCode 68
|
||||||
versionName "0.20.3"
|
versionName "0.20.4"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
resValue "string", "app_name", "Wulkanowy"
|
resValue "string", "app_name", "Wulkanowy"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
@ -126,7 +126,7 @@ configurations.all {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "io.github.wulkanowy:sdk:0.20.3"
|
implementation "io.github.wulkanowy:sdk:0.20.4"
|
||||||
|
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'
|
||||||
|
|
||||||
@ -147,7 +147,7 @@ dependencies {
|
|||||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
||||||
implementation "androidx.constraintlayout:constraintlayout:2.0.1"
|
implementation "androidx.constraintlayout:constraintlayout:2.0.1"
|
||||||
implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
|
implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
|
||||||
implementation "com.google.android.material:material:1.2.0"
|
implementation "com.google.android.material:material:1.2.1"
|
||||||
implementation "com.github.wulkanowy:material-chips-input:2.1.1"
|
implementation "com.github.wulkanowy:material-chips-input:2.1.1"
|
||||||
implementation "com.github.PhilJay:MPAndroidChart:v3.1.0"
|
implementation "com.github.PhilJay:MPAndroidChart:v3.1.0"
|
||||||
implementation "me.zhanghai.android.materialprogressbar:library:1.6.1"
|
implementation "me.zhanghai.android.materialprogressbar:library:1.6.1"
|
||||||
@ -176,7 +176,7 @@ dependencies {
|
|||||||
implementation "fr.bipi.treessence:treessence:0.3.2"
|
implementation "fr.bipi.treessence:treessence:0.3.2"
|
||||||
implementation "com.mikepenz:aboutlibraries-core:$about_libraries"
|
implementation "com.mikepenz:aboutlibraries-core:$about_libraries"
|
||||||
implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
|
implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
|
||||||
implementation "io.coil-kt:coil:1.0.0-rc1"
|
implementation "io.coil-kt:coil:1.0.0-rc2"
|
||||||
implementation "io.github.wulkanowy:AppKillerManager:3.0.0"
|
implementation "io.github.wulkanowy:AppKillerManager:3.0.0"
|
||||||
implementation 'me.xdrop:fuzzywuzzy:1.3.1'
|
implementation 'me.xdrop:fuzzywuzzy:1.3.1'
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package io.github.wulkanowy.data
|
package io.github.wulkanowy.data
|
||||||
|
|
||||||
data class Resource<out T>(val status: Status, val data: T?, val error: Throwable?) {
|
data class Resource<T>(val status: Status, val data: T?, val error: Throwable?) {
|
||||||
companion object {
|
companion object {
|
||||||
fun <T> success(data: T?): Resource<T> {
|
fun <T> success(data: T?): Resource<T> {
|
||||||
return Resource(Status.SUCCESS, data, null)
|
return Resource(Status.SUCCESS, data, null)
|
||||||
|
@ -2,9 +2,9 @@ package io.github.wulkanowy.data.repositories.exam
|
|||||||
|
|
||||||
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.Student
|
||||||
import io.github.wulkanowy.utils.monday
|
import io.github.wulkanowy.utils.endExamsDay
|
||||||
import io.github.wulkanowy.utils.networkBoundResource
|
import io.github.wulkanowy.utils.networkBoundResource
|
||||||
import io.github.wulkanowy.utils.sunday
|
import io.github.wulkanowy.utils.startExamsDay
|
||||||
import io.github.wulkanowy.utils.uniqueSubtract
|
import io.github.wulkanowy.utils.uniqueSubtract
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@ -18,8 +18,8 @@ class ExamRepository @Inject constructor(
|
|||||||
|
|
||||||
fun getExams(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource(
|
fun getExams(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource(
|
||||||
shouldFetch = { it.isEmpty() || forceRefresh },
|
shouldFetch = { it.isEmpty() || forceRefresh },
|
||||||
query = { local.getExams(semester, start.monday, end.sunday) },
|
query = { local.getExams(semester, start.startExamsDay, start.endExamsDay) },
|
||||||
fetch = { remote.getExams(student, semester, start.monday, end.sunday) },
|
fetch = { remote.getExams(student, semester, start.startExamsDay, start.endExamsDay) },
|
||||||
saveFetchResult = { old, new ->
|
saveFetchResult = { old, new ->
|
||||||
local.deleteExams(old uniqueSubtract new)
|
local.deleteExams(old uniqueSubtract new)
|
||||||
local.saveExams(new uniqueSubtract old)
|
local.saveExams(new uniqueSubtract old)
|
||||||
|
@ -8,6 +8,7 @@ import io.github.wulkanowy.utils.getCurrentOrLast
|
|||||||
import io.github.wulkanowy.utils.isCurrent
|
import io.github.wulkanowy.utils.isCurrent
|
||||||
import io.github.wulkanowy.utils.uniqueSubtract
|
import io.github.wulkanowy.utils.uniqueSubtract
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@ -41,7 +42,7 @@ class SemesterRepository @Inject constructor(
|
|||||||
|
|
||||||
private suspend fun refreshSemesters(student: Student) {
|
private suspend fun refreshSemesters(student: Student) {
|
||||||
val new = remote.getSemesters(student)
|
val new = remote.getSemesters(student)
|
||||||
if (new.isEmpty()) throw IllegalArgumentException("Empty semester list!")
|
if (new.isEmpty()) return Timber.i("Empty semester list!")
|
||||||
|
|
||||||
val old = local.getSemesters(student)
|
val old = local.getSemesters(student)
|
||||||
local.deleteSemesters(old.uniqueSubtract(new))
|
local.deleteSemesters(old.uniqueSubtract(new))
|
||||||
|
@ -26,7 +26,9 @@ import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companio
|
|||||||
import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_ID
|
import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_ID
|
||||||
import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_NAME
|
import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_NAME
|
||||||
import io.github.wulkanowy.ui.modules.main.MainView
|
import io.github.wulkanowy.ui.modules.main.MainView
|
||||||
|
import io.github.wulkanowy.utils.DispatchersProvider
|
||||||
import io.github.wulkanowy.utils.toTimestamp
|
import io.github.wulkanowy.utils.toTimestamp
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
import java.time.LocalDateTime.now
|
import java.time.LocalDateTime.now
|
||||||
@ -35,7 +37,8 @@ import javax.inject.Inject
|
|||||||
class TimetableNotificationSchedulerHelper @Inject constructor(
|
class TimetableNotificationSchedulerHelper @Inject constructor(
|
||||||
@ApplicationContext private val context: Context,
|
@ApplicationContext private val context: Context,
|
||||||
private val alarmManager: AlarmManager,
|
private val alarmManager: AlarmManager,
|
||||||
private val preferencesRepository: PreferencesRepository
|
private val preferencesRepository: PreferencesRepository,
|
||||||
|
private val dispatchersProvider: DispatchersProvider,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private fun getRequestCode(time: LocalDateTime, studentId: Int) = (time.toTimestamp() * studentId).toInt()
|
private fun getRequestCode(time: LocalDateTime, studentId: Int) = (time.toTimestamp() * studentId).toInt()
|
||||||
@ -44,13 +47,15 @@ class TimetableNotificationSchedulerHelper @Inject constructor(
|
|||||||
return day.getOrNull(index - 1)?.end ?: lesson.start.minusMinutes(30)
|
return day.getOrNull(index - 1)?.end ?: lesson.start.minusMinutes(30)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun cancelScheduled(lessons: List<Timetable>, studentId: Int = 1) {
|
suspend fun cancelScheduled(lessons: List<Timetable>, studentId: Int = 1) {
|
||||||
lessons.sortedBy { it.start }.forEachIndexed { index, lesson ->
|
withContext(dispatchersProvider.backgroundThread) {
|
||||||
val upcomingTime = getUpcomingLessonTime(index, lessons, lesson)
|
lessons.sortedBy { it.start }.forEachIndexed { index, lesson ->
|
||||||
cancelScheduledTo(upcomingTime..lesson.start, getRequestCode(upcomingTime, studentId))
|
val upcomingTime = getUpcomingLessonTime(index, lessons, lesson)
|
||||||
cancelScheduledTo(lesson.start..lesson.end, getRequestCode(lesson.start, studentId))
|
cancelScheduledTo(upcomingTime..lesson.start, getRequestCode(upcomingTime, studentId))
|
||||||
|
cancelScheduledTo(lesson.start..lesson.end, getRequestCode(lesson.start, studentId))
|
||||||
|
|
||||||
Timber.d("TimetableNotification canceled: type 1 & 2, subject: ${lesson.subject}, start: ${lesson.start}, student: $studentId")
|
Timber.d("TimetableNotification canceled: type 1 & 2, subject: ${lesson.subject}, start: ${lesson.start}, student: $studentId")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,28 +66,30 @@ class TimetableNotificationSchedulerHelper @Inject constructor(
|
|||||||
|
|
||||||
fun cancelNotification() = NotificationManagerCompat.from(context).cancel(MainView.Section.TIMETABLE.id)
|
fun cancelNotification() = NotificationManagerCompat.from(context).cancel(MainView.Section.TIMETABLE.id)
|
||||||
|
|
||||||
fun scheduleNotifications(lessons: List<Timetable>, student: Student) {
|
suspend fun scheduleNotifications(lessons: List<Timetable>, student: Student) {
|
||||||
if (!preferencesRepository.isUpcomingLessonsNotificationsEnable) return cancelScheduled(lessons, student.studentId)
|
if (!preferencesRepository.isUpcomingLessonsNotificationsEnable) return cancelScheduled(lessons, student.studentId)
|
||||||
|
|
||||||
lessons.groupBy { it.date }
|
withContext(dispatchersProvider.backgroundThread) {
|
||||||
.map { it.value.sortedBy { lesson -> lesson.start } }
|
lessons.groupBy { it.date }
|
||||||
.map { it.filter { lesson -> !lesson.canceled && lesson.isStudentPlan } }
|
.map { it.value.sortedBy { lesson -> lesson.start } }
|
||||||
.map { day ->
|
.map { it.filter { lesson -> !lesson.canceled && lesson.isStudentPlan } }
|
||||||
day.forEachIndexed { index, lesson ->
|
.map { day ->
|
||||||
val intent = createIntent(student, lesson, day.getOrNull(index + 1))
|
day.forEachIndexed { index, lesson ->
|
||||||
|
val intent = createIntent(student, lesson, day.getOrNull(index + 1))
|
||||||
|
|
||||||
if (lesson.start > now()) {
|
if (lesson.start > now()) {
|
||||||
scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_UPCOMING, getUpcomingLessonTime(index, day, lesson))
|
scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_UPCOMING, getUpcomingLessonTime(index, day, lesson))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lesson.end > now()) {
|
if (lesson.end > now()) {
|
||||||
scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_CURRENT, lesson.start)
|
scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_CURRENT, lesson.start)
|
||||||
if (day.lastIndex == index) {
|
if (day.lastIndex == index) {
|
||||||
scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION, lesson.end)
|
scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION, lesson.end)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createIntent(student: Student, lesson: Timetable, nextLesson: Timetable?): Intent {
|
private fun createIntent(student: Student, lesson: Timetable, nextLesson: Timetable?): Intent {
|
||||||
|
@ -44,6 +44,7 @@ class SyncManager @Inject constructor(
|
|||||||
|
|
||||||
if (SDK_INT >= O) {
|
if (SDK_INT >= O) {
|
||||||
channels.forEach { it.create() }
|
channels.forEach { it.create() }
|
||||||
|
notificationManager.deleteNotificationChannel("lesson_channel")
|
||||||
notificationManager.deleteNotificationChannel("new_entries_channel")
|
notificationManager.deleteNotificationChannel("new_entries_channel")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ class UpcomingLessonsChannel @Inject constructor(
|
|||||||
) : Channel {
|
) : Channel {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val CHANNEL_ID = "lesson_channel"
|
const val CHANNEL_ID = "upcoming_lesson_channel"
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun create() {
|
override fun create() {
|
||||||
|
@ -3,8 +3,6 @@ package io.github.wulkanowy.services.sync.works
|
|||||||
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.Student
|
||||||
import io.github.wulkanowy.data.repositories.exam.ExamRepository
|
import io.github.wulkanowy.data.repositories.exam.ExamRepository
|
||||||
import io.github.wulkanowy.utils.monday
|
|
||||||
import io.github.wulkanowy.utils.sunday
|
|
||||||
import io.github.wulkanowy.utils.waitForResult
|
import io.github.wulkanowy.utils.waitForResult
|
||||||
import java.time.LocalDate.now
|
import java.time.LocalDate.now
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@ -12,6 +10,6 @@ import javax.inject.Inject
|
|||||||
class ExamWork @Inject constructor(private val examRepository: ExamRepository) : Work {
|
class ExamWork @Inject constructor(private val examRepository: ExamRepository) : Work {
|
||||||
|
|
||||||
override suspend fun doWork(student: Student, semester: Semester) {
|
override suspend fun doWork(student: Student, semester: Semester) {
|
||||||
examRepository.getExams(student, semester, now().monday, now().sunday, true).waitForResult()
|
examRepository.getExams(student, semester, now(), now(), true).waitForResult()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -164,8 +164,8 @@ class GradeStatisticsPresenter @Inject constructor(
|
|||||||
Status.SUCCESS -> {
|
Status.SUCCESS -> {
|
||||||
Timber.i("Loading grade stats result: Success")
|
Timber.i("Loading grade stats result: Success")
|
||||||
view?.run {
|
view?.run {
|
||||||
showEmpty(it.data!!.isEmpty())
|
showEmpty(it.data!!.isEmpty() || it.data.first().partial.isEmpty())
|
||||||
showContent(it.data.isNotEmpty())
|
showContent(it.data.isNotEmpty() && it.data.first().partial.isNotEmpty())
|
||||||
showErrorView(false)
|
showErrorView(false)
|
||||||
updateData(it.data, preferencesRepository.gradeColorTheme, preferencesRepository.showAllSubjectsOnStatisticsList)
|
updateData(it.data, preferencesRepository.gradeColorTheme, preferencesRepository.showAllSubjectsOnStatisticsList)
|
||||||
showSubjects(!preferencesRepository.showAllSubjectsOnStatisticsList)
|
showSubjects(!preferencesRepository.showAllSubjectsOnStatisticsList)
|
||||||
|
@ -6,6 +6,7 @@ import android.view.View.GONE
|
|||||||
import android.view.View.VISIBLE
|
import android.view.View.VISIBLE
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import io.github.wulkanowy.R
|
import io.github.wulkanowy.R
|
||||||
import io.github.wulkanowy.data.db.entities.Timetable
|
import io.github.wulkanowy.data.db.entities.Timetable
|
||||||
@ -44,8 +45,8 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
|||||||
|
|
||||||
private val timers = mutableMapOf<Int, Timer>()
|
private val timers = mutableMapOf<Int, Timer>()
|
||||||
|
|
||||||
private fun resetTimers() {
|
fun resetTimers() {
|
||||||
Timber.d("Timetable timers reset")
|
Timber.d("Timetable timers (${timers.size}) reset")
|
||||||
with(timers) {
|
with(timers) {
|
||||||
forEach { (_, timer) -> timer.cancel() }
|
forEach { (_, timer) -> timer.cancel() }
|
||||||
clear()
|
clear()
|
||||||
@ -69,11 +70,6 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
|
|
||||||
super.onDetachedFromRecyclerView(recyclerView)
|
|
||||||
resetTimers()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
||||||
val lesson = items[position]
|
val lesson = items[position]
|
||||||
|
|
||||||
@ -112,8 +108,12 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
|||||||
bindNormalDescription(binding, lesson)
|
bindNormalDescription(binding, lesson)
|
||||||
bindNormalColors(binding, lesson)
|
bindNormalColors(binding, lesson)
|
||||||
|
|
||||||
if (lesson.isStudentPlan && showTimers) timers[position] = timer(period = 1000) {
|
if (lesson.isStudentPlan && showTimers) {
|
||||||
root.post { updateTimeLeft(binding, lesson, position) }
|
timers[position] = timer(period = 1000) {
|
||||||
|
if (ViewCompat.isAttachedToWindow(root)) {
|
||||||
|
root.post { updateTimeLeft(binding, lesson, position) }
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// reset item on set changed
|
// reset item on set changed
|
||||||
timetableItemTimeUntil.visibility = GONE
|
timetableItemTimeUntil.visibility = GONE
|
||||||
|
@ -185,6 +185,7 @@ class TimetableFragment : BaseFragment<FragmentTimetableBinding>(R.layout.fragme
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
|
timetableAdapter.resetTimers()
|
||||||
presenter.onDetachView()
|
presenter.onDetachView()
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ private fun calculatePercentage(presence: Double, absence: Double): Double {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline val Attendance.description
|
inline val Attendance.description
|
||||||
get() = when (AttendanceCategory.valueOf(name)) {
|
get() = when (AttendanceCategory.getCategoryByName(name)) {
|
||||||
AttendanceCategory.PRESENCE -> R.string.attendance_present
|
AttendanceCategory.PRESENCE -> R.string.attendance_present
|
||||||
AttendanceCategory.ABSENCE_UNEXCUSED -> R.string.attendance_absence_unexcused
|
AttendanceCategory.ABSENCE_UNEXCUSED -> R.string.attendance_absence_unexcused
|
||||||
AttendanceCategory.ABSENCE_EXCUSED -> R.string.attendance_absence_excused
|
AttendanceCategory.ABSENCE_EXCUSED -> R.string.attendance_absence_excused
|
||||||
|
@ -89,7 +89,7 @@ fun <T> flowWithResourceIn(block: suspend () -> Flow<Resource<T>>) = flow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
emit(Resource.error(e))
|
emit(Resource.error<T>(e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,8 +13,7 @@ import java.time.Month
|
|||||||
import java.time.ZoneId
|
import java.time.ZoneId
|
||||||
import java.time.ZoneOffset
|
import java.time.ZoneOffset
|
||||||
import java.time.format.DateTimeFormatter.ofPattern
|
import java.time.format.DateTimeFormatter.ofPattern
|
||||||
import java.time.format.TextStyle.FULL_STANDALONE
|
import java.time.format.TextStyle.FULL
|
||||||
import java.time.format.TextStyle.*
|
|
||||||
import java.time.temporal.TemporalAdjusters.firstInMonth
|
import java.time.temporal.TemporalAdjusters.firstInMonth
|
||||||
import java.time.temporal.TemporalAdjusters.next
|
import java.time.temporal.TemporalAdjusters.next
|
||||||
import java.time.temporal.TemporalAdjusters.previous
|
import java.time.temporal.TemporalAdjusters.previous
|
||||||
@ -78,6 +77,12 @@ inline val LocalDate.nextOrSameSchoolDay: LocalDate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline val LocalDate.startExamsDay: LocalDate
|
||||||
|
get() = nextOrSameSchoolDay.monday
|
||||||
|
|
||||||
|
inline val LocalDate.endExamsDay: LocalDate
|
||||||
|
get() = nextOrSameSchoolDay.monday.plusWeeks(4).minusDays(1)
|
||||||
|
|
||||||
inline val LocalDate.previousOrSameSchoolDay: LocalDate
|
inline val LocalDate.previousOrSameSchoolDay: LocalDate
|
||||||
get() {
|
get() {
|
||||||
return when (dayOfWeek) {
|
return when (dayOfWeek) {
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
Wersja 0.20.3
|
Wersja 0.20.4
|
||||||
- naprawiliśmy opisy wpisów frekwencyjnych, które teraz będą już w całości po polsku
|
- dodaliśmy obsługę koszalińskiego dziennika
|
||||||
|
- poprawiliśmy synchronizację sprawdzianów
|
||||||
|
- wyłączyliśmy dźwięk powiadomienia przy włączonej opcji pokazywania nadchodzących lekcji w powiadomieniu
|
||||||
|
- poprawiliśmy problemy ze stabilnością we frekwencji i planie lekcji
|
||||||
|
|
||||||
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
<item>Lubelski Portal Oświatowy</item>
|
<item>Lubelski Portal Oświatowy</item>
|
||||||
<item>EduNet Miasta Tarnowa</item>
|
<item>EduNet Miasta Tarnowa</item>
|
||||||
<item>ResMan Rzeszów</item>
|
<item>ResMan Rzeszów</item>
|
||||||
|
<item>Platforma Edukacyjna Koszalina</item>
|
||||||
<item>Rawa Mazowiecka - Platforma vEdukacja</item>
|
<item>Rawa Mazowiecka - Platforma vEdukacja</item>
|
||||||
<item>Zduńska Wola - e-Urząd</item>
|
<item>Zduńska Wola - e-Urząd</item>
|
||||||
<item>Sieradz - Portal oświatowy</item>
|
<item>Sieradz - Portal oświatowy</item>
|
||||||
@ -27,6 +28,7 @@
|
|||||||
<item>https://edu.lublin.eu</item>
|
<item>https://edu.lublin.eu</item>
|
||||||
<item>https://umt.tarnow.pl</item>
|
<item>https://umt.tarnow.pl</item>
|
||||||
<item>https://resman.pl</item>
|
<item>https://resman.pl</item>
|
||||||
|
<item>https://eduportal.koszalin.pl</item>
|
||||||
<item>https://vulcan.net.pl/</item>
|
<item>https://vulcan.net.pl/</item>
|
||||||
<item>https://vulcan.net.pl/</item>
|
<item>https://vulcan.net.pl/</item>
|
||||||
<item>https://vulcan.net.pl/</item>
|
<item>https://vulcan.net.pl/</item>
|
||||||
@ -47,6 +49,7 @@
|
|||||||
<item>lublin</item>
|
<item>lublin</item>
|
||||||
<item>tarnow</item>
|
<item>tarnow</item>
|
||||||
<item>rzeszow</item>
|
<item>rzeszow</item>
|
||||||
|
<item>koszalin</item>
|
||||||
<item>rawamazowiecka</item>
|
<item>rawamazowiecka</item>
|
||||||
<item>zdunskawola</item>
|
<item>zdunskawola</item>
|
||||||
<item>sieradz</item>
|
<item>sieradz</item>
|
||||||
|
@ -171,4 +171,42 @@ class TimeExtensionTest {
|
|||||||
assertEquals(of(2019, 5, 1), of(2019, 5, 1).getLastSchoolDayIfHoliday(2018))
|
assertEquals(of(2019, 5, 1), of(2019, 5, 1).getLastSchoolDayIfHoliday(2018))
|
||||||
assertEquals(of(2018, 5, 1), of(2019, 5, 1).getLastSchoolDayIfHoliday(2017))
|
assertEquals(of(2018, 5, 1), of(2019, 5, 1).getLastSchoolDayIfHoliday(2017))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getExamsCutOffDates() {
|
||||||
|
with(of(2020, 9, 13)) {
|
||||||
|
assertEquals(of(2020, 9, 14), startExamsDay)
|
||||||
|
assertEquals(of(2020, 10, 11), endExamsDay)
|
||||||
|
}
|
||||||
|
|
||||||
|
with(of(2020, 9, 14)) {
|
||||||
|
assertEquals(of(2020, 9, 14), startExamsDay)
|
||||||
|
assertEquals(of(2020, 10, 11), endExamsDay)
|
||||||
|
}
|
||||||
|
|
||||||
|
with(of(2020, 9, 15)) {
|
||||||
|
assertEquals(of(2020, 9, 14), startExamsDay)
|
||||||
|
assertEquals(of(2020, 10, 11), endExamsDay)
|
||||||
|
}
|
||||||
|
|
||||||
|
with(of(2020, 9, 16)) {
|
||||||
|
assertEquals(of(2020, 9, 14), startExamsDay)
|
||||||
|
assertEquals(of(2020, 10, 11), endExamsDay)
|
||||||
|
}
|
||||||
|
|
||||||
|
with(of(2020, 9, 17)) {
|
||||||
|
assertEquals(of(2020, 9, 14), startExamsDay)
|
||||||
|
assertEquals(of(2020, 10, 11), endExamsDay)
|
||||||
|
}
|
||||||
|
|
||||||
|
with(of(2020, 9, 18)) {
|
||||||
|
assertEquals(of(2020, 9, 14), startExamsDay)
|
||||||
|
assertEquals(of(2020, 10, 11), endExamsDay)
|
||||||
|
}
|
||||||
|
|
||||||
|
with(of(2020, 9, 19)) {
|
||||||
|
assertEquals(of(2020, 9, 21), startExamsDay)
|
||||||
|
assertEquals(of(2020, 10, 18), endExamsDay)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
ext {
|
ext {
|
||||||
kotlin_version = '1.4.0'
|
kotlin_version = '1.4.10'
|
||||||
about_libraries = '8.3.0'
|
about_libraries = '8.3.0'
|
||||||
hilt_version = "2.28.3-alpha"
|
hilt_version = "2.29.1-alpha"
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
@ -15,7 +15,7 @@ buildscript {
|
|||||||
classpath 'com.android.tools.build:gradle:4.0.1'
|
classpath 'com.android.tools.build:gradle:4.0.1'
|
||||||
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
|
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
|
||||||
classpath 'com.google.gms:google-services:4.3.3'
|
classpath 'com.google.gms:google-services:4.3.3'
|
||||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.1'
|
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0'
|
||||||
classpath "com.github.triplet.gradle:play-publisher:2.7.5"
|
classpath "com.github.triplet.gradle:play-publisher:2.7.5"
|
||||||
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0"
|
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0"
|
||||||
classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0"
|
classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user