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 c6c255a1..37226c5d 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 @@ -18,4 +18,13 @@ interface AttendanceDao : BaseDao { start: LocalDate, 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)") + fun loadAllCensored( + diaryId: Int, + studentId: Int, + start: LocalDate, + end: LocalDate + ): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDao.kt index b0fad647..3d0cf15f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDao.kt @@ -10,6 +10,10 @@ import javax.inject.Singleton @Dao interface GradeDao : BaseDao { - @Query("SELECT * FROM Grades WHERE semester_id = :semesterId AND student_id = :studentId AND entry NOT IN ('1', '1+', '2', '2-', '2+')") + @Query("SELECT * FROM Grades WHERE semester_id = :semesterId AND student_id = :studentId") fun loadAll(semesterId: Int, studentId: Int): Flow> + + @Query("SELECT * FROM Grades WHERE semester_id = :semesterId AND student_id = :studentId " + + "AND entry NOT IN ('1', '1+', '2', '2+', '2-')") + fun loadAllCensored(semesterId: Int, studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt index 3d656c30..972ef3df 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt @@ -9,8 +9,9 @@ import javax.inject.Singleton @Singleton @Dao interface NoteDao : BaseDao { - - // Disabled notes - @Query("SELECT * FROM Notes WHERE student_id = :studentId AND 1 != 1") + @Query("SELECT * FROM Notes WHERE student_id = :studentId") fun loadAll(studentId: Int): Flow> + + @Query("SELECT * FROM Notes WHERE student_id = :studentId AND 1 != 1") + fun pretendLoadingAll(studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/AppTheme.kt b/app/src/main/java/io/github/wulkanowy/data/enums/AppTheme.kt index 438f0732..acff9d2e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/enums/AppTheme.kt +++ b/app/src/main/java/io/github/wulkanowy/data/enums/AppTheme.kt @@ -7,6 +7,6 @@ enum class AppTheme(val value: String) { BLACK("black"); companion object { - fun getByValue(value: String) = values().find { it.value == value } ?: LIGHT + fun getByValue(value: String) = entries.find { it.value == value } ?: LIGHT } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/GradeColorTheme.kt b/app/src/main/java/io/github/wulkanowy/data/enums/GradeColorTheme.kt index 24b095d0..48b81670 100644 --- a/app/src/main/java/io/github/wulkanowy/data/enums/GradeColorTheme.kt +++ b/app/src/main/java/io/github/wulkanowy/data/enums/GradeColorTheme.kt @@ -8,6 +8,6 @@ enum class GradeColorTheme(val value: String) : Serializable { GRADE_COLOR("grade_color"); companion object { - fun getByValue(value: String) = values().find { it.value == value } ?: VULCAN + fun getByValue(value: String) = entries.find { it.value == value } ?: VULCAN } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/GradeExpandMode.kt b/app/src/main/java/io/github/wulkanowy/data/enums/GradeExpandMode.kt index 96e4a174..f99fe7a8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/enums/GradeExpandMode.kt +++ b/app/src/main/java/io/github/wulkanowy/data/enums/GradeExpandMode.kt @@ -6,6 +6,6 @@ enum class GradeExpandMode(val value: String) { ALWAYS_EXPANDED("always"); companion object { - fun getByValue(value: String) = values().find { it.value == value } ?: ONE + fun getByValue(value: String) = entries.find { it.value == value } ?: ONE } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/GradeSortingMode.kt b/app/src/main/java/io/github/wulkanowy/data/enums/GradeSortingMode.kt index a7aa4cc2..e2872728 100644 --- a/app/src/main/java/io/github/wulkanowy/data/enums/GradeSortingMode.kt +++ b/app/src/main/java/io/github/wulkanowy/data/enums/GradeSortingMode.kt @@ -6,6 +6,6 @@ enum class GradeSortingMode(val value: String) { AVERAGE("average"); companion object { - fun getByValue(value: String) = values().find { it.value == value } ?: ALPHABETIC + fun getByValue(value: String) = entries.find { it.value == value } ?: ALPHABETIC } } diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/TimetableMode.kt b/app/src/main/java/io/github/wulkanowy/data/enums/TimetableMode.kt index 9e294ad7..b2eeec38 100644 --- a/app/src/main/java/io/github/wulkanowy/data/enums/TimetableMode.kt +++ b/app/src/main/java/io/github/wulkanowy/data/enums/TimetableMode.kt @@ -6,6 +6,6 @@ enum class TimetableMode(val value: String) { SMALL_OTHER_GROUP("small"); companion object { - fun getByValue(value: String) = values().find { it.value == value } ?: ONLY_CURRENT_GROUP + fun getByValue(value: String) = entries.find { it.value == value } ?: ONLY_CURRENT_GROUP } -} \ No newline at end of file +} 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 3afb9907..a9ecdb42 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 @@ -9,6 +9,7 @@ import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Absent +import io.github.wulkanowy.ui.modules.dashboard.DashboardItem import io.github.wulkanowy.utils.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow @@ -26,8 +27,8 @@ class AttendanceRepository @Inject constructor( private val timetableDb: TimetableDao, private val sdk: Sdk, private val refreshHelper: AutoRefreshHelper, + private val preferencesRepository: PreferencesRepository ) { - private val saveFetchResultMutex = Mutex() private val cacheKey = "attendance" @@ -49,18 +50,38 @@ class AttendanceRepository @Inject constructor( it.isEmpty() || forceRefresh || isExpired }, query = { - attendanceDb.loadAll(semester.diaryId, semester.studentId, start.monday, end.sunday) + val badAttendanceHidden = preferencesRepository + .selectedHiddenSettingTiles + .contains(DashboardItem.HiddenSettingTile.BAD_ATTENDANCE) + + if (badAttendanceHidden) { + attendanceDb.loadAllCensored(semester.diaryId, semester.studentId, start, end) + } else { + attendanceDb.loadAll(semester.diaryId, semester.studentId, start, end) + } }, fetch = { + val badAttendanceHidden = preferencesRepository + .selectedHiddenSettingTiles + .contains(DashboardItem.HiddenSettingTile.BAD_ATTENDANCE) + val lessons = withContext(Dispatchers.IO) { timetableDb.load( semester.diaryId, semester.studentId, start.monday, end.sunday ) } - sdk.init(student) + + val attendance = sdk.init(student) .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) .getAttendance(start.monday, end.sunday) - .mapToEntities(semester, lessons) + + val censoredAttendance = if (badAttendanceHidden) { + attendance.filter { it.presence || it.excused } + } else { + attendance + } + + censoredAttendance.mapToEntities(semester, lessons) }, saveFetchResult = { old, new -> attendanceDb.deleteAll(old uniqueSubtract new) @@ -79,7 +100,15 @@ class AttendanceRepository @Inject constructor( start: LocalDate, end: LocalDate ): Flow> { - return attendanceDb.loadAll(semester.diaryId, semester.studentId, start, end) + val badAttendanceHidden = preferencesRepository + .selectedHiddenSettingTiles + .contains(DashboardItem.HiddenSettingTile.BAD_ATTENDANCE) + + return if (badAttendanceHidden) { + attendanceDb.loadAllCensored(semester.diaryId, semester.studentId, start, end) + } else { + attendanceDb.loadAll(semester.diaryId, semester.studentId, start, end) + } } suspend fun updateTimetable(timetable: List) { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeRepository.kt index f5f895d8..8b80d47d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeRepository.kt @@ -9,11 +9,13 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.ui.modules.dashboard.DashboardItem import io.github.wulkanowy.utils.* import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.sync.Mutex +import timber.log.Timber import java.time.Instant import javax.inject.Inject import javax.inject.Singleton @@ -24,12 +26,25 @@ class GradeRepository @Inject constructor( private val gradeSummaryDb: GradeSummaryDao, private val sdk: Sdk, private val refreshHelper: AutoRefreshHelper, + private val preferencesRepository: PreferencesRepository ) { - private val saveFetchResultMutex = Mutex() private val cacheKey = "grade" + private fun loadGrades(semesterId: Int, studentId: Int): Flow> { + val badGradesHidden = preferencesRepository + .selectedHiddenSettingTiles + .contains(DashboardItem.HiddenSettingTile.BAD_GRADES) + + Timber.i("Load grades for semester $semesterId student $studentId / $badGradesHidden") + return if (badGradesHidden) { + gradeDb.loadAllCensored(semesterId, studentId) + } else { + gradeDb.loadAll(semesterId, studentId) + } + } + fun getGrades( student: Student, semester: Semester, @@ -46,16 +61,26 @@ class GradeRepository @Inject constructor( details.isEmpty() || summaries.isEmpty() || forceRefresh || isExpired }, query = { - val detailsFlow = gradeDb.loadAll(semester.semesterId, semester.studentId) + val detailsFlow = loadGrades(semester.semesterId, semester.studentId) val summaryFlow = gradeSummaryDb.loadAll(semester.semesterId, semester.studentId) detailsFlow.combine(summaryFlow) { details, summaries -> details to summaries } }, fetch = { + val badGradesHidden = preferencesRepository + .selectedHiddenSettingTiles + .contains(DashboardItem.HiddenSettingTile.BAD_GRADES) + val (details, summary) = sdk.init(student) .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) .getGrades(semester.semesterId) - details.mapToEntities(semester) to summary.mapToEntities(semester) + val censoredDetails = if (badGradesHidden) { + details.filter { !listOf("1", "1+", "2", "2+", "2-").contains(it.entry) } + } else { + details + } + + censoredDetails.mapToEntities(semester) to summary.mapToEntities(semester) }, saveFetchResult = { (oldDetails, oldSummary), (newDetails, newSummary) -> refreshGradeDetails(student, oldDetails, newDetails, notify) @@ -115,13 +140,13 @@ class GradeRepository @Inject constructor( } fun getUnreadGrades(semester: Semester): Flow> { - return gradeDb.loadAll(semester.semesterId, semester.studentId).map { + return loadGrades(semester.semesterId, semester.studentId).map { it.filter { grade -> !grade.isRead } } } fun getGradesFromDatabase(semester: Semester): Flow> { - return gradeDb.loadAll(semester.semesterId, semester.studentId) + return loadGrades(semester.semesterId, semester.studentId) } fun getGradesPredictedFromDatabase(semester: Semester): Flow> { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/NoteRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/NoteRepository.kt index bb513d1c..057638fb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/NoteRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/NoteRepository.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.ui.modules.dashboard.DashboardItem import io.github.wulkanowy.utils.* import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -17,8 +18,8 @@ class NoteRepository @Inject constructor( private val noteDb: NoteDao, private val sdk: Sdk, private val refreshHelper: AutoRefreshHelper, + private val preferencesRepository: PreferencesRepository ) { - private val saveFetchResultMutex = Mutex() private val cacheKey = "note" @@ -30,14 +31,24 @@ class NoteRepository @Inject constructor( notify: Boolean = false, ) = networkBoundResource( mutex = saveFetchResultMutex, - isResultEmpty = { true }, + isResultEmpty = { it.isEmpty() }, shouldFetch = { val isExpired = refreshHelper.shouldBeRefreshed( getRefreshKey(cacheKey, semester) ) it.isEmpty() || forceRefresh || isExpired }, - query = { noteDb.loadAll(student.studentId) }, + query = { + val notesHidden = preferencesRepository + .selectedHiddenSettingTiles + .contains(DashboardItem.HiddenSettingTile.NOTES) + + if (notesHidden) { + noteDb.pretendLoadingAll(student.studentId) + } else { + noteDb.loadAll(student.studentId) + } + }, fetch = { listOf() }, saveFetchResult = { old, new -> noteDb.deleteAll(old uniqueSubtract new) @@ -53,7 +64,15 @@ class NoteRepository @Inject constructor( ) fun getNotesFromDatabase(student: Student): Flow> { - return noteDb.loadAll(student.studentId) + val notesHidden = preferencesRepository + .selectedHiddenSettingTiles + .contains(DashboardItem.HiddenSettingTile.NOTES) + + return if (notesHidden) { + noteDb.pretendLoadingAll(student.studentId) + } else { + noteDb.loadAll(student.studentId) + } } suspend fun updateNote(note: Note) { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt index 495415f9..74591bcb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import okhttp3.internal.notifyAll import java.time.Instant import java.util.* import javax.inject.Inject @@ -29,7 +30,6 @@ class PreferencesRepository @Inject constructor( private val flowSharedPref: FlowSharedPreferences, private val json: Json, ) { - val isShowPresent: Boolean get() = getBoolean( R.string.pref_key_attendance_present, @@ -267,6 +267,17 @@ class PreferencesRepository @Inject constructor( selectedDashboardTilesPreference.set(filteredValue) } + var selectedHiddenSettingTiles: List + get() = selectedHiddenSettingTilesPreference.get() + .map { DashboardItem.HiddenSettingTile.valueOf(it) } + set(value) { + val filteredValue = value + .map { it.name } + .toSet() + + selectedHiddenSettingTilesPreference.set(filteredValue) + } + private val selectedDashboardTilesPreference: Preference> get() { val defaultSet = @@ -276,6 +287,15 @@ class PreferencesRepository @Inject constructor( return flowSharedPref.getStringSet(prefKey, defaultSet) } + private val selectedHiddenSettingTilesPreference: Preference> + get() { + val defaultSet = + context.resources.getStringArray(R.array.pref_default_hidden_settings_tiles).toSet() + val prefKey = "hidden_settings_tiles" + + return flowSharedPref.getStringSet(prefKey, defaultSet) + } + var dismissedAdminMessageIds: List get() = sharedPref.getStringSet(PREF_KEY_ADMIN_DISMISSED_MESSAGE_IDS, emptySet()) .orEmpty() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt index f66479da..31cc058e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt @@ -5,17 +5,13 @@ import io.github.wulkanowy.data.* import io.github.wulkanowy.data.db.entities.Attendance 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.PreferencesRepository import io.github.wulkanowy.data.repositories.SemesterRepository 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.ErrorHandler import io.github.wulkanowy.utils.* -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach import timber.log.Timber import java.time.DayOfWeek @@ -32,7 +28,6 @@ class AttendancePresenter @Inject constructor( private val prefRepository: PreferencesRepository, private val analytics: AnalyticsHelper ) : BasePresenter(errorHandler, studentRepository) { - private var initialDate: LocalDate? = null private var isWeekendHasLessons: Boolean = false 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 d019dea6..7331b916 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 @@ -147,6 +147,12 @@ sealed class DashboardItem(val type: Type) { EXAMS, CONFERENCES, } + + enum class HiddenSettingTile { + BAD_GRADES, + BAD_ATTENDANCE, + NOTES + } } fun DashboardItem.Tile.toDashboardItemType() = when (this) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageMode.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageMode.kt index 1960c3df..3158bd0b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageMode.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageMode.kt @@ -6,6 +6,6 @@ enum class GradeAverageMode(val value: String) { BOTH_SEMESTERS("both_semesters"); companion object { - fun getByValue(value: String) = values().firstOrNull { it.value == value } ?: ONE_SEMESTER + fun getByValue(value: String) = entries.firstOrNull { it.value == value } ?: ONE_SEMESTER } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreAdapter.kt index 697eab33..23eaba7c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreAdapter.kt @@ -12,6 +12,8 @@ class MoreAdapter @Inject constructor() : RecyclerView.Adapter Unit = {} + var onLongClickListener: (moreItem: MoreItem) -> Unit = {} + override fun getItemCount() = items.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( @@ -27,6 +29,10 @@ class MoreAdapter @Inject constructor() : RecyclerView.Adapter(R.layout.fragment_more), override fun initView() { moreAdapter.onClickListener = presenter::onItemSelected + moreAdapter.onLongClickListener = presenter::onItemHold with(binding.moreRecycler) { layoutManager = LinearLayoutManager(context) @@ -73,4 +78,28 @@ class MoreFragment : BaseFragment(R.layout.fragment_more), presenter.onDetachView() super.onDestroyView() } + + override fun showHiddenSettings(data: List) { + val entries = requireContext().resources.getStringArray(R.array.hidden_settings_entries) + val values = requireContext().resources.getStringArray(R.array.hidden_settings_values) + val selectedItemsState = values.map { value -> data.any { it.name == value } } + + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.pref_hidden_settings_title) + .setMultiChoiceItems(entries, selectedItemsState.toBooleanArray()) { _, _, _ -> } + .setPositiveButton(android.R.string.ok) { dialog, _ -> + val selectedState = (dialog as AlertDialog).listView.checkedItemPositions + val selectedValues = values.filterIndexed { index, _ -> selectedState[index] } + + Timber.i("Selected hidden settings: $selectedValues") + presenter.onHiddenSettingsSelected(selectedValues) + } + .setNegativeButton(android.R.string.cancel) { _, _ -> } + .show() + } + + override fun restartApp() { + startActivity(MainActivity.getStartIntent(requireContext())) + requireActivity().finishAffinity() + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MorePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MorePresenter.kt index 0ebaf4c7..c81d4a1b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MorePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MorePresenter.kt @@ -6,19 +6,23 @@ import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.dashboard.DashboardItem +import okhttp3.internal.notify import timber.log.Timber import javax.inject.Inject class MorePresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, - preferencesRepository: PreferencesRepository + private val preferencesRepository: PreferencesRepository ) : BasePresenter(errorHandler, studentRepository) { private val moreAppMenuItem = preferencesRepository.appMenuItemOrder .sortedBy { it.order } .drop(4) + private val selectedHiddenSettingsTiles = preferencesRepository.selectedHiddenSettingTiles + override fun onAttachView(view: MoreView) { super.onAttachView(view) view.initView() @@ -32,6 +36,23 @@ class MorePresenter @Inject constructor( view?.openView(moreItem.destination) } + fun onItemHold(moreItem: MoreItem) { + Timber.i("More item hold") + + when (moreItem.destination) { + Destination.Settings -> view?.showHiddenSettings(selectedHiddenSettingsTiles) + else -> return + } + } + + fun onHiddenSettingsSelected(selectedItems: List) { + preferencesRepository.selectedHiddenSettingTiles = selectedItems.map { + DashboardItem.HiddenSettingTile.valueOf(it) + } + + view?.restartApp() + } + fun onViewReselected() { Timber.i("More view is reselected") view?.popView(2) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreView.kt index fbca97ed..ab2f1444 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreView.kt @@ -2,6 +2,7 @@ package io.github.wulkanowy.ui.modules.more import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.dashboard.DashboardItem interface MoreView : BaseView { @@ -12,4 +13,8 @@ interface MoreView : BaseView { fun popView(depth: Int) fun openView(destination: Destination) + + fun showHiddenSettings(data: List) + + fun restartApp() } diff --git a/app/src/main/res/values-cs/preferences_values.xml b/app/src/main/res/values-cs/preferences_values.xml index 1590c47a..b6759870 100644 --- a/app/src/main/res/values-cs/preferences_values.xml +++ b/app/src/main/res/values-cs/preferences_values.xml @@ -67,4 +67,10 @@ Zkoušky Setkání + + + Špatné hodnocení + Špatná účast + Poznámky + diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 3af494fa..fb3246c0 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -784,6 +784,7 @@ Známky Domů Viditelnost dlaždic + Tajná nastavení Frekvence Plán lekce Známky 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 5aff12de..ff09cdba 100644 --- a/app/src/main/res/values-da-rDK/preferences_values.xml +++ b/app/src/main/res/values-da-rDK/preferences_values.xml @@ -67,4 +67,9 @@ Exams Conferences + + Bad grades + Bad attendance + Notes + diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index a89b8376..962fbe45 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -694,6 +694,7 @@ Grades Dashboard Tiles visibility + Hidden settings Attendance Timetable Grades diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index d1001c74..17ed6f7c 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -67,4 +67,9 @@ Prüfungen Sitzungen + + Schlechte Noten + Schlechte Anwesenheit + Notizen + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4c9aa2d2..e01d3486 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -694,6 +694,7 @@ Noten Dashboard Sichtbarkeit der Kacheln + Geheime Einstellungen Schulbesuch Stundenplan Noten 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 5aff12de..ff09cdba 100644 --- a/app/src/main/res/values-es-rES/preferences_values.xml +++ b/app/src/main/res/values-es-rES/preferences_values.xml @@ -67,4 +67,9 @@ Exams Conferences + + Bad grades + Bad attendance + Notes + diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index a89b8376..962fbe45 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -694,6 +694,7 @@ Grades Dashboard Tiles visibility + Hidden settings Attendance Timetable Grades 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 5aff12de..ff09cdba 100644 --- a/app/src/main/res/values-it-rIT/preferences_values.xml +++ b/app/src/main/res/values-it-rIT/preferences_values.xml @@ -67,4 +67,9 @@ Exams Conferences + + Bad grades + Bad attendance + Notes + diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index a89b8376..962fbe45 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -694,6 +694,7 @@ Grades Dashboard Tiles visibility + Hidden settings Attendance Timetable Grades diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 2f2432e9..e00681b7 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -67,4 +67,9 @@ Sprawdziany Zebrania + + Słabe oceny + Słaba frekwencja + Uwagi + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 31b9ce32..9ad21d05 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -784,6 +784,7 @@ Oceny Start Widoczność kafelków + Sekretne ustawienia Frekwencja Plan lekcji Oceny diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index df3629c0..48c624eb 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -67,4 +67,9 @@ Тесты Встречи + + Плохие оценки + Плохая посещаемость + Примечания + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 89a94a59..bbf1005d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -784,6 +784,7 @@ Оценки Главная Видимость плиток + Секретные настройки Посещаемость Расписание Оценки diff --git a/app/src/main/res/values-sk/preferences_values.xml b/app/src/main/res/values-sk/preferences_values.xml index 6cd22154..412a5429 100644 --- a/app/src/main/res/values-sk/preferences_values.xml +++ b/app/src/main/res/values-sk/preferences_values.xml @@ -67,4 +67,9 @@ Skúšky Stretnutie + + Zlé známky + Zlá účasť + Poznámky + diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 3cde8152..f206744f 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -784,6 +784,7 @@ Známky Domov Viditeľnosť dlaždíc + Tajné nastavenia Frekvencia Plán lekcie Známky diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index c02efb54..eaf3da19 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -67,4 +67,9 @@ Тести Зустрічі + + Погані оцінки + Погана відвідуваність + Примітки + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 20a917aa..31267f84 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -784,6 +784,7 @@ Оцінки Головна Видимість плиток + Секретні налаштування Відвідуваність Розклад Оцінки diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 8e6fc7d6..2678362d 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -36,6 +36,9 @@ GRADES ANNOUNCEMENTS + + BAD_GRADES + false false false diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index f56707c8..efc7fee0 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -156,4 +156,15 @@ EXAMS CONFERENCES + + + Bad grades + Bad attendance + Notes + + + BAD_GRADES + BAD_ATTENDANCE + NOTES + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5cad09d0..853397ae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -773,6 +773,7 @@ Grades Dashboard Tiles visibility + Hidden settings Attendance Timetable Grades diff --git a/build.gradle b/build.gradle index 6a9d654d..295af980 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,8 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.20-Beta2" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.15" - classpath 'com.android.tools.build:gradle:8.2.0' + // NOTE: Version downgraded due to https://github.com/appwrite/sdk-for-android/issues/42. + classpath 'com.android.tools.build:gradle:8.1.1' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.4.0' classpath 'com.huawei.agconnect:agcp:1.9.1.301'