diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceDao.kt index 37226c5d..9b6759b2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceDao.kt @@ -19,8 +19,7 @@ interface AttendanceDao : BaseDao { end: LocalDate ): Flow> - @Query("SELECT * FROM Attendance WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :start AND date <= :end" + - " AND (presence OR excused)") + @Query("SELECT * FROM Attendance WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :start AND date <= :end AND (presence OR excused)") fun loadAllCensored( diaryId: Int, studentId: Int, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceRepository.kt index a9ecdb42..2a087ff9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceRepository.kt @@ -13,8 +13,14 @@ import io.github.wulkanowy.ui.modules.dashboard.DashboardItem import io.github.wulkanowy.utils.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.asFlow +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.flatMapConcat +import kotlinx.coroutines.flow.toList import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.withContext +import timber.log.Timber import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime @@ -50,20 +56,26 @@ class AttendanceRepository @Inject constructor( it.isEmpty() || forceRefresh || isExpired }, query = { - val badAttendanceHidden = preferencesRepository - .selectedHiddenSettingTiles - .contains(DashboardItem.HiddenSettingTile.BAD_ATTENDANCE) + val badAttendanceHidden = false if (badAttendanceHidden) { - attendanceDb.loadAllCensored(semester.diaryId, semester.studentId, start, end) + attendanceDb.loadAllCensored( + semester.diaryId, + semester.studentId, + start.monday, + end.sunday + ) } else { - attendanceDb.loadAll(semester.diaryId, semester.studentId, start, end) + attendanceDb.loadAll( + semester.diaryId, + semester.studentId, + start.monday, + end.sunday + ) } }, fetch = { - val badAttendanceHidden = preferencesRepository - .selectedHiddenSettingTiles - .contains(DashboardItem.HiddenSettingTile.BAD_ATTENDANCE) + val badAttendanceHidden = false val lessons = withContext(Dispatchers.IO) { timetableDb.load( @@ -71,17 +83,13 @@ class AttendanceRepository @Inject constructor( ) } - val attendance = sdk.init(student) + sdk.init(student) .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) .getAttendance(start.monday, end.sunday) - - val censoredAttendance = if (badAttendanceHidden) { - attendance.filter { it.presence || it.excused } - } else { - attendance - } - - censoredAttendance.mapToEntities(semester, lessons) + .filter { attendance -> + !badAttendanceHidden || + (attendance.presence || attendance.excused) + }.mapToEntities(semester, lessons) }, saveFetchResult = { old, new -> attendanceDb.deleteAll(old uniqueSubtract new) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryAdapter.kt index a2b6abfb..70c97740 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryAdapter.kt @@ -5,17 +5,25 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.AttendanceSummary +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.ItemAttendanceSummaryBinding import io.github.wulkanowy.databinding.ScrollableHeaderAttendanceSummaryBinding +import io.github.wulkanowy.ui.modules.dashboard.DashboardItem import io.github.wulkanowy.utils.calculatePercentage import io.github.wulkanowy.utils.getFormattedName import java.time.Month import java.util.Locale import javax.inject.Inject -class AttendanceSummaryAdapter @Inject constructor() : +class AttendanceSummaryAdapter @Inject constructor( + private val preferencesRepository: PreferencesRepository +) : RecyclerView.Adapter() { + private val fake = preferencesRepository + .selectedHiddenSettingTiles + .contains(DashboardItem.HiddenSettingTile.ATTENDANCE) + private enum class ViewType(val id: Int) { HEADER(1), ITEM(2) @@ -48,7 +56,7 @@ class AttendanceSummaryAdapter @Inject constructor() : } private fun bindHeaderViewHolder(binding: ScrollableHeaderAttendanceSummaryBinding) { - binding.attendanceSummaryScrollableHeaderPercentage.text = formatPercentage(items.calculatePercentage()) + binding.attendanceSummaryScrollableHeaderPercentage.text = formatPercentage(items.calculatePercentage(fake)) } private fun bindItemViewHolder(binding: ItemAttendanceSummaryBinding, position: Int) { @@ -60,8 +68,8 @@ class AttendanceSummaryAdapter @Inject constructor() : else -> item.month.getFormattedName() } attendanceSummaryPercentage.text = when (position) { - -1 -> formatPercentage(items.calculatePercentage()) - else -> formatPercentage(item.calculatePercentage()) + -1 -> formatPercentage(items.calculatePercentage(fake)) + else -> formatPercentage(item.calculatePercentage(fake)) } attendanceSummaryPresent.text = item.presence.toString() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItem.kt index 7331b916..30bf9480 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItem.kt @@ -151,7 +151,8 @@ sealed class DashboardItem(val type: Type) { enum class HiddenSettingTile { BAD_GRADES, BAD_ATTENDANCE, - NOTES + NOTES, + ATTENDANCE, } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardPresenter.kt index ae451ae1..140544c8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardPresenter.kt @@ -120,14 +120,27 @@ class DashboardPresenter @Inject constructor( dashboardItemLoadedList.find { it is DashboardItem.HorizontalGroup } as DashboardItem.HorizontalGroup? if (horizontalGroup != null) { + val fakeAttendance = preferencesRepository + .selectedHiddenSettingTiles + .contains(DashboardItem.HiddenSettingTile.ATTENDANCE) + val isLuckyNumberToLoad = DashboardItem.Tile.LUCKY_NUMBER in tilesToLoad val isMessagesToLoad = DashboardItem.Tile.MESSAGES in tilesToLoad val isAttendanceToLoad = DashboardItem.Tile.ATTENDANCE in tilesToLoad val horizontalGroupIndex = dashboardItemLoadedList.indexOf(horizontalGroup) + // Fake 100% attendance if tweak is enabled val newHorizontalGroup = horizontalGroup.copy( - attendancePercentage = horizontalGroup.attendancePercentage.takeIf { isAttendanceToLoad }, + attendancePercentage = if (fakeAttendance) { + DashboardItem.HorizontalGroup.Cell( + data = 100.0, + error = false, + isLoading = false, + ) + } else { + horizontalGroup.attendancePercentage.takeIf { isAttendanceToLoad } + }, unreadMessagesCount = horizontalGroup.unreadMessagesCount.takeIf { isMessagesToLoad }, luckyNumber = horizontalGroup.luckyNumber.takeIf { isLuckyNumberToLoad } ) @@ -232,6 +245,10 @@ class DashboardPresenter @Inject constructor( private fun loadHorizontalGroup(student: Student, forceRefresh: Boolean) { flow { + val fake = preferencesRepository + .selectedHiddenSettingTiles + .contains(DashboardItem.HiddenSettingTile.ATTENDANCE) + val selectedTiles = preferencesRepository.selectedDashboardTiles val flowSuccess = flowOf(Resource.Success(null)) @@ -283,7 +300,7 @@ class DashboardPresenter @Inject constructor( } else null }, attendancePercentage = DashboardItem.HorizontalGroup.Cell( - data = attendanceResource.dataOrNull?.calculatePercentage(), + data = attendanceResource.dataOrNull?.calculatePercentage(fake), error = attendanceResource.errorOrNull != null, isLoading = attendanceResource is Resource.Loading, ), diff --git a/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt index 397c9595..d20f991d 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt @@ -19,10 +19,18 @@ private inline val AttendanceSummary.allAbsences: Double inline val Attendance.isExcusableOrNotExcused: Boolean get() = (excusable || ((absence || lateness) && !excused)) && excuseStatus == null -fun AttendanceSummary.calculatePercentage() = calculatePercentage(allPresences, allAbsences) +fun AttendanceSummary.calculatePercentage(fake: Boolean = false) = if (fake) { + 100.0 +} else { + calculatePercentage(allPresences, allAbsences) +} -fun List.calculatePercentage(): Double { - return calculatePercentage(sumOf { it.allPresences }, sumOf { it.allAbsences }) +fun List.calculatePercentage(fake: Boolean = false): Double { + return if (fake) { + 100.0 + } else { + calculatePercentage(sumOf { it.allPresences }, sumOf { it.allAbsences }) + } } private fun calculatePercentage(presence: Double, absence: Double): Double { diff --git a/app/src/main/res/values-cs/preferences_values.xml b/app/src/main/res/values-cs/preferences_values.xml index b6759870..e1a3956b 100644 --- a/app/src/main/res/values-cs/preferences_values.xml +++ b/app/src/main/res/values-cs/preferences_values.xml @@ -72,5 +72,6 @@ Špatné hodnocení Špatná účast Poznámky + Falešná 100% účast diff --git a/app/src/main/res/values-da-rDK/preferences_values.xml b/app/src/main/res/values-da-rDK/preferences_values.xml index ff09cdba..c71d83c6 100644 --- a/app/src/main/res/values-da-rDK/preferences_values.xml +++ b/app/src/main/res/values-da-rDK/preferences_values.xml @@ -71,5 +71,6 @@ Bad grades Bad attendance Notes + Fake 100% attendance diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 17ed6f7c..309f56c5 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -71,5 +71,6 @@ Schlechte Noten Schlechte Anwesenheit Notizen + Vorgetäuschte 100-prozentige Anwesenheit diff --git a/app/src/main/res/values-es-rES/preferences_values.xml b/app/src/main/res/values-es-rES/preferences_values.xml index ff09cdba..c71d83c6 100644 --- a/app/src/main/res/values-es-rES/preferences_values.xml +++ b/app/src/main/res/values-es-rES/preferences_values.xml @@ -71,5 +71,6 @@ Bad grades Bad attendance Notes + Fake 100% attendance diff --git a/app/src/main/res/values-it-rIT/preferences_values.xml b/app/src/main/res/values-it-rIT/preferences_values.xml index ff09cdba..c71d83c6 100644 --- a/app/src/main/res/values-it-rIT/preferences_values.xml +++ b/app/src/main/res/values-it-rIT/preferences_values.xml @@ -71,5 +71,6 @@ Bad grades Bad attendance Notes + Fake 100% attendance diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index e00681b7..8547e4f5 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -71,5 +71,6 @@ Słabe oceny Słaba frekwencja Uwagi + Fałszywa 100% frekwencja diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index 48c624eb..b900f2f9 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -71,5 +71,6 @@ Плохие оценки Плохая посещаемость Примечания + Фейковая 100% посещаемость diff --git a/app/src/main/res/values-sk/preferences_values.xml b/app/src/main/res/values-sk/preferences_values.xml index 412a5429..244fb99a 100644 --- a/app/src/main/res/values-sk/preferences_values.xml +++ b/app/src/main/res/values-sk/preferences_values.xml @@ -71,5 +71,6 @@ Zlé známky Zlá účasť Poznámky + Falošná 100% účasť diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index eaf3da19..a1968b3e 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -71,5 +71,6 @@ Погані оцінки Погана відвідуваність Примітки + Фальшива 100% явка diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index efc7fee0..bac474dc 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -161,10 +161,12 @@ Bad grades Bad attendance Notes + Fake 100% attendance BAD_GRADES BAD_ATTENDANCE NOTES + ATTENDANCE