From 155f0cc3478c2cd5ad0f9a8bae6e306606440120 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2020 20:56:55 +0000 Subject: [PATCH 0001/1526] Bump threetenbp from 1.4.3 to 1.4.4 (#784) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 45d20f96d..60ce9da3d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -200,7 +200,7 @@ dependencies { testImplementation "junit:junit:4.13" testImplementation "io.mockk:mockk:$mockk" - testImplementation "org.threeten:threetenbp:1.4.3" + testImplementation "org.threeten:threetenbp:1.4.4" testImplementation "org.mockito:mockito-inline:3.3.3" androidTestImplementation "androidx.test:core:1.2.0" From 87af3da1ad9143a18d32c8c1dffaa59da8616f08 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2020 20:57:14 +0000 Subject: [PATCH 0002/1526] Bump threetenabp from 1.2.3 to 1.2.4 (#783) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 60ce9da3d..d3967cec9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -178,7 +178,7 @@ dependencies { implementation "io.reactivex.rxjava2:rxjava:2.2.19" implementation "com.google.code.gson:gson:2.8.6" - implementation "com.jakewharton.threetenabp:threetenabp:1.2.3" + implementation "com.jakewharton.threetenabp:threetenabp:1.2.4" implementation "com.jakewharton.timber:timber:4.7.1" implementation "at.favre.lib:slf4j-timber:1.0.1" implementation "fr.bipi.treessence:treessence:0.3.2" From 6fe62edd637fedb08fce9b87347729041667f5c2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2020 21:04:54 +0000 Subject: [PATCH 0003/1526] Bump firebase-inappmessaging-display-ktx from 19.0.5 to 19.0.6 (#786) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d3967cec9..bc9df9482 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,7 +187,7 @@ dependencies { implementation "io.coil-kt:coil:0.9.5" playImplementation 'com.google.firebase:firebase-analytics:17.3.0' - playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.5' + playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.6' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.5" playImplementation "com.google.firebase:firebase-messaging:20.1.0" playImplementation "com.crashlytics.sdk.android:crashlytics:2.10.1" From 5fba3d577546a02892462962788007b3f15f2e69 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2020 21:25:27 +0000 Subject: [PATCH 0004/1526] Bump firebase-inappmessaging-ktx from 19.0.5 to 19.0.6 (#782) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index bc9df9482..733d8d63f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -188,7 +188,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics:17.3.0' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.6' - playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.5" + playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.6" playImplementation "com.google.firebase:firebase-messaging:20.1.0" playImplementation "com.crashlytics.sdk.android:crashlytics:2.10.1" playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' From c6c2b1c6a344d67150be8cf7164f4985a1b8c39d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2020 14:40:12 +0000 Subject: [PATCH 0005/1526] Bump coil from 0.9.5 to 0.10.1 (#785) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 733d8d63f..6c5d79362 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -184,7 +184,7 @@ dependencies { implementation "fr.bipi.treessence:treessence:0.3.2" implementation "com.mikepenz:aboutlibraries-core:$about_libraries" implementation 'com.wdullaer:materialdatetimepicker:4.2.3' - implementation "io.coil-kt:coil:0.9.5" + implementation "io.coil-kt:coil:0.10.1" playImplementation 'com.google.firebase:firebase-analytics:17.3.0' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.6' From 17ac3cfd52f0577a6a2f24f6c634b395d95d75f8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 30 Apr 2020 22:40:38 +0000 Subject: [PATCH 0006/1526] Bump firebase-analytics from 17.3.0 to 17.4.0 (#787) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6c5d79362..17cc6d958 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -186,7 +186,7 @@ dependencies { implementation 'com.wdullaer:materialdatetimepicker:4.2.3' implementation "io.coil-kt:coil:0.10.1" - playImplementation 'com.google.firebase:firebase-analytics:17.3.0' + playImplementation 'com.google.firebase:firebase-analytics:17.4.0' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.6' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.6" playImplementation "com.google.firebase:firebase-messaging:20.1.0" From a1f864b35e85743d843ba2b20e06d2c18f8283e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 1 May 2020 12:54:01 +0200 Subject: [PATCH 0007/1526] Add importantForAutofill to login fields (#788) --- app/src/main/res/layout/fragment_login_advanced.xml | 2 ++ app/src/main/res/layout/fragment_login_form.xml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/src/main/res/layout/fragment_login_advanced.xml b/app/src/main/res/layout/fragment_login_advanced.xml index 55bc62ae3..65af0b543 100644 --- a/app/src/main/res/layout/fragment_login_advanced.xml +++ b/app/src/main/res/layout/fragment_login_advanced.xml @@ -118,6 +118,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:autofillHints="username|emailAddress" + android:importantForAutofill="yes" android:inputType="textEmailAddress" android:maxLines="1" tools:targetApi="o" /> @@ -151,6 +152,7 @@ android:autofillHints="password" android:imeActionLabel="@string/login_sign_in" android:imeOptions="actionDone" + android:importantForAutofill="yes" android:inputType="textPassword" android:maxLines="1" app:fontFamily="sans-serif" diff --git a/app/src/main/res/layout/fragment_login_form.xml b/app/src/main/res/layout/fragment_login_form.xml index ba261e095..e4a5fab78 100644 --- a/app/src/main/res/layout/fragment_login_form.xml +++ b/app/src/main/res/layout/fragment_login_form.xml @@ -134,6 +134,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:autofillHints="username|emailAddress" + android:importantForAutofill="yes" android:inputType="textEmailAddress" android:maxLines="1" tools:targetApi="o" /> @@ -167,6 +168,7 @@ android:autofillHints="password" android:imeActionLabel="@string/login_sign_in" android:imeOptions="actionDone" + android:importantForAutofill="yes" android:inputType="textPassword" android:maxLines="1" app:fontFamily="sans-serif" From 4a3b746d4894dc290bea7227aabec9d5f8b7a26f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 1 May 2020 17:38:19 +0200 Subject: [PATCH 0008/1526] Remove flexible adapter (#781) --- app/build.gradle | 11 +- .../java/io/github/wulkanowy/WulkanowyApp.kt | 3 - .../github/wulkanowy/data/pojos/AppCreator.kt | 3 - .../wulkanowy/data/pojos/Contributor.kt | 3 + .../appcreator/AppCreatorRepository.kt | 8 +- .../java/io/github/wulkanowy/di/AppModule.kt | 5 - .../ui/base/BaseExpandableAdapter.kt | 58 +++++ .../ui/base/WidgetConfigureAdapter.kt | 46 ++++ .../ui/modules/about/AboutAdapter.kt | 72 +++++++ .../ui/modules/about/AboutFragment.kt | 18 +- .../wulkanowy/ui/modules/about/AboutItem.kt | 56 ----- .../ui/modules/about/AboutPresenter.kt | 25 ++- .../ui/modules/about/AboutScrollableHeader.kt | 41 ---- .../wulkanowy/ui/modules/about/AboutView.kt | 2 +- .../about/contributor/ContributorAdapter.kt | 41 ++++ .../about/contributor/ContributorFragment.kt | 25 ++- .../about/contributor/ContributorItem.kt | 51 ----- .../about/contributor/ContributorPresenter.kt | 8 +- .../about/contributor/ContributorView.kt | 3 +- .../modules/about/license/LicenseAdapter.kt | 34 +++ .../modules/about/license/LicenseFragment.kt | 19 +- .../ui/modules/about/license/LicenseItem.kt | 44 ---- .../modules/about/license/LicensePresenter.kt | 10 +- .../ui/modules/about/license/LicenseView.kt | 2 +- .../ui/modules/account/AccountAdapter.kt | 46 ++++ .../ui/modules/account/AccountDialog.kt | 19 +- .../ui/modules/account/AccountItem.kt | 59 ------ .../ui/modules/account/AccountPresenter.kt | 40 ++-- .../ui/modules/account/AccountView.kt | 3 +- .../modules/attendance/AttendanceAdapter.kt | 74 ++++++- .../modules/attendance/AttendanceFragment.kt | 34 +-- .../ui/modules/attendance/AttendanceItem.kt | 97 --------- .../ui/modules/attendance/AttendanceModule.kt | 12 -- .../modules/attendance/AttendancePresenter.kt | 16 +- .../ui/modules/attendance/AttendanceView.kt | 2 +- .../summary/AttendanceSummaryAdapter.kt | 101 +++++++++ .../summary/AttendanceSummaryFragment.kt | 25 ++- .../summary/AttendanceSummaryItem.kt | 80 ------- .../summary/AttendanceSummaryPresenter.kt | 55 +---- .../AttendanceSummaryScrollableHeader.kt | 46 ---- .../summary/AttendanceSummaryView.kt | 5 +- .../wulkanowy/ui/modules/exam/ExamAdapter.kt | 65 ++++++ .../wulkanowy/ui/modules/exam/ExamFragment.kt | 31 +-- .../wulkanowy/ui/modules/exam/ExamHeader.kt | 52 ----- .../wulkanowy/ui/modules/exam/ExamItem.kt | 49 +---- .../ui/modules/exam/ExamPresenter.kt | 22 +- .../wulkanowy/ui/modules/exam/ExamView.kt | 2 +- .../grade/details/GradeDetailsAdapter.kt | 176 ++++++++++++++++ .../grade/details/GradeDetailsFragment.kt | 64 ++---- .../grade/details/GradeDetailsHeader.kt | 94 --------- .../GradeDetailsHeaderItemDecoration.kt | 38 ---- .../modules/grade/details/GradeDetailsItem.kt | 88 ++------ .../grade/details/GradeDetailsPresenter.kt | 112 ++++------ .../modules/grade/details/GradeDetailsView.kt | 23 +- .../grade/summary/GradeSummaryAdapter.kt | 85 ++++++++ .../grade/summary/GradeSummaryFragment.kt | 27 ++- .../modules/grade/summary/GradeSummaryItem.kt | 64 ------ .../grade/summary/GradeSummaryPresenter.kt | 39 +--- .../summary/GradeSummaryScrollableHeader.kt | 53 ----- .../modules/grade/summary/GradeSummaryView.kt | 3 +- .../ui/modules/homework/HomeworkAdapter.kt | 67 ++++++ .../ui/modules/homework/HomeworkFragment.kt | 31 +-- .../ui/modules/homework/HomeworkHeader.kt | 54 ----- .../ui/modules/homework/HomeworkItem.kt | 52 +---- .../ui/modules/homework/HomeworkPresenter.kt | 22 +- .../ui/modules/homework/HomeworkView.kt | 2 +- .../LoginStudentSelectAdapter.kt | 51 +++++ .../LoginStudentSelectFragment.kt | 18 +- .../studentselect/LoginStudentSelectItem.kt | 71 ------- .../LoginStudentSelectPresenter.kt | 22 +- .../studentselect/LoginStudentSelectView.kt | 3 +- .../LuckyNumberWidgetConfigureActivity.kt | 24 ++- .../LuckyNumberWidgetConfigureItem.kt | 60 ------ .../LuckyNumberWidgetConfigurePresenter.kt | 13 +- .../LuckyNumberWidgetConfigureView.kt | 3 +- .../wulkanowy/ui/modules/main/MainActivity.kt | 3 +- .../wulkanowy/ui/modules/main/MainModule.kt | 6 +- .../ui/modules/message/MessageItem.kt | 67 ------ .../modules/message/tab/MessageTabAdapter.kt | 53 +++++ .../modules/message/tab/MessageTabFragment.kt | 42 ++-- .../message/tab/MessageTabPresenter.kt | 20 +- .../ui/modules/message/tab/MessageTabView.kt | 10 +- .../mobiledevice/MobileDeviceAdapter.kt | 34 ++- .../mobiledevice/MobileDeviceFragment.kt | 84 ++++---- .../modules/mobiledevice/MobileDeviceItem.kt | 53 ----- .../mobiledevice/MobileDeviceModule.kt | 12 -- .../mobiledevice/MobileDevicePresenter.kt | 9 +- .../modules/mobiledevice/MobileDeviceView.kt | 12 +- .../wulkanowy/ui/modules/more/MoreAdapter.kt | 34 +++ .../wulkanowy/ui/modules/more/MoreFragment.kt | 18 +- .../wulkanowy/ui/modules/more/MoreItem.kt | 47 ----- .../ui/modules/more/MorePresenter.kt | 26 ++- .../wulkanowy/ui/modules/more/MoreView.kt | 2 +- .../wulkanowy/ui/modules/note/NoteAdapter.kt | 60 ++++++ .../wulkanowy/ui/modules/note/NoteFragment.kt | 41 ++-- .../wulkanowy/ui/modules/note/NoteItem.kt | 77 ------- .../ui/modules/note/NotePresenter.kt | 22 +- .../wulkanowy/ui/modules/note/NoteView.kt | 5 +- .../teacher/TeacherAdapter.kt | 40 ++++ .../teacher/TeacherFragment.kt | 33 ++- .../schoolandteachers/teacher/TeacherItem.kt | 59 ------ .../teacher/TeacherPresenter.kt | 1 - .../schoolandteachers/teacher/TeacherView.kt | 8 +- .../ui/modules/timetable/TimetableAdapter.kt | 199 ++++++++++++++++++ .../ui/modules/timetable/TimetableFragment.kt | 33 +-- .../ui/modules/timetable/TimetableItem.kt | 197 ----------------- .../modules/timetable/TimetablePresenter.kt | 23 +- .../ui/modules/timetable/TimetableView.kt | 2 +- .../completed/CompletedLessonItem.kt | 58 ----- .../completed/CompletedLessonsAdapter.kt | 45 ++++ .../completed/CompletedLessonsFragment.kt | 27 ++- .../completed/CompletedLessonsPresenter.kt | 15 +- .../completed/CompletedLessonsView.kt | 2 +- .../TimetableWidgetConfigureActivity.kt | 20 +- .../TimetableWidgetConfigureItem.kt | 59 ------ .../TimetableWidgetConfigurePresenter.kt | 17 +- .../TimetableWidgetConfigureView.kt | 3 +- .../ui/widgets/DividerItemDecoration.kt | 27 +++ .../wulkanowy/utils/ContextExtension.kt | 7 + .../utils/FlexibleAdapterExtension.kt | 11 - app/src/main/res/layout/dialog_account.xml | 3 +- app/src/main/res/layout/header_exam.xml | 3 +- .../main/res/layout/header_grade_details.xml | 154 +++++++------- app/src/main/res/layout/header_homework.xml | 3 +- app/src/main/res/layout/item_about.xml | 11 +- app/src/main/res/layout/item_account.xml | 28 +-- app/src/main/res/layout/item_attendance.xml | 12 +- .../res/layout/item_attendance_summary.xml | 25 +-- .../main/res/layout/item_completed_lesson.xml | 16 +- app/src/main/res/layout/item_contributor.xml | 25 ++- app/src/main/res/layout/item_exam.xml | 8 +- .../main/res/layout/item_grade_details.xml | 146 ++++++------- .../main/res/layout/item_grade_summary.xml | 12 +- app/src/main/res/layout/item_homework.xml | 2 +- app/src/main/res/layout/item_license.xml | 3 +- .../res/layout/item_login_student_select.xml | 23 +- app/src/main/res/layout/item_message.xml | 3 +- .../main/res/layout/item_mobile_device.xml | 7 +- app/src/main/res/layout/item_more.xml | 3 +- app/src/main/res/layout/item_note.xml | 2 +- app/src/main/res/layout/item_teacher.xml | 7 +- app/src/main/res/layout/item_timetable.xml | 63 +++--- .../main/res/layout/item_timetable_small.xml | 14 +- .../res/layout/scrollable_header_about.xml | 4 +- .../scrollable_header_attendance_summary.xml | 3 +- .../scrollable_header_grade_summary.xml | 6 +- .../LoginStudentSelectPresenterTest.kt | 4 +- 147 files changed, 2231 insertions(+), 2864 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/data/pojos/AppCreator.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/base/BaseExpandableAdapter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutItem.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutScrollableHeader.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorItem.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseItem.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceItem.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceModule.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryItem.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryScrollableHeader.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamHeader.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeader.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeaderItemDecoration.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryScrollableHeader.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkHeader.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectItem.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureItem.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageItem.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceItem.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceModule.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreItem.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteItem.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherItem.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonItem.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsAdapter.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureItem.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/widgets/DividerItemDecoration.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/utils/FlexibleAdapterExtension.kt diff --git a/app/build.gradle b/app/build.gradle index 17cc6d958..7c311dfc2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,6 +80,10 @@ android { } } + viewBinding { + enabled = true + } + lintOptions { disable 'HardwareIds' } @@ -118,7 +122,6 @@ ext { work_manager = "2.3.4" room = "2.2.5" dagger = "2.27" - // don't update https://github.com/ChuckerTeam/chucker/issues/242 chucker = "3.2.0" mockk = "1.9.2" } @@ -167,13 +170,11 @@ dependencies { implementation "com.squareup.inject:assisted-inject-annotations-dagger2:0.5.2" kapt "com.squareup.inject:assisted-inject-processor-dagger2:0.5.2" - implementation "eu.davidea:flexible-adapter:5.1.0" - implementation "eu.davidea:flexible-adapter-ui:1.0.0" implementation "com.aurelhubert:ahbottomnavigation:2.3.4" implementation "com.ncapdevi:frag-nav:3.3.0" - implementation "com.github.YarikSOffice:lingver:1.2.1" + implementation "com.github.YarikSOffice:lingver:1.2.2" - implementation "com.github.pwittchen:reactivenetwork-rx2:3.0.6" + implementation "com.github.pwittchen:reactivenetwork-rx2:3.0.8" implementation "io.reactivex.rxjava2:rxandroid:2.1.1" implementation "io.reactivex.rxjava2:rxjava:2.2.19" diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index 96ec7cb84..3fab98563 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -10,8 +10,6 @@ import com.jakewharton.threetenabp.AndroidThreeTen import com.yariksoffice.lingver.Lingver import dagger.android.AndroidInjector import dagger.android.support.DaggerApplication -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.utils.Log import fr.bipi.tressence.file.FileLoggerTree import io.github.wulkanowy.di.DaggerAppComponent import io.github.wulkanowy.services.sync.SyncWorkerFactory @@ -57,7 +55,6 @@ class WulkanowyApp : DaggerApplication(), Configuration.Provider { private fun initLogging() { if (appInfo.isDebug) { - FlexibleAdapter.enableLogs(Log.Level.DEBUG) Timber.plant(DebugLogTree()) Timber.plant(FileLoggerTree.Builder() .withFileName("wulkanowy.%g.log") diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/AppCreator.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/AppCreator.kt deleted file mode 100644 index d67aa2a7f..000000000 --- a/app/src/main/java/io/github/wulkanowy/data/pojos/AppCreator.kt +++ /dev/null @@ -1,3 +0,0 @@ -package io.github.wulkanowy.data.pojos - -class AppCreator(val displayName: String, val githubUsername: String) diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt new file mode 100644 index 000000000..e792bde46 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt @@ -0,0 +1,3 @@ +package io.github.wulkanowy.data.pojos + +class Contributor(val displayName: String, val githubUsername: String) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt index fa752ed29..6a0b2d32e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt @@ -2,18 +2,18 @@ package io.github.wulkanowy.data.repositories.appcreator import android.content.res.AssetManager import com.google.gson.Gson -import io.github.wulkanowy.data.pojos.AppCreator +import io.github.wulkanowy.data.pojos.Contributor import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class AppCreatorRepository @Inject constructor(private val assets: AssetManager) { - fun getAppCreators(): Single> { - return Single.fromCallable> { + fun getAppCreators(): Single> { + return Single.fromCallable> { Gson().fromJson( assets.open("contributors.json").bufferedReader().use { it.readText() }, - Array::class.java + Array::class.java ).toList() } } diff --git a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt index 4f5683850..db5ff59b3 100644 --- a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt @@ -5,8 +5,6 @@ import android.content.Context import com.yariksoffice.lingver.Lingver import dagger.Module import dagger.Provides -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.WulkanowyApp import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.SchedulersProvider @@ -23,9 +21,6 @@ internal class AppModule { @Provides fun provideSchedulersProvider() = SchedulersProvider() - @Provides - fun provideFlexibleAdapter() = FlexibleAdapter>(null, null, true) - @Singleton @Provides fun provideAppWidgetManager(context: Context): AppWidgetManager = AppWidgetManager.getInstance(context) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseExpandableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseExpandableAdapter.kt new file mode 100644 index 000000000..eee4625c9 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseExpandableAdapter.kt @@ -0,0 +1,58 @@ +package io.github.wulkanowy.ui.base + +import android.util.DisplayMetrics +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.LinearSmoothScroller +import androidx.recyclerview.widget.RecyclerView +import kotlin.math.max +import kotlin.math.min + +abstract class BaseExpandableAdapter : RecyclerView.Adapter() { + + companion object { + private const val MILLISECONDS_PER_INCH = 100f + private const val AUTO_SCROLL_DELAY = 150L + } + + private var recyclerView: RecyclerView? = null + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { + super.onAttachedToRecyclerView(recyclerView) + this.recyclerView = recyclerView + } + + override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { + super.onDetachedFromRecyclerView(recyclerView) + this.recyclerView = null + } + + // original: https://github.com/davideas/FlexibleAdapter/blob/5.1.0/flexible-adapter/src/main/java/eu/davidea/flexibleadapter/FlexibleAdapter.java#L4984-L5011 + protected fun scrollToHeaderWithSubItems(position: Int, subItemsCount: Int) { + val layoutManager = recyclerView!!.layoutManager as LinearLayoutManager + val firstVisibleItem = layoutManager.findFirstCompletelyVisibleItemPosition() + val lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition() + val itemsToShow = position + subItemsCount - lastVisibleItem + if (itemsToShow > 0) { + val scrollMax: Int = position - firstVisibleItem + val scrollMin = max(0, position + subItemsCount - lastVisibleItem) + val scrollBy = min(scrollMax, scrollMin) + val scrollTo = firstVisibleItem + scrollBy + scrollToPosition(scrollTo) + } else if (position < firstVisibleItem) { + scrollToPosition(position) + } + } + + private fun scrollToPosition(position: Int) { + recyclerView?.run { + postDelayed({ + layoutManager?.startSmoothScroll(object : LinearSmoothScroller(context) { + override fun getVerticalSnapPreference() = SNAP_TO_START + override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics) = MILLISECONDS_PER_INCH / displayMetrics.densityDpi + }.apply { + targetPosition = position + }) + }, AUTO_SCROLL_DELAY) + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt new file mode 100644 index 000000000..cefe6ed75 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt @@ -0,0 +1,46 @@ +package io.github.wulkanowy.ui.base + +import android.annotation.SuppressLint +import android.graphics.PorterDuff +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.ItemAccountBinding +import io.github.wulkanowy.utils.getThemeAttrColor +import javax.inject.Inject + +class WidgetConfigureAdapter @Inject constructor() : RecyclerView.Adapter() { + + var items = emptyList>() + + var onClickListener: (Student) -> Unit = {} + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemAccountBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val (student, isCurrent) = items[position] + + with(holder.binding) { + accountItemName.text = "${student.studentName} ${student.className}" + accountItemSchool.text = student.schoolName + + with(accountItemImage) { + val colorImage = if (isCurrent) context.getThemeAttrColor(R.attr.colorPrimary) + else context.getThemeAttrColor(R.attr.colorOnSurface, 153) + + setColorFilter(colorImage, PorterDuff.Mode.SRC_IN) + } + + root.setOnClickListener { onClickListener(student) } + } + } + + class ItemViewHolder(val binding: ItemAccountBinding) : RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutAdapter.kt new file mode 100644 index 000000000..35dec3b4f --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutAdapter.kt @@ -0,0 +1,72 @@ +package io.github.wulkanowy.ui.modules.about + +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.databinding.ItemAboutBinding +import io.github.wulkanowy.databinding.ScrollableHeaderAboutBinding +import javax.inject.Inject + +class AboutAdapter @Inject constructor() : RecyclerView.Adapter() { + + private enum class ViewType(val id: Int) { + ITEM_HEADER(1), + ITEM_ELEMENT(2) + } + + var items = emptyList>() + + var onClickListener: (name: String) -> Unit = {} + + override fun getItemCount() = items.size + 1 + + override fun getItemViewType(position: Int) = when (position) { + 0 -> ViewType.ITEM_HEADER.id + else -> ViewType.ITEM_ELEMENT.id + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + + return when (viewType) { + ViewType.ITEM_HEADER.id -> HeaderViewHolder(ScrollableHeaderAboutBinding.inflate(inflater, parent, false)) + ViewType.ITEM_ELEMENT.id -> ItemViewHolder(ItemAboutBinding.inflate(inflater, parent, false)) + else -> throw IllegalStateException() + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is HeaderViewHolder -> bindHeaderViewHolder(holder.binding) + is ItemViewHolder -> bindItemViewHolder(holder.binding, position - 1) + } + } + + private fun bindHeaderViewHolder(binding: ScrollableHeaderAboutBinding) { + with(binding.aboutScrollableHeaderIcon) { + setImageDrawable(ResourcesCompat.getDrawableForDensity( + context.resources, context.applicationInfo.icon, 640, null) + ) + } + } + + private fun bindItemViewHolder(binding: ItemAboutBinding, position: Int) { + val (title, summary, image) = items[position] + + with(binding) { + aboutItemImage.setImageDrawable(image) + aboutItemTitle.text = title + aboutItemSummary.text = summary + + root.setOnClickListener { onClickListener(title) } + } + } + + private class HeaderViewHolder(val binding: ScrollableHeaderAboutBinding) : + RecyclerView.ViewHolder(binding.root) + + private class ItemViewHolder(val binding: ItemAboutBinding) : + RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt index 5a32ac837..b2893c1e1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt @@ -5,9 +5,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.about.contributor.ContributorFragment @@ -19,7 +17,6 @@ import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.getCompatDrawable import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_about.* import javax.inject.Inject @@ -29,7 +26,7 @@ class AboutFragment : BaseFragment(), AboutView, MainView.TitledView { lateinit var presenter: AboutPresenter @Inject - lateinit var aboutAdapter: FlexibleAdapter> + lateinit var aboutAdapter: AboutAdapter @Inject lateinit var appInfo: AppInfo @@ -90,19 +87,18 @@ class AboutFragment : BaseFragment(), AboutView, MainView.TitledView { } override fun initView() { - aboutAdapter.setOnItemClickListener(presenter::onItemSelected) + aboutAdapter.onClickListener = presenter::onItemSelected with(aboutRecycler) { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = aboutAdapter } } - override fun updateData(header: AboutScrollableHeader, items: List) { + override fun updateData(data: List>) { with(aboutAdapter) { - removeAllScrollableHeaders() - addScrollableHeader(header) - updateDataSet(items) + items = data + notifyDataSetChanged() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutItem.kt deleted file mode 100644 index 29f1cd8c8..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutItem.kt +++ /dev/null @@ -1,56 +0,0 @@ -package io.github.wulkanowy.ui.modules.about - -import android.graphics.drawable.Drawable -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_about.* - -class AboutItem( - val title: String, - private val summary: String, - private val image: Drawable? -) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_about - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>) = ViewHolder(view, adapter) - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList) { - with(holder) { - aboutItemImage.setImageDrawable(image) - aboutItemTitle.text = title - aboutItemSummary.text = summary - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as AboutItem - - if (title != other.title) return false - if (summary != other.summary) return false - if (image != other.image) return false - - return true - } - - override fun hashCode(): Int { - var result = title.hashCode() - result = 31 * result + summary.hashCode() - result = 31 * result + (image?.hashCode() ?: 0) - return result - } - - class ViewHolder(view: View, adapter: FlexibleAdapter>) : FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View? get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt index 7e740b32b..27237ea6f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.about -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler @@ -23,10 +22,9 @@ class AboutPresenter @Inject constructor( loadData() } - fun onItemSelected(item: AbstractFlexibleItem<*>) { - if (item !is AboutItem) return + fun onItemSelected(name: String) { view?.run { - when (item.title) { + when (name) { versionRes?.first -> { Timber.i("Opening log viewer") openLogViewer() @@ -73,15 +71,16 @@ class AboutPresenter @Inject constructor( private fun loadData() { view?.run { - updateData(AboutScrollableHeader(), listOfNotNull( - versionRes?.let { (title, summary, image) -> AboutItem(title, summary, image) }, - creatorsRes?.let { (title, summary, image) -> AboutItem(title, summary, image) }, - feedbackRes?.let { (title, summary, image) -> AboutItem(title, summary, image) }, - faqRes?.let { (title, summary, image) -> AboutItem(title, summary, image) }, - discordRes?.let { (title, summary, image) -> AboutItem(title, summary, image) }, - homepageRes?.let { (title, summary, image) -> AboutItem(title, summary, image) }, - licensesRes?.let { (title, summary, image) -> AboutItem(title, summary, image) }, - privacyRes?.let { (title, summary, image) -> AboutItem(title, summary, image) })) + updateData(listOfNotNull( + versionRes, + creatorsRes, + feedbackRes, + faqRes, + discordRes, + homepageRes, + licensesRes, + privacyRes + )) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutScrollableHeader.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutScrollableHeader.kt deleted file mode 100644 index 07bb41249..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutScrollableHeader.kt +++ /dev/null @@ -1,41 +0,0 @@ -package io.github.wulkanowy.ui.modules.about - -import android.view.View -import androidx.core.content.res.ResourcesCompat -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.scrollable_header_about.* - -class AboutScrollableHeader : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.scrollable_header_about - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>) = ViewHolder(view, adapter) - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList) { - with(holder) { - val context = contentView.context - val drawable = ResourcesCompat.getDrawableForDensity(context.resources, context.applicationInfo.icon, 640, null) - - aboutScrollableHeaderIcon.setImageDrawable(drawable) - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - return true - } - - override fun hashCode() = javaClass.hashCode() - - class ViewHolder(view: View, adapter: FlexibleAdapter>) : FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View? get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt index 4bc0c3fe0..79b700ea3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt @@ -23,7 +23,7 @@ interface AboutView : BaseView { fun initView() - fun updateData(header: AboutScrollableHeader, items: List) + fun updateData(data: List>) fun openLogViewer() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorAdapter.kt new file mode 100644 index 000000000..215cd27db --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorAdapter.kt @@ -0,0 +1,41 @@ +package io.github.wulkanowy.ui.modules.about.contributor + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import coil.api.load +import coil.transform.RoundedCornersTransformation +import io.github.wulkanowy.data.pojos.Contributor +import io.github.wulkanowy.databinding.ItemContributorBinding +import javax.inject.Inject + +class ContributorAdapter @Inject constructor() : + RecyclerView.Adapter() { + + var items = emptyList() + + var onClickListener: (Contributor) -> Unit = {} + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemContributorBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val item = items[position] + + with(holder.binding) { + creatorItemName.text = item.displayName + creatorItemAvatar.load("https://github.com/${item.githubUsername}.png") { + transformations(RoundedCornersTransformation(8f)) + crossfade(true) + } + + root.setOnClickListener { onClickListener(item) } + } + } + + class ItemViewHolder(val binding: ItemContributorBinding) : + RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt index c181c3d38..2544836cb 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt @@ -6,15 +6,13 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.FlexibleItemDecoration -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R +import io.github.wulkanowy.data.pojos.Contributor import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.openInternetBrowser -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_creator.* import javax.inject.Inject @@ -24,7 +22,7 @@ class ContributorFragment : BaseFragment(), ContributorView, MainView.TitledView lateinit var presenter: ContributorPresenter @Inject - lateinit var creatorsAdapter: FlexibleAdapter> + lateinit var creatorsAdapter: ContributorAdapter override val titleStringId get() = R.string.contributors_title @@ -43,18 +41,19 @@ class ContributorFragment : BaseFragment(), ContributorView, MainView.TitledView override fun initView() { with(creatorRecycler) { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = creatorsAdapter - addItemDecoration(FlexibleItemDecoration(context) - .withDefaultDivider() - .withDrawDividerOnLastItem(false)) + addItemDecoration(DividerItemDecoration(context)) } - creatorsAdapter.setOnItemClickListener(presenter::onItemSelected) + creatorsAdapter.onClickListener = presenter::onItemSelected creatorSeeMore.setOnClickListener { presenter.onSeeMoreClick() } } - override fun updateData(data: List) { - creatorsAdapter.updateDataSet(data) + override fun updateData(data: List) { + with(creatorsAdapter) { + items = data + notifyDataSetChanged() + } } override fun openUserGithubPage(username: String) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorItem.kt deleted file mode 100644 index 844b5bd8d..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorItem.kt +++ /dev/null @@ -1,51 +0,0 @@ -package io.github.wulkanowy.ui.modules.about.contributor - -import android.view.View -import coil.api.load -import coil.transform.RoundedCornersTransformation -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.pojos.AppCreator -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_contributor.* - -class ContributorItem(val creator: AppCreator) : - AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_contributor - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>) = ViewHolder(view, adapter) - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList) { - with(holder) { - creatorItemName.text = creator.displayName - - creatorItemAvatar.load("https://github.com/${creator.githubUsername}.png") { - transformations(RoundedCornersTransformation(8f)) - crossfade(true) - } - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as ContributorItem - - if (creator != other.creator) return false - - return true - } - - override fun hashCode() = creator.hashCode() - - class ViewHolder(view: View, adapter: FlexibleAdapter>) : FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View? get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt index 721b25007..416a59ce5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt @@ -1,6 +1,6 @@ package io.github.wulkanowy.ui.modules.about.contributor -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import io.github.wulkanowy.data.pojos.Contributor import io.github.wulkanowy.data.repositories.appcreator.AppCreatorRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter @@ -21,9 +21,8 @@ class ContributorPresenter @Inject constructor( loadData() } - fun onItemSelected(item: AbstractFlexibleItem<*>) { - if (item !is ContributorItem) return - view?.openUserGithubPage(item.creator.githubUsername) + fun onItemSelected(contributor: Contributor) { + view?.openUserGithubPage(contributor.githubUsername) } fun onSeeMoreClick() { @@ -32,7 +31,6 @@ class ContributorPresenter @Inject constructor( private fun loadData() { disposable.add(appCreatorRepository.getAppCreators() - .map { it.map { creator -> ContributorItem(creator) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { view?.showProgress(false) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorView.kt index 18ec3a8ec..8007e4e3f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorView.kt @@ -1,12 +1,13 @@ package io.github.wulkanowy.ui.modules.about.contributor +import io.github.wulkanowy.data.pojos.Contributor import io.github.wulkanowy.ui.base.BaseView interface ContributorView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List) fun openUserGithubPage(username: String) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseAdapter.kt new file mode 100644 index 000000000..07025c09f --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseAdapter.kt @@ -0,0 +1,34 @@ +package io.github.wulkanowy.ui.modules.about.license + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.mikepenz.aboutlibraries.entity.Library +import io.github.wulkanowy.databinding.ItemLicenseBinding +import javax.inject.Inject + +class LicenseAdapter @Inject constructor() : RecyclerView.Adapter() { + + var items = emptyList() + + var onClickListener: (Library) -> Unit = {} + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemLicenseBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val item = items[position] + + with(holder.binding) { + licenseItemName.text = item.libraryName + licenseItemSummary.text = item.license?.licenseName?.takeIf { it.isNotBlank() } ?: item.libraryVersion + + root.setOnClickListener { onClickListener(item) } + } + } + + class ItemViewHolder(val binding: ItemLicenseBinding) : RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt index 2681680b1..d64c6225c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt @@ -8,16 +8,13 @@ import android.view.View.VISIBLE import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import androidx.core.text.parseAsHtml +import androidx.recyclerview.widget.LinearLayoutManager import com.mikepenz.aboutlibraries.Libs import com.mikepenz.aboutlibraries.entity.Library import dagger.Lazy -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainView -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_license.* import javax.inject.Inject @@ -27,7 +24,7 @@ class LicenseFragment : BaseFragment(), LicenseView, MainView.TitledView { lateinit var presenter: LicensePresenter @Inject - lateinit var licenseAdapter: FlexibleAdapter> + lateinit var licenseAdapter: LicenseAdapter @Inject lateinit var libs: Lazy @@ -53,15 +50,19 @@ class LicenseFragment : BaseFragment(), LicenseView, MainView.TitledView { } override fun initView() { + licenseAdapter.onClickListener = presenter::onItemSelected + with(licenseRecycler) { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = licenseAdapter } - licenseAdapter.setOnItemClickListener(presenter::onItemSelected) } - override fun updateData(data: List) { - licenseAdapter.updateDataSet(data) + override fun updateData(data: List) { + with(licenseAdapter) { + items = data + notifyDataSetChanged() + } } override fun openLicense(licenseHtml: String) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseItem.kt deleted file mode 100644 index 8dcb89224..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseItem.kt +++ /dev/null @@ -1,44 +0,0 @@ -package io.github.wulkanowy.ui.modules.about.license - -import android.view.View -import com.mikepenz.aboutlibraries.entity.Library -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_license.* - -class LicenseItem(val library: Library) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_license - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>) = ViewHolder(view, adapter) - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList) { - with(holder) { - licenseItemName.text = library.libraryName - licenseItemSummary.text = library.license?.licenseName?.takeIf { it.isNotBlank() } ?: library.libraryVersion - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as LicenseItem - - if (library != other.library) return false - - return true - } - - override fun hashCode() = library.hashCode() - - class ViewHolder(view: View, adapter: FlexibleAdapter>) : FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View? get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt index dc48b098b..d0f6d69e0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt @@ -1,6 +1,6 @@ package io.github.wulkanowy.ui.modules.about.license -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import com.mikepenz.aboutlibraries.entity.Library import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler @@ -20,14 +20,12 @@ class LicensePresenter @Inject constructor( loadData() } - fun onItemSelected(item: AbstractFlexibleItem<*>) { - if (item !is LicenseItem) return - view?.run { item.library.license?.licenseDescription?.let { openLicense(it) } } + fun onItemSelected(library: Library) { + view?.run { library.license?.licenseDescription?.let { openLicense(it) } } } private fun loadData() { - disposable.add(Single.fromCallable { view?.appLibraries } - .map { it.map { library -> LicenseItem(library) } } + disposable.add(Single.fromCallable { view?.appLibraries.orEmpty() } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnEvent { _, _ -> view?.showProgress(false) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseView.kt index 3939d3e80..0680dbb73 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseView.kt @@ -9,7 +9,7 @@ interface LicenseView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List) fun openLicense(licenseHtml: String) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt new file mode 100644 index 000000000..7df0ca378 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt @@ -0,0 +1,46 @@ +package io.github.wulkanowy.ui.modules.account + +import android.annotation.SuppressLint +import android.graphics.PorterDuff +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.ItemAccountBinding +import io.github.wulkanowy.utils.getThemeAttrColor +import javax.inject.Inject + +class AccountAdapter @Inject constructor() : RecyclerView.Adapter() { + + var items = emptyList() + + var onClickListener: (Student) -> Unit = {} + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemAccountBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val student = items[position] + + with(holder.binding) { + accountItemName.text = "${student.studentName} ${student.className}" + accountItemSchool.text = student.schoolName + + with(accountItemImage) { + val colorImage = if (student.isCurrent) context.getThemeAttrColor(R.attr.colorPrimary) + else context.getThemeAttrColor(R.attr.colorOnSurface, 153) + + setColorFilter(colorImage, PorterDuff.Mode.SRC_IN) + } + + root.setOnClickListener { onClickListener(student) } + } + } + + class ItemViewHolder(val binding: ItemAccountBinding) : RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt index cfff31c98..dc8cce928 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt @@ -7,13 +7,11 @@ import android.view.ViewGroup import android.widget.Toast import android.widget.Toast.LENGTH_LONG import androidx.appcompat.app.AlertDialog -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseDialogFragment import io.github.wulkanowy.ui.modules.login.LoginActivity -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.dialog_account.* import javax.inject.Inject @@ -23,7 +21,7 @@ class AccountDialog : BaseDialogFragment(), AccountView { lateinit var presenter: AccountPresenter @Inject - lateinit var accountAdapter: FlexibleAdapter> + lateinit var accountAdapter: AccountAdapter companion object { fun newInstance() = AccountDialog() @@ -44,18 +42,21 @@ class AccountDialog : BaseDialogFragment(), AccountView { } override fun initView() { - accountAdapter.setOnItemClickListener { presenter.onItemSelected(it) } + accountAdapter.onClickListener = presenter::onItemSelected accountDialogAdd.setOnClickListener { presenter.onAddSelected() } accountDialogRemove.setOnClickListener { presenter.onRemoveSelected() } accountDialogRecycler.apply { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = accountAdapter } } - override fun updateData(data: List) { - accountAdapter.updateDataSet(data) + override fun updateData(data: List) { + with(accountAdapter) { + items = data + notifyDataSetChanged() + } } override fun showError(text: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt deleted file mode 100644 index d3a3ee6a3..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt +++ /dev/null @@ -1,59 +0,0 @@ -package io.github.wulkanowy.ui.modules.account - -import android.annotation.SuppressLint -import android.graphics.PorterDuff -import android.view.View -import androidx.core.graphics.ColorUtils -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.getThemeAttrColor -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_account.* - -class AccountItem(val student: Student) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_account - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>) = ViewHolder(view, adapter) - - @SuppressLint("SetTextI18n") - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - val context = holder.contentView.context - - val colorImage = if (student.isCurrent) context.getThemeAttrColor(R.attr.colorPrimary) - else ColorUtils.setAlphaComponent(context.getThemeAttrColor(R.attr.colorOnSurface), 153) - - with(holder) { - accountItemName.text = "${student.studentName} ${student.className}" - accountItemSchool.text = student.schoolName - accountItemImage.setColorFilter(colorImage, PorterDuff.Mode.SRC_IN) - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as AccountItem - - if (student != other.student) return false - - return true - } - - override fun hashCode(): Int { - var result = student.hashCode() - result = 31 * result + student.id.toInt() - return result - } - - class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View? get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt index e9b4b81ee..3416a043f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt @@ -1,6 +1,6 @@ package io.github.wulkanowy.ui.modules.account -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.BasePresenter @@ -63,32 +63,29 @@ class AccountPresenter @Inject constructor( })) } - fun onItemSelected(item: AbstractFlexibleItem<*>) { - if (item is AccountItem) { - Timber.i("Select student item ${item.student.id}") - if (item.student.isCurrent) { - view?.dismissView() - } else { - Timber.i("Attempt to change a student") - disposable.add(studentRepository.switchStudent(item.student) - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { view?.dismissView() } - .subscribe({ - Timber.i("Change a student result: Success") - view?.recreateMainView() - }, { - Timber.i("Change a student result: An exception occurred") - errorHandler.dispatch(it) - })) - } + fun onItemSelected(student: Student) { + Timber.i("Select student item ${student.id}") + if (student.isCurrent) { + view?.dismissView() + } else { + Timber.i("Attempt to change a student") + disposable.add(studentRepository.switchStudent(student) + .subscribeOn(schedulers.backgroundThread) + .observeOn(schedulers.mainThread) + .doFinally { view?.dismissView() } + .subscribe({ + Timber.i("Change a student result: Success") + view?.recreateMainView() + }, { + Timber.i("Change a student result: An exception occurred") + errorHandler.dispatch(it) + })) } } private fun loadData() { Timber.i("Loading account data started") disposable.add(studentRepository.getSavedStudents(false) - .map { it.map { item -> AccountItem(item) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -100,4 +97,3 @@ class AccountPresenter @Inject constructor( })) } } - diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt index ede5023ba..abb9e1d27 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt @@ -1,12 +1,13 @@ package io.github.wulkanowy.ui.modules.account +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseView interface AccountView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List) fun dismissView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt index 75f998404..a63d5045a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt @@ -1,12 +1,80 @@ package io.github.wulkanowy.ui.modules.attendance -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.IFlexible +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.isVisible +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Attendance +import io.github.wulkanowy.data.repositories.attendance.SentExcuseStatus +import io.github.wulkanowy.databinding.ItemAttendanceBinding +import javax.inject.Inject -class AttendanceAdapter> : FlexibleAdapter(null, null, true) { +class AttendanceAdapter @Inject constructor() : + RecyclerView.Adapter() { + + var items = emptyList() var excuseActionMode: Boolean = false + var onClickListener: (Attendance) -> Unit = {} + var onExcuseCheckboxSelect: (attendanceItem: Attendance, checked: Boolean) -> Unit = { _, _ -> } + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemAttendanceBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val item = items[position] + + with(holder.binding) { + attendanceItemNumber.text = item.number.toString() + attendanceItemSubject.text = item.subject + attendanceItemDescription.text = item.name + attendanceItemAlert.visibility = item.run { if (absence && !excused) View.VISIBLE else View.INVISIBLE } + attendanceItemNumber.visibility = View.GONE + attendanceItemExcuseInfo.visibility = View.GONE + attendanceItemExcuseCheckbox.visibility = View.GONE + attendanceItemExcuseCheckbox.isChecked = false + attendanceItemExcuseCheckbox.setOnCheckedChangeListener { _, checked -> + onExcuseCheckboxSelect(item, checked) + } + + when (if (item.excuseStatus != null) SentExcuseStatus.valueOf(item.excuseStatus) else null) { + SentExcuseStatus.WAITING -> { + attendanceItemExcuseInfo.setImageResource(R.drawable.ic_excuse_waiting) + attendanceItemExcuseInfo.visibility = View.VISIBLE + attendanceItemAlert.visibility = View.INVISIBLE + } + SentExcuseStatus.DENIED -> { + attendanceItemExcuseInfo.setImageResource(R.drawable.ic_excuse_denied) + attendanceItemExcuseInfo.visibility = View.VISIBLE + } + else -> { + if (item.excusable && excuseActionMode) { + attendanceItemNumber.visibility = View.GONE + attendanceItemExcuseCheckbox.visibility = View.VISIBLE + } else { + attendanceItemNumber.visibility = View.VISIBLE + attendanceItemExcuseCheckbox.visibility = View.GONE + } + } + } + root.setOnClickListener { + onClickListener(item) + + with(attendanceItemExcuseCheckbox) { + if (excuseActionMode && isVisible) { + isChecked = !isChecked + } + } + } + } + } + + class ItemViewHolder(val binding: ItemAttendanceBinding) : RecyclerView.ViewHolder(binding.root) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 9969b1c78..31b0a3c29 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -13,19 +13,17 @@ import android.view.View.VISIBLE import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import androidx.appcompat.view.ActionMode +import androidx.recyclerview.widget.LinearLayoutManager import com.wdullaer.materialdatetimepicker.date.DatePickerDialog -import eu.davidea.flexibleadapter.common.FlexibleItemDecoration -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.attendance.summary.AttendanceSummaryFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.SchooldaysRangeLimiter import io.github.wulkanowy.utils.dpToPx -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.dialog_excuse.* import kotlinx.android.synthetic.main.fragment_attendance.* import org.threeten.bp.LocalDate @@ -38,7 +36,7 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie lateinit var presenter: AttendancePresenter @Inject - lateinit var attendanceAdapter: AttendanceAdapter> + lateinit var attendanceAdapter: AttendanceAdapter override val excuseSuccessString: String get() = getString(R.string.attendance_excuse_success) @@ -54,7 +52,7 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie override val titleStringId get() = R.string.attendance_title - override val isViewEmpty get() = attendanceAdapter.isEmpty + override val isViewEmpty get() = attendanceAdapter.items.isEmpty() override val currentStackSize get() = (activity as? MainActivity)?.currentStackSize @@ -102,15 +100,15 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie } override fun initView() { - attendanceAdapter.setOnItemClickListener(presenter::onAttendanceItemSelected) - attendanceAdapter.onExcuseCheckboxSelect = presenter::onExcuseCheckboxSelect + with(attendanceAdapter) { + onClickListener = presenter::onAttendanceItemSelected + onExcuseCheckboxSelect = presenter::onExcuseCheckboxSelect + } with(attendanceRecycler) { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = attendanceAdapter - addItemDecoration(FlexibleItemDecoration(context) - .withDefaultDivider() - .withDrawDividerOnLastItem(false)) + addItemDecoration(DividerItemDecoration(context)) } attendanceSwipe.setOnRefreshListener(presenter::onSwipeRefresh) @@ -135,8 +133,11 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie else false } - override fun updateData(data: List) { - attendanceAdapter.updateDataSet(data, true) + override fun updateData(data: List) { + with(attendanceAdapter) { + items = data + notifyDataSetChanged() + } } override fun updateNavigationDay(date: String) { @@ -144,7 +145,10 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie } override fun clearData() { - attendanceAdapter.clear() + with(attendanceAdapter) { + items = emptyList() + notifyDataSetChanged() + } } override fun resetView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceItem.kt deleted file mode 100644 index 7355aec2e..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceItem.kt +++ /dev/null @@ -1,97 +0,0 @@ -package io.github.wulkanowy.ui.modules.attendance - -import android.view.View -import android.view.View.GONE -import android.view.View.INVISIBLE -import android.view.View.VISIBLE -import androidx.core.view.isVisible -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Attendance -import io.github.wulkanowy.data.repositories.attendance.SentExcuseStatus -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_attendance.* - -class AttendanceItem(val attendance: Attendance) : - AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_attendance - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.apply { - attendanceItemNumber.text = attendance.number.toString() - attendanceItemSubject.text = attendance.subject - attendanceItemDescription.text = attendance.name - attendanceItemAlert.visibility = attendance.run { if (absence && !excused) VISIBLE else INVISIBLE } - attendanceItemNumber.visibility = GONE - attendanceItemExcuseInfo.visibility = GONE - attendanceItemExcuseCheckbox.visibility = GONE - attendanceItemExcuseCheckbox.isChecked = false - attendanceItemExcuseCheckbox.setOnCheckedChangeListener { _, checked -> - (adapter as AttendanceAdapter).onExcuseCheckboxSelect(attendance, checked) - } - - when (if (attendance.excuseStatus != null) SentExcuseStatus.valueOf(attendance.excuseStatus) else null) { - SentExcuseStatus.WAITING -> { - attendanceItemExcuseInfo.setImageResource(R.drawable.ic_excuse_waiting) - attendanceItemExcuseInfo.visibility = VISIBLE - attendanceItemAlert.visibility = INVISIBLE - } - SentExcuseStatus.DENIED -> { - attendanceItemExcuseInfo.setImageResource(R.drawable.ic_excuse_denied) - attendanceItemExcuseInfo.visibility = VISIBLE - } - else -> { - if (attendance.excusable && (adapter as AttendanceAdapter).excuseActionMode) { - attendanceItemNumber.visibility = GONE - attendanceItemExcuseCheckbox.visibility = VISIBLE - } else { - attendanceItemNumber.visibility = VISIBLE - attendanceItemExcuseCheckbox.visibility = GONE - } - } - } - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as AttendanceItem - - if (attendance != other.attendance) return false - - return true - } - - override fun hashCode(): Int { - var result = attendance.hashCode() - result = 31 * result + attendance.id.toInt() - return result - } - - class ViewHolder(view: View, val adapter: FlexibleAdapter<*>) : - FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View - get() = contentView - - override fun onClick(view: View?) { - super.onClick(view) - attendanceItemExcuseCheckbox.apply { - if ((adapter as AttendanceAdapter).excuseActionMode && isVisible) { - isChecked = !isChecked - } - } - } - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceModule.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceModule.kt deleted file mode 100644 index eb35fea1b..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceModule.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.github.wulkanowy.ui.modules.attendance - -import dagger.Module -import dagger.Provides -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem - -@Module -class AttendanceModule { - - @Provides - fun provideAttendanceFlexibleAdapter() = AttendanceAdapter>() -} 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 7fc044744..3a1fb0ceb 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 @@ -1,7 +1,6 @@ package io.github.wulkanowy.ui.modules.attendance import android.annotation.SuppressLint -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository @@ -111,11 +110,11 @@ class AttendancePresenter @Inject constructor( view?.finishActionMode() } - fun onAttendanceItemSelected(item: AbstractFlexibleItem<*>?) { + fun onAttendanceItemSelected(attendance: Attendance) { view?.apply { - if (item is AttendanceItem && !excuseActionMode) { - Timber.i("Select attendance item ${item.attendance.id}") - showAttendanceDialog(item.attendance) + if (!excuseActionMode) { + Timber.i("Select attendance item ${attendance.id}") + showAttendanceDialog(attendance) } } } @@ -197,9 +196,7 @@ class AttendancePresenter @Inject constructor( if (prefRepository.isShowPresent) list else list.filter { !it.presence } } - .delay(200, MILLISECONDS) - .map { items -> items.map { AttendanceItem(it) } } - .map { items -> items.sortedBy { it.attendance.number } } + .map { items -> items.sortedBy { it.number } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { @@ -216,7 +213,7 @@ class AttendancePresenter @Inject constructor( showEmpty(it.isEmpty()) showErrorView(false) showContent(it.isNotEmpty()) - showExcuseButton(it.any { item -> item.attendance.excusable }) + showExcuseButton(it.any { item -> item.excusable }) } analytics.logEvent("load_attendance", "items" to it.size, "force_refresh" to forceRefresh) }) { @@ -236,7 +233,6 @@ class AttendancePresenter @Inject constructor( attendanceRepository.excuseForAbsence(student, semester, toExcuseList, reason) } } - .delay(200, MILLISECONDS) .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt index 03e95053f..484070a2e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt @@ -18,7 +18,7 @@ interface AttendanceView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List) fun updateNavigationDay(date: String) 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 new file mode 100644 index 000000000..a6d4cf220 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryAdapter.kt @@ -0,0 +1,101 @@ +package io.github.wulkanowy.ui.modules.attendance.summary + +import android.view.LayoutInflater +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.databinding.ItemAttendanceSummaryBinding +import io.github.wulkanowy.databinding.ScrollableHeaderAttendanceSummaryBinding +import io.github.wulkanowy.utils.calculatePercentage +import io.github.wulkanowy.utils.getFormattedName +import org.threeten.bp.Month +import java.util.Locale +import javax.inject.Inject + +class AttendanceSummaryAdapter @Inject constructor() : + RecyclerView.Adapter() { + + private enum class ViewType(val id: Int) { + HEADER(1), + ITEM(2) + } + + var items = emptyList() + + override fun getItemCount() = items.size + 2 + + override fun getItemViewType(position: Int) = when (position) { + 0 -> ViewType.HEADER.id + else -> ViewType.ITEM.id + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + + return when (viewType) { + ViewType.HEADER.id -> HeaderViewHolder(ScrollableHeaderAttendanceSummaryBinding.inflate(inflater, parent, false)) + ViewType.ITEM.id -> ItemViewHolder(ItemAttendanceSummaryBinding.inflate(inflater, parent, false)) + else -> throw IllegalStateException() + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is HeaderViewHolder -> bindHeaderViewHolder(holder.binding) + is ItemViewHolder -> bindItemViewHolder(holder.binding, position - 2) + } + } + + private fun bindHeaderViewHolder(binding: ScrollableHeaderAttendanceSummaryBinding) { + binding.attendanceSummaryScrollableHeaderPercentage.text = formatPercentage(items.calculatePercentage()) + } + + private fun bindItemViewHolder(binding: ItemAttendanceSummaryBinding, position: Int) { + val item = if (position == -1) getTotalItem() else items[position] + + with(binding) { + attendanceSummaryMonth.text = when (position) { + -1 -> root.context.getString(R.string.attendance_summary_total) + else -> item.month.getFormattedName() + } + attendanceSummaryPercentage.text = when (position) { + -1 -> formatPercentage(items.calculatePercentage()) + else -> formatPercentage(item.calculatePercentage()) + } + + attendanceSummaryPresent.text = item.presence.toString() + attendanceSummaryAbsenceUnexcused.text = item.absence.toString() + attendanceSummaryAbsenceExcused.text = item.absenceExcused.toString() + attendanceSummaryAbsenceSchool.text = item.absenceForSchoolReasons.toString() + attendanceSummaryExemption.text = item.exemption.toString() + attendanceSummaryLatenessUnexcused.text = item.lateness.toString() + attendanceSummaryLatenessExcused.text = item.latenessExcused.toString() + } + } + + private fun getTotalItem() = AttendanceSummary( + month = Month.APRIL, + presence = items.sumBy { it.presence }, + absence = items.sumBy { it.absence }, + absenceExcused = items.sumBy { it.absenceExcused }, + absenceForSchoolReasons = items.sumBy { it.absenceForSchoolReasons }, + exemption = items.sumBy { it.exemption }, + lateness = items.sumBy { it.lateness }, + latenessExcused = items.sumBy { it.latenessExcused }, + diaryId = -1, + studentId = -1, + subjectId = -1 + ) + + private fun formatPercentage(percentage: Double): String { + return if (percentage == 0.0) "0%" + else "${String.format(Locale.FRANCE, "%.2f", percentage)}%" + } + + class HeaderViewHolder(val binding: ScrollableHeaderAttendanceSummaryBinding) : + RecyclerView.ViewHolder(binding.root) + + class ItemViewHolder(val binding: ItemAttendanceSummaryBinding) : + RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt index 8e30ea8b7..4ec9cceda 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt @@ -9,10 +9,9 @@ import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.TextView -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.dpToPx @@ -26,7 +25,7 @@ class AttendanceSummaryFragment : BaseFragment(), AttendanceSummaryView, MainVie lateinit var presenter: AttendanceSummaryPresenter @Inject - lateinit var attendanceSummaryAdapter: FlexibleAdapter> + lateinit var attendanceSummaryAdapter: AttendanceSummaryAdapter private lateinit var subjectsAdapter: ArrayAdapter @@ -36,11 +35,9 @@ class AttendanceSummaryFragment : BaseFragment(), AttendanceSummaryView, MainVie fun newInstance() = AttendanceSummaryFragment() } - override val totalString get() = getString(R.string.attendance_summary_total) - override val titleStringId get() = R.string.attendance_title - override val isViewEmpty get() = attendanceSummaryAdapter.isEmpty + override val isViewEmpty get() = attendanceSummaryAdapter.items.isEmpty() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_attendance_summary, container, false) @@ -54,7 +51,7 @@ class AttendanceSummaryFragment : BaseFragment(), AttendanceSummaryView, MainVie override fun initView() { with(attendanceSummaryRecycler) { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = attendanceSummaryAdapter } @@ -81,16 +78,18 @@ class AttendanceSummaryFragment : BaseFragment(), AttendanceSummaryView, MainVie } } - override fun updateDataSet(data: List, header: AttendanceSummaryScrollableHeader) { + override fun updateDataSet(data: List) { with(attendanceSummaryAdapter) { - updateDataSet(data, true) - removeAllScrollableHeaders() - addScrollableHeader(header) + items = data + notifyDataSetChanged() } } override fun clearView() { - attendanceSummaryAdapter.clear() + with(attendanceSummaryAdapter) { + items = emptyList() + notifyDataSetChanged() + } } override fun showEmpty(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryItem.kt deleted file mode 100644 index 265d6ce44..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryItem.kt +++ /dev/null @@ -1,80 +0,0 @@ -package io.github.wulkanowy.ui.modules.attendance.summary - -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_attendance_summary.* - -class AttendanceSummaryItem( - private val month: String, - private val percentage: String, - private val present: String, - private val absence: String, - private val excusedAbsence: String, - private val schoolAbsence: String, - private val exemption: String, - private val lateness: String, - private val excusedLateness: String -) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_attendance_summary - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.apply { - attendanceSummaryMonth.text = month - attendanceSummaryPercentage.text = percentage - attendanceSummaryPresent.text = present - attendanceSummaryAbsenceUnexcused.text = absence - attendanceSummaryAbsenceExcused.text = excusedAbsence - attendanceSummaryAbsenceSchool.text = schoolAbsence - attendanceSummaryExemption.text = exemption - attendanceSummaryLatenessUnexcused.text = lateness - attendanceSummaryLatenessExcused.text = excusedLateness - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as AttendanceSummaryItem - - if (month != other.month) return false - if (percentage != other.percentage) return false - if (present != other.present) return false - if (absence != other.absence) return false - if (excusedAbsence != other.excusedAbsence) return false - if (schoolAbsence != other.schoolAbsence) return false - if (exemption != other.exemption) return false - if (lateness != other.lateness) return false - if (excusedLateness != other.excusedLateness) return false - - return true - } - - override fun hashCode(): Int { - var result = month.hashCode() - result = 31 * result + percentage.hashCode() - result = 31 * result + present.hashCode() - result = 31 * result + absence.hashCode() - result = 31 * result + excusedAbsence.hashCode() - result = 31 * result + schoolAbsence.hashCode() - result = 31 * result + exemption.hashCode() - result = 31 * result + lateness.hashCode() - result = 31 * result + excusedLateness.hashCode() - return result - } - - class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), LayoutContainer { - override val containerView: View - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt index 8fc5b6e4a..72dfc327e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.attendance.summary -import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.data.db.entities.Subject import io.github.wulkanowy.data.repositories.attendancesummary.AttendanceSummaryRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -10,13 +9,8 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import io.github.wulkanowy.utils.calculatePercentage -import io.github.wulkanowy.utils.getFormattedName import org.threeten.bp.Month import timber.log.Timber -import java.lang.String.format -import java.util.Locale.FRANCE -import java.util.concurrent.TimeUnit.MILLISECONDS import javax.inject.Inject class AttendanceSummaryPresenter @Inject constructor( @@ -88,8 +82,7 @@ class AttendanceSummaryPresenter @Inject constructor( attendanceSummaryRepository.getAttendanceSummary(student, it, subjectId, forceRefresh) } } - .map { createAttendanceSummaryItems(it) to AttendanceSummaryScrollableHeader(formatPercentage(it.calculatePercentage())) } - .delay(200, MILLISECONDS) + .map { items -> items.sortedByDescending { if (it.month.value <= Month.JUNE.value) it.month.value + 12 else it.month.value } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { @@ -102,11 +95,11 @@ class AttendanceSummaryPresenter @Inject constructor( .subscribe({ Timber.i("Loading attendance summary result: Success") view?.apply { - showEmpty(it.first.isEmpty()) - showContent(it.first.isNotEmpty()) - updateDataSet(it.first, it.second) + showEmpty(it.isEmpty()) + showContent(it.isNotEmpty()) + updateDataSet(it) } - analytics.logEvent("load_attendance_summary", "items" to it.first.size, "force_refresh" to forceRefresh, "item_id" to subjectId) + analytics.logEvent("load_attendance_summary", "items" to it.size, "force_refresh" to forceRefresh, "item_id" to subjectId) }) { Timber.i("Loading attendance summary result: An exception occurred") errorHandler.dispatch(it) @@ -150,42 +143,4 @@ class AttendanceSummaryPresenter @Inject constructor( }) ) } - - private fun createAttendanceSummaryTotalItem(attendanceSummary: List): AttendanceSummaryItem { - return AttendanceSummaryItem( - month = view?.totalString.orEmpty(), - percentage = formatPercentage(attendanceSummary.calculatePercentage()), - present = attendanceSummary.sumBy { it.presence }.toString(), - absence = attendanceSummary.sumBy { it.absence }.toString(), - excusedAbsence = attendanceSummary.sumBy { it.absenceExcused }.toString(), - schoolAbsence = attendanceSummary.sumBy { it.absenceForSchoolReasons }.toString(), - exemption = attendanceSummary.sumBy { it.exemption }.toString(), - lateness = attendanceSummary.sumBy { it.lateness }.toString(), - excusedLateness = attendanceSummary.sumBy { it.latenessExcused }.toString() - ) - } - - private fun createAttendanceSummaryItems(attendanceSummary: List): List { - if (attendanceSummary.isEmpty()) return emptyList() - return listOf(createAttendanceSummaryTotalItem(attendanceSummary)) + attendanceSummary.sortedByDescending { - if (it.month.value <= Month.JUNE.value) it.month.value + 12 else it.month.value - }.map { - AttendanceSummaryItem( - month = it.month.getFormattedName(), - percentage = formatPercentage(it.calculatePercentage()), - present = it.presence.toString(), - absence = it.absence.toString(), - excusedAbsence = it.absenceExcused.toString(), - schoolAbsence = it.absenceForSchoolReasons.toString(), - exemption = it.exemption.toString(), - lateness = it.lateness.toString(), - excusedLateness = it.latenessExcused.toString() - ) - } - } - - private fun formatPercentage(percentage: Double): String { - return if (percentage == 0.0) "0%" - else "${format(FRANCE, "%.2f", percentage)}%" - } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryScrollableHeader.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryScrollableHeader.kt deleted file mode 100644 index c258f71d2..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryScrollableHeader.kt +++ /dev/null @@ -1,46 +0,0 @@ -package io.github.wulkanowy.ui.modules.attendance.summary - -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.scrollable_header_attendance_summary.* - -class AttendanceSummaryScrollableHeader(private val percentage: String) : - AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.scrollable_header_attendance_summary - - override fun createViewHolder(view: View?, adapter: FlexibleAdapter>?): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>?, holder: ViewHolder?, position: Int, payloads: MutableList?) { - holder?.apply { attendanceSummaryScrollableHeaderPercentage.text = percentage } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as AttendanceSummaryScrollableHeader - - if (percentage != other.percentage) return false - - return true - } - - override fun hashCode(): Int { - return percentage.hashCode() - } - - class ViewHolder(view: View?, adapter: FlexibleAdapter>?) : FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View? - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryView.kt index 8bd5332d6..dd4053c72 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryView.kt @@ -1,11 +1,10 @@ package io.github.wulkanowy.ui.modules.attendance.summary +import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.ui.base.BaseView interface AttendanceSummaryView : BaseView { - val totalString: String - val isViewEmpty: Boolean fun initView() @@ -24,7 +23,7 @@ interface AttendanceSummaryView : BaseView { fun setErrorDetails(message: String) - fun updateDataSet(data: List, header: AttendanceSummaryScrollableHeader) + fun updateDataSet(data: List) fun updateSubjects(data: ArrayList) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamAdapter.kt new file mode 100644 index 000000000..85061997c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamAdapter.kt @@ -0,0 +1,65 @@ +package io.github.wulkanowy.ui.modules.exam + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.data.db.entities.Exam +import io.github.wulkanowy.databinding.HeaderExamBinding +import io.github.wulkanowy.databinding.ItemExamBinding +import io.github.wulkanowy.utils.toFormattedString +import io.github.wulkanowy.utils.weekDayName +import org.threeten.bp.LocalDate +import javax.inject.Inject + +class ExamAdapter @Inject constructor() : RecyclerView.Adapter() { + + var items = emptyList>() + + var onClickListener: (Exam) -> Unit = {} + + override fun getItemCount() = items.size + + override fun getItemViewType(position: Int) = items[position].viewType.id + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + + return when (viewType) { + ExamItem.ViewType.HEADER.id -> HeaderViewHolder(HeaderExamBinding.inflate(inflater, parent, false)) + ExamItem.ViewType.ITEM.id -> ItemViewHolder(ItemExamBinding.inflate(inflater, parent, false)) + else -> throw IllegalStateException() + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is HeaderViewHolder -> bindHeaderViewHolder(holder.binding, items[position].value as LocalDate) + is ItemViewHolder -> bindItemViewHolder(holder.binding, items[position].value as Exam) + } + } + + @SuppressLint("DefaultLocale") + private fun bindHeaderViewHolder(binding: HeaderExamBinding, date: LocalDate) { + with(binding) { + examHeaderDay.text = date.weekDayName.capitalize() + examHeaderDate.text = date.toFormattedString() + } + } + + private fun bindItemViewHolder(binding: ItemExamBinding, exam: Exam) { + with(binding) { + examItemSubject.text = exam.subject + examItemTeacher.text = exam.teacher + examItemType.text = exam.type + + root.setOnClickListener { onClickListener(exam) } + } + } + + private class HeaderViewHolder(val binding: HeaderExamBinding) : + RecyclerView.ViewHolder(binding.root) + + private class ItemViewHolder(val binding: ItemExamBinding) : + RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt index b880f4650..cc395f626 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt @@ -7,17 +7,14 @@ import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.FlexibleItemDecoration -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.dpToPx -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_exam.* import javax.inject.Inject @@ -27,7 +24,7 @@ class ExamFragment : BaseFragment(), ExamView, MainView.MainChildView, MainView. lateinit var presenter: ExamPresenter @Inject - lateinit var examAdapter: FlexibleAdapter> + lateinit var examAdapter: ExamAdapter companion object { private const val SAVED_DATE_KEY = "CURRENT_DATE" @@ -37,7 +34,7 @@ class ExamFragment : BaseFragment(), ExamView, MainView.MainChildView, MainView. override val titleStringId get() = R.string.exam_title - override val isViewEmpty get() = examAdapter.isEmpty + override val isViewEmpty get() = examAdapter.items.isEmpty() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_exam, container, false) @@ -50,14 +47,12 @@ class ExamFragment : BaseFragment(), ExamView, MainView.MainChildView, MainView. } override fun initView() { - examAdapter.setOnItemClickListener(presenter::onExamItemSelected) + examAdapter.onClickListener = presenter::onExamItemSelected with(examRecycler) { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = examAdapter - addItemDecoration(FlexibleItemDecoration(context) - .withDefaultDivider(R.layout.item_exam) - .withDrawDividerOnLastItem(false)) + addItemDecoration(DividerItemDecoration(context)) } examSwipe.setOnRefreshListener(presenter::onSwipeRefresh) @@ -74,8 +69,11 @@ class ExamFragment : BaseFragment(), ExamView, MainView.MainChildView, MainView. examSwipe.isRefreshing = false } - override fun updateData(data: List) { - examAdapter.updateDataSet(data, true) + override fun updateData(data: List>) { + with(examAdapter) { + items = data + notifyDataSetChanged() + } } override fun updateNavigationWeek(date: String) { @@ -83,7 +81,10 @@ class ExamFragment : BaseFragment(), ExamView, MainView.MainChildView, MainView. } override fun clearData() { - examAdapter.clear() + with(examAdapter) { + items = emptyList() + notifyDataSetChanged() + } } override fun resetView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamHeader.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamHeader.kt deleted file mode 100644 index 0a5b862c3..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamHeader.kt +++ /dev/null @@ -1,52 +0,0 @@ -package io.github.wulkanowy.ui.modules.exam - -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractHeaderItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.ExpandableViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.utils.toFormattedString -import io.github.wulkanowy.utils.weekDayName -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.header_exam.* -import org.threeten.bp.LocalDate - -class ExamHeader(private val date: LocalDate) : AbstractHeaderItem() { - - override fun getLayoutRes() = R.layout.header_exam - - override fun createViewHolder(view: View?, adapter: FlexibleAdapter>?): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>?, holder: ViewHolder, - position: Int, payloads: MutableList?) { - holder.run { - examHeaderDay.text = date.weekDayName.capitalize() - examHeaderDate.text = date.toFormattedString() - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as ExamHeader - - if (date != other.date) return false - - return true - } - - override fun hashCode(): Int { - return date.hashCode() - } - - class ViewHolder(view: View?, adapter: FlexibleAdapter>?) : ExpandableViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamItem.kt index 8971b4df3..579e37203 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamItem.kt @@ -1,50 +1,9 @@ package io.github.wulkanowy.ui.modules.exam -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractSectionableItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Exam -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_exam.* +data class ExamItem(val value: T, val viewType: ViewType) { -class ExamItem(header: ExamHeader, val exam: Exam) : AbstractSectionableItem(header) { - - override fun getLayoutRes() = R.layout.item_exam - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.run { - examItemSubject.text = exam.subject - examItemTeacher.text = exam.teacher - examItemType.text = exam.type - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as ExamItem - - if (exam != other.exam) return false - - return true - } - - override fun hashCode(): Int { - var result = exam.hashCode() - result = 31 * result + exam.id.toInt() - return result - } - - class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), LayoutContainer { - override val containerView: View - get() = contentView + enum class ViewType(val id: Int) { + HEADER(1), + ITEM(2) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index aac9bc4bb..495602fc5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.exam -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.repositories.exam.ExamRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -19,7 +18,6 @@ import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber -import java.util.concurrent.TimeUnit.MILLISECONDS import javax.inject.Inject class ExamPresenter @Inject constructor( @@ -75,11 +73,9 @@ class ExamPresenter @Inject constructor( view?.showErrorDetailsDialog(lastError) } - fun onExamItemSelected(item: AbstractFlexibleItem<*>?) { - if (item is ExamItem) { - Timber.i("Select exam item ${item.exam.id}") - view?.showExamDialog(item.exam) - } + fun onExamItemSelected(exam: Exam) { + Timber.i("Select exam item ${exam.id}") + view?.showExamDialog(exam) } fun onViewReselected() { @@ -117,8 +113,6 @@ class ExamPresenter @Inject constructor( examRepository.getExams(student, semester, currentDate.monday, currentDate.friday, forceRefresh) } } - .delay(200, MILLISECONDS) - .map { it.groupBy { exam -> exam.date }.toSortedMap() } .map { createExamItems(it) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) @@ -156,12 +150,12 @@ class ExamPresenter @Inject constructor( } } - private fun createExamItems(items: Map>): List { - return items.flatMap { - ExamHeader(it.key).let { header -> - it.value.reversed().map { item -> ExamItem(header, item) } + private fun createExamItems(items: List): List> { + return items.groupBy { it.date }.toSortedMap().map { (date, exams) -> + listOf(ExamItem(date, ExamItem.ViewType.HEADER)) + exams.reversed().map { exam -> + ExamItem(exam, ExamItem.ViewType.ITEM) } - } + }.flatten() } private fun reloadView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt index 5f4a74306..00429bae6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt @@ -9,7 +9,7 @@ interface ExamView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List>) fun updateNavigationWeek(date: String) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt new file mode 100644 index 000000000..22367d02c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt @@ -0,0 +1,176 @@ +package io.github.wulkanowy.ui.modules.grade.details + +import android.annotation.SuppressLint +import android.content.res.Resources +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.databinding.HeaderGradeDetailsBinding +import io.github.wulkanowy.databinding.ItemGradeDetailsBinding +import io.github.wulkanowy.ui.base.BaseExpandableAdapter +import io.github.wulkanowy.utils.getBackgroundColor +import io.github.wulkanowy.utils.toFormattedString +import javax.inject.Inject + +class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter() { + + private var headers = mutableListOf() + + private var items = mutableListOf() + + private var expandedPosition = RecyclerView.NO_POSITION + + private var isExpandable = false + + var onClickListener: (Grade, position: Int) -> Unit = { _, _ -> } + + var colorTheme = "" + + fun setDataItems(data: List, isExpanded: Boolean = isExpandable) { + headers = data.filter { it.viewType == ViewType.HEADER }.toMutableList() + items = if (isExpanded) headers else data.toMutableList() + isExpandable = isExpanded + expandedPosition = RecyclerView.NO_POSITION + } + + fun updateDetailsItem(position: Int, grade: Grade) { + items[position] = GradeDetailsItem(grade, ViewType.ITEM) + notifyItemChanged(position) + } + + fun getHeaderItem(subject: String): GradeDetailsItem { + return headers.single { (it.value as GradeDetailsHeader).subject == subject } + } + + fun updateHeaderItem(item: GradeDetailsItem) { + headers[headers.indexOf(item)] = item + items[items.indexOf(item)] = item + notifyItemChanged(items.indexOf(item)) + } + + fun collapseAll() { + if (expandedPosition != -1) { + refreshList(headers) + expandedPosition = RecyclerView.NO_POSITION + } + } + + @Synchronized + private fun refreshList(newItems: List) { + val diffCallback = GradeDetailsDiffUtil(items, newItems) + val diffResult = DiffUtil.calculateDiff(diffCallback) + items = newItems.toMutableList() + diffResult.dispatchUpdatesTo(this) + } + + override fun getItemCount() = items.size + + override fun getItemViewType(position: Int) = items[position].viewType.id + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + + return when (viewType) { + ViewType.HEADER.id -> HeaderViewHolder(HeaderGradeDetailsBinding.inflate(inflater, parent, false)) + ViewType.ITEM.id -> ItemViewHolder(ItemGradeDetailsBinding.inflate(inflater, parent, false)) + else -> throw IllegalStateException() + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is HeaderViewHolder -> bindHeaderViewHolder( + binding = holder.binding, + header = items[position].value as GradeDetailsHeader, + headerPosition = headers.indexOf(items[position]), + adapterPosition = position + ) + is ItemViewHolder -> bindItemViewHolder( + binding = holder.binding, + grade = items[position].value as Grade, + position = position + ) + } + } + + private fun bindHeaderViewHolder(binding: HeaderGradeDetailsBinding, header: GradeDetailsHeader, headerPosition: Int, adapterPosition: Int) { + with(binding) { + gradeHeaderDivider.visibility = if (adapterPosition == 0) View.GONE else View.VISIBLE + gradeHeaderSubject.apply { + text = header.subject + maxLines = if (headerPosition == expandedPosition) 2 else 1 + } + gradeHeaderAverage.text = formatAverage(header.average, root.context.resources) + gradeHeaderPointsSum.text = root.context.getString(R.string.grade_points_sum, header.pointsSum) + gradeHeaderPointsSum.visibility = if (!header.pointsSum.isNullOrEmpty()) View.VISIBLE else View.GONE + gradeHeaderNumber.text = root.context.resources.getQuantityString(R.plurals.grade_number_item, header.number, header.number) + gradeHeaderNote.visibility = if (header.newGrades > 0) View.VISIBLE else View.GONE + if (header.newGrades > 0) gradeHeaderNote.text = header.newGrades.toString(10) + + gradeHeaderContainer.isEnabled = isExpandable + gradeHeaderContainer.setOnClickListener { + expandedPosition = if (expandedPosition == adapterPosition) -1 else adapterPosition + + if (expandedPosition != RecyclerView.NO_POSITION) { + refreshList(headers.toMutableList().apply { + addAll(headerPosition + 1, header.grades) + }) + scrollToHeaderWithSubItems(headerPosition, header.grades.size) + } else { + refreshList(headers) + } + } + } + } + + private fun formatAverage(average: Double?, resources: Resources): String { + return if (average == null || average == .0) resources.getString(R.string.grade_no_average) + else resources.getString(R.string.grade_average, average) + } + + @SuppressLint("SetTextI18n") + private fun bindItemViewHolder(binding: ItemGradeDetailsBinding, grade: Grade, position: Int) { + with(binding) { + gradeItemValue.run { + text = grade.entry + setBackgroundResource(grade.getBackgroundColor(colorTheme)) + } + gradeItemDescription.text = when { + grade.description.isNotBlank() -> grade.description + grade.gradeSymbol.isNotBlank() -> grade.gradeSymbol + else -> root.context.getString(R.string.all_no_description) + } + gradeItemDate.text = grade.date.toFormattedString() + gradeItemWeight.text = "${root.context.getString(R.string.grade_weight)}: ${grade.weight}" + gradeItemNote.visibility = if (!grade.isRead) View.VISIBLE else View.GONE + + root.setOnClickListener { onClickListener(grade, position) } + } + } + + private class HeaderViewHolder(val binding: HeaderGradeDetailsBinding) : + RecyclerView.ViewHolder(binding.root) + + private class ItemViewHolder(val binding: ItemGradeDetailsBinding) : + RecyclerView.ViewHolder(binding.root) + + class GradeDetailsDiffUtil(private val old: List, private val new: List) : + DiffUtil.Callback() { + + override fun getOldListSize() = old.size + + override fun getNewListSize() = new.size + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return old[oldItemPosition] == new[newItemPosition] + } + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return old[oldItemPosition] == new[newItemPosition] + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt index 9505d354f..e0cfca2f1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt @@ -10,18 +10,13 @@ import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IExpandable -import eu.davidea.flexibleadapter.items.IFlexible +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment import io.github.wulkanowy.ui.modules.grade.GradeView import io.github.wulkanowy.ui.modules.main.MainActivity -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_grade_details.* import javax.inject.Inject @@ -31,7 +26,7 @@ class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeCh lateinit var presenter: GradeDetailsPresenter @Inject - lateinit var gradeDetailsAdapter: FlexibleAdapter> + lateinit var gradeDetailsAdapter: GradeDetailsAdapter private var gradeDetailsMenu: Menu? = null @@ -39,23 +34,8 @@ class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeCh fun newInstance() = GradeDetailsFragment() } - override val emptyAverageString: String - get() = getString(R.string.grade_no_average) - - override val averageString: String - get() = getString(R.string.grade_average) - - override val pointsSumString: String - get() = getString(R.string.grade_points_sum) - - override val weightString: String - get() = getString(R.string.grade_weight) - - override val noDescriptionString: String - get() = getString(R.string.all_no_description) - override val isViewEmpty - get() = gradeDetailsAdapter.isEmpty + get() = gradeDetailsAdapter.itemCount == 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -79,18 +59,11 @@ class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeCh } override fun initView() { - gradeDetailsAdapter.run { - isAutoCollapseOnExpand = true - isAutoScrollOnExpand = true - setOnItemClickListener { presenter.onGradeItemSelected(it) } - } + gradeDetailsAdapter.onClickListener = presenter::onGradeItemSelected gradeDetailsRecycler.run { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = gradeDetailsAdapter - addItemDecoration(GradeDetailsHeaderItemDecoration(context) - .withDefaultDivider(R.layout.header_grade_details) - ) } gradeDetailsSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } gradeDetailsErrorRetry.setOnClickListener { presenter.onRetry() } @@ -102,16 +75,23 @@ class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeCh else false } - override fun updateData(data: List) { - gradeDetailsAdapter.updateDataSet(data, true) + override fun updateData(data: List, isGradeExpandable: Boolean, gradeColorTheme: String) { + with(gradeDetailsAdapter) { + colorTheme = gradeColorTheme + setDataItems(data, isGradeExpandable) + notifyDataSetChanged() + } } - override fun updateItem(item: AbstractFlexibleItem<*>) { - gradeDetailsAdapter.updateItem(item) + override fun updateItem(item: Grade, position: Int) { + gradeDetailsAdapter.updateDetailsItem(position, item) } override fun clearView() { - gradeDetailsAdapter.clear() + with(gradeDetailsAdapter) { + setDataItems(mutableListOf()) + notifyDataSetChanged() + } } override fun collapseAllItems() { @@ -119,15 +99,15 @@ class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeCh } override fun scrollToStart() { - gradeDetailsRecycler.scrollToPosition(0) + gradeDetailsRecycler.smoothScrollToPosition(0) } - override fun getHeaderOfItem(item: AbstractFlexibleItem<*>): IExpandable<*, out IFlexible<*>>? { - return gradeDetailsAdapter.getExpandableOf(item) + override fun getHeaderOfItem(subject: String): GradeDetailsItem { + return gradeDetailsAdapter.getHeaderItem(subject) } - override fun getGradeNumberString(number: Int): String { - return resources.getQuantityString(R.plurals.grade_number_item, number, number) + override fun updateHeaderItem(item: GradeDetailsItem) { + gradeDetailsAdapter.updateHeaderItem(item) } override fun showProgress(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeader.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeader.kt deleted file mode 100644 index 4a34a1457..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeader.kt +++ /dev/null @@ -1,94 +0,0 @@ -package io.github.wulkanowy.ui.modules.grade.details - -import android.view.View -import android.view.View.GONE -import android.view.View.VISIBLE -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractExpandableItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.ExpandableViewHolder -import io.github.wulkanowy.R -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.header_grade_details.* - -class GradeDetailsHeader( - private val subject: String, - private val number: String, - private val average: String, - private val pointsSum: String, - var newGrades: Int, - private val isExpandable: Boolean -) : AbstractExpandableItem() { - - init { - isExpanded = !isExpandable - } - - override fun getLayoutRes() = R.layout.header_grade_details - - override fun createViewHolder(view: View?, adapter: FlexibleAdapter>?): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>?, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.run { - gradeHeaderSubject.apply { - text = subject - maxLines = if (isExpanded) 2 else 1 - } - gradeHeaderAverage.text = average - gradeHeaderPointsSum.text = pointsSum - gradeHeaderPointsSum.visibility = if (pointsSum.isNotEmpty()) VISIBLE else GONE - gradeHeaderNumber.text = number - gradeHeaderNote.visibility = if (newGrades > 0) VISIBLE else GONE - if (newGrades > 0) gradeHeaderNote.text = newGrades.toString(10) - gradeHeaderContainer.isEnabled = isExpandable - - isViewExpandable = isExpandable - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as GradeDetailsHeader - - if (subject != other.subject) return false - if (number != other.number) return false - if (average != other.average) return false - if (isExpandable != other.isExpandable) return false - - return true - } - - override fun hashCode(): Int { - var result = subject.hashCode() - result = 31 * result + number.hashCode() - result = 31 * result + average.hashCode() - result = 31 * result + isExpandable.hashCode() - return result - } - - class ViewHolder(view: View?, adapter: FlexibleAdapter>?) : - ExpandableViewHolder(view, adapter), LayoutContainer { - - var isViewExpandable = true - - init { - contentView.setOnClickListener(this) - } - - override val containerView: View - get() = contentView - - override fun isViewCollapsibleOnClick() = isViewExpandable - - override fun isViewExpandableOnClick() = isViewExpandable - - override fun onClick(view: View?) { - super.onClick(view) - mAdapter.getItem(adapterPosition)?.let { mAdapter.updateItem(it) } - } - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeaderItemDecoration.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeaderItemDecoration.kt deleted file mode 100644 index 39a911e62..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeaderItemDecoration.kt +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.wulkanowy.ui.modules.grade.details - -import android.content.Context -import android.graphics.Canvas -import androidx.recyclerview.widget.RecyclerView -import eu.davidea.flexibleadapter.common.FlexibleItemDecoration - -class GradeDetailsHeaderItemDecoration(context: Context) : FlexibleItemDecoration(context) { - - override fun drawVertical(canvas: Canvas, parent: RecyclerView) { - canvas.save() - val left: Int - val right: Int - if (parent.clipToPadding) { - left = parent.paddingLeft - right = parent.width - parent.paddingRight - canvas.clipRect(left, parent.paddingTop, right, - parent.height - parent.paddingBottom) - } else { - left = 0 - right = parent.width - } - - val itemCount = parent.childCount - for (i in 1 until itemCount) { - val child = parent.getChildAt(i) - val viewHolder = parent.getChildViewHolder(child) - if (shouldDrawDivider(viewHolder)) { - parent.getDecoratedBoundsWithMargins(child, mBounds) - val bottom = mBounds.top + Math.round(child.translationY) - val top = bottom - mDivider.intrinsicHeight - mDivider.setBounds(left, top, right, bottom) - mDivider.draw(canvas) - } - } - canvas.restore() - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt index 1e47eca5d..f1adbdea2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt @@ -1,74 +1,20 @@ package io.github.wulkanowy.ui.modules.grade.details -import android.annotation.SuppressLint -import android.view.View -import android.view.View.GONE -import android.view.View.VISIBLE -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Grade -import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_grade_details.* - -class GradeDetailsItem( - val grade: Grade, - private val valueBgColor: Int, - private val weightString: String, - private val noDescriptionString: String -) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_grade_details - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - @SuppressLint("SetTextI18n") - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.run { - gradeItemValue.run { - text = grade.entry - setBackgroundResource(valueBgColor) - } - gradeItemDescription.text = when { - grade.description.isNotBlank() -> grade.description - grade.gradeSymbol.isNotBlank() -> grade.gradeSymbol - else -> noDescriptionString - } - gradeItemDate.text = grade.date.toFormattedString() - gradeItemWeight.text = "$weightString: ${grade.weight}" - gradeItemNote.visibility = if (!grade.isRead) VISIBLE else GONE - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as GradeDetailsItem - - if (grade != other.grade) return false - if (grade.id != other.grade.id) return false - if (weightString != other.weightString) return false - if (valueBgColor != other.valueBgColor) return false - - return true - } - - override fun hashCode(): Int { - var result = grade.hashCode() - result = 31 * result + grade.id.toInt() - result = 31 * result + weightString.hashCode() - result = 31 * result + valueBgColor - return result - } - - class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), LayoutContainer { - override val containerView: View - get() = contentView - } +enum class ViewType(val id: Int) { + HEADER(1), + ITEM(2) } + +data class GradeDetailsItem( + val value: Any, + val viewType: ViewType +) + +data class GradeDetailsHeader( + val subject: String, + val number: Int, + val average: Double?, + val pointsSum: String?, + var newGrades: Int, + val grades: List +) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index a9e5b2b7d..83501182d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.grade.details -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.repositories.grade.GradeRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository @@ -11,7 +10,6 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import io.github.wulkanowy.utils.getBackgroundColor import timber.log.Timber import javax.inject.Inject @@ -43,24 +41,20 @@ class GradeDetailsPresenter @Inject constructor( loadData(semesterId, forceRefresh) } - fun onGradeItemSelected(item: AbstractFlexibleItem<*>?) { - if (item is GradeDetailsItem) { - Timber.i("Select grade item ${item.grade.id}") - view?.apply { - showGradeDialog(item.grade, preferencesRepository.gradeColorTheme) - if (!item.grade.isRead) { - item.grade.isRead = true - updateItem(item) - getHeaderOfItem(item)?.let { header -> - if (header is GradeDetailsHeader) { - header.newGrades-- - updateItem(header) - } - } - newGradesAmount-- - updateMarkAsDoneButton() - updateGrade(item.grade) + fun onGradeItemSelected(grade: Grade, position: Int) { + Timber.i("Select grade item ${grade.id}") + view?.apply { + showGradeDialog(grade, preferencesRepository.gradeColorTheme) + if (!grade.isRead) { + grade.isRead = true + updateItem(grade, position) + getHeaderOfItem(grade.subject).let { header -> + (header.value as GradeDetailsHeader).newGrades-- + updateHeaderItem(header) } + newGradesAmount-- + updateMarkAsDoneButton() + updateGrade(grade) } } } @@ -134,13 +128,11 @@ class GradeDetailsPresenter @Inject constructor( disposable.add(studentRepository.getCurrentStudent() .flatMap { semesterRepository.getSemesters(it).map { semester -> it to semester } } .flatMap { (student, semesters) -> - averageProvider.getGradeAverage(student, semesters, semesterId, forceRefresh) - .flatMap { averages -> - gradeRepository.getGrades(student, semesters.first { it.semesterId == semesterId }, forceRefresh) - .map { it.sortedByDescending { grade -> grade.date } } - .map { it.groupBy { grade -> grade.subject }.toSortedMap() } - .map { createGradeItems(it, averages) } - } + averageProvider.getGradeAverage(student, semesters, semesterId, forceRefresh).flatMap { averages -> + gradeRepository.getGrades(student, semesters.first { it.semesterId == semesterId }, forceRefresh) + .map { it.sortedByDescending { grade -> grade.date } } + .map { createGradeItems(it, averages) } + } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) @@ -152,17 +144,23 @@ class GradeDetailsPresenter @Inject constructor( notifyParentDataLoaded(semesterId) } } - .subscribe({ + .subscribe({ grades -> Timber.i("Loading grade details result: Success") - newGradesAmount = it.sumBy { gradeDetailsHeader -> gradeDetailsHeader.newGrades } + newGradesAmount = grades + .filter { it.viewType == ViewType.HEADER } + .sumBy { item -> (item.value as GradeDetailsHeader).newGrades } updateMarkAsDoneButton() view?.run { - showEmpty(it.isEmpty()) + showEmpty(grades.isEmpty()) showErrorView(false) - showContent(it.isNotEmpty()) - updateData(it) + showContent(grades.isNotEmpty()) + updateData( + data = grades, + isGradeExpandable = preferencesRepository.isGradeExpandable, + gradeColorTheme = preferencesRepository.gradeColorTheme + ) } - analytics.logEvent("load_grade_details", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent("load_grade_details", "items" to grades.size, "force_refresh" to forceRefresh) }) { Timber.i("Loading grade details result: An exception occurred") errorHandler.dispatch(it) @@ -180,40 +178,21 @@ class GradeDetailsPresenter @Inject constructor( } } - private fun createGradeItems(items: Map>, averages: List>): List { - val isGradeExpandable = preferencesRepository.isGradeExpandable - val gradeColorTheme = preferencesRepository.gradeColorTheme - - val noDescriptionString = view?.noDescriptionString.orEmpty() - val weightString = view?.weightString.orEmpty() - val pointsSumString = view?.pointsSumString.orEmpty() - - return items.map { subject -> - GradeDetailsHeader( - subject = subject.key, - average = formatAverage(averages.singleOrNull { subject.key == it.first }?.second), - pointsSum = averages.singleOrNull { subject.key == it.first }?.takeIf { it.third.isNotEmpty() }?.let { pointsSumString.format(it.third) }.orEmpty(), - number = view?.getGradeNumberString(subject.value.size).orEmpty(), - newGrades = subject.value.filter { grade -> !grade.isRead }.size, - isExpandable = isGradeExpandable - ).apply { - subItems = subject.value.map { item -> - GradeDetailsItem( - grade = item, - valueBgColor = item.getBackgroundColor(gradeColorTheme), - weightString = weightString, - noDescriptionString = noDescriptionString - ) - } + private fun createGradeItems(items: List, averages: List>): List { + return items.groupBy { grade -> grade.subject }.toSortedMap().map { (subject, grades) -> + val subItems = grades.map { + GradeDetailsItem(it, ViewType.ITEM) } - } - } - private fun formatAverage(average: Double?): String { - return view?.run { - if (average == null || average == .0) emptyAverageString - else averageString.format(average) - }.orEmpty() + listOf(GradeDetailsItem(GradeDetailsHeader( + subject = subject, + average = averages.singleOrNull { subject == it.first }?.second, + pointsSum = averages.singleOrNull { subject == it.first }?.third, + number = grades.size, + newGrades = grades.filter { grade -> !grade.isRead }.size, + grades = subItems + ), ViewType.HEADER)) + if (preferencesRepository.isGradeExpandable) emptyList() else subItems + }.flatten() } private fun updateGrade(grade: Grade) { @@ -221,8 +200,9 @@ class GradeDetailsPresenter @Inject constructor( disposable.add(gradeRepository.updateGrade(grade) .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) - .subscribe({ Timber.i("Update grade result: Success") }) - { error -> + .subscribe({ + Timber.i("Update grade result: Success") + }) { error -> Timber.i("Update grade result: An exception occurred") errorHandler.dispatch(error) }) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt index e2977bcbe..e71fcc3c8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt @@ -1,8 +1,5 @@ package io.github.wulkanowy.ui.modules.grade.details -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IExpandable -import eu.davidea.flexibleadapter.items.IFlexible import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.ui.base.BaseView @@ -10,21 +7,13 @@ interface GradeDetailsView : BaseView { val isViewEmpty: Boolean - val emptyAverageString: String - - val averageString: String - - val pointsSumString: String - - val weightString: String - - val noDescriptionString: String - fun initView() - fun updateData(data: List) + fun updateData(data: List, isGradeExpandable: Boolean, gradeColorTheme: String) - fun updateItem(item: AbstractFlexibleItem<*>) + fun updateItem(item: Grade, position: Int) + + fun updateHeaderItem(item: GradeDetailsItem) fun clearView() @@ -54,7 +43,5 @@ interface GradeDetailsView : BaseView { fun enableMarkAsDoneButton(enable: Boolean) - fun getGradeNumberString(number: Int): String - - fun getHeaderOfItem(item: AbstractFlexibleItem<*>): IExpandable<*, out IFlexible<*>>? + fun getHeaderOfItem(subject: String): GradeDetailsItem } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt new file mode 100644 index 000000000..30c4ccc23 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt @@ -0,0 +1,85 @@ +package io.github.wulkanowy.ui.modules.grade.summary + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.data.db.entities.GradeSummary +import io.github.wulkanowy.databinding.ItemGradeSummaryBinding +import io.github.wulkanowy.databinding.ScrollableHeaderGradeSummaryBinding +import io.github.wulkanowy.utils.calcAverage +import java.util.Locale +import javax.inject.Inject + +class GradeSummaryAdapter @Inject constructor() : RecyclerView.Adapter() { + + private enum class ViewType(val id: Int) { + HEADER(1), + ITEM(2) + } + + var items = emptyList() + + override fun getItemCount() = items.size + 1 + + override fun getItemViewType(position: Int) = when (position) { + 0 -> ViewType.HEADER.id + else -> ViewType.ITEM.id + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + + return when (viewType) { + ViewType.HEADER.id -> HeaderViewHolder(ScrollableHeaderGradeSummaryBinding.inflate(inflater, parent, false)) + ViewType.ITEM.id -> ItemViewHolder(ItemGradeSummaryBinding.inflate(inflater, parent, false)) + else -> throw IllegalStateException() + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is HeaderViewHolder -> bindHeaderViewHolder(holder.binding) + is ItemViewHolder -> bindItemViewHolder(holder.binding, items[position - 1]) + } + } + + private fun bindHeaderViewHolder(binding: ScrollableHeaderGradeSummaryBinding) { + if (items.isEmpty()) return + + with(binding) { + gradeSummaryScrollableHeaderFinal.text = formatAverage(items.calcAverage()) + gradeSummaryScrollableHeaderCalculated.text = formatAverage(items + .filter { value -> value.average != 0.0 } + .map { values -> values.average } + .reversed() // fix average precision + .average() + ) + } + } + + @SuppressLint("SetTextI18n") + private fun bindItemViewHolder(binding: ItemGradeSummaryBinding, item: GradeSummary) { + with(binding) { + gradeSummaryItemTitle.text = item.subject + gradeSummaryItemPoints.text = item.pointsSum + gradeSummaryItemAverage.text = formatAverage(item.average, "") + gradeSummaryItemPredicted.text = "${item.predictedGrade} ${item.proposedPoints}".trim() + gradeSummaryItemFinal.text = "${item.finalGrade} ${item.finalPoints}".trim() + + gradeSummaryItemPointsContainer.visibility = if (item.pointsSum.isBlank()) View.GONE else View.VISIBLE + } + } + + private fun formatAverage(average: Double, defaultValue: String = "-- --"): String { + return if (average == 0.0) defaultValue + else String.format(Locale.FRANCE, "%.2f", average) + } + + private class HeaderViewHolder(val binding: ScrollableHeaderGradeSummaryBinding) : + RecyclerView.ViewHolder(binding.root) + + private class ItemViewHolder(val binding: ItemGradeSummaryBinding) : + RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt index 05fde5227..3addfb6ed 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt @@ -7,10 +7,9 @@ import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment import io.github.wulkanowy.ui.modules.grade.GradeView @@ -23,14 +22,14 @@ class GradeSummaryFragment : BaseFragment(), GradeSummaryView, GradeView.GradeCh lateinit var presenter: GradeSummaryPresenter @Inject - lateinit var gradeSummaryAdapter: FlexibleAdapter> + lateinit var gradeSummaryAdapter: GradeSummaryAdapter companion object { fun newInstance() = GradeSummaryFragment() } override val isViewEmpty - get() = gradeSummaryAdapter.isEmpty + get() = gradeSummaryAdapter.items.isEmpty() override val predictedString get() = getString(R.string.grade_summary_predicted_grade) @@ -49,10 +48,8 @@ class GradeSummaryFragment : BaseFragment(), GradeSummaryView, GradeView.GradeCh } override fun initView() { - gradeSummaryAdapter.setDisplayHeadersAtStartUp(true) - gradeSummaryRecycler.run { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = gradeSummaryAdapter } gradeSummarySwipe.setOnRefreshListener { presenter.onSwipeRefresh() } @@ -60,16 +57,18 @@ class GradeSummaryFragment : BaseFragment(), GradeSummaryView, GradeView.GradeCh gradeSummaryErrorDetails.setOnClickListener { presenter.onDetailsClick() } } - override fun updateData(data: List, header: GradeSummaryScrollableHeader) { - gradeSummaryAdapter.apply { - updateDataSet(data, true) - removeAllScrollableHeaders() - addScrollableHeader(header) + override fun updateData(data: List) { + with(gradeSummaryAdapter) { + items = data + notifyDataSetChanged() } } override fun clearView() { - gradeSummaryAdapter.clear() + with(gradeSummaryAdapter) { + items = emptyList() + notifyDataSetChanged() + } } override fun resetView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt deleted file mode 100644 index 95c32d176..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt +++ /dev/null @@ -1,64 +0,0 @@ -package io.github.wulkanowy.ui.modules.grade.summary - -import android.annotation.SuppressLint -import android.view.View -import android.view.View.GONE -import android.view.View.VISIBLE -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.GradeSummary -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_grade_summary.* - -class GradeSummaryItem( - val summary: GradeSummary, - private val average: String -) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_grade_summary - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - @SuppressLint("SetTextI18n") - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.run { - gradeSummaryItemTitle.text = summary.subject - gradeSummaryItemPoints.text = summary.pointsSum - gradeSummaryItemAverage.text = average - gradeSummaryItemPredicted.text = "${summary.predictedGrade} ${summary.proposedPoints}".trim() - gradeSummaryItemFinal.text = "${summary.finalGrade} ${summary.finalPoints}".trim() - - gradeSummaryItemPointsContainer.visibility = if (summary.pointsSum.isBlank()) GONE else VISIBLE - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as GradeSummaryItem - - if (average != other.average) return false - if (summary != other.summary) return false - if (summary.id != other.summary.id) return false - - return true - } - - override fun hashCode(): Int { - var result = summary.hashCode() - result = 31 * result + summary.id.hashCode() - result = 31 * result + average.hashCode() - return result - } - - class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), LayoutContainer { - override val containerView: View - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index c12f2a516..53c69db70 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -9,10 +9,7 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import io.github.wulkanowy.utils.calcAverage import timber.log.Timber -import java.lang.String.format -import java.util.Locale.FRANCE import javax.inject.Inject class GradeSummaryPresenter @Inject constructor( @@ -42,7 +39,7 @@ class GradeSummaryPresenter @Inject constructor( .map { it.sortedBy { subject -> subject.subject } } .flatMap { gradesSummary -> averageProvider.getGradeAverage(student, semesters, semesterId, forceRefresh) - .map { averages -> createGradeSummaryItemsAndHeader(gradesSummary, averages) } + .map { averages -> createGradeSummaryItems(gradesSummary, averages) } } } .subscribeOn(schedulers.backgroundThread) @@ -54,15 +51,15 @@ class GradeSummaryPresenter @Inject constructor( enableSwipe(true) notifyParentDataLoaded(semesterId) } - }.subscribe({ (gradeSummaryItems, gradeSummaryHeader) -> + }.subscribe({ Timber.i("Loading grade summary result: Success") view?.run { - showEmpty(gradeSummaryItems.isEmpty()) - showContent(gradeSummaryItems.isNotEmpty()) + showEmpty(it.isEmpty()) + showContent(it.isNotEmpty()) showErrorView(false) - updateData(gradeSummaryItems, gradeSummaryHeader) + updateData(it) } - analytics.logEvent("load_grade_summary", "items" to gradeSummaryItems.size, "force_refresh" to forceRefresh) + analytics.logEvent("load_grade_summary", "items" to it.size, "force_refresh" to forceRefresh) }) { Timber.i("Loading grade summary result: An exception occurred") errorHandler.dispatch(it) @@ -115,20 +112,11 @@ class GradeSummaryPresenter @Inject constructor( disposable.clear() } - private fun createGradeSummaryItemsAndHeader(gradesSummary: List, averages: List>): Pair, GradeSummaryScrollableHeader> { - return averages.filter { value -> value.second != 0.0 } - .let { filteredAverages -> - gradesSummary.filter { !checkEmpty(it, filteredAverages) } - .map { gradeSummary -> - GradeSummaryItem( - summary = gradeSummary, - average = formatAverage(filteredAverages.singleOrNull { gradeSummary.subject == it.first }?.second ?: .0, "") - ) - }.let { - it to GradeSummaryScrollableHeader( - formatAverage(gradesSummary.calcAverage()), - formatAverage(filteredAverages.map { values -> values.second }.average())) - } + private fun createGradeSummaryItems(gradesSummary: List, averages: List>): List { + return gradesSummary + .filter { !checkEmpty(it, averages) } + .map { gradeSummary -> + gradeSummary.copy(average = averages.singleOrNull { gradeSummary.subject == it.first }?.second ?: .0) } } @@ -137,9 +125,4 @@ class GradeSummaryPresenter @Inject constructor( finalGrade.isBlank() && predictedGrade.isBlank() && averages.singleOrNull { it.first == subject } == null } } - - private fun formatAverage(average: Double, defaultValue: String = "-- --"): String { - return if (average == 0.0) defaultValue - else format(FRANCE, "%.2f", average) - } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryScrollableHeader.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryScrollableHeader.kt deleted file mode 100644 index f1c535c71..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryScrollableHeader.kt +++ /dev/null @@ -1,53 +0,0 @@ -package io.github.wulkanowy.ui.modules.grade.summary - -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.scrollable_header_grade_summary.* - -class GradeSummaryScrollableHeader(private val finalAverage: String, private val calculatedAverage: String) - : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.scrollable_header_grade_summary - - override fun createViewHolder(view: View?, adapter: FlexibleAdapter>?): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>?, holder: ViewHolder?, - position: Int, payloads: MutableList?) { - holder?.apply { - gradeSummaryScrollableHeaderFinal.text = finalAverage - gradeSummaryScrollableHeaderCalculated.text = calculatedAverage - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as GradeSummaryScrollableHeader - - if (calculatedAverage != other.calculatedAverage) return false - if (finalAverage != other.finalAverage) return false - - return true - } - - override fun hashCode(): Int { - var result = calculatedAverage.hashCode() - result = 31 * result + finalAverage.hashCode() - return result - } - - class ViewHolder(view: View?, adapter: FlexibleAdapter>?) : FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View? - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt index cf3184873..974d91415 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.grade.summary +import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.ui.base.BaseView interface GradeSummaryView : BaseView { @@ -12,7 +13,7 @@ interface GradeSummaryView : BaseView { fun initView() - fun updateData(data: List, header: GradeSummaryScrollableHeader) + fun updateData(data: List) fun resetView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkAdapter.kt new file mode 100644 index 000000000..a87ad18e8 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkAdapter.kt @@ -0,0 +1,67 @@ +package io.github.wulkanowy.ui.modules.homework + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.data.db.entities.Homework +import io.github.wulkanowy.databinding.HeaderHomeworkBinding +import io.github.wulkanowy.databinding.ItemHomeworkBinding +import io.github.wulkanowy.utils.toFormattedString +import io.github.wulkanowy.utils.weekDayName +import org.threeten.bp.LocalDate +import javax.inject.Inject + +class HomeworkAdapter @Inject constructor() : RecyclerView.Adapter() { + + var items = emptyList>() + + var onClickListener: (Homework) -> Unit = {} + + override fun getItemCount() = items.size + + override fun getItemViewType(position: Int) = items[position].viewType.id + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + + return when (viewType) { + HomeworkItem.ViewType.HEADER.id -> HeaderViewHolder(HeaderHomeworkBinding.inflate(inflater, parent, false)) + HomeworkItem.ViewType.ITEM.id -> ItemViewHolder(ItemHomeworkBinding.inflate(inflater, parent, false)) + else -> throw IllegalStateException() + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is HeaderViewHolder -> bindHeaderViewHolder(holder.binding, items[position].value as LocalDate) + is ItemViewHolder -> bindItemViewHolder(holder.binding, items[position].value as Homework) + } + } + + @SuppressLint("DefaultLocale") + private fun bindHeaderViewHolder(binding: HeaderHomeworkBinding, date: LocalDate) { + with(binding) { + homeworkHeaderDay.text = date.weekDayName.capitalize() + homeworkHeaderDate.text = date.toFormattedString() + } + } + + private fun bindItemViewHolder(binding: ItemHomeworkBinding, homework: Homework) { + with(binding) { + homeworkItemSubject.text = homework.subject + homeworkItemTeacher.text = homework.teacher + homeworkItemContent.text = homework.content + homeworkItemCheckImage.visibility = if (homework.isDone) View.VISIBLE else View.GONE + homeworkItemAttachmentImage.visibility = if (!homework.isDone && homework.attachments.isNotEmpty()) View.VISIBLE else View.GONE + + root.setOnClickListener { onClickListener(homework) } + } + } + + class HeaderViewHolder(val binding: HeaderHomeworkBinding) : + RecyclerView.ViewHolder(binding.root) + + class ItemViewHolder(val binding: ItemHomeworkBinding) : RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt index a011a015c..ba0bf1bef 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt @@ -6,18 +6,15 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.FlexibleItemDecoration -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.homework.details.HomeworkDetailsDialog import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.dpToPx -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_homework.* import javax.inject.Inject @@ -27,7 +24,7 @@ class HomeworkFragment : BaseFragment(), HomeworkView, MainView.TitledView { lateinit var presenter: HomeworkPresenter @Inject - lateinit var homeworkAdapter: FlexibleAdapter> + lateinit var homeworkAdapter: HomeworkAdapter companion object { private const val SAVED_DATE_KEY = "CURRENT_DATE" @@ -37,7 +34,7 @@ class HomeworkFragment : BaseFragment(), HomeworkView, MainView.TitledView { override val titleStringId get() = R.string.homework_title - override val isViewEmpty get() = homeworkAdapter.isEmpty + override val isViewEmpty get() = homeworkAdapter.items.isEmpty() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_homework, container, false) @@ -50,14 +47,12 @@ class HomeworkFragment : BaseFragment(), HomeworkView, MainView.TitledView { } override fun initView() { - homeworkAdapter.setOnItemClickListener(presenter::onHomeworkItemSelected) + homeworkAdapter.onClickListener = presenter::onHomeworkItemSelected with(homeworkRecycler) { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = homeworkAdapter - addItemDecoration(FlexibleItemDecoration(context) - .withDefaultDivider() - .withDrawDividerOnLastItem(false)) + addItemDecoration(DividerItemDecoration(context)) } homeworkSwipe.setOnRefreshListener(presenter::onSwipeRefresh) @@ -70,8 +65,11 @@ class HomeworkFragment : BaseFragment(), HomeworkView, MainView.TitledView { homeworkNavContainer.setElevationCompat(requireContext().dpToPx(8f)) } - override fun updateData(data: List) { - homeworkAdapter.updateDataSet(data, true) + override fun updateData(data: List>) { + with(homeworkAdapter) { + items = data + notifyDataSetChanged() + } } fun onReloadList() { @@ -79,7 +77,10 @@ class HomeworkFragment : BaseFragment(), HomeworkView, MainView.TitledView { } override fun clearData() { - homeworkAdapter.clear() + with(homeworkAdapter) { + items = emptyList() + notifyDataSetChanged() + } } override fun updateNavigationWeek(date: String) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkHeader.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkHeader.kt deleted file mode 100644 index 490237883..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkHeader.kt +++ /dev/null @@ -1,54 +0,0 @@ -package io.github.wulkanowy.ui.modules.homework - -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractHeaderItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.ExpandableViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.utils.toFormattedString -import io.github.wulkanowy.utils.weekDayName -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.header_homework.* -import org.threeten.bp.LocalDate - -class HomeworkHeader(private val date: LocalDate) : AbstractHeaderItem() { - - override fun getLayoutRes() = R.layout.header_homework - - override fun createViewHolder(view: View?, adapter: FlexibleAdapter>?): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder( - adapter: FlexibleAdapter>?, holder: HomeworkHeader.ViewHolder, - position: Int, payloads: MutableList? - ) { - holder.run { - homeworkHeaderDay.text = date.weekDayName.capitalize() - homeworkHeaderDate.text = date.toFormattedString() - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as HomeworkHeader - - if (date != other.date) return false - - return true - } - - override fun hashCode(): Int { - return date.hashCode() - } - - class ViewHolder(view: View?, adapter: FlexibleAdapter>?) : ExpandableViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkItem.kt index 3c2dd7baf..7e0039583 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkItem.kt @@ -1,53 +1,9 @@ package io.github.wulkanowy.ui.modules.homework -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractSectionableItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Homework -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_homework.* +data class HomeworkItem(val value: T, val viewType: ViewType) { -class HomeworkItem(header: HomeworkHeader, val homework: Homework) : - AbstractSectionableItem(header) { - - override fun getLayoutRes() = R.layout.item_homework - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.apply { - homeworkItemSubject.text = homework.subject - homeworkItemTeacher.text = homework.teacher - homeworkItemContent.text = homework.content - homeworkItemCheckImage.visibility = if (homework.isDone) View.VISIBLE else View.GONE - homeworkItemAttachmentImage.visibility = if (!homework.isDone && homework.attachments.isNotEmpty()) View.VISIBLE else View.GONE - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as HomeworkItem - - if (homework != other.homework) return false - return true - } - - override fun hashCode(): Int { - var result = homework.hashCode() - result = 31 * result + homework.id.toInt() - return result - } - - class ViewHolder(val view: View, adapter: FlexibleAdapter<*>) : - FlexibleViewHolder(view, adapter), LayoutContainer { - override val containerView: View - get() = contentView + enum class ViewType(val id: Int) { + HEADER(1), + ITEM(2) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index aae18df32..d39efde14 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.homework -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.repositories.homework.HomeworkRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -18,7 +17,6 @@ import io.github.wulkanowy.utils.toFormattedString import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber -import java.util.concurrent.TimeUnit import javax.inject.Inject class HomeworkPresenter @Inject constructor( @@ -74,11 +72,9 @@ class HomeworkPresenter @Inject constructor( view?.showErrorDetailsDialog(lastError) } - fun onHomeworkItemSelected(item: AbstractFlexibleItem<*>?) { - if (item is HomeworkItem) { - Timber.i("Select homework item ${item.homework.id}") - view?.showTimetableDialog(item.homework) - } + fun onHomeworkItemSelected(homework: Homework) { + Timber.i("Select homework item ${homework.id}") + view?.showTimetableDialog(homework) } private fun setBaseDateOnHolidays() { @@ -110,8 +106,6 @@ class HomeworkPresenter @Inject constructor( homeworkRepository.getHomework(student, semester, currentDate, currentDate, forceRefresh) } } - .delay(200, TimeUnit.MILLISECONDS) - .map { it.groupBy { homework -> homework.date }.toSortedMap() } .map { createHomeworkItem(it) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) @@ -150,12 +144,12 @@ class HomeworkPresenter @Inject constructor( } } - private fun createHomeworkItem(items: Map>): List { - return items.flatMap { - HomeworkHeader(it.key).let { header -> - it.value.reversed().map { item -> HomeworkItem(header, item) } + private fun createHomeworkItem(items: List): List> { + return items.groupBy { it.date }.toSortedMap().map { (date, exams) -> + listOf(HomeworkItem(date, HomeworkItem.ViewType.HEADER)) + exams.reversed().map { exam -> + HomeworkItem(exam, HomeworkItem.ViewType.ITEM) } - } + }.flatten() } private fun reloadView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkView.kt index 1d241df46..2a678cd4c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkView.kt @@ -9,7 +9,7 @@ interface HomeworkView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List>) fun clearData() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt new file mode 100644 index 000000000..7383a5ecb --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt @@ -0,0 +1,51 @@ +package io.github.wulkanowy.ui.modules.login.studentselect + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.ItemLoginStudentSelectBinding +import javax.inject.Inject + +class LoginStudentSelectAdapter @Inject constructor() : + RecyclerView.Adapter() { + + var items = emptyList>() + + var onClickListener: (Student, alreadySaved: Boolean) -> Unit = { _, _ -> } + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemLoginStudentSelectBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val (student, alreadySaved) = items[position] + + with(holder.binding) { + loginItemName.text = "${student.studentName} ${student.className}" + loginItemSchool.text = student.schoolName + loginItemName.isEnabled = !alreadySaved + loginItemSchool.isEnabled = !alreadySaved + loginItemCheck.isEnabled = !alreadySaved + loginItemSignedIn.visibility = if (alreadySaved) View.VISIBLE else View.GONE + + root.setOnClickListener { + onClickListener(student, alreadySaved) + + with(loginItemCheck) { + if (isEnabled) { + isChecked = !isChecked + } + } + } + } + } + + class ItemViewHolder(val binding: ItemLoginStudentSelectBinding) : + RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index 9860af22f..48a3cc614 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -6,9 +6,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseFragment @@ -16,7 +14,6 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_login_student_select.* import java.io.Serializable import javax.inject.Inject @@ -27,7 +24,7 @@ class LoginStudentSelectFragment : BaseFragment(), LoginStudentSelectView { lateinit var presenter: LoginStudentSelectPresenter @Inject - lateinit var loginAdapter: FlexibleAdapter> + lateinit var loginAdapter: LoginStudentSelectAdapter @Inject lateinit var appInfo: AppInfo @@ -48,19 +45,22 @@ class LoginStudentSelectFragment : BaseFragment(), LoginStudentSelectView { } override fun initView() { + loginAdapter.onClickListener = presenter::onItemSelected loginStudentSelectSignIn.setOnClickListener { presenter.onSignIn() } - loginAdapter.apply { setOnItemClickListener { presenter.onItemSelected(it) } } loginStudentSelectContactDiscord.setOnClickListener { presenter.onDiscordClick() } loginStudentSelectContactEmail.setOnClickListener { presenter.onEmailClick() } loginStudentSelectRecycler.apply { + layoutManager = LinearLayoutManager(context) adapter = loginAdapter - layoutManager = SmoothScrollLinearLayoutManager(context) } } - override fun updateData(data: List) { - loginAdapter.updateDataSet(data) + override fun updateData(data: List>) { + with(loginAdapter) { + items = data + notifyDataSetChanged() + } } override fun openMainView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectItem.kt deleted file mode 100644 index 06be61387..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectItem.kt +++ /dev/null @@ -1,71 +0,0 @@ -package io.github.wulkanowy.ui.modules.login.studentselect - -import android.annotation.SuppressLint -import android.view.View -import android.view.View.GONE -import android.view.View.VISIBLE -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Student -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_login_student_select.* - -class LoginStudentSelectItem(val student: Student, val alreadySaved: Boolean) : - AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_login_student_select - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ItemViewHolder { - return ItemViewHolder(view, adapter) - } - - @SuppressLint("SetTextI18n") - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ItemViewHolder, position: Int, payloads: MutableList) { - holder.apply { - loginItemName.text = "${student.studentName} ${student.className}" - loginItemSchool.text = student.schoolName - loginItemName.isEnabled = !alreadySaved - loginItemSchool.isEnabled = !alreadySaved - loginItemCheck.isEnabled = !alreadySaved - loginItemSignedIn.visibility = if (alreadySaved) VISIBLE else GONE - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as LoginStudentSelectItem - - if (student != other.student) return false - if (alreadySaved != other.alreadySaved) return false - - return true - } - - override fun hashCode(): Int { - return student.hashCode() - } - - class ItemViewHolder(view: View, val adapter: FlexibleAdapter<*>) : - FlexibleViewHolder(view, adapter), LayoutContainer { - - override val containerView: View - get() = itemView - - init { - loginItemCheck.keyListener = null - } - - override fun onClick(view: View?) { - super.onClick(view) - - if (loginItemCheck.isEnabled) { - loginItemCheck.apply { isChecked = !isChecked } - } - } - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 82de5a887..b2d0aed91 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.login.studentselect -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter @@ -51,13 +50,14 @@ class LoginStudentSelectPresenter @Inject constructor( if (students.size == 1) registerStudents(students) } - fun onItemSelected(item: AbstractFlexibleItem<*>?) { - if (item is LoginStudentSelectItem && !item.alreadySaved) { - selectedStudents.removeAll { it == item.student } - .let { if (!it) selectedStudents.add(item.student) } + fun onItemSelected(student: Student, alreadySaved: Boolean) { + if (alreadySaved) return - view?.enableSignIn(selectedStudents.isNotEmpty()) - } + selectedStudents + .removeAll { it == student } + .let { if (!it) selectedStudents.add(student) } + + view?.enableSignIn(selectedStudents.isNotEmpty()) } private fun compareStudents(a: Student, b: Student): Boolean { @@ -73,19 +73,17 @@ class LoginStudentSelectPresenter @Inject constructor( disposable.add(studentRepository.getSavedStudents() .map { savedStudents -> students.map { student -> - Pair(student, savedStudents.any { compareStudents(student, it) }) + student to savedStudents.any { compareStudents(student, it) } } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ - view?.updateData(it.map { studentPair -> - LoginStudentSelectItem(studentPair.first, studentPair.second) - }) + view?.updateData(it) }, { errorHandler.dispatch(it) lastError = it - view?.updateData(students.map { student -> LoginStudentSelectItem(student, false) }) + view?.updateData(students.map { student -> student to false }) }) ) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt index d80b059db..89431dfc6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt @@ -1,12 +1,13 @@ package io.github.wulkanowy.ui.modules.login.studentselect +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseView interface LoginStudentSelectView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List>) fun openMainView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt index e8ce3bcfb..84f4e06e1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt @@ -7,13 +7,12 @@ import android.content.Intent import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AlertDialog -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.modules.login.LoginActivity -import io.github.wulkanowy.utils.setOnItemClickListener +import io.github.wulkanowy.ui.base.WidgetConfigureAdapter import kotlinx.android.synthetic.main.activity_widget_configure.* import javax.inject.Inject @@ -21,7 +20,7 @@ class LuckyNumberWidgetConfigureActivity : BaseActivity> + lateinit var configureAdapter: WidgetConfigureAdapter @Inject override lateinit var presenter: LuckyNumberWidgetConfigurePresenter @@ -41,10 +40,10 @@ class LuckyNumberWidgetConfigureActivity : BaseActivity presenter.onThemeSelect(which) } .show() } - override fun updateData(data: List) { - configureAdapter.updateDataSet(data) + override fun updateData(data: List>) { + with(configureAdapter) { + items = data + notifyDataSetChanged() + } } override fun updateLuckyNumberWidget(widgetId: Int) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureItem.kt deleted file mode 100644 index e260b7fcb..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureItem.kt +++ /dev/null @@ -1,60 +0,0 @@ -package io.github.wulkanowy.ui.modules.luckynumberwidget - -import android.annotation.SuppressLint -import android.view.View -import androidx.core.graphics.ColorUtils -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetConfigureItem -import io.github.wulkanowy.utils.getThemeAttrColor -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_account.* - -class LuckyNumberWidgetConfigureItem(var student: Student, val isCurrent: Boolean) : - AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_account - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>) = ViewHolder(view, adapter) - - @SuppressLint("SetTextI18n") - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList) { - val context = holder.contentView.context - - val colorImage = if (isCurrent) context.getThemeAttrColor(R.attr.colorPrimary) - else ColorUtils.setAlphaComponent(context.getThemeAttrColor(R.attr.colorOnSurface), 153) - - with(holder) { - accountItemName.text = "${student.studentName} ${student.className}" - accountItemSchool.text = student.schoolName - accountItemImage.setColorFilter(colorImage) - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as TimetableWidgetConfigureItem - - if (student != other.student) return false - - return true - } - - override fun hashCode(): Int { - var result = student.hashCode() - result = 31 * result + student.id.toInt() - return result - } - - class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View? get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt index 6e4716bfa..1bb7447a2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.luckynumberwidget -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -29,11 +28,9 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( loadData() } - fun onItemSelect(item: AbstractFlexibleItem<*>) { - if (item is LuckyNumberWidgetConfigureItem) { - selectedStudent = item.student - view?.showThemeDialog() - } + fun onItemSelect(student: Student) { + selectedStudent = student + view?.showThemeDialog() } fun onThemeSelect(index: Int) { @@ -51,7 +48,7 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( disposable.add(studentRepository.getSavedStudents(false) .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } .map { (students, currentStudentId) -> - students.map { student -> LuckyNumberWidgetConfigureItem(student, student.id == currentStudentId) } + students.map { student -> student to (student.id == currentStudentId) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) @@ -59,7 +56,7 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( when { it.isEmpty() -> view?.openLoginView() it.size == 1 -> { - selectedStudent = it.single().student + selectedStudent = it.single().first view?.showThemeDialog() } else -> view?.updateData(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt index fa4c0cc61..c8c348ed3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.luckynumberwidget +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseView interface LuckyNumberWidgetConfigureView : BaseView { @@ -8,7 +9,7 @@ interface LuckyNumberWidgetConfigureView : BaseView { fun showThemeDialog() - fun updateData(data: List) + fun updateData(data: List>) fun updateLuckyNumberWidget(widgetId: Int) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 864ad4239..e44b47a7b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -9,7 +9,6 @@ import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Bundle import android.view.Menu import android.view.MenuItem -import androidx.core.graphics.ColorUtils import androidx.core.view.ViewCompat import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment @@ -115,7 +114,7 @@ class MainActivity : BaseActivity(), MainView { AHBottomNavigationItem(R.string.more_title, R.drawable.ic_main_more, 0) )) accentColor = getThemeAttrColor(R.attr.colorPrimary) - inactiveColor = ColorUtils.setAlphaComponent(getThemeAttrColor(R.attr.colorOnSurface), 153) + inactiveColor = getThemeAttrColor(R.attr.colorOnSurface, 153) defaultBackgroundColor = overlayProvider.get().compositeOverlayWithThemeSurfaceColorIfNeeded(dpToPx(8f)) titleState = ALWAYS_SHOW currentItem = startMenuIndex diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainModule.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainModule.kt index 1610d0298..03f6ac382 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainModule.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainModule.kt @@ -14,7 +14,6 @@ import io.github.wulkanowy.ui.modules.about.license.LicenseModule import io.github.wulkanowy.ui.modules.about.logviewer.LogViewerFragment import io.github.wulkanowy.ui.modules.account.AccountDialog import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment -import io.github.wulkanowy.ui.modules.attendance.AttendanceModule import io.github.wulkanowy.ui.modules.attendance.summary.AttendanceSummaryFragment import io.github.wulkanowy.ui.modules.exam.ExamFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment @@ -26,7 +25,6 @@ import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.message.MessageModule import io.github.wulkanowy.ui.modules.message.preview.MessagePreviewFragment import io.github.wulkanowy.ui.modules.mobiledevice.MobileDeviceFragment -import io.github.wulkanowy.ui.modules.mobiledevice.MobileDeviceModule import io.github.wulkanowy.ui.modules.mobiledevice.token.MobileDeviceTokenDialog import io.github.wulkanowy.ui.modules.more.MoreFragment import io.github.wulkanowy.ui.modules.note.NoteFragment @@ -52,7 +50,7 @@ abstract class MainModule { } @PerFragment - @ContributesAndroidInjector(modules = [AttendanceModule::class]) + @ContributesAndroidInjector abstract fun bindAttendanceFragment(): AttendanceFragment @PerFragment @@ -116,7 +114,7 @@ abstract class MainModule { abstract fun bindAccountDialog(): AccountDialog @PerFragment - @ContributesAndroidInjector(modules = [MobileDeviceModule::class]) + @ContributesAndroidInjector abstract fun bindMobileDevices(): MobileDeviceFragment @PerFragment diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageItem.kt deleted file mode 100644 index 7e52233c9..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageItem.kt +++ /dev/null @@ -1,67 +0,0 @@ -package io.github.wulkanowy.ui.modules.message - -import android.graphics.Typeface.BOLD -import android.graphics.Typeface.NORMAL -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Message -import io.github.wulkanowy.data.repositories.message.MessageFolder -import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_message.* - -class MessageItem(val message: Message, private val noSubjectString: String) : - AbstractFlexibleItem() { - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun getLayoutRes() = R.layout.item_message - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.apply { - val style = if (message.unread) BOLD else NORMAL - - messageItemAuthor.run { - text = if (message.folderId == MessageFolder.SENT.id) message.recipient else message.sender - setTypeface(null, style) - } - messageItemSubject.run { - text = if (message.subject.isNotBlank()) message.subject else noSubjectString - setTypeface(null, style) - } - messageItemDate.run { - text = message.date.toFormattedString() - setTypeface(null, style) - } - with(messageItemAttachmentIcon) { - visibility = if (message.hasAttachments) View.VISIBLE else View.GONE - } - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as MessageItem - - if (message != other.message) return false - return true - } - - override fun hashCode(): Int { - return message.hashCode() - } - - class ViewHolder(val view: View, adapter: FlexibleAdapter<*>) : - FlexibleViewHolder(view, adapter), LayoutContainer { - override val containerView: View - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt new file mode 100644 index 000000000..93097fd20 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt @@ -0,0 +1,53 @@ +package io.github.wulkanowy.ui.modules.message.tab + +import android.graphics.Typeface +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Message +import io.github.wulkanowy.data.repositories.message.MessageFolder +import io.github.wulkanowy.databinding.ItemMessageBinding +import io.github.wulkanowy.utils.toFormattedString +import javax.inject.Inject + +class MessageTabAdapter @Inject constructor() : + RecyclerView.Adapter() { + + var items = mutableListOf() + + var onClickListener: (Message, position: Int) -> Unit = { _, _ -> } + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemMessageBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val item = items[position] + + with(holder.binding) { + val style = if (item.unread) Typeface.BOLD else Typeface.NORMAL + + messageItemAuthor.run { + text = if (item.folderId == MessageFolder.SENT.id) item.recipient else item.sender + setTypeface(null, style) + } + messageItemSubject.run { + text = if (item.subject.isNotBlank()) item.subject else context.getString(R.string.message_no_subject) + setTypeface(null, style) + } + messageItemDate.run { + text = item.date.toFormattedString() + setTypeface(null, style) + } + messageItemAttachmentIcon.visibility = if (item.hasAttachments) View.VISIBLE else View.GONE + + root.setOnClickListener { onClickListener(item, position) } + } + } + + class ItemViewHolder(val binding: ItemMessageBinding) : RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt index ce0fc7805..c39aa3e28 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt @@ -7,19 +7,15 @@ import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.FlexibleItemDecoration -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.message.MessageFolder import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.message.MessageFragment -import io.github.wulkanowy.ui.modules.message.MessageItem import io.github.wulkanowy.ui.modules.message.preview.MessagePreviewFragment -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_message_tab.* import javax.inject.Inject @@ -29,7 +25,7 @@ class MessageTabFragment : BaseFragment(), MessageTabView { lateinit var presenter: MessageTabPresenter @Inject - lateinit var tabAdapter: FlexibleAdapter> + lateinit var tabAdapter: MessageTabAdapter companion object { const val MESSAGE_TAB_FOLDER_ID = "message_tab_folder_id" @@ -43,11 +39,8 @@ class MessageTabFragment : BaseFragment(), MessageTabView { } } - override val noSubjectString: String - get() = getString(R.string.message_no_subject) - override val isViewEmpty - get() = tabAdapter.isEmpty + get() = tabAdapter.items.isEmpty() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_message_tab, container, false) @@ -62,31 +55,30 @@ class MessageTabFragment : BaseFragment(), MessageTabView { } override fun initView() { - tabAdapter.setOnItemClickListener { presenter.onMessageItemSelected(it) } + tabAdapter.onClickListener = presenter::onMessageItemSelected messageTabRecycler.run { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = tabAdapter - addItemDecoration(FlexibleItemDecoration(context) - .withDefaultDivider() - .withDrawDividerOnLastItem(false) - ) + addItemDecoration(DividerItemDecoration(context)) } messageTabSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } messageTabErrorRetry.setOnClickListener { presenter.onRetry() } messageTabErrorDetails.setOnClickListener { presenter.onDetailsClick() } } - override fun updateData(data: List) { - tabAdapter.updateDataSet(data) + override fun updateData(data: List) { + with(tabAdapter) { + items = data.toMutableList() + notifyDataSetChanged() + } } - override fun updateItem(item: AbstractFlexibleItem<*>) { - tabAdapter.updateItem(item) - } - - override fun clearView() { - tabAdapter.clear() + override fun updateItem(item: Message, position: Int) { + with(tabAdapter) { + items[position] = item + notifyItemChanged(position) + } } override fun showProgress(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index cbdb89b2e..37b45d03d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -1,13 +1,12 @@ package io.github.wulkanowy.ui.modules.message.tab -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.message.MessageFolder import io.github.wulkanowy.data.repositories.message.MessageRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.ui.modules.message.MessageItem import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import timber.log.Timber @@ -58,15 +57,13 @@ class MessageTabPresenter @Inject constructor( loadData(forceRefresh) } - fun onMessageItemSelected(item: AbstractFlexibleItem<*>) { - if (item is MessageItem) { - Timber.i("Select message ${item.message.id} item") - view?.run { - openMessage(item.message) - if (item.message.unread) { - item.message.unread = false - updateItem(item) - } + fun onMessageItemSelected(message: Message, position: Int) { + Timber.i("Select message ${message.id} item") + view?.run { + openMessage(message) + if (message.unread) { + message.unread = false + updateItem(message, position) } } } @@ -79,7 +76,6 @@ class MessageTabPresenter @Inject constructor( .flatMap { student -> semesterRepository.getCurrentSemester(student) .flatMap { messageRepository.getMessages(student, it, folder, forceRefresh) } - .map { items -> items.map { MessageItem(it, view?.noSubjectString.orEmpty()) } } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt index 92115ed33..94ece8ec2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt @@ -1,23 +1,17 @@ package io.github.wulkanowy.ui.modules.message.tab -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.ui.base.BaseView -import io.github.wulkanowy.ui.modules.message.MessageItem interface MessageTabView : BaseView { - val noSubjectString: String - val isViewEmpty: Boolean fun initView() - fun updateData(data: List) + fun updateData(data: List) - fun updateItem(item: AbstractFlexibleItem<*>) - - fun clearView() + fun updateItem(item: Message, position: Int) fun showProgress(show: Boolean) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceAdapter.kt index 27c72ce69..4bc3097d6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceAdapter.kt @@ -1,10 +1,38 @@ package io.github.wulkanowy.ui.modules.mobiledevice -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.IFlexible +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.data.db.entities.MobileDevice +import io.github.wulkanowy.databinding.ItemMobileDeviceBinding +import io.github.wulkanowy.utils.toFormattedString +import javax.inject.Inject -class MobileDeviceAdapter> : FlexibleAdapter(null, null, true) { +class MobileDeviceAdapter @Inject constructor() : + RecyclerView.Adapter() { + + var items = mutableListOf() var onDeviceUnregisterListener: (device: MobileDevice, position: Int) -> Unit = { _, _ -> } + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemMobileDeviceBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val device = items[position] + + with(holder.binding) { + mobileDeviceItemDate.text = device.date.toFormattedString("dd.MM.yyyy HH:mm:ss") + mobileDeviceItemName.text = device.name + mobileDeviceItemUnregister.setOnClickListener { + onDeviceUnregisterListener(device, position) + } + } + } + + class ItemViewHolder(val binding: ItemMobileDeviceBinding) : + RecyclerView.ViewHolder(binding.root) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt index d47574f60..08ec26755 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt @@ -6,13 +6,13 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup -import eu.davidea.flexibleadapter.common.FlexibleItemDecoration -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.helpers.UndoHelper -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.core.view.postDelayed +import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.snackbar.Snackbar import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.mobiledevice.token.MobileDeviceTokenDialog @@ -25,7 +25,7 @@ class MobileDeviceFragment : BaseFragment(), MobileDeviceView, MainView.TitledVi lateinit var presenter: MobileDevicePresenter @Inject - lateinit var devicesAdapter: MobileDeviceAdapter> + lateinit var devicesAdapter: MobileDeviceAdapter companion object { fun newInstance() = MobileDeviceFragment() @@ -35,7 +35,7 @@ class MobileDeviceFragment : BaseFragment(), MobileDeviceView, MainView.TitledVi get() = R.string.mobile_devices_title override val isViewEmpty: Boolean - get() = devicesAdapter.isEmpty + get() = devicesAdapter.items.isEmpty() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_mobile_device, container, false) @@ -48,51 +48,55 @@ class MobileDeviceFragment : BaseFragment(), MobileDeviceView, MainView.TitledVi } override fun initView() { + devicesAdapter.onDeviceUnregisterListener = presenter::onUnregisterDevice + with(mobileDevicesRecycler) { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = devicesAdapter - addItemDecoration(FlexibleItemDecoration(context) - .withDefaultDivider() - .withDrawDividerOnLastItem(false) - ) - } - with(devicesAdapter) { - isPermanentDelete = false - onDeviceUnregisterListener = presenter::onUnregisterDevice + addItemDecoration(DividerItemDecoration(context)) } + mobileDevicesSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } mobileDevicesErrorRetry.setOnClickListener { presenter.onRetry() } mobileDevicesErrorDetails.setOnClickListener { presenter.onDetailsClick() } mobileDeviceAddButton.setOnClickListener { presenter.onRegisterDevice() } } - override fun updateData(data: List) { - devicesAdapter.updateDataSet(data) - } - - override fun restoreDeleteItem() { - devicesAdapter.restoreDeletedItems() - } - - override fun clearData() { - devicesAdapter.clear() - } - - override fun showUndo(position: Int, device: MobileDevice) { - val onActionListener = object : UndoHelper.OnActionListener { - override fun onActionConfirmed(action: Int, event: Int) { - presenter.onUnregisterConfirmed(device) - } - - override fun onActionCanceled(action: Int, positions: MutableList?) { - presenter.onUnregisterCancelled() - } + override fun updateData(data: List) { + with(devicesAdapter) { + items = data.toMutableList() + notifyDataSetChanged() } + } - UndoHelper(devicesAdapter, onActionListener) - .withConsecutive(false) - .withAction(UndoHelper.Action.REMOVE) - .start(listOf(position), mobileDevicesRecycler, R.string.mobile_device_removed, R.string.all_undo, 3000) + override fun deleteItem(device: MobileDevice, position: Int) { + with(devicesAdapter) { + items.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, itemCount) + } + } + + override fun restoreDeleteItem(device: MobileDevice, position: Int) { + with(devicesAdapter) { + items.add(position, device) + notifyItemInserted(position) + notifyItemRangeChanged(position, itemCount) + } + } + + override fun showUndo(device: MobileDevice, position: Int) { + var confirmed = true + + Snackbar.make(mobileDevicesRecycler, getString(R.string.mobile_device_removed), 3000) + .setAction(R.string.all_undo) { + confirmed = false + presenter.onUnregisterCancelled(device, position) + }.show() + + view?.postDelayed(3000) { + if (confirmed) presenter.onUnregisterConfirmed(device) + } } override fun hideRefresh() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceItem.kt deleted file mode 100644 index 436c2d0e2..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceItem.kt +++ /dev/null @@ -1,53 +0,0 @@ -package io.github.wulkanowy.ui.modules.mobiledevice - -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.MobileDevice -import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_mobile_device.* - -class MobileDeviceItem(val device: MobileDevice) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_mobile_device - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.apply { - mobileDeviceItemDate.text = device.date.toFormattedString("dd.MM.yyyy HH:mm:ss") - mobileDeviceItemName.text = device.name - mobileDeviceItemUnregister.setOnClickListener { - (adapter as MobileDeviceAdapter).onDeviceUnregisterListener(device, holder.flexibleAdapterPosition) - } - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as MobileDeviceItem - - if (device.id != other.device.id) return false - return true - } - - override fun hashCode(): Int { - var result = device.hashCode() - result = 31 * result + device.id.toInt() - return result - } - - class ViewHolder(val view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), LayoutContainer { - - override val containerView: View - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceModule.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceModule.kt deleted file mode 100644 index 59bbaa9f8..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceModule.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.github.wulkanowy.ui.modules.mobiledevice - -import dagger.Module -import dagger.Provides -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem - -@Module -class MobileDeviceModule { - - @Provides - fun provideMobileDeviceFlexibleAdapter() = MobileDeviceAdapter>() -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt index a6a83f8a9..d8c99b221 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt @@ -54,7 +54,6 @@ class MobileDevicePresenter @Inject constructor( mobileDeviceRepository.getDevices(student, semester, forceRefresh) } } - .map { items -> items.map { MobileDeviceItem(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { @@ -95,14 +94,15 @@ class MobileDevicePresenter @Inject constructor( fun onUnregisterDevice(device: MobileDevice, position: Int) { view?.run { - showUndo(position, device) + deleteItem(device, position) + showUndo(device, position) showEmpty(isViewEmpty) } } - fun onUnregisterCancelled() { + fun onUnregisterCancelled(device: MobileDevice, position: Int) { view?.run { - restoreDeleteItem() + restoreDeleteItem(device, position) showEmpty(isViewEmpty) } } @@ -116,7 +116,6 @@ class MobileDevicePresenter @Inject constructor( .flatMap { mobileDeviceRepository.getDevices(student, semester, it) } } } - .map { items -> items.map { MobileDeviceItem(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceView.kt index 869b59bb1..ec2d3f87f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceView.kt @@ -9,14 +9,16 @@ interface MobileDeviceView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List) - fun restoreDeleteItem() + fun deleteItem(device: MobileDevice, position: Int) + + fun restoreDeleteItem(device: MobileDevice, position: Int) + + fun showUndo(device: MobileDevice, position: Int) fun hideRefresh() - fun clearData() - fun showProgress(show: Boolean) fun enableSwipe(enable: Boolean) @@ -29,7 +31,5 @@ interface MobileDeviceView : BaseView { fun setErrorDetails(message: String) - fun showUndo(position: Int, device: MobileDevice) - fun showTokenDialog() } 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 new file mode 100644 index 000000000..70587b0cf --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreAdapter.kt @@ -0,0 +1,34 @@ +package io.github.wulkanowy.ui.modules.more + +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.databinding.ItemMoreBinding +import javax.inject.Inject + +class MoreAdapter @Inject constructor() : RecyclerView.Adapter() { + + var items = emptyList>() + + var onClickListener: (name: String) -> Unit = {} + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemMoreBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val (title, drawable) = items[position] + + with(holder.binding) { + moreItemTitle.text = title + moreItemImage.setImageDrawable(drawable) + + root.setOnClickListener { onClickListener(title) } + } + } + + class ItemViewHolder(val binding: ItemMoreBinding) : RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt index ef9c36fab..25cda2b2a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt @@ -5,9 +5,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.about.AboutFragment @@ -21,7 +19,6 @@ import io.github.wulkanowy.ui.modules.note.NoteFragment import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersFragment import io.github.wulkanowy.ui.modules.settings.SettingsFragment import io.github.wulkanowy.utils.getCompatDrawable -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_more.* import javax.inject.Inject @@ -31,7 +28,7 @@ class MoreFragment : BaseFragment(), MoreView, MainView.TitledView, MainView.Mai lateinit var presenter: MorePresenter @Inject - lateinit var moreAdapter: FlexibleAdapter> + lateinit var moreAdapter: MoreAdapter companion object { fun newInstance() = MoreFragment() @@ -74,10 +71,10 @@ class MoreFragment : BaseFragment(), MoreView, MainView.TitledView, MainView.Mai } override fun initView() { - moreAdapter.setOnItemClickListener { presenter.onItemSelected(it) } + moreAdapter.onClickListener = presenter::onItemSelected moreRecycler.apply { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = moreAdapter } } @@ -86,8 +83,11 @@ class MoreFragment : BaseFragment(), MoreView, MainView.TitledView, MainView.Mai if (::presenter.isInitialized) presenter.onViewReselected() } - override fun updateData(data: List) { - moreAdapter.updateDataSet(data) + override fun updateData(data: List>) { + with(moreAdapter) { + items = data + notifyDataSetChanged() + } } override fun openMessagesView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreItem.kt deleted file mode 100644 index 85b604e77..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreItem.kt +++ /dev/null @@ -1,47 +0,0 @@ -package io.github.wulkanowy.ui.modules.more - -import android.graphics.drawable.Drawable -import android.view.View -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_more.* - -class MoreItem(val title: String, private val drawable: Drawable?) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_more - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.apply { - moreItemTitle.text = title - moreItemImage.setImageDrawable(drawable) - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as MoreItem - - if (title != other.title) return false - - return true - } - - override fun hashCode(): Int { - return title.hashCode() - } - - class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), LayoutContainer { - override val containerView: View - get() = contentView - } -} 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 096f89e9b..593645c19 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 @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.more -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler @@ -21,11 +20,10 @@ class MorePresenter @Inject constructor( loadData() } - fun onItemSelected(item: AbstractFlexibleItem<*>?) { - if (item !is MoreItem) return - Timber.i("Select more item \"${item.title}\"") + fun onItemSelected(title: String) { + Timber.i("Select more item \"${title}\"") view?.run { - when (item.title) { + when (title) { messagesRes?.first -> openMessagesView() homeworkRes?.first -> openHomeworkView() noteRes?.first -> openNoteView() @@ -47,15 +45,15 @@ class MorePresenter @Inject constructor( Timber.i("Load items for more view") view?.run { updateData(listOfNotNull( - messagesRes?.let { MoreItem(it.first, it.second) }, - homeworkRes?.let { MoreItem(it.first, it.second) }, - noteRes?.let { MoreItem(it.first, it.second) }, - luckyNumberRes?.let { MoreItem(it.first, it.second) }, - mobileDevicesRes?.let { MoreItem(it.first, it.second) }, - schoolAndTeachersRes?.let { MoreItem(it.first, it.second) }, - settingsRes?.let { MoreItem(it.first, it.second) }, - aboutRes?.let { MoreItem(it.first, it.second) }) - ) + messagesRes, + homeworkRes, + noteRes, + luckyNumberRes, + mobileDevicesRes, + schoolAndTeachersRes, + settingsRes, + aboutRes + )) } } } 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 41008176d..922afdfd5 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 @@ -23,7 +23,7 @@ interface MoreView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List>) fun openSettingsView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteAdapter.kt new file mode 100644 index 000000000..2ffcad949 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteAdapter.kt @@ -0,0 +1,60 @@ +package io.github.wulkanowy.ui.modules.note + +import android.annotation.SuppressLint +import android.graphics.Typeface +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import io.github.wulkanowy.sdk.scrapper.notes.Note.CategoryType +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Note +import io.github.wulkanowy.databinding.ItemNoteBinding +import io.github.wulkanowy.utils.getThemeAttrColor +import io.github.wulkanowy.utils.toFormattedString +import javax.inject.Inject + +class NoteAdapter @Inject constructor() : RecyclerView.Adapter() { + + var items = mutableListOf() + + var onClickListener: (Note, position: Int) -> Unit = { _, _ -> } + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemNoteBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val item = items[position] + + with(holder.binding) { + with(noteItemDate) { + text = item.date.toFormattedString() + setTypeface(null, if (item.isRead) Typeface.NORMAL else Typeface.BOLD) + } + with(noteItemType) { + text = item.category + setTypeface(null, if (item.isRead) Typeface.NORMAL else Typeface.BOLD) + } + with(noteItemPoints) { + text = "${if (item.points > 0) "+" else ""}${item.points}" + visibility = if (item.isPointsShow) View.VISIBLE else View.GONE + setTextColor(when (CategoryType.getByValue(item.categoryType)) { + CategoryType.POSITIVE -> ContextCompat.getColor(context, R.color.note_positive) + CategoryType.NEGATIVE -> ContextCompat.getColor(context, R.color.note_negative) + else -> context.getThemeAttrColor(android.R.attr.textColorPrimary) + }) + } + noteItemTeacher.text = item.teacher + noteItemContent.text = item.content + + root.setOnClickListener { onClickListener(item, position) } + } + } + + class ItemViewHolder(val binding: ItemNoteBinding) : RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt index e5335e459..b01dc4939 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt @@ -6,16 +6,13 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.FlexibleItemDecoration -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_note.* import javax.inject.Inject @@ -25,7 +22,7 @@ class NoteFragment : BaseFragment(), NoteView, MainView.TitledView { lateinit var presenter: NotePresenter @Inject - lateinit var noteAdapter: FlexibleAdapter> + lateinit var noteAdapter: NoteAdapter companion object { fun newInstance() = NoteFragment() @@ -35,7 +32,7 @@ class NoteFragment : BaseFragment(), NoteView, MainView.TitledView { get() = R.string.note_title override val isViewEmpty: Boolean - get() = noteAdapter.isEmpty + get() = noteAdapter.items.isEmpty() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_note, container, false) @@ -47,17 +44,12 @@ class NoteFragment : BaseFragment(), NoteView, MainView.TitledView { } override fun initView() { - noteAdapter.run { - setOnItemClickListener { presenter.onNoteItemSelected(it) } - } + noteAdapter.onClickListener = presenter::onNoteItemSelected noteRecycler.run { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = noteAdapter - addItemDecoration(FlexibleItemDecoration(context) - .withDefaultDivider() - .withDrawDividerOnLastItem(false) - ) + addItemDecoration(DividerItemDecoration(context)) } noteSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } noteErrorRetry.setOnClickListener { presenter.onRetry() } @@ -68,16 +60,25 @@ class NoteFragment : BaseFragment(), NoteView, MainView.TitledView { (activity as? MainActivity)?.showDialogFragment(NoteDialog.newInstance(note)) } - override fun updateData(data: List) { - noteAdapter.updateDataSet(data, true) + override fun updateData(data: List) { + with(noteAdapter) { + items = data.toMutableList() + notifyDataSetChanged() + } } - override fun updateItem(item: AbstractFlexibleItem<*>) { - noteAdapter.updateItem(item) + override fun updateItem(item: Note, position: Int) { + with(noteAdapter) { + items[position] = item + notifyItemChanged(position) + } } override fun clearData() { - noteAdapter.clear() + with(noteAdapter) { + items = mutableListOf() + notifyDataSetChanged() + } } override fun showEmpty(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteItem.kt deleted file mode 100644 index 53fe6fa91..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteItem.kt +++ /dev/null @@ -1,77 +0,0 @@ -package io.github.wulkanowy.ui.modules.note - -import android.annotation.SuppressLint -import android.graphics.Typeface.BOLD -import android.graphics.Typeface.NORMAL -import android.view.View -import android.view.View.GONE -import android.view.View.VISIBLE -import androidx.core.content.ContextCompat -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Note -import io.github.wulkanowy.sdk.scrapper.notes.Note.CategoryType -import io.github.wulkanowy.utils.getThemeAttrColor -import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_note.* - -class NoteItem(val note: Note) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_note - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - @SuppressLint("SetTextI18n") - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - holder.apply { - with(noteItemDate) { - text = note.date.toFormattedString() - setTypeface(null, if (note.isRead) NORMAL else BOLD) - } - with(noteItemType) { - text = note.category - setTypeface(null, if (note.isRead) NORMAL else BOLD) - } - with(noteItemPoints) { - text = "${if (note.points > 0) "+" else ""}${note.points}" - visibility = if (note.isPointsShow) VISIBLE else GONE - setTextColor(when(CategoryType.getByValue(note.categoryType)) { - CategoryType.POSITIVE -> ContextCompat.getColor(context, R.color.note_positive) - CategoryType.NEGATIVE -> ContextCompat.getColor(context, R.color.note_negative) - else -> context.getThemeAttrColor(android.R.attr.textColorPrimary) - }) - } - noteItemTeacher.text = note.teacher - noteItemContent.text = note.content - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as NoteItem - - if (note != other.note) return false - if (note.id != other.note.id) return false - return true - } - - override fun hashCode(): Int { - var result = note.hashCode() - result = 31 * result + note.id.toInt() - return result - } - - class ViewHolder(val view: View, adapter: FlexibleAdapter<*>) : - FlexibleViewHolder(view, adapter), LayoutContainer { - override val containerView: View - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt index 7acf37a4c..00df71b96 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.note -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.repositories.note.NoteRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -53,8 +52,7 @@ class NotePresenter @Inject constructor( disposable.add(studentRepository.getCurrentStudent() .flatMap { semesterRepository.getCurrentSemester(it).map { semester -> semester to it } } .flatMap { noteRepository.getNotes(it.second, it.first, forceRefresh) } - .map { items -> items.map { NoteItem(it) } } - .map { items -> items.sortedByDescending { it.note.date } } + .map { items -> items.sortedByDescending { it.date } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { @@ -90,16 +88,14 @@ class NotePresenter @Inject constructor( } } - fun onNoteItemSelected(item: AbstractFlexibleItem<*>?) { - if (item is NoteItem) { - Timber.i("Select note item ${item.note.id}") - view?.run { - showNoteDialog(item.note) - if (!item.note.isRead) { - item.note.isRead = true - updateItem(item) - updateNote(item.note) - } + fun onNoteItemSelected(note: Note, position: Int) { + Timber.i("Select note item ${note.id}") + view?.run { + showNoteDialog(note) + if (!note.isRead) { + note.isRead = true + updateItem(note, position) + updateNote(note) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteView.kt index a9c9f4f2f..a7cbab8f4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteView.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.note -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.ui.base.BaseView @@ -10,9 +9,9 @@ interface NoteView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List) - fun updateItem(item: AbstractFlexibleItem<*>) + fun updateItem(item: Note, position: Int) fun clearData() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherAdapter.kt new file mode 100644 index 000000000..8deeae05b --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherAdapter.kt @@ -0,0 +1,40 @@ +package io.github.wulkanowy.ui.modules.schoolandteachers.teacher + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Teacher +import io.github.wulkanowy.databinding.ItemTeacherBinding +import javax.inject.Inject + +class TeacherAdapter @Inject constructor() : RecyclerView.Adapter() { + + var items = emptyList() + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemTeacherBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val teacher = items[position] + + with(holder.binding) { + teacherItemName.text = teacher.name + teacherItemSubject.text = if (teacher.subject.isNotBlank()) teacher.subject else root.context.getString(R.string.teacher_no_subject) + if (teacher.shortName.isNotBlank()) { + teacherItemShortName.visibility = View.VISIBLE + teacherItemShortName.text = "[${teacher.shortName}]" + } else { + teacherItemShortName.visibility = View.GONE + } + } + } + + class ItemViewHolder(val binding: ItemTeacherBinding) : RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt index b6bb9c101..7d1003263 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt @@ -6,12 +6,11 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.FlexibleItemDecoration -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Teacher import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersChildView import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersFragment @@ -25,7 +24,7 @@ class TeacherFragment : BaseFragment(), TeacherView, MainView.TitledView, lateinit var presenter: TeacherPresenter @Inject - lateinit var teacherAdapter: FlexibleAdapter> + lateinit var teacherAdapter: TeacherAdapter companion object { fun newInstance() = TeacherFragment() @@ -37,7 +36,7 @@ class TeacherFragment : BaseFragment(), TeacherView, MainView.TitledView, override val noSubjectString get() = getString(R.string.teacher_no_subject) override val isViewEmpty: Boolean - get() = teacherAdapter.isEmpty + get() = teacherAdapter.items.isEmpty() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_teacher, container, false) @@ -50,28 +49,20 @@ class TeacherFragment : BaseFragment(), TeacherView, MainView.TitledView, override fun initView() { teacherRecycler.run { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = teacherAdapter - addItemDecoration(FlexibleItemDecoration(context) - .withDefaultDivider() - .withDrawDividerOnLastItem(false) - ) + addItemDecoration(DividerItemDecoration(context)) } teacherSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } teacherErrorRetry.setOnClickListener { presenter.onRetry() } teacherErrorDetails.setOnClickListener { presenter.onDetailsClick() } } - override fun updateData(data: List) { - teacherAdapter.updateDataSet(data, true) - } - - override fun updateItem(item: AbstractFlexibleItem<*>) { - teacherAdapter.updateItem(item) - } - - override fun clearData() { - teacherAdapter.clear() + override fun updateData(data: List) { + with(teacherAdapter) { + items = data + notifyDataSetChanged() + } } override fun showEmpty(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherItem.kt deleted file mode 100644 index 368317744..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherItem.kt +++ /dev/null @@ -1,59 +0,0 @@ -package io.github.wulkanowy.ui.modules.schoolandteachers.teacher - -import android.annotation.SuppressLint -import android.view.View -import android.view.View.GONE -import android.view.View.VISIBLE -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Teacher -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_teacher.* - -class TeacherItem(val teacher: Teacher, private val noSubjectText: String) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_teacher - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): TeacherItem.ViewHolder { - return TeacherItem.ViewHolder(view, adapter) - } - - @SuppressLint("SetTextI18n") - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: TeacherItem.ViewHolder, position: Int, payloads: MutableList?) { - holder.apply { - teacherItemName.text = teacher.name - teacherItemSubject.text = if (teacher.subject.isNotBlank()) teacher.subject else noSubjectText - if (teacher.shortName.isNotBlank()) { - teacherItemShortName.visibility = VISIBLE - teacherItemShortName.text = "[${teacher.shortName}]" - } else { - teacherItemShortName.visibility = GONE - } - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as TeacherItem - - if (teacher != other.teacher) return false - if (teacher.id != other.teacher.id) return false - return true - } - - override fun hashCode(): Int { - var result = teacher.hashCode() - result = 31 * result + teacher.id.toInt() - return result - } - - class ViewHolder(val view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), LayoutContainer { - override val containerView: View - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt index c5b6cfd69..e888308fd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt @@ -58,7 +58,6 @@ class TeacherPresenter @Inject constructor( } } .map { it.filter { teacher -> teacher.name.isNotBlank() } } - .map { items -> items.map { TeacherItem(it, view?.noSubjectString.orEmpty()) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherView.kt index b16be8ff9..c655bfad8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherView.kt @@ -1,6 +1,6 @@ package io.github.wulkanowy.ui.modules.schoolandteachers.teacher -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import io.github.wulkanowy.data.db.entities.Teacher import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersChildView @@ -12,14 +12,10 @@ interface TeacherView : BaseView, SchoolAndTeachersChildView { fun initView() - fun updateData(data: List) - - fun updateItem(item: AbstractFlexibleItem<*>) + fun updateData(data: List) fun hideRefresh() - fun clearData() - fun showProgress(show: Boolean) fun enableSwipe(enable: Boolean) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt new file mode 100644 index 000000000..b4b2671e0 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -0,0 +1,199 @@ +package io.github.wulkanowy.ui.modules.timetable + +import android.graphics.Paint +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Timetable +import io.github.wulkanowy.databinding.ItemTimetableBinding +import io.github.wulkanowy.databinding.ItemTimetableSmallBinding +import io.github.wulkanowy.utils.getThemeAttrColor +import io.github.wulkanowy.utils.toFormattedString +import javax.inject.Inject + +class TimetableAdapter @Inject constructor() : RecyclerView.Adapter() { + + private enum class ViewType(val id: Int) { + ITEM_NORMAL(1), + ITEM_SMALL(2) + } + + var items = emptyList() + + var onClickListener: (Timetable) -> Unit = {} + + var showWholeClassPlan: String = "no" + + override fun getItemCount() = items.size + + override fun getItemViewType(position: Int) = when { + !items[position].isStudentPlan && showWholeClassPlan == "small" -> ViewType.ITEM_SMALL.id + else -> ViewType.ITEM_NORMAL.id + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + + return when (viewType) { + ViewType.ITEM_NORMAL.id -> ItemViewHolder(ItemTimetableBinding.inflate(inflater, parent, false)) + ViewType.ITEM_SMALL.id -> SmallItemViewHolder(ItemTimetableSmallBinding.inflate(inflater, parent, false)) + else -> throw IllegalStateException() + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val lesson = items[position] + + when (holder) { + is ItemViewHolder -> bindNormalView(holder.binding, lesson) + is SmallItemViewHolder -> bindSmallView(holder.binding, lesson) + } + } + + private fun bindSmallView(binding: ItemTimetableSmallBinding, lesson: Timetable) { + with(binding) { + timetableSmallItemNumber.text = lesson.number.toString() + timetableSmallItemSubject.text = lesson.subject + timetableSmallItemTimeStart.text = lesson.start.toFormattedString("HH:mm") + timetableSmallItemRoom.text = lesson.room + timetableSmallItemTeacher.text = lesson.teacher + + bindSubjectStyle(timetableSmallItemSubject, lesson) + bindSmallDescription(binding, lesson) + bindSmallColors(binding, lesson) + + root.setOnClickListener { onClickListener(lesson) } + } + } + + private fun bindNormalView(binding: ItemTimetableBinding, lesson: Timetable) { + with(binding) { + timetableItemNumber.text = lesson.number.toString() + timetableItemSubject.text = lesson.subject + timetableItemRoom.text = lesson.room + timetableItemTeacher.text = lesson.teacher + timetableItemTimeStart.text = lesson.start.toFormattedString("HH:mm") + timetableItemTimeFinish.text = lesson.end.toFormattedString("HH:mm") + + bindSubjectStyle(timetableItemSubject, lesson) + bindNormalDescription(binding, lesson) + bindNormalColors(binding, lesson) + + root.setOnClickListener { onClickListener(lesson) } + } + } + + private fun bindSubjectStyle(subjectView: TextView, lesson: Timetable) { + subjectView.paintFlags = if (lesson.canceled) subjectView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG + else subjectView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() + } + + private fun bindSmallDescription(binding: ItemTimetableSmallBinding, lesson: Timetable) { + with(binding) { + if (lesson.info.isNotBlank() && !lesson.changes) { + timetableSmallItemDescription.visibility = android.view.View.VISIBLE + timetableSmallItemDescription.text = lesson.info + + timetableSmallItemRoom.visibility = android.view.View.GONE + timetableSmallItemTeacher.visibility = android.view.View.GONE + + timetableSmallItemDescription.setTextColor(root.context.getThemeAttrColor( + if (lesson.canceled) R.attr.colorPrimary + else R.attr.colorTimetableChange + )) + } else { + timetableSmallItemDescription.visibility = android.view.View.GONE + timetableSmallItemRoom.visibility = android.view.View.VISIBLE + timetableSmallItemTeacher.visibility = android.view.View.VISIBLE + } + } + } + + private fun bindNormalDescription(binding: ItemTimetableBinding, lesson: Timetable) { + with(binding) { + if (lesson.info.isNotBlank() && !lesson.changes) { + timetableItemDescription.visibility = android.view.View.VISIBLE + timetableItemDescription.text = lesson.info + + timetableItemRoom.visibility = android.view.View.GONE + timetableItemTeacher.visibility = android.view.View.GONE + + timetableItemDescription.setTextColor(root.context.getThemeAttrColor( + if (lesson.canceled) R.attr.colorPrimary + else R.attr.colorTimetableChange + )) + } else { + timetableItemDescription.visibility = android.view.View.GONE + timetableItemRoom.visibility = android.view.View.VISIBLE + timetableItemTeacher.visibility = android.view.View.VISIBLE + } + } + } + + private fun bindSmallColors(binding: ItemTimetableSmallBinding, lesson: Timetable) { + with(binding) { + if (lesson.canceled) { + updateNumberAndSubjectCanceledColor(timetableSmallItemNumber, timetableSmallItemSubject) + } else { + updateNumberColor(timetableSmallItemNumber, lesson) + updateSubjectColor(timetableSmallItemSubject, lesson) + updateRoomColor(timetableSmallItemRoom, lesson) + updateTeacherColor(timetableSmallItemTeacher, lesson) + } + } + } + + private fun bindNormalColors(binding: ItemTimetableBinding, lesson: Timetable) { + with(binding) { + if (lesson.canceled) { + updateNumberAndSubjectCanceledColor(timetableItemNumber, timetableItemSubject) + } else { + updateNumberColor(timetableItemNumber, lesson) + updateSubjectColor(timetableItemSubject, lesson) + updateRoomColor(timetableItemRoom, lesson) + updateTeacherColor(timetableItemTeacher, lesson) + } + } + } + + private fun updateNumberAndSubjectCanceledColor(numberView: TextView, subjectView: TextView) { + numberView.setTextColor(numberView.context.getThemeAttrColor(R.attr.colorPrimary)) + subjectView.setTextColor(subjectView.context.getThemeAttrColor(R.attr.colorPrimary)) + } + + private fun updateNumberColor(numberView: TextView, lesson: Timetable) { + numberView.setTextColor(numberView.context.getThemeAttrColor( + if (lesson.changes || lesson.info.isNotBlank()) R.attr.colorTimetableChange + else android.R.attr.textColorPrimary + )) + } + + private fun updateSubjectColor(subjectView: TextView, lesson: Timetable) { + subjectView.setTextColor(subjectView.context.getThemeAttrColor( + if (lesson.subjectOld.isNotBlank() && lesson.subjectOld != lesson.subject) R.attr.colorTimetableChange + else android.R.attr.textColorPrimary + )) + } + + private fun updateRoomColor(roomView: TextView, lesson: Timetable) { + roomView.setTextColor(roomView.context.getThemeAttrColor( + if (lesson.roomOld.isNotBlank() && lesson.roomOld != lesson.room) R.attr.colorTimetableChange + else android.R.attr.textColorSecondary + )) + } + + private fun updateTeacherColor(teacherTextView: TextView, lesson: Timetable) { + teacherTextView.setTextColor(teacherTextView.context.getThemeAttrColor( + if (lesson.teacherOld.isNotBlank() && lesson.teacherOld != lesson.teacher) R.attr.colorTimetableChange + else android.R.attr.textColorSecondary + )) + } + + private class ItemViewHolder(val binding: ItemTimetableBinding) : + RecyclerView.ViewHolder(binding.root) + + private class SmallItemViewHolder(val binding: ItemTimetableSmallBinding) : + RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index ef6057dfa..2c15b9b3f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -9,20 +9,17 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager import com.wdullaer.materialdatetimepicker.date.DatePickerDialog -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.FlexibleItemDecoration -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.timetable.completed.CompletedLessonsFragment import io.github.wulkanowy.utils.SchooldaysRangeLimiter import io.github.wulkanowy.utils.dpToPx -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_timetable.* import org.threeten.bp.LocalDate import javax.inject.Inject @@ -34,7 +31,7 @@ class TimetableFragment : BaseFragment(), TimetableView, MainView.MainChildView, lateinit var presenter: TimetablePresenter @Inject - lateinit var timetableAdapter: FlexibleAdapter> + lateinit var timetableAdapter: TimetableAdapter companion object { private const val SAVED_DATE_KEY = "CURRENT_DATE" @@ -44,7 +41,7 @@ class TimetableFragment : BaseFragment(), TimetableView, MainView.MainChildView, override val titleStringId get() = R.string.timetable_title - override val isViewEmpty get() = timetableAdapter.isEmpty + override val isViewEmpty get() = timetableAdapter.items.isEmpty() override val currentStackSize get() = (activity as? MainActivity)?.currentStackSize @@ -64,15 +61,12 @@ class TimetableFragment : BaseFragment(), TimetableView, MainView.MainChildView, } override fun initView() { - timetableAdapter.setOnItemClickListener(presenter::onTimetableItemSelected) + timetableAdapter.onClickListener = presenter::onTimetableItemSelected with(timetableRecycler) { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = timetableAdapter - addItemDecoration(FlexibleItemDecoration(context) - .withDefaultDivider() - .withDrawDividerOnLastItem(false) - ) + addItemDecoration(DividerItemDecoration(context)) } timetableSwipe.setOnRefreshListener(presenter::onSwipeRefresh) @@ -95,12 +89,19 @@ class TimetableFragment : BaseFragment(), TimetableView, MainView.MainChildView, else false } - override fun updateData(data: List) { - timetableAdapter.updateDataSet(data, true) + override fun updateData(data: List, showWholeClassPlanType: String) { + with(timetableAdapter) { + items = data + showWholeClassPlan = showWholeClassPlanType + notifyDataSetChanged() + } } override fun clearData() { - timetableAdapter.clear() + with(timetableAdapter) { + items = emptyList() + notifyDataSetChanged() + } } override fun updateNavigationDay(date: String) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt deleted file mode 100644 index 5b35b85d1..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt +++ /dev/null @@ -1,197 +0,0 @@ -package io.github.wulkanowy.ui.modules.timetable - -import android.annotation.SuppressLint -import android.graphics.Paint -import android.view.View -import android.view.View.GONE -import android.view.View.VISIBLE -import android.widget.TextView -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Timetable -import io.github.wulkanowy.utils.getThemeAttrColor -import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_timetable.* -import kotlinx.android.synthetic.main.item_timetable_small.* - -class TimetableItem(val lesson: Timetable, private val showWholeClassPlan: String) : - AbstractFlexibleItem() { - - override fun getLayoutRes() = when { - showWholeClassPlan == "small" && !lesson.isStudentPlan -> R.layout.item_timetable_small - else -> R.layout.item_timetable - } - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { - return ViewHolder(view, adapter) - } - - @SuppressLint("SetTextI18n") - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) { - when (itemViewType) { - R.layout.item_timetable_small -> bindSmallView(holder) - R.layout.item_timetable -> bindNormalView(holder) - } - } - - private fun bindSmallView(holder: ViewHolder) { - with(holder) { - timetableSmallItemNumber.text = lesson.number.toString() - timetableSmallItemSubject.text = lesson.subject - timetableSmallItemTimeStart.text = lesson.start.toFormattedString("HH:mm") - timetableSmallItemRoom.text = lesson.room - timetableSmallItemTeacher.text = lesson.teacher - - updateSubjectStyle(timetableSmallItemSubject) - updateSmallDescription(this) - updateSmallColors(this) - } - } - - private fun bindNormalView(holder: ViewHolder) { - with(holder) { - timetableItemNumber.text = lesson.number.toString() - timetableItemSubject.text = lesson.subject - timetableItemRoom.text = lesson.room - timetableItemTeacher.text = lesson.teacher - timetableItemTimeStart.text = lesson.start.toFormattedString("HH:mm") - timetableItemTimeFinish.text = lesson.end.toFormattedString("HH:mm") - - updateSubjectStyle(timetableItemSubject) - updateNormalDescription(this) - updateNormalColors(this) - } - } - - private fun updateSubjectStyle(subjectView: TextView) { - subjectView.paintFlags = if (lesson.canceled) subjectView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG - else subjectView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() - } - - private fun updateSmallDescription(holder: ViewHolder) { - with(holder) { - if (lesson.info.isNotBlank() && !lesson.changes) { - timetableSmallItemDescription.visibility = VISIBLE - timetableSmallItemDescription.text = lesson.info - - timetableSmallItemRoom.visibility = GONE - timetableSmallItemTeacher.visibility = GONE - - timetableSmallItemDescription.setTextColor(holder.view.context.getThemeAttrColor( - if (lesson.canceled) R.attr.colorPrimary - else R.attr.colorTimetableChange - )) - } else { - timetableSmallItemDescription.visibility = GONE - timetableSmallItemRoom.visibility = VISIBLE - timetableSmallItemTeacher.visibility = VISIBLE - } - } - } - - private fun updateNormalDescription(holder: ViewHolder) { - with(holder) { - if (lesson.info.isNotBlank() && !lesson.changes) { - timetableItemDescription.visibility = VISIBLE - timetableItemDescription.text = lesson.info - - timetableItemRoom.visibility = GONE - timetableItemTeacher.visibility = GONE - - timetableItemDescription.setTextColor(holder.view.context.getThemeAttrColor( - if (lesson.canceled) R.attr.colorPrimary - else R.attr.colorTimetableChange - )) - } else { - timetableItemDescription.visibility = GONE - timetableItemRoom.visibility = VISIBLE - timetableItemTeacher.visibility = VISIBLE - } - } - } - - private fun updateSmallColors(holder: ViewHolder) { - with(holder) { - if (lesson.canceled) { - updateNumberAndSubjectCanceledColor(timetableSmallItemNumber, timetableSmallItemSubject) - } else { - updateNumberColor(timetableSmallItemNumber) - updateSubjectColor(timetableSmallItemSubject) - updateRoomColor(timetableSmallItemRoom) - updateTeacherColor(timetableSmallItemTeacher) - } - } - } - - private fun updateNormalColors(holder: ViewHolder) { - with(holder) { - if (lesson.canceled) { - updateNumberAndSubjectCanceledColor(timetableItemNumber, timetableItemSubject) - } else { - updateNumberColor(timetableItemNumber) - updateSubjectColor(timetableItemSubject) - updateRoomColor(timetableItemRoom) - updateTeacherColor(timetableItemTeacher) - } - } - } - - private fun updateNumberAndSubjectCanceledColor(numberView: TextView, subjectView: TextView) { - numberView.setTextColor(numberView.context.getThemeAttrColor(R.attr.colorPrimary)) - subjectView.setTextColor(subjectView.context.getThemeAttrColor(R.attr.colorPrimary)) - } - - private fun updateNumberColor(numberView: TextView) { - numberView.setTextColor(numberView.context.getThemeAttrColor( - if (lesson.changes || lesson.info.isNotBlank()) R.attr.colorTimetableChange - else android.R.attr.textColorPrimary - )) - } - - private fun updateSubjectColor(subjectView: TextView) { - subjectView.setTextColor(subjectView.context.getThemeAttrColor( - if (lesson.subjectOld.isNotBlank() && lesson.subjectOld != lesson.subject) R.attr.colorTimetableChange - else android.R.attr.textColorPrimary - )) - } - - private fun updateRoomColor(roomView: TextView) { - roomView.setTextColor(roomView.context.getThemeAttrColor( - if (lesson.roomOld.isNotBlank() && lesson.roomOld != lesson.room) R.attr.colorTimetableChange - else android.R.attr.textColorSecondary - )) - } - - private fun updateTeacherColor(teacherTextView: TextView) { - teacherTextView.setTextColor(teacherTextView.context.getThemeAttrColor( - if (lesson.teacherOld.isNotBlank() && lesson.teacherOld != lesson.teacher) R.attr.colorTimetableChange - else android.R.attr.textColorSecondary - )) - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as TimetableItem - - if (lesson != other.lesson) return false - return true - } - - override fun hashCode(): Int { - var result = lesson.hashCode() - result = 31 * result + lesson.id.toInt() - return result - } - - class ViewHolder(val view: View, adapter: FlexibleAdapter<*>) : - FlexibleViewHolder(view, adapter), LayoutContainer { - override val containerView: View - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 2e9d0a0b3..03d79081d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.ui.modules.timetable import android.annotation.SuppressLint -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -22,7 +21,6 @@ import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.of import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber -import java.util.concurrent.TimeUnit.MILLISECONDS import javax.inject.Inject class TimetablePresenter @Inject constructor( @@ -102,11 +100,9 @@ class TimetablePresenter @Inject constructor( } } - fun onTimetableItemSelected(item: AbstractFlexibleItem<*>?) { - if (item is TimetableItem) { - Timber.i("Select timetable item ${item.lesson.id}") - view?.showTimetableDialog(item.lesson) - } + fun onTimetableItemSelected(lesson: Timetable) { + Timber.i("Select timetable item ${lesson.id}") + view?.showTimetableDialog(lesson) } fun onCompletedLessonsSwitchSelected(): Boolean { @@ -139,9 +135,8 @@ class TimetablePresenter @Inject constructor( timetableRepository.getTimetable(student, semester, currentDate, currentDate, forceRefresh) } } - .delay(200, MILLISECONDS) - .map { createTimetableItems(it) } - .map { items -> items.sortedWith(compareBy({ it.lesson.number }, { !it.lesson.isStudentPlan })) } + .map { items -> items.filter { if (prefRepository.showWholeClassPlan == "no") it.isStudentPlan else true } } + .map { items -> items.sortedWith(compareBy({ it.number }, { !it.isStudentPlan })) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { @@ -154,7 +149,7 @@ class TimetablePresenter @Inject constructor( .subscribe({ Timber.i("Loading timetable result: Success") view?.apply { - updateData(it) + updateData(it, prefRepository.showWholeClassPlan) showEmpty(it.isEmpty()) showErrorView(false) showContent(it.isNotEmpty()) @@ -178,12 +173,6 @@ class TimetablePresenter @Inject constructor( } } - private fun createTimetableItems(items: List): List { - return items - .filter { if (prefRepository.showWholeClassPlan == "no") it.isStudentPlan else true } - .map { TimetableItem(it, prefRepository.showWholeClassPlan) } - } - private fun reloadView() { Timber.i("Reload timetable view with the date ${currentDate.toFormattedString()}") view?.apply { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt index f730a2712..8399498c6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt @@ -12,7 +12,7 @@ interface TimetableView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List, showWholeClassPlanType: String) fun updateNavigationDay(date: String) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonItem.kt deleted file mode 100644 index fd6dc8a66..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonItem.kt +++ /dev/null @@ -1,58 +0,0 @@ -package io.github.wulkanowy.ui.modules.timetable.completed - -import android.view.View -import android.view.View.GONE -import android.view.View.VISIBLE -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.CompletedLesson -import io.github.wulkanowy.utils.getThemeAttrColor -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_completed_lesson.* - -class CompletedLessonItem(val completedLesson: CompletedLesson) : AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_completed_lesson - - override fun createViewHolder(view: View?, adapter: FlexibleAdapter>?): CompletedLessonItem.ViewHolder { - return CompletedLessonItem.ViewHolder(view, adapter) - } - - override fun bindViewHolder(adapter: FlexibleAdapter>?, holder: CompletedLessonItem.ViewHolder?, position: Int, payloads: MutableList?) { - holder?.apply { - completedLessonItemNumber.text = completedLesson.number.toString() - completedLessonItemNumber.setTextColor(holder.contentView.context.getThemeAttrColor( - if (completedLesson.substitution.isNotEmpty()) R.attr.colorTimetableChange - else android.R.attr.textColorPrimary - )) - completedLessonItemSubject.text = completedLesson.subject - completedLessonItemTopic.text = completedLesson.topic - completedLessonItemAlert.visibility = if (completedLesson.substitution.isNotEmpty()) VISIBLE else GONE - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as CompletedLessonItem - - if (completedLesson != other.completedLesson) return false - - return true - } - - override fun hashCode(): Int { - return completedLesson.hashCode() - } - - class ViewHolder(view: View?, adapter: FlexibleAdapter>?) : FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View? - get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsAdapter.kt new file mode 100644 index 000000000..3399a8a23 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsAdapter.kt @@ -0,0 +1,45 @@ +package io.github.wulkanowy.ui.modules.timetable.completed + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.CompletedLesson +import io.github.wulkanowy.databinding.ItemCompletedLessonBinding +import io.github.wulkanowy.utils.getThemeAttrColor +import javax.inject.Inject + +class CompletedLessonsAdapter @Inject constructor() : + RecyclerView.Adapter() { + + var items = emptyList() + + var onClickListener: (CompletedLesson) -> Unit = {} + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemCompletedLessonBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val item = items[position] + + with(holder.binding) { + completedLessonItemNumber.text = item.number.toString() + completedLessonItemNumber.setTextColor(root.context.getThemeAttrColor( + if (item.substitution.isNotEmpty()) R.attr.colorTimetableChange + else android.R.attr.textColorPrimary + )) + completedLessonItemSubject.text = item.subject + completedLessonItemTopic.text = item.topic + completedLessonItemAlert.visibility = if (item.substitution.isNotEmpty()) View.VISIBLE else View.GONE + + root.setOnClickListener { onClickListener(item) } + } + } + + class ItemViewHolder(val binding: ItemCompletedLessonBinding) : + RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt index 60c16b2dc..544343a42 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt @@ -7,19 +7,17 @@ import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager import com.wdullaer.materialdatetimepicker.date.DatePickerDialog -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.SchooldaysRangeLimiter import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.getCompatDrawable -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_timetable_completed.* import org.threeten.bp.LocalDate import javax.inject.Inject @@ -30,7 +28,7 @@ class CompletedLessonsFragment : BaseFragment(), CompletedLessonsView, MainView. lateinit var presenter: CompletedLessonsPresenter @Inject - lateinit var completedLessonsAdapter: FlexibleAdapter> + lateinit var completedLessonsAdapter: CompletedLessonsAdapter companion object { private const val SAVED_DATE_KEY = "CURRENT_DATE" @@ -40,7 +38,7 @@ class CompletedLessonsFragment : BaseFragment(), CompletedLessonsView, MainView. override val titleStringId get() = R.string.completed_lessons_title - override val isViewEmpty get() = completedLessonsAdapter.isEmpty + override val isViewEmpty get() = completedLessonsAdapter.items.isEmpty() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_timetable_completed, container, false) @@ -53,11 +51,12 @@ class CompletedLessonsFragment : BaseFragment(), CompletedLessonsView, MainView. } override fun initView() { - completedLessonsAdapter.setOnItemClickListener(presenter::onCompletedLessonsItemSelected) + completedLessonsAdapter.onClickListener = presenter::onCompletedLessonsItemSelected with(completedLessonsRecycler) { - layoutManager = SmoothScrollLinearLayoutManager(context) + layoutManager = LinearLayoutManager(context) adapter = completedLessonsAdapter + addItemDecoration(DividerItemDecoration(context)) } completedLessonsSwipe.setOnRefreshListener(presenter::onSwipeRefresh) @@ -71,12 +70,18 @@ class CompletedLessonsFragment : BaseFragment(), CompletedLessonsView, MainView. completedLessonsNavContainer.setElevationCompat(requireContext().dpToPx(8f)) } - override fun updateData(data: List) { - completedLessonsAdapter.updateDataSet(data, true) + override fun updateData(data: List) { + with(completedLessonsAdapter) { + items = data + notifyDataSetChanged() + } } override fun clearData() { - completedLessonsAdapter.clear() + with(completedLessonsAdapter) { + items = emptyList() + notifyDataSetChanged() + } } override fun updateNavigationDay(date: String) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt index 001fed97b..355411eb5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt @@ -1,7 +1,7 @@ package io.github.wulkanowy.ui.modules.timetable.completed import android.annotation.SuppressLint -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -18,7 +18,6 @@ import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber -import java.util.concurrent.TimeUnit import javax.inject.Inject class CompletedLessonsPresenter @Inject constructor( @@ -87,11 +86,9 @@ class CompletedLessonsPresenter @Inject constructor( view?.showErrorDetailsDialog(lastError) } - fun onCompletedLessonsItemSelected(item: AbstractFlexibleItem<*>?) { - if (item is CompletedLessonItem) { - Timber.i("Select completed lessons item ${item.completedLesson.id}") - view?.showCompletedLessonDialog(item.completedLesson) - } + fun onCompletedLessonsItemSelected(completedLesson: CompletedLesson) { + Timber.i("Select completed lessons item ${completedLesson.id}") + view?.showCompletedLessonDialog(completedLesson) } private fun setBaseDateOnHolidays() { @@ -119,9 +116,7 @@ class CompletedLessonsPresenter @Inject constructor( completedLessonsRepository.getCompletedLessons(student, semester, currentDate, currentDate, forceRefresh) } } - .delay(200, TimeUnit.MILLISECONDS) - .map { items -> items.map { CompletedLessonItem(it) } } - .map { items -> items.sortedBy { it.completedLesson.number } } + .map { items -> items.sortedBy { it.number } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsView.kt index a6a327e2d..170e19694 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsView.kt @@ -10,7 +10,7 @@ interface CompletedLessonsView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List) fun clearData() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt index 7636637f4..9208cd9e6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt @@ -8,14 +8,13 @@ import android.os.Bundle import android.widget.Toast import android.widget.Toast.LENGTH_LONG import androidx.appcompat.app.AlertDialog -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseActivity +import io.github.wulkanowy.ui.base.WidgetConfigureAdapter import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.EXTRA_FROM_PROVIDER -import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.activity_widget_configure.* import javax.inject.Inject @@ -23,7 +22,7 @@ class TimetableWidgetConfigureActivity : BaseActivity> + lateinit var configureAdapter: WidgetConfigureAdapter @Inject override lateinit var presenter: TimetableWidgetConfigurePresenter @@ -43,10 +42,10 @@ class TimetableWidgetConfigureActivity : BaseActivity) { - configureAdapter.updateDataSet(data) + override fun updateData(data: List>) { + with(configureAdapter) { + items = data + notifyDataSetChanged() + } } override fun updateTimetableWidget(widgetId: Int) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureItem.kt deleted file mode 100644 index a3338c684..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureItem.kt +++ /dev/null @@ -1,59 +0,0 @@ -package io.github.wulkanowy.ui.modules.timetablewidget - -import android.annotation.SuppressLint -import android.view.View -import androidx.core.graphics.ColorUtils -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem -import eu.davidea.flexibleadapter.items.IFlexible -import eu.davidea.viewholders.FlexibleViewHolder -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.getThemeAttrColor -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_account.* - -class TimetableWidgetConfigureItem(val student: Student, private val isCurrent: Boolean) : - AbstractFlexibleItem() { - - override fun getLayoutRes() = R.layout.item_account - - override fun createViewHolder(view: View, adapter: FlexibleAdapter>) = ViewHolder(view, adapter) - - @SuppressLint("SetTextI18n") - override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList) { - val context = holder.contentView.context - - val colorImage = if (isCurrent) context.getThemeAttrColor(R.attr.colorPrimary) - else ColorUtils.setAlphaComponent(context.getThemeAttrColor(R.attr.colorOnSurface), 153) - - with(holder) { - accountItemName.text = "${student.studentName} ${student.className}" - accountItemSchool.text = student.schoolName - accountItemImage.setColorFilter(colorImage) - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as TimetableWidgetConfigureItem - - if (student != other.student) return false - - return true - } - - override fun hashCode(): Int { - var result = student.hashCode() - result = 31 * result + student.id.toInt() - return result - } - - class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), - LayoutContainer { - - override val containerView: View? get() = contentView - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt index e16851083..57dde824c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.timetablewidget -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -32,13 +31,11 @@ class TimetableWidgetConfigurePresenter @Inject constructor( loadData() } - fun onItemSelect(item: AbstractFlexibleItem<*>) { - if (item is TimetableWidgetConfigureItem) { - selectedStudent = item.student + fun onItemSelect(student: Student) { + selectedStudent = student - if (isFromProvider) registerStudent(selectedStudent) - else view?.showThemeDialog() - } + if (isFromProvider) registerStudent(selectedStudent) + else view?.showThemeDialog() } fun onThemeSelect(index: Int) { @@ -48,7 +45,7 @@ class TimetableWidgetConfigurePresenter @Inject constructor( registerStudent(selectedStudent) } - fun onDismissThemeView(){ + fun onDismissThemeView() { view?.finishView() } @@ -56,7 +53,7 @@ class TimetableWidgetConfigurePresenter @Inject constructor( disposable.add(studentRepository.getSavedStudents(false) .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } .map { (students, currentStudentId) -> - students.map { student -> TimetableWidgetConfigureItem(student, student.id == currentStudentId) } + students.map { student -> student to (student.id == currentStudentId) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) @@ -64,7 +61,7 @@ class TimetableWidgetConfigurePresenter @Inject constructor( when { it.isEmpty() -> view?.openLoginView() it.size == 1 && !isFromProvider -> { - selectedStudent = it.single().student + selectedStudent = it.single().first view?.showThemeDialog() } else -> view?.updateData(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt index 7cac892d9..056225ab5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt @@ -1,12 +1,13 @@ package io.github.wulkanowy.ui.modules.timetablewidget +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseView interface TimetableWidgetConfigureView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List>) fun updateTimetableWidget(widgetId: Int) diff --git a/app/src/main/java/io/github/wulkanowy/ui/widgets/DividerItemDecoration.kt b/app/src/main/java/io/github/wulkanowy/ui/widgets/DividerItemDecoration.kt new file mode 100644 index 000000000..b0b6999eb --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/widgets/DividerItemDecoration.kt @@ -0,0 +1,27 @@ +package io.github.wulkanowy.ui.widgets + +import android.content.Context +import android.graphics.Canvas +import android.view.View +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.RecyclerView + +class DividerItemDecoration(context: Context) : DividerItemDecoration(context, VERTICAL) { + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + canvas.save() + val dividerLeft = parent.paddingLeft + val dividerRight = parent.width - parent.paddingRight + val childCount = parent.childCount + + for (i in 0..childCount - 2) { + val child: View = parent.getChildAt(i) + val params = child.layoutParams as RecyclerView.LayoutParams + val dividerTop: Int = child.bottom + params.bottomMargin + val dividerBottom = dividerTop + drawable!!.intrinsicHeight + drawable?.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom) + drawable?.draw(canvas) + } + canvas.restore() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt index 582b1c835..489e7e6fb 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt @@ -9,6 +9,8 @@ import androidx.annotation.ColorInt import androidx.annotation.ColorRes import androidx.annotation.DrawableRes import androidx.core.content.ContextCompat +import androidx.core.graphics.ColorUtils +import io.github.wulkanowy.R @ColorInt fun Context.getThemeAttrColor(@AttrRes colorAttr: Int): Int { @@ -20,6 +22,11 @@ fun Context.getThemeAttrColor(@AttrRes colorAttr: Int): Int { } } +@ColorInt +fun Context.getThemeAttrColor(@AttrRes colorAttr: Int, alpha: Int): Int { + return ColorUtils.setAlphaComponent(getThemeAttrColor(colorAttr), alpha) +} + @ColorInt fun Context.getCompatColor(@ColorRes colorRes: Int) = ContextCompat.getColor(this, colorRes) diff --git a/app/src/main/java/io/github/wulkanowy/utils/FlexibleAdapterExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/FlexibleAdapterExtension.kt deleted file mode 100644 index bd6867a38..000000000 --- a/app/src/main/java/io/github/wulkanowy/utils/FlexibleAdapterExtension.kt +++ /dev/null @@ -1,11 +0,0 @@ -package io.github.wulkanowy.utils - -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem - -inline fun FlexibleAdapter<*>.setOnItemClickListener(crossinline listener: (item: AbstractFlexibleItem<*>) -> Unit) { - addListener(FlexibleAdapter.OnItemClickListener { _, position -> - listener(getItem(position) as AbstractFlexibleItem<*>) - true - }) -} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_account.xml b/app/src/main/res/layout/dialog_account.xml index f2ee0bca7..6e975c80d 100644 --- a/app/src/main/res/layout/dialog_account.xml +++ b/app/src/main/res/layout/dialog_account.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/layout/header_exam.xml b/app/src/main/res/layout/header_exam.xml index 3a2e38c59..43f089f73 100644 --- a/app/src/main/res/layout/header_exam.xml +++ b/app/src/main/res/layout/header_exam.xml @@ -10,7 +10,7 @@ android:paddingTop="10dp" android:paddingRight="20dp" android:paddingBottom="10dp" - tools:context=".ui.modules.exam.ExamHeader"> + tools:context=".ui.modules.exam.ExamAdapter"> diff --git a/app/src/main/res/layout/header_grade_details.xml b/app/src/main/res/layout/header_grade_details.xml index 75e01745f..f2ba9a8c9 100644 --- a/app/src/main/res/layout/header_grade_details.xml +++ b/app/src/main/res/layout/header_grade_details.xml @@ -1,81 +1,93 @@ - + android:background="?android:windowBackground"> - + android:background="?selectableItemBackground" + tools:context=".ui.modules.grade.details.GradeDetailsAdapter"> - + - + - + - - + + + + + + + diff --git a/app/src/main/res/layout/header_homework.xml b/app/src/main/res/layout/header_homework.xml index 207fcdb40..e1c6608f4 100644 --- a/app/src/main/res/layout/header_homework.xml +++ b/app/src/main/res/layout/header_homework.xml @@ -10,7 +10,7 @@ android:paddingTop="10dp" android:paddingRight="20dp" android:paddingBottom="10dp" - tools:context=".ui.modules.homework.HomeworkHeader"> + tools:context=".ui.modules.homework.HomeworkAdapter"> diff --git a/app/src/main/res/layout/item_about.xml b/app/src/main/res/layout/item_about.xml index b5dc3758c..f988c47ba 100644 --- a/app/src/main/res/layout/item_about.xml +++ b/app/src/main/res/layout/item_about.xml @@ -4,17 +4,16 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="72dp" - android:background="?selectableItemBackground"> + android:background="?selectableItemBackground" + tools:context=".ui.modules.about.AboutAdapter"> @@ -24,9 +23,7 @@ android:layout_width="wrap_content" android:layout_height="32dp" android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" android:layout_toEndOf="@id/aboutItemImage" - android:layout_toRightOf="@id/aboutItemImage" android:ellipsize="end" android:gravity="bottom" android:maxLines="1" @@ -39,13 +36,11 @@ android:layout_height="20dp" android:layout_below="@id/aboutItemTitle" android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" android:layout_toEndOf="@id/aboutItemImage" - android:layout_toRightOf="@id/aboutItemImage" android:ellipsize="end" android:gravity="bottom" android:maxLines="1" android:textColor="?android:textColorSecondary" android:textSize="14sp" tools:text="@tools:sample/lorem" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_account.xml b/app/src/main/res/layout/item_account.xml index 309be8121..614e4d2df 100644 --- a/app/src/main/res/layout/item_account.xml +++ b/app/src/main/res/layout/item_account.xml @@ -1,5 +1,5 @@ - + tools:context=".ui.modules.account.AccountAdapter"> - + diff --git a/app/src/main/res/layout/item_attendance.xml b/app/src/main/res/layout/item_attendance.xml index 56bcab440..6917c6ce0 100644 --- a/app/src/main/res/layout/item_attendance.xml +++ b/app/src/main/res/layout/item_attendance.xml @@ -11,7 +11,7 @@ android:paddingEnd="12dp" android:paddingRight="12dp" android:paddingBottom="7dp" - tools:context=".ui.modules.attendance.AttendanceItem"> + tools:context=".ui.modules.attendance.AttendanceAdapter"> + tools:text="5" + tools:visibility="visible" /> + android:orientation="vertical" + tools:context=".ui.modules.attendance.summary.AttendanceSummaryAdapter"> @@ -46,7 +46,6 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" - android:layout_marginLeft="20dp" android:layout_weight="1" android:text="@string/attendance_present" android:textSize="14sp" /> @@ -57,9 +56,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" android:gravity="end" android:textSize="12sp" tools:text="50" /> @@ -77,7 +74,6 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" - android:layout_marginLeft="20dp" android:layout_weight="1" android:text="@string/attendance_absence_unexcused" android:textSize="14sp" /> @@ -88,9 +84,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" android:gravity="end" android:textSize="12sp" tools:text="0" /> @@ -108,7 +102,6 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" - android:layout_marginLeft="20dp" android:layout_weight="1" android:text="@string/attendance_absence_excused" android:textSize="14sp" /> @@ -119,9 +112,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" android:gravity="end" android:textSize="12sp" tools:text="25" /> @@ -139,7 +130,6 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" - android:layout_marginLeft="20dp" android:layout_weight="1" android:text="@string/attendance_absence_school" android:textSize="14sp" /> @@ -150,9 +140,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" android:gravity="end" android:textSize="12sp" tools:text="0" /> @@ -170,7 +158,6 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" - android:layout_marginLeft="20dp" android:layout_weight="1" android:text="@string/attendance_exemption" android:textSize="14sp" /> @@ -181,9 +168,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" android:gravity="end" android:textSize="12sp" tools:text="6" /> @@ -201,7 +186,6 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" - android:layout_marginLeft="20dp" android:layout_weight="1" android:text="@string/attendance_unexcused_lateness" android:textSize="14sp" /> @@ -212,9 +196,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" android:gravity="end" android:textSize="12sp" tools:text="0" /> @@ -232,7 +214,6 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" - android:layout_marginLeft="20dp" android:layout_weight="1" android:text="@string/attendance_excused_lateness" android:textSize="14sp" /> @@ -243,9 +224,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" android:gravity="end" android:textSize="12sp" tools:text="0" /> diff --git a/app/src/main/res/layout/item_completed_lesson.xml b/app/src/main/res/layout/item_completed_lesson.xml index 8b49ba765..b9beec804 100644 --- a/app/src/main/res/layout/item_completed_lesson.xml +++ b/app/src/main/res/layout/item_completed_lesson.xml @@ -3,16 +3,12 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/ic_all_divider" - android:foreground="?selectableItemBackground" + android:background="?selectableItemBackground" android:paddingStart="8dp" - android:paddingLeft="8dp" android:paddingTop="6dp" android:paddingEnd="12dp" - android:paddingRight="12dp" android:paddingBottom="6dp" - tools:context=".ui.modules.timetable.completed.CompletedLessonItem" - tools:ignore="UnusedAttribute"> + tools:context=".ui.modules.timetable.completed.CompletedLessonsAdapter"> + android:minHeight="56dp" + android:orientation="vertical" + tools:context=".ui.modules.about.contributor.ContributorAdapter"> + android:layout_marginBottom="8dp" + android:contentDescription="@string/contributor_avatar_description" /> + tools:text="@tools:sample/lorem" /> diff --git a/app/src/main/res/layout/item_exam.xml b/app/src/main/res/layout/item_exam.xml index 459a7ecb3..bd1d47312 100644 --- a/app/src/main/res/layout/item_exam.xml +++ b/app/src/main/res/layout/item_exam.xml @@ -4,14 +4,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?selectableItemBackground" - tools:context=".ui.modules.exam.ExamItem"> + tools:context=".ui.modules.exam.ExamAdapter"> @@ -22,7 +21,6 @@ android:layout_height="wrap_content" android:layout_below="@id/examItemSubject" android:layout_alignStart="@id/examItemSubject" - android:layout_alignLeft="@id/examItemSubject" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:textSize="13sp" @@ -34,15 +32,11 @@ android:layout_height="wrap_content" android:layout_below="@id/examItemSubject" android:layout_alignParentEnd="true" - android:layout_alignParentRight="true" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginTop="5dp" android:layout_marginEnd="20dp" - android:layout_marginRight="20dp" android:layout_marginBottom="10dp" android:layout_toEndOf="@id/examItemType" - android:layout_toRightOf="@id/examItemType" android:gravity="end" android:textSize="13sp" tools:text="@tools:sample/lorem" /> diff --git a/app/src/main/res/layout/item_grade_details.xml b/app/src/main/res/layout/item_grade_details.xml index d6d99d9b8..ccc968c08 100644 --- a/app/src/main/res/layout/item_grade_details.xml +++ b/app/src/main/res/layout/item_grade_details.xml @@ -1,82 +1,82 @@ - + android:background="?android:windowBackground"> - - - + android:background="?selectableItemBackground" + android:paddingStart="12dp" + android:paddingTop="7dp" + android:paddingEnd="12dp" + android:paddingBottom="7dp" + tools:context=".ui.modules.grade.details.GradeDetailsAdapter"> - + - + - - + + + + + + + + diff --git a/app/src/main/res/layout/item_grade_summary.xml b/app/src/main/res/layout/item_grade_summary.xml index a3a49ab62..85a78571e 100644 --- a/app/src/main/res/layout/item_grade_summary.xml +++ b/app/src/main/res/layout/item_grade_summary.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - tools:context=".ui.modules.grade.summary.GradeSummaryItem"> + tools:context=".ui.modules.grade.summary.GradeSummaryAdapter"> @@ -48,7 +47,6 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" - android:layout_marginLeft="20dp" android:layout_weight="1" android:text="@string/grade_summary_points" android:textSize="14sp" /> @@ -59,9 +57,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" android:gravity="end" android:textSize="12sp" tools:text="123/150" /> @@ -79,7 +75,6 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" - android:layout_marginLeft="20dp" android:layout_weight="1" android:text="@string/grade_summary_predicted_grade" android:textSize="14sp" /> @@ -90,9 +85,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" android:gravity="end" android:textSize="12sp" tools:text="5" /> @@ -110,7 +103,6 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" - android:layout_marginLeft="20dp" android:layout_weight="1" android:text="@string/grade_summary_final_grade" android:textSize="14sp" /> @@ -121,9 +113,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" android:gravity="end" android:textSize="12sp" tools:text="5" /> diff --git a/app/src/main/res/layout/item_homework.xml b/app/src/main/res/layout/item_homework.xml index 62566e9c2..89c3c6885 100644 --- a/app/src/main/res/layout/item_homework.xml +++ b/app/src/main/res/layout/item_homework.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?selectableItemBackground" - tools:context=".ui.modules.homework.HomeworkItem"> + tools:context=".ui.modules.homework.HomeworkAdapter"> + android:paddingRight="16dp" + tools:context=".ui.modules.about.license.LicenseAdapter"> + tools:context=".ui.modules.login.studentselect.LoginStudentSelectAdapter"> diff --git a/app/src/main/res/layout/item_message.xml b/app/src/main/res/layout/item_message.xml index 4379c2fc2..111de88c9 100644 --- a/app/src/main/res/layout/item_message.xml +++ b/app/src/main/res/layout/item_message.xml @@ -9,14 +9,13 @@ android:paddingTop="10dp" android:paddingRight="16dp" android:paddingBottom="10dp" - tools:context=".ui.modules.message.MessageItem"> + tools:context=".ui.modules.message.tab.MessageTabAdapter"> + tools:context=".ui.modules.mobiledevice.MobileDeviceAdapter"> + tools:context=".ui.modules.more.MoreAdapter"> diff --git a/app/src/main/res/layout/item_note.xml b/app/src/main/res/layout/item_note.xml index 3a56f9de7..660f32e00 100644 --- a/app/src/main/res/layout/item_note.xml +++ b/app/src/main/res/layout/item_note.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?selectableItemBackground" - tools:context=".ui.modules.note.NoteItem"> + tools:context=".ui.modules.note.NoteAdapter"> + tools:context=".ui.modules.schoolandteachers.teacher.TeacherAdapter"> + tools:context=".ui.modules.timetable.TimetableAdapter"> @@ -86,35 +80,30 @@ android:id="@+id/timetableItemTeacher" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignBottom="@+id/timetableItemNumber" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" - android:layout_toEndOf="@id/timetableItemRoom" - android:layout_toRightOf="@id/timetableItemRoom" - android:maxLines="1" android:ellipsize="end" + android:maxLines="1" android:textColor="?android:textColorSecondary" android:textSize="13sp" + app:layout_constraintBottom_toBottomOf="@+id/timetableItemNumber" + app:layout_constraintStart_toEndOf="@id/timetableItemRoom" tools:text="Agata Kowalska - Błaszczyk" tools:visibility="gone" /> - + diff --git a/app/src/main/res/layout/item_timetable_small.xml b/app/src/main/res/layout/item_timetable_small.xml index 7a5ab033f..98a213ec3 100644 --- a/app/src/main/res/layout/item_timetable_small.xml +++ b/app/src/main/res/layout/item_timetable_small.xml @@ -3,14 +3,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?selectableItemBackground" - tools:context=".ui.modules.timetable.TimetableItem"> + tools:context=".ui.modules.timetable.TimetableAdapter"> @@ -37,9 +34,7 @@ android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_toEndOf="@+id/timetableSmallItemTimeStart" - android:layout_toRightOf="@+id/timetableSmallItemTimeStart" android:ellipsize="end" android:maxLines="1" android:textColor="?android:textColorPrimary" @@ -51,10 +46,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginTop="1dp" android:layout_toEndOf="@+id/timetableSmallItemSubject" - android:layout_toRightOf="@+id/timetableSmallItemSubject" android:maxLines="1" android:textColor="?android:textColorSecondary" android:textSize="13sp" @@ -65,10 +58,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginTop="1dp" android:layout_toEndOf="@id/timetableSmallItemRoom" - android:layout_toRightOf="@id/timetableSmallItemRoom" android:ellipsize="end" android:maxLines="1" android:textColor="?android:textColorSecondary" @@ -80,12 +71,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:layout_marginTop="1dp" android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" android:layout_toEndOf="@id/timetableSmallItemTeacher" - android:layout_toRightOf="@id/timetableSmallItemTeacher" android:ellipsize="end" android:singleLine="true" android:textColor="?android:textColorSecondary" diff --git a/app/src/main/res/layout/scrollable_header_about.xml b/app/src/main/res/layout/scrollable_header_about.xml index 9b7bb7324..72186bf79 100644 --- a/app/src/main/res/layout/scrollable_header_about.xml +++ b/app/src/main/res/layout/scrollable_header_about.xml @@ -4,14 +4,14 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="104dp" - android:orientation="vertical"> + android:orientation="vertical" + tools:context=".ui.modules.about.AboutAdapter"> + android:orientation="vertical" + tools:context=".ui.modules.attendance.summary.AttendanceSummaryAdapter"> + android:orientation="horizontal" + tools:context=".ui.modules.grade.summary.GradeSummaryAdapter"> - \ No newline at end of file + diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index 258dc54fe..121391dee 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -53,7 +53,7 @@ class LoginStudentSelectPresenterTest { fun onSelectedStudentTest() { doReturn(Single.just(listOf(1L))).`when`(studentRepository).saveStudents(listOf(testStudent)) doReturn(Completable.complete()).`when`(studentRepository).switchStudent(testStudent) - presenter.onItemSelected(LoginStudentSelectItem(testStudent, false)) + presenter.onItemSelected(testStudent, false) presenter.onSignIn() verify(loginStudentSelectView).showContent(false) verify(loginStudentSelectView).showProgress(true) @@ -64,7 +64,7 @@ class LoginStudentSelectPresenterTest { fun onSelectedStudentErrorTest() { doReturn(Single.error(testException)).`when`(studentRepository).saveStudents(listOf(testStudent)) doReturn(Completable.complete()).`when`(studentRepository).logoutStudent(testStudent) - presenter.onItemSelected(LoginStudentSelectItem(testStudent, false)) + presenter.onItemSelected(testStudent, false) presenter.onSignIn() verify(loginStudentSelectView).showContent(false) verify(loginStudentSelectView).showProgress(true) From 98f2f0e74f718bad524cca01170ca3b11528d49c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 1 May 2020 19:00:42 +0200 Subject: [PATCH 0009/1526] Migrate from fabric to firebase crashlytics (#789) --- .travis.yml | 9 +--- app/build.gradle | 14 ++--- app/src/main/AndroidManifest.xml | 27 ++++++++-- .../java/io/github/wulkanowy/WulkanowyApp.kt | 2 - .../java/io/github/wulkanowy/utils/AppInfo.kt | 3 -- .../wulkanowy/utils/CrashlyticsUtils.kt | 54 +++++++++++-------- build.gradle | 6 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- 8 files changed, 66 insertions(+), 51 deletions(-) diff --git a/.travis.yml b/.travis.yml index 514e37c0b..88b711a6c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,20 +48,15 @@ before_script: script: - ./gradlew dependencies --stacktrace --daemon - fossa --no-ansi || true - #- ./gradlew lintPlayRelease -x fabricGenerateResourcesPlayRelease --stacktrace --daemon - - ./gradlew -Pcoverage testPlayDebugUnitTest -x fabricGenerateResourcesPlay --stacktrace --daemon + - ./gradlew -Pcoverage testPlayDebugUnitTest --stacktrace --daemon - ./gradlew -Pcoverage createFdroidDebugCoverageReport --stacktrace --daemon - ./gradlew -Pcoverage jacocoTestReport --stacktrace --daemon - - if [ -z ${SONAR_HOST+x} ]; then echo "sonar scan skipped"; else - git fetch --unshallow; - ./gradlew sonarqube -x test -x lint -x fabricGenerateResourcesPlayRelease -x fabricGenerateResourcesFdroidRelease -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH} --stacktrace --daemon; - fi - | if [ $TRAVIS_TAG ]; then gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg; gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg; gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg; - ./gradlew publishPlayRelease -PenableCrashlytics --stacktrace; + ./gradlew publishPlayRelease -PenableFirebase --stacktrace; fi after_success: diff --git a/app/build.gradle b/app/build.gradle index 7c311dfc2..3d8fd082d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-android-extensions' -apply plugin: 'io.fabric' +apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'com.github.triplet.play' apply plugin: 'com.mikepenz.aboutlibraries.plugin' apply from: 'jacoco.gradle' @@ -24,8 +24,7 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true manifestPlaceholders = [ - fabric_api_key : System.getenv("FABRIC_API_KEY") ?: "null", - crashlytics_enabled: project.hasProperty("enableCrashlytics") + firebase_enabled: project.hasProperty("enableFirebase") ] javaCompileOptions { annotationProcessorOptions { @@ -52,18 +51,16 @@ android { buildTypes { release { - buildConfigField "boolean", "CRASHLYTICS_ENABLED", "true" minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } debug { - buildConfigField "boolean", "CRASHLYTICS_ENABLED", project.hasProperty("enableCrashlytics") ? "true" : "false" applicationIdSuffix ".dev" versionNameSuffix "-dev" testCoverageEnabled = project.hasProperty('coverage') - ext.enableCrashlytics = project.hasProperty("enableCrashlytics") + ext.enableCrashlytics = project.hasProperty("enableFirebase") } } @@ -75,7 +72,6 @@ android { } fdroid { - buildConfigField "boolean", "CRASHLYTICS_ENABLED", "false" dimension "platform" } } @@ -190,8 +186,8 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics:17.4.0' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.6' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.6" - playImplementation "com.google.firebase:firebase-messaging:20.1.0" - playImplementation "com.crashlytics.sdk.android:crashlytics:2.10.1" + playImplementation 'com.google.firebase:firebase-messaging:20.1.6' + playImplementation 'com.google.firebase:firebase-crashlytics:17.0.0' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 42c754756..4478f4087 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -107,12 +107,33 @@ android:resource="@xml/provider_paths" /> + + + + + android:name="firebase_analytics_collection_enabled" + android:value="${firebase_enabled}" /> + + + + android:value="${firebase_enabled}" /> + + + + Date: Sun, 3 May 2020 15:06:49 +0200 Subject: [PATCH 0010/1526] Add nav bar color in night style (#790) --- app/src/main/res/values-night/styles.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 492645381..a06a46f00 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -8,6 +8,8 @@ @color/colorDividerInverse ?colorSurface ?android:textColorPrimary + @android:color/black + @android:color/black false true From 70fc51a0b5687dad97af278699bf75cf2d1bf06b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 6 May 2020 23:07:13 +0200 Subject: [PATCH 0011/1526] Update Crowdin configuration file --- crowdin.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 crowdin.yml diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 000000000..ed131b89d --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,14 @@ +files: + - source: /app/src/main/res/values/*.xml + ignore: + - /app/src/main/res/values/styles.xml + - /app/src/main/res/values/api_hosts.xml + - /app/src/main/res/values/api_symbols.xml + - /app/src/main/res/values/attrs.xml + - /app/src/main/res/values/colors.xml + - /app/src/main/res/values/dimens.xml + - /app/src/main/res/values/preferences_keys.xml + - /app/src/main/res/values/preferences_defaults.xml + translation: /app/src/main/res/values-%android_code%/%original_file_name%.xml + translate_attributes: 0 + content_segmentation: 0 From ec80f939f10245d17697dfa3ed05be7014170414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 6 May 2020 23:10:19 +0200 Subject: [PATCH 0012/1526] Update Crowdin configuration file --- crowdin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crowdin.yml b/crowdin.yml index ed131b89d..2399a56b5 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -9,6 +9,6 @@ files: - /app/src/main/res/values/dimens.xml - /app/src/main/res/values/preferences_keys.xml - /app/src/main/res/values/preferences_defaults.xml - translation: /app/src/main/res/values-%android_code%/%original_file_name%.xml + translation: /app/src/main/res/values-%android_code%/%original_file_name% translate_attributes: 0 content_segmentation: 0 From 8eb0c0351bb961146bb846aa0dda05aaab8e95f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 10 May 2020 10:39:10 +0200 Subject: [PATCH 0013/1526] Use view binding instead of kotlin synthetics (#791) --- .bettercodehub.yml | 2 +- app/build.gradle | 5 - .../github/wulkanowy/ui/base/BaseActivity.kt | 8 +- .../wulkanowy/ui/base/BaseDialogFragment.kt | 10 +- .../github/wulkanowy/ui/base/BaseFragment.kt | 16 +- .../github/wulkanowy/ui/base/ErrorDialog.kt | 48 ++--- .../ui/modules/about/AboutFragment.kt | 14 +- .../about/contributor/ContributorFragment.kt | 24 +-- .../modules/about/license/LicenseFragment.kt | 20 +- .../about/logviewer/LogViewerFragment.kt | 24 +-- .../ui/modules/account/AccountDialog.kt | 18 +- .../ui/modules/attendance/AttendanceDialog.kt | 20 +- .../modules/attendance/AttendanceFragment.kt | 67 ++++--- .../summary/AttendanceSummaryAdapter.kt | 2 +- .../summary/AttendanceSummaryFragment.kt | 51 +++-- .../wulkanowy/ui/modules/exam/ExamDialog.kt | 22 ++- .../wulkanowy/ui/modules/exam/ExamFragment.kt | 58 +++--- .../ui/modules/grade/GradeFragment.kt | 45 +++-- .../grade/details/GradeDetailsDialog.kt | 75 +++---- .../grade/details/GradeDetailsFragment.kt | 51 +++-- .../statistics/GradeStatisticsAdapter.kt | 47 +++-- .../statistics/GradeStatisticsFragment.kt | 61 +++--- .../ui/modules/grade/statistics/ViewType.kt | 8 +- .../grade/summary/GradeSummaryFragment.kt | 47 +++-- .../ui/modules/homework/HomeworkFragment.kt | 56 +++--- .../details/HomeworkDetailsAdapter.kt | 28 +-- .../homework/details/HomeworkDetailsDialog.kt | 18 +- .../ui/modules/login/LoginActivity.kt | 19 +- .../login/advanced/LoginAdvancedFragment.kt | 183 +++++++++--------- .../modules/login/form/LoginFormFragment.kt | 84 ++++---- .../login/recover/LoginRecoverFragment.kt | 75 ++++--- .../LoginStudentSelectFragment.kt | 40 ++-- .../login/symbol/LoginSymbolFragment.kt | 54 +++--- .../luckynumber/LuckyNumberFragment.kt | 47 +++-- .../LuckyNumberWidgetConfigureActivity.kt | 11 +- .../wulkanowy/ui/modules/main/MainActivity.kt | 16 +- .../ui/modules/message/MessageFragment.kt | 36 ++-- .../message/preview/MessagePreviewAdapter.kt | 44 +++-- .../message/preview/MessagePreviewFragment.kt | 33 ++-- .../message/send/SendMessageActivity.kt | 60 +++--- .../modules/message/tab/MessageTabFragment.kt | 44 ++--- .../mobiledevice/MobileDeviceFragment.kt | 49 +++-- .../token/MobileDeviceTokenDialog.kt | 20 +- .../wulkanowy/ui/modules/more/MoreFragment.kt | 18 +- .../wulkanowy/ui/modules/note/NoteDialog.kt | 23 ++- .../wulkanowy/ui/modules/note/NoteFragment.kt | 42 ++-- .../SchoolAndTeachersFragment.kt | 35 ++-- .../school/SchoolFragment.kt | 60 +++--- .../teacher/TeacherFragment.kt | 43 ++-- .../ui/modules/settings/SettingsFragment.kt | 8 +- .../ui/modules/splash/SplashActivity.kt | 3 +- .../ui/modules/timetable/TimetableDialog.kt | 138 +++++++------ .../ui/modules/timetable/TimetableFragment.kt | 61 +++--- .../completed/CompletedLessonDialog.kt | 50 +++-- .../completed/CompletedLessonsFragment.kt | 65 ++++--- .../TimetableWidgetConfigureActivity.kt | 9 +- .../wulkanowy/utils/LifecycleAwareVariable.kt | 55 ++++++ app/src/main/res/layout/fragment_about.xml | 4 +- ...t_creator.xml => fragment_contributor.xml} | 0 59 files changed, 1178 insertions(+), 1096 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/utils/LifecycleAwareVariable.kt rename app/src/main/res/layout/{fragment_creator.xml => fragment_contributor.xml} (100%) diff --git a/.bettercodehub.yml b/.bettercodehub.yml index 349f7675a..d7be51695 100644 --- a/.bettercodehub.yml +++ b/.bettercodehub.yml @@ -1,3 +1,3 @@ -component_depth: 8 +component_depth: 10 languages: - kotlin diff --git a/app/build.gradle b/app/build.gradle index 3d8fd082d..412dd1bd5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,6 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' -apply plugin: 'kotlin-android-extensions' apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'com.github.triplet.play' apply plugin: 'com.mikepenz.aboutlibraries.plugin' @@ -103,10 +102,6 @@ android { } } -androidExtensions { - experimental = true -} - play { serviceAccountEmail = System.getenv("PLAY_SERVICE_ACCOUNT_EMAIL") ?: "jan@fakelog.cf" serviceAccountCredentials = file('key.p12') diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index ee74832fd..f20fb22f3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -11,6 +11,7 @@ import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.viewbinding.ViewBinding import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG import dagger.android.AndroidInjection @@ -20,10 +21,13 @@ import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.utils.FragmentLifecycleLogger import io.github.wulkanowy.utils.getThemeAttrColor +import io.github.wulkanowy.utils.lifecycleAwareVariable import javax.inject.Inject -abstract class BaseActivity> : AppCompatActivity(), BaseView, - HasAndroidInjector { +abstract class BaseActivity, VB : ViewBinding> : + AppCompatActivity(), BaseView, HasAndroidInjector { + + protected var binding: VB by lifecycleAwareVariable() @Inject lateinit var androidInjector: DispatchingAndroidInjector diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt index fdc463714..0279dccf4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt @@ -1,9 +1,13 @@ package io.github.wulkanowy.ui.base import android.widget.Toast +import androidx.viewbinding.ViewBinding import dagger.android.support.DaggerAppCompatDialogFragment +import io.github.wulkanowy.utils.lifecycleAwareVariable -abstract class BaseDialogFragment : DaggerAppCompatDialogFragment(), BaseView { +abstract class BaseDialogFragment : DaggerAppCompatDialogFragment(), BaseView { + + protected var binding: VB by lifecycleAwareVariable() override fun showError(text: String, error: Throwable) { showMessage(text) @@ -14,11 +18,11 @@ abstract class BaseDialogFragment : DaggerAppCompatDialogFragment(), BaseView { } override fun showExpiredDialog() { - (activity as? BaseActivity<*>)?.showExpiredDialog() + (activity as? BaseActivity<*, *>)?.showExpiredDialog() } override fun openClearLoginView() { - (activity as? BaseActivity<*>)?.openClearLoginView() + (activity as? BaseActivity<*, *>)?.openClearLoginView() } override fun showErrorDetailsDialog(error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt index 2f5878d0d..83f787654 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt @@ -1,12 +1,18 @@ package io.github.wulkanowy.ui.base import android.view.View +import androidx.annotation.LayoutRes +import androidx.viewbinding.ViewBinding import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG import dagger.android.support.DaggerFragment import io.github.wulkanowy.R +import io.github.wulkanowy.utils.lifecycleAwareVariable -abstract class BaseFragment : DaggerFragment(), BaseView { +abstract class BaseFragment(@LayoutRes layoutId: Int) : DaggerFragment(layoutId), + BaseView { + + protected var binding: VB by lifecycleAwareVariable() protected var messageContainer: View? = null @@ -16,7 +22,7 @@ abstract class BaseFragment : DaggerFragment(), BaseView { .setAction(R.string.all_details) { if (isAdded) showErrorDetailsDialog(error) } .show() } else { - (activity as? BaseActivity<*>)?.showError(text, error) + (activity as? BaseActivity<*, *>)?.showError(text, error) } } @@ -28,15 +34,15 @@ abstract class BaseFragment : DaggerFragment(), BaseView { if (messageContainer != null) { Snackbar.make(messageContainer!!, text, LENGTH_LONG).show() } else { - (activity as? BaseActivity<*>)?.showMessage(text) + (activity as? BaseActivity<*, *>)?.showMessage(text) } } override fun showExpiredDialog() { - (activity as? BaseActivity<*>)?.showExpiredDialog() + (activity as? BaseActivity<*, *>)?.showExpiredDialog() } override fun openClearLoginView() { - (activity as? BaseActivity<*>)?.openClearLoginView() + (activity as? BaseActivity<*, *>)?.openClearLoginView() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt index ae3604bfd..5fd6a86a5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt @@ -11,6 +11,7 @@ import android.widget.Toast import android.widget.Toast.LENGTH_LONG import androidx.core.content.getSystemService import io.github.wulkanowy.R +import io.github.wulkanowy.databinding.DialogErrorBinding import io.github.wulkanowy.sdk.exception.FeatureDisabledException import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException import io.github.wulkanowy.sdk.exception.ServiceUnavailableException @@ -18,7 +19,6 @@ import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.getString import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser -import kotlinx.android.synthetic.main.dialog_error.* import java.io.InterruptedIOException import java.io.PrintWriter import java.io.StringWriter @@ -26,7 +26,7 @@ import java.net.SocketTimeoutException import java.net.UnknownHostException import javax.inject.Inject -class ErrorDialog : BaseDialogFragment() { +class ErrorDialog : BaseDialogFragment() { private lateinit var error: Throwable @@ -52,7 +52,7 @@ class ErrorDialog : BaseDialogFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_error, container, false) + return DialogErrorBinding.inflate(inflater).apply { binding = this }.root } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -62,27 +62,29 @@ class ErrorDialog : BaseDialogFragment() { error.printStackTrace(PrintWriter(this)) } - errorDialogContent.text = stringWriter.toString() - with(errorDialogHorizontalScroll) { - post { fullScroll(HorizontalScrollView.FOCUS_LEFT) } - } - errorDialogCopy.setOnClickListener { - val clip = ClipData.newPlainText("wulkanowy", stringWriter.toString()) - activity?.getSystemService()?.setPrimaryClip(clip) + with(binding) { + errorDialogContent.text = stringWriter.toString() + with(errorDialogHorizontalScroll) { + post { fullScroll(HorizontalScrollView.FOCUS_LEFT) } + } + errorDialogCopy.setOnClickListener { + val clip = ClipData.newPlainText("wulkanowy", stringWriter.toString()) + activity?.getSystemService()?.setPrimaryClip(clip) - Toast.makeText(context, R.string.all_copied, LENGTH_LONG).show() - } - errorDialogCancel.setOnClickListener { dismiss() } - errorDialogReport.setOnClickListener { openEmailClient(stringWriter.toString()) } - errorDialogMessage.text = resources.getString(error) - errorDialogReport.isEnabled = when (error) { - is UnknownHostException, - is InterruptedIOException, - is SocketTimeoutException, - is ServiceUnavailableException, - is FeatureDisabledException, - is FeatureNotAvailableException -> false - else -> true + Toast.makeText(context, R.string.all_copied, LENGTH_LONG).show() + } + errorDialogCancel.setOnClickListener { dismiss() } + errorDialogReport.setOnClickListener { openEmailClient(stringWriter.toString()) } + errorDialogMessage.text = resources.getString(error) + errorDialogReport.isEnabled = when (error) { + is UnknownHostException, + is InterruptedIOException, + is SocketTimeoutException, + is ServiceUnavailableException, + is FeatureDisabledException, + is FeatureNotAvailableException -> false + else -> true + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt index b2893c1e1..3828a2bc4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt @@ -2,11 +2,10 @@ package io.github.wulkanowy.ui.modules.about import android.graphics.drawable.Drawable import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R +import io.github.wulkanowy.databinding.FragmentAboutBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.about.contributor.ContributorFragment import io.github.wulkanowy.ui.modules.about.license.LicenseFragment @@ -17,10 +16,10 @@ import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.getCompatDrawable import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser -import kotlinx.android.synthetic.main.fragment_about.* import javax.inject.Inject -class AboutFragment : BaseFragment(), AboutView, MainView.TitledView { +class AboutFragment : BaseFragment(R.layout.fragment_about), AboutView, + MainView.TitledView { @Inject lateinit var presenter: AboutPresenter @@ -77,19 +76,16 @@ class AboutFragment : BaseFragment(), AboutView, MainView.TitledView { fun newInstance() = AboutFragment() } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_about, container, false) - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding = FragmentAboutBinding.bind(view) presenter.onAttachView(this) } override fun initView() { aboutAdapter.onClickListener = presenter::onItemSelected - with(aboutRecycler) { + with(binding.aboutRecycler) { layoutManager = LinearLayoutManager(context) adapter = aboutAdapter } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt index 2544836cb..42eebd347 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt @@ -1,22 +1,21 @@ package io.github.wulkanowy.ui.modules.about.contributor import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.pojos.Contributor +import io.github.wulkanowy.databinding.FragmentContributorBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.openInternetBrowser -import kotlinx.android.synthetic.main.fragment_creator.* import javax.inject.Inject -class ContributorFragment : BaseFragment(), ContributorView, MainView.TitledView { +class ContributorFragment : BaseFragment(R.layout.fragment_contributor), + ContributorView, MainView.TitledView { @Inject lateinit var presenter: ContributorPresenter @@ -30,23 +29,20 @@ class ContributorFragment : BaseFragment(), ContributorView, MainView.TitledView fun newInstance() = ContributorFragment() } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_creator, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentContributorBinding.bind(view) presenter.onAttachView(this) } override fun initView() { - with(creatorRecycler) { + with(binding.creatorRecycler) { layoutManager = LinearLayoutManager(context) adapter = creatorsAdapter addItemDecoration(DividerItemDecoration(context)) } creatorsAdapter.onClickListener = presenter::onItemSelected - creatorSeeMore.setOnClickListener { presenter.onSeeMoreClick() } + binding.creatorSeeMore.setOnClickListener { presenter.onSeeMoreClick() } } override fun updateData(data: List) { @@ -65,7 +61,7 @@ class ContributorFragment : BaseFragment(), ContributorView, MainView.TitledView } override fun showProgress(show: Boolean) { - creatorProgress.visibility = if (show) VISIBLE else GONE + binding.creatorProgress.visibility = if (show) VISIBLE else GONE } override fun onDestroyView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt index d64c6225c..f6c3b5698 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt @@ -1,11 +1,9 @@ package io.github.wulkanowy.ui.modules.about.license import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import androidx.core.text.parseAsHtml import androidx.recyclerview.widget.LinearLayoutManager @@ -13,12 +11,13 @@ import com.mikepenz.aboutlibraries.Libs import com.mikepenz.aboutlibraries.entity.Library import dagger.Lazy import io.github.wulkanowy.R +import io.github.wulkanowy.databinding.FragmentLicenseBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainView -import kotlinx.android.synthetic.main.fragment_license.* import javax.inject.Inject -class LicenseFragment : BaseFragment(), LicenseView, MainView.TitledView { +class LicenseFragment : BaseFragment(R.layout.fragment_license), + LicenseView, MainView.TitledView { @Inject lateinit var presenter: LicensePresenter @@ -40,19 +39,16 @@ class LicenseFragment : BaseFragment(), LicenseView, MainView.TitledView { fun newInstance() = LicenseFragment() } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_license, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentLicenseBinding.bind(view) presenter.onAttachView(this) } override fun initView() { licenseAdapter.onClickListener = presenter::onItemSelected - with(licenseRecycler) { + with(binding.licenseRecycler) { layoutManager = LinearLayoutManager(context) adapter = licenseAdapter } @@ -77,7 +73,7 @@ class LicenseFragment : BaseFragment(), LicenseView, MainView.TitledView { } override fun showProgress(show: Boolean) { - licenseProgress.visibility = if (show) VISIBLE else GONE + binding.licenseProgress.visibility = if (show) VISIBLE else GONE } override fun onDestroyView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerFragment.kt index 0b7b05c78..08f91aff1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerFragment.kt @@ -8,23 +8,22 @@ import android.net.Uri import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Bundle -import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.BuildConfig.APPLICATION_ID import io.github.wulkanowy.R +import io.github.wulkanowy.databinding.FragmentLogviewerBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainView -import kotlinx.android.synthetic.main.fragment_logviewer.* import java.io.File import javax.inject.Inject -class LogViewerFragment : BaseFragment(), LogViewerView, MainView.TitledView { +class LogViewerFragment : BaseFragment(R.layout.fragment_logviewer), + LogViewerView, MainView.TitledView { @Inject lateinit var presenter: LogViewerPresenter @@ -43,13 +42,10 @@ class LogViewerFragment : BaseFragment(), LogViewerView, MainView.TitledView { setHasOptionsMenu(true) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_logviewer, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = logViewerRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentLogviewerBinding.bind(view) + messageContainer = binding.logViewerRecycler presenter.onAttachView(this) } @@ -63,18 +59,18 @@ class LogViewerFragment : BaseFragment(), LogViewerView, MainView.TitledView { } override fun initView() { - with(logViewerRecycler) { + with(binding.logViewerRecycler) { layoutManager = LinearLayoutManager(context) adapter = logAdapter } - logViewRefreshButton.setOnClickListener { presenter.onRefreshClick() } + binding.logViewRefreshButton.setOnClickListener { presenter.onRefreshClick() } } override fun setLines(lines: List) { logAdapter.lines = lines logAdapter.notifyDataSetChanged() - logViewerRecycler.scrollToPosition(lines.size - 1) + binding.logViewerRecycler.scrollToPosition(lines.size - 1) } override fun shareLogs(files: List) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt index dc8cce928..ce811e0b0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt @@ -10,12 +10,12 @@ import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.DialogAccountBinding import io.github.wulkanowy.ui.base.BaseDialogFragment import io.github.wulkanowy.ui.modules.login.LoginActivity -import kotlinx.android.synthetic.main.dialog_account.* import javax.inject.Inject -class AccountDialog : BaseDialogFragment(), AccountView { +class AccountDialog : BaseDialogFragment(), AccountView { @Inject lateinit var presenter: AccountPresenter @@ -33,7 +33,7 @@ class AccountDialog : BaseDialogFragment(), AccountView { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_account, container, false) + return DialogAccountBinding.inflate(inflater).apply { binding = this }.root } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -44,11 +44,13 @@ class AccountDialog : BaseDialogFragment(), AccountView { override fun initView() { accountAdapter.onClickListener = presenter::onItemSelected - accountDialogAdd.setOnClickListener { presenter.onAddSelected() } - accountDialogRemove.setOnClickListener { presenter.onRemoveSelected() } - accountDialogRecycler.apply { - layoutManager = LinearLayoutManager(context) - adapter = accountAdapter + with(binding) { + accountDialogAdd.setOnClickListener { presenter.onAddSelected() } + accountDialogRemove.setOnClickListener { presenter.onRemoveSelected() } + accountDialogRecycler.apply { + layoutManager = LinearLayoutManager(context) + adapter = accountAdapter + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt index 611dd999e..97b76e812 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt @@ -5,13 +5,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.DialogFragment -import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Attendance +import io.github.wulkanowy.databinding.DialogAttendanceBinding +import io.github.wulkanowy.utils.lifecycleAwareVariable import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.synthetic.main.dialog_attendance.* class AttendanceDialog : DialogFragment() { + private var binding: DialogAttendanceBinding by lifecycleAwareVariable() + private lateinit var attendance: Attendance companion object { @@ -33,16 +35,18 @@ class AttendanceDialog : DialogFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_attendance, container, false) + return DialogAttendanceBinding.inflate(inflater).apply { binding = this }.root } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - attendanceDialogSubject.text = attendance.subject - attendanceDialogDescription.text = attendance.name - attendanceDialogDate.text = attendance.date.toFormattedString() - attendanceDialogNumber.text = attendance.number.toString() - attendanceDialogClose.setOnClickListener { dismiss() } + with(binding) { + attendanceDialogSubject.text = attendance.subject + attendanceDialogDescription.text = attendance.name + attendanceDialogDate.text = attendance.date.toFormattedString() + attendanceDialogNumber.text = attendance.number.toString() + attendanceDialogClose.setOnClickListener { dismiss() } + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 31b0a3c29..6599243dd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -10,13 +10,14 @@ import android.view.View import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import androidx.appcompat.view.ActionMode import androidx.recyclerview.widget.LinearLayoutManager import com.wdullaer.materialdatetimepicker.date.DatePickerDialog import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Attendance +import io.github.wulkanowy.databinding.DialogExcuseBinding +import io.github.wulkanowy.databinding.FragmentAttendanceBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.attendance.summary.AttendanceSummaryFragment @@ -24,12 +25,10 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.SchooldaysRangeLimiter import io.github.wulkanowy.utils.dpToPx -import kotlinx.android.synthetic.main.dialog_excuse.* -import kotlinx.android.synthetic.main.fragment_attendance.* import org.threeten.bp.LocalDate import javax.inject.Inject -class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildView, +class AttendanceFragment : BaseFragment(R.layout.fragment_attendance), AttendanceView, MainView.MainChildView, MainView.TitledView { @Inject @@ -89,13 +88,10 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie setHasOptionsMenu(true) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_attendance, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = attendanceRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentAttendanceBinding.bind(view) + messageContainer = binding.attendanceRecycler presenter.onAttachView(this, savedInstanceState?.getLong(SAVED_DATE_KEY)) } @@ -105,23 +101,25 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie onExcuseCheckboxSelect = presenter::onExcuseCheckboxSelect } - with(attendanceRecycler) { + with(binding.attendanceRecycler) { layoutManager = LinearLayoutManager(context) adapter = attendanceAdapter addItemDecoration(DividerItemDecoration(context)) } - attendanceSwipe.setOnRefreshListener(presenter::onSwipeRefresh) - attendanceErrorRetry.setOnClickListener { presenter.onRetry() } - attendanceErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + attendanceSwipe.setOnRefreshListener(presenter::onSwipeRefresh) + attendanceErrorRetry.setOnClickListener { presenter.onRetry() } + attendanceErrorDetails.setOnClickListener { presenter.onDetailsClick() } - attendancePreviousButton.setOnClickListener { presenter.onPreviousDay() } - attendanceNavDate.setOnClickListener { presenter.onPickDate() } - attendanceNextButton.setOnClickListener { presenter.onNextDay() } + attendancePreviousButton.setOnClickListener { presenter.onPreviousDay() } + attendanceNavDate.setOnClickListener { presenter.onPickDate() } + attendanceNextButton.setOnClickListener { presenter.onNextDay() } - attendanceExcuseButton.setOnClickListener { presenter.onExcuseButtonClick() } + attendanceExcuseButton.setOnClickListener { presenter.onExcuseButtonClick() } - attendanceNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + attendanceNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + } } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { @@ -141,7 +139,7 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie } override fun updateNavigationDay(date: String) { - attendanceNavDate.text = date + binding.attendanceNavDate.text = date } override fun clearData() { @@ -152,7 +150,7 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie } override fun resetView() { - attendanceRecycler.smoothScrollToPosition(0) + binding.attendanceRecycler.smoothScrollToPosition(0) } override fun onFragmentReselected() { @@ -168,43 +166,43 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie } override fun showEmpty(show: Boolean) { - attendanceEmpty.visibility = if (show) VISIBLE else GONE + binding.attendanceEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - attendanceError.visibility = if (show) VISIBLE else GONE + binding.attendanceError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - attendanceErrorMessage.text = message + binding.attendanceErrorMessage.text = message } override fun showProgress(show: Boolean) { - attendanceProgress.visibility = if (show) VISIBLE else GONE + binding.attendanceProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - attendanceSwipe.isEnabled = enable + binding.attendanceSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - attendanceRecycler.visibility = if (show) VISIBLE else GONE + binding. attendanceRecycler.visibility = if (show) VISIBLE else GONE } override fun hideRefresh() { - attendanceSwipe.isRefreshing = false + binding.attendanceSwipe.isRefreshing = false } override fun showPreButton(show: Boolean) { - attendancePreviousButton.visibility = if (show) VISIBLE else INVISIBLE + binding.attendancePreviousButton.visibility = if (show) VISIBLE else INVISIBLE } override fun showNextButton(show: Boolean) { - attendanceNextButton.visibility = if (show) VISIBLE else INVISIBLE + binding. attendanceNextButton.visibility = if (show) VISIBLE else INVISIBLE } override fun showExcuseButton(show: Boolean) { - attendanceExcuseButton.visibility = if (show) VISIBLE else GONE + binding.attendanceExcuseButton.visibility = if (show) VISIBLE else GONE } override fun showAttendanceDialog(lesson: Attendance) { @@ -227,14 +225,15 @@ class AttendanceFragment : BaseFragment(), AttendanceView, MainView.MainChildVie } override fun showExcuseDialog() { + val dialogBinding = DialogExcuseBinding.inflate(LayoutInflater.from(context)) AlertDialog.Builder(requireContext()) .setTitle(R.string.attendance_excuse_title) - .setView(R.layout.dialog_excuse) + .setView(dialogBinding.root) .setNegativeButton(android.R.string.cancel) { _, _ -> } .create() .apply { setButton(BUTTON_POSITIVE, getString(R.string.attendance_excuse_dialog_submit)) { _, _ -> - presenter.onExcuseDialogSubmit(excuseReason.text?.toString().orEmpty()) + presenter.onExcuseDialogSubmit(dialogBinding.excuseReason.text?.toString().orEmpty()) } }.show() } 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 a6d4cf220..236c3da16 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 @@ -23,7 +23,7 @@ class AttendanceSummaryAdapter @Inject constructor() : var items = emptyList() - override fun getItemCount() = items.size + 2 + override fun getItemCount() = if (items.isNotEmpty()) items.size + 2 else 0 override fun getItemViewType(position: Int) = when (position) { 0 -> ViewType.HEADER.id diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt index 4ec9cceda..1b9fe08ef 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt @@ -1,25 +1,25 @@ package io.github.wulkanowy.ui.modules.attendance.summary import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE -import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.TextView import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.AttendanceSummary +import io.github.wulkanowy.databinding.FragmentAttendanceSummaryBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.setOnItemSelectedListener -import kotlinx.android.synthetic.main.fragment_attendance_summary.* import javax.inject.Inject -class AttendanceSummaryFragment : BaseFragment(), AttendanceSummaryView, MainView.TitledView { +class AttendanceSummaryFragment : + BaseFragment(R.layout.fragment_attendance_summary), + AttendanceSummaryView, MainView.TitledView { @Inject lateinit var presenter: AttendanceSummaryPresenter @@ -39,35 +39,34 @@ class AttendanceSummaryFragment : BaseFragment(), AttendanceSummaryView, MainVie override val isViewEmpty get() = attendanceSummaryAdapter.items.isEmpty() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_attendance_summary, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = attendanceSummaryRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentAttendanceSummaryBinding.bind(view) + messageContainer = binding.attendanceSummaryRecycler presenter.onAttachView(this, savedInstanceState?.getInt(SAVED_SUBJECT_KEY)) } override fun initView() { - with(attendanceSummaryRecycler) { + with(binding.attendanceSummaryRecycler) { layoutManager = LinearLayoutManager(context) adapter = attendanceSummaryAdapter } - attendanceSummarySwipe.setOnRefreshListener(presenter::onSwipeRefresh) - attendanceSummaryErrorRetry.setOnClickListener { presenter.onRetry() } - attendanceSummaryErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + attendanceSummarySwipe.setOnRefreshListener(presenter::onSwipeRefresh) + attendanceSummaryErrorRetry.setOnClickListener { presenter.onRetry() } + attendanceSummaryErrorDetails.setOnClickListener { presenter.onDetailsClick() } + } subjectsAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, mutableListOf()) subjectsAdapter.setDropDownViewResource(R.layout.item_attendance_summary_subject) - with(attendanceSummarySubjects) { + with(binding.attendanceSummarySubjects) { adapter = subjectsAdapter setOnItemSelectedListener { presenter.onSubjectSelected(it?.text?.toString()) } } - attendanceSummarySubjectsContainer.setElevationCompat(requireContext().dpToPx(1f)) + binding.attendanceSummarySubjectsContainer.setElevationCompat(requireContext().dpToPx(1f)) } override fun updateSubjects(data: ArrayList) { @@ -93,35 +92,35 @@ class AttendanceSummaryFragment : BaseFragment(), AttendanceSummaryView, MainVie } override fun showEmpty(show: Boolean) { - attendanceSummaryEmpty.visibility = if (show) VISIBLE else GONE + binding.attendanceSummaryEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - attendanceSummaryError.visibility = if (show) VISIBLE else GONE + binding.attendanceSummaryError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - attendanceSummaryErrorMessage.text = message + binding.attendanceSummaryErrorMessage.text = message } override fun showProgress(show: Boolean) { - attendanceSummaryProgress.visibility = if (show) VISIBLE else GONE + binding.attendanceSummaryProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - attendanceSummarySwipe.isEnabled = enable + binding.attendanceSummarySwipe.isEnabled = enable } override fun showContent(show: Boolean) { - attendanceSummaryRecycler.visibility = if (show) VISIBLE else GONE + binding.attendanceSummaryRecycler.visibility = if (show) VISIBLE else GONE } override fun showSubjects(show: Boolean) { - attendanceSummarySubjectsContainer.visibility = if (show) VISIBLE else INVISIBLE + binding.attendanceSummarySubjectsContainer.visibility = if (show) VISIBLE else INVISIBLE } override fun hideRefresh() { - attendanceSummarySwipe.isRefreshing = false + binding.attendanceSummarySwipe.isRefreshing = false } override fun onSaveInstanceState(outState: Bundle) { @@ -130,7 +129,7 @@ class AttendanceSummaryFragment : BaseFragment(), AttendanceSummaryView, MainVie } override fun onDestroyView() { - super.onDestroyView() presenter.onDetachView() + super.onDestroyView() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamDialog.kt index ed5092c96..c1a6f1f0d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamDialog.kt @@ -5,13 +5,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.DialogFragment -import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Exam +import io.github.wulkanowy.databinding.DialogExamBinding +import io.github.wulkanowy.utils.lifecycleAwareVariable import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.synthetic.main.dialog_exam.* class ExamDialog : DialogFragment() { + private var binding: DialogExamBinding by lifecycleAwareVariable() + private lateinit var exam: Exam companion object { @@ -33,18 +35,20 @@ class ExamDialog : DialogFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_exam, container, false) + return DialogExamBinding.inflate(inflater).apply { binding = this }.root } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - examDialogSubjectValue.text = exam.subject - examDialogTypeValue.text = exam.type - examDialogTeacherValue.text = exam.teacher - examDialogDateValue.text = exam.entryDate.toFormattedString() - examDialogDescriptionValue.text = exam.description + with(binding) { + examDialogSubjectValue.text = exam.subject + examDialogTypeValue.text = exam.type + examDialogTeacherValue.text = exam.teacher + examDialogDateValue.text = exam.entryDate.toFormattedString() + examDialogDescriptionValue.text = exam.description - examDialogClose.setOnClickListener { dismiss() } + examDialogClose.setOnClickListener { dismiss() } + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt index cc395f626..eeab30c15 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt @@ -1,24 +1,23 @@ package io.github.wulkanowy.ui.modules.exam import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Exam +import io.github.wulkanowy.databinding.FragmentExamBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.dpToPx -import kotlinx.android.synthetic.main.fragment_exam.* import javax.inject.Inject -class ExamFragment : BaseFragment(), ExamView, MainView.MainChildView, MainView.TitledView { +class ExamFragment : BaseFragment(R.layout.fragment_exam), ExamView, + MainView.MainChildView, MainView.TitledView { @Inject lateinit var presenter: ExamPresenter @@ -36,37 +35,36 @@ class ExamFragment : BaseFragment(), ExamView, MainView.MainChildView, MainView. override val isViewEmpty get() = examAdapter.items.isEmpty() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_exam, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = examRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentExamBinding.bind(view) + messageContainer = binding.examRecycler presenter.onAttachView(this, savedInstanceState?.getLong(SAVED_DATE_KEY)) } override fun initView() { examAdapter.onClickListener = presenter::onExamItemSelected - with(examRecycler) { + with(binding.examRecycler) { layoutManager = LinearLayoutManager(context) adapter = examAdapter addItemDecoration(DividerItemDecoration(context)) } - examSwipe.setOnRefreshListener(presenter::onSwipeRefresh) - examErrorRetry.setOnClickListener { presenter.onRetry() } - examErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + examSwipe.setOnRefreshListener(presenter::onSwipeRefresh) + examErrorRetry.setOnClickListener { presenter.onRetry() } + examErrorDetails.setOnClickListener { presenter.onDetailsClick() } - examPreviousButton.setOnClickListener { presenter.onPreviousWeek() } - examNextButton.setOnClickListener { presenter.onNextWeek() } + examPreviousButton.setOnClickListener { presenter.onPreviousWeek() } + examNextButton.setOnClickListener { presenter.onNextWeek() } - examNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + examNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + } } override fun hideRefresh() { - examSwipe.isRefreshing = false + binding.examSwipe.isRefreshing = false } override fun updateData(data: List>) { @@ -77,7 +75,7 @@ class ExamFragment : BaseFragment(), ExamView, MainView.MainChildView, MainView. } override fun updateNavigationWeek(date: String) { - examNavDate.text = date + binding.examNavDate.text = date } override fun clearData() { @@ -88,7 +86,7 @@ class ExamFragment : BaseFragment(), ExamView, MainView.MainChildView, MainView. } override fun resetView() { - examRecycler.scrollToPosition(0) + binding.examRecycler.scrollToPosition(0) } override fun onFragmentReselected() { @@ -96,35 +94,35 @@ class ExamFragment : BaseFragment(), ExamView, MainView.MainChildView, MainView. } override fun showEmpty(show: Boolean) { - examEmpty.visibility = if (show) VISIBLE else GONE + binding.examEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - examError.visibility = if (show) VISIBLE else GONE + binding.examError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - examErrorMessage.text = message + binding.examErrorMessage.text = message } override fun showProgress(show: Boolean) { - examProgress.visibility = if (show) VISIBLE else GONE + binding.examProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - examSwipe.isEnabled = enable + binding.examSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - examRecycler.visibility = if (show) VISIBLE else GONE + binding.examRecycler.visibility = if (show) VISIBLE else GONE } override fun showPreButton(show: Boolean) { - examPreviousButton.visibility = if (show) VISIBLE else INVISIBLE + binding.examPreviousButton.visibility = if (show) VISIBLE else INVISIBLE } override fun showNextButton(show: Boolean) { - examNextButton.visibility = if (show) VISIBLE else INVISIBLE + binding.examNextButton.visibility = if (show) VISIBLE else INVISIBLE } override fun showExamDialog(exam: Exam) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt index b1faf18f1..59b83c4b0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt @@ -1,16 +1,15 @@ package io.github.wulkanowy.ui.modules.grade import android.os.Bundle -import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import io.github.wulkanowy.R +import io.github.wulkanowy.databinding.FragmentGradeBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter import io.github.wulkanowy.ui.modules.grade.details.GradeDetailsFragment @@ -19,10 +18,9 @@ import io.github.wulkanowy.ui.modules.grade.summary.GradeSummaryFragment import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.setOnSelectPageListener -import kotlinx.android.synthetic.main.fragment_grade.* import javax.inject.Inject -class GradeFragment : BaseFragment(), GradeView, MainView.MainChildView, MainView.TitledView { +class GradeFragment : BaseFragment(R.layout.fragment_grade), GradeView, MainView.MainChildView, MainView.TitledView { @Inject lateinit var presenter: GradePresenter @@ -42,19 +40,16 @@ class GradeFragment : BaseFragment(), GradeView, MainView.MainChildView, MainVie override var subtitleString = "" - override val currentPageIndex get() = gradeViewPager.currentItem + override val currentPageIndex get() = binding.gradeViewPager.currentItem override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_grade, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentGradeBinding.bind(view) presenter.onAttachView(this, savedInstanceState?.getInt(SAVED_SEMESTER_KEY)) } @@ -66,7 +61,7 @@ class GradeFragment : BaseFragment(), GradeView, MainView.MainChildView, MainVie override fun initView() { with(pagerAdapter) { - containerId = gradeViewPager.id + containerId = binding.gradeViewPager.id addFragmentsWithTitle(mapOf( GradeDetailsFragment.newInstance() to getString(R.string.all_details), GradeSummaryFragment.newInstance() to getString(R.string.grade_menu_summary), @@ -74,19 +69,21 @@ class GradeFragment : BaseFragment(), GradeView, MainView.MainChildView, MainVie )) } - with(gradeViewPager) { + with(binding.gradeViewPager) { adapter = pagerAdapter offscreenPageLimit = 3 setOnSelectPageListener(presenter::onPageSelected) } - with(gradeTabLayout) { - setupWithViewPager(gradeViewPager) + with(binding.gradeTabLayout) { + setupWithViewPager(binding.gradeViewPager) setElevationCompat(context.dpToPx(4f)) } - gradeErrorRetry.setOnClickListener { presenter.onRetry() } - gradeErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + gradeErrorRetry.setOnClickListener { presenter.onRetry() } + gradeErrorDetails.setOnClickListener { presenter.onDetailsClick() } + } } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -99,20 +96,22 @@ class GradeFragment : BaseFragment(), GradeView, MainView.MainChildView, MainVie } override fun showContent(show: Boolean) { - gradeViewPager.visibility = if (show) VISIBLE else INVISIBLE - gradeTabLayout.visibility = if (show) VISIBLE else INVISIBLE + with(binding) { + gradeViewPager.visibility = if (show) VISIBLE else INVISIBLE + gradeTabLayout.visibility = if (show) VISIBLE else INVISIBLE + } } override fun showProgress(show: Boolean) { - gradeProgress.visibility = if (show) VISIBLE else INVISIBLE + binding.gradeProgress.visibility = if (show) VISIBLE else INVISIBLE } override fun showErrorView(show: Boolean) { - gradeError.visibility = if (show) VISIBLE else INVISIBLE + binding.gradeError.visibility = if (show) VISIBLE else INVISIBLE } override fun setErrorDetails(message: String) { - gradeErrorMessage.text = message + binding.gradeErrorMessage.text = message } override fun showSemesterSwitch(show: Boolean) { @@ -166,7 +165,7 @@ class GradeFragment : BaseFragment(), GradeView, MainView.MainChildView, MainVie } override fun onDestroyView() { - super.onDestroyView() presenter.onDetachView() + super.onDestroyView() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt index a8f8a8653..698aff3ea 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt @@ -8,14 +8,17 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.databinding.DialogGradeBinding import io.github.wulkanowy.utils.colorStringId import io.github.wulkanowy.utils.getBackgroundColor import io.github.wulkanowy.utils.getGradeColor +import io.github.wulkanowy.utils.lifecycleAwareVariable import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.synthetic.main.dialog_grade.* class GradeDetailsDialog : DialogFragment() { + private var binding: DialogGradeBinding by lifecycleAwareVariable() + private lateinit var grade: Grade private lateinit var colorScheme: String @@ -44,47 +47,49 @@ class GradeDetailsDialog : DialogFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_grade, container, false) + return DialogGradeBinding.inflate(inflater).apply { binding = this }.root } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - gradeDialogSubject.text = grade.subject + with(binding) { + gradeDialogSubject.text = grade.subject - gradeDialogColorAndWeightValue.run { - text = context.getString(R.string.grade_weight_value, grade.weight) - setBackgroundResource(grade.getGradeColor()) - } - - gradeDialogDateValue.text = grade.date.toFormattedString() - gradeDialogColorValue.text = getString(grade.colorStringId) - - gradeDialogCommentValue.apply { - if (grade.comment.isBlank()) { - visibility = GONE - gradeDialogComment.visibility = GONE - } else text = grade.comment - } - - gradeDialogValue.run { - text = grade.entry - setBackgroundResource(grade.getBackgroundColor(colorScheme)) - } - - gradeDialogTeacherValue.text = if (grade.teacher.isBlank()) { - getString(R.string.all_no_data) - } else grade.teacher - - gradeDialogDescriptionValue.text = grade.run { - when { - description.isBlank() && gradeSymbol.isNotBlank() -> gradeSymbol - description.isBlank() && gradeSymbol.isBlank() -> getString(R.string.all_no_description) - gradeSymbol.isNotBlank() && description.isNotBlank() -> "$gradeSymbol - $description" - else -> description + gradeDialogColorAndWeightValue.run { + text = context.getString(R.string.grade_weight_value, grade.weight) + setBackgroundResource(grade.getGradeColor()) } - } - gradeDialogClose.setOnClickListener { dismiss() } + gradeDialogDateValue.text = grade.date.toFormattedString() + gradeDialogColorValue.text = getString(grade.colorStringId) + + gradeDialogCommentValue.apply { + if (grade.comment.isBlank()) { + visibility = GONE + gradeDialogComment.visibility = GONE + } else text = grade.comment + } + + gradeDialogValue.run { + text = grade.entry + setBackgroundResource(grade.getBackgroundColor(colorScheme)) + } + + gradeDialogTeacherValue.text = if (grade.teacher.isBlank()) { + getString(R.string.all_no_data) + } else grade.teacher + + gradeDialogDescriptionValue.text = grade.run { + when { + description.isBlank() && gradeSymbol.isNotBlank() -> gradeSymbol + description.isBlank() && gradeSymbol.isBlank() -> getString(R.string.all_no_description) + gradeSymbol.isNotBlank() && description.isNotBlank() -> "$gradeSymbol - $description" + else -> description + } + } + + gradeDialogClose.setOnClickListener { dismiss() } + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt index e0cfca2f1..ac50b9f53 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.ui.modules.grade.details import android.os.Bundle -import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater import android.view.MenuItem @@ -9,18 +8,19 @@ import android.view.View import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.databinding.FragmentGradeDetailsBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment import io.github.wulkanowy.ui.modules.grade.GradeView import io.github.wulkanowy.ui.modules.main.MainActivity -import kotlinx.android.synthetic.main.fragment_grade_details.* import javax.inject.Inject -class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeChildView { +class GradeDetailsFragment : + BaseFragment(R.layout.fragment_grade_details), GradeDetailsView, + GradeView.GradeChildView { @Inject lateinit var presenter: GradeDetailsPresenter @@ -42,13 +42,10 @@ class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeCh setHasOptionsMenu(true) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_grade_details, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = gradeDetailsRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentGradeDetailsBinding.bind(view) + messageContainer = binding.gradeDetailsRecycler presenter.onAttachView(this) } @@ -61,13 +58,15 @@ class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeCh override fun initView() { gradeDetailsAdapter.onClickListener = presenter::onGradeItemSelected - gradeDetailsRecycler.run { - layoutManager = LinearLayoutManager(context) - adapter = gradeDetailsAdapter + with(binding) { + with(gradeDetailsRecycler) { + layoutManager = LinearLayoutManager(context) + adapter = gradeDetailsAdapter + } + gradeDetailsSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } + gradeDetailsErrorRetry.setOnClickListener { presenter.onRetry() } + gradeDetailsErrorDetails.setOnClickListener { presenter.onDetailsClick() } } - gradeDetailsSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } - gradeDetailsErrorRetry.setOnClickListener { presenter.onRetry() } - gradeDetailsErrorDetails.setOnClickListener { presenter.onDetailsClick() } } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -99,7 +98,7 @@ class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeCh } override fun scrollToStart() { - gradeDetailsRecycler.smoothScrollToPosition(0) + binding.gradeDetailsRecycler.smoothScrollToPosition(0) } override fun getHeaderOfItem(subject: String): GradeDetailsItem { @@ -111,31 +110,31 @@ class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeCh } override fun showProgress(show: Boolean) { - gradeDetailsProgress.visibility = if (show) VISIBLE else GONE + binding.gradeDetailsProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - gradeDetailsSwipe.isEnabled = enable + binding.gradeDetailsSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - gradeDetailsRecycler.visibility = if (show) VISIBLE else INVISIBLE + binding.gradeDetailsRecycler.visibility = if (show) VISIBLE else INVISIBLE } override fun showEmpty(show: Boolean) { - gradeDetailsEmpty.visibility = if (show) VISIBLE else INVISIBLE + binding.gradeDetailsEmpty.visibility = if (show) VISIBLE else INVISIBLE } override fun showErrorView(show: Boolean) { - gradeDetailsError.visibility = if (show) VISIBLE else GONE + binding.gradeDetailsError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - gradeDetailsErrorMessage.text = message + binding.gradeDetailsErrorMessage.text = message } override fun showRefresh(show: Boolean) { - gradeDetailsSwipe.isRefreshing = show + binding.gradeDetailsSwipe.isRefreshing = show } override fun showGradeDialog(grade: Grade, colorScheme: String) { @@ -167,7 +166,7 @@ class GradeDetailsFragment : BaseFragment(), GradeDetailsView, GradeView.GradeCh } override fun onDestroyView() { - super.onDestroyView() presenter.onDetachView() + super.onDestroyView() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt index a7b7b6534..8c1f0b0d6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt @@ -2,7 +2,6 @@ package io.github.wulkanowy.ui.modules.grade.statistics import android.graphics.Color import android.view.LayoutInflater -import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup @@ -21,9 +20,9 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.GradePointsStatistics import io.github.wulkanowy.data.db.entities.GradeStatistics import io.github.wulkanowy.data.pojos.GradeStatisticsItem +import io.github.wulkanowy.databinding.ItemGradeStatisticsBarBinding +import io.github.wulkanowy.databinding.ItemGradeStatisticsPieBinding import io.github.wulkanowy.utils.getThemeAttrColor -import kotlinx.android.synthetic.main.item_grade_statistics_bar.view.* -import kotlinx.android.synthetic.main.item_grade_statistics_pie.view.* import javax.inject.Inject class GradeStatisticsAdapter @Inject constructor() : @@ -62,30 +61,26 @@ class GradeStatisticsAdapter @Inject constructor() : override fun getItemCount() = items.size - override fun getItemViewType(position: Int): Int { - return when (items[position].type) { - ViewType.SEMESTER, ViewType.PARTIAL -> R.layout.item_grade_statistics_pie - ViewType.POINTS -> R.layout.item_grade_statistics_bar - } - } + override fun getItemViewType(position: Int) = items[position].type.id override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - val viewHolder = LayoutInflater.from(parent.context).inflate(viewType, parent, false) + val inflater = LayoutInflater.from(parent.context) return when (viewType) { - R.layout.item_grade_statistics_bar -> GradeStatisticsBar(viewHolder) - else -> GradeStatisticsPie(viewHolder) + ViewType.PARTIAL.id, ViewType.SEMESTER.id -> PieViewHolder(ItemGradeStatisticsPieBinding.inflate(inflater, parent, false)) + ViewType.POINTS.id -> BarViewHolder(ItemGradeStatisticsBarBinding.inflate(inflater, parent, false)) + else -> throw IllegalStateException() } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { - is GradeStatisticsPie -> bindPieChart(holder, items[position].partial) - is GradeStatisticsBar -> bindBarChart(holder, items[position].points!!) + is PieViewHolder -> bindPieChart(holder, items[position].partial) + is BarViewHolder -> bindBarChart(holder, items[position].points!!) } } - private fun bindPieChart(holder: GradeStatisticsPie, partials: List) { - with(holder.view.gradeStatisticsPieTitle) { + private fun bindPieChart(holder: PieViewHolder, partials: List) { + with(holder.binding.gradeStatisticsPieTitle) { text = partials.firstOrNull()?.subject visibility = if (items.size == 1) GONE else VISIBLE } @@ -105,10 +100,10 @@ class GradeStatisticsAdapter @Inject constructor() : valueTextColor = Color.WHITE setColors(partials.map { gradeColors.single { color -> color.first == it.grade }.second - }.toIntArray(), holder.view.context) + }.toIntArray(), holder.binding.root.context) } - with(holder.view.gradeStatisticsPie) { + with(holder.binding.gradeStatisticsPie) { setTouchEnabled(false) if (partials.size == 1) animateXY(1000, 1000) data = PieData(dataset).apply { @@ -140,8 +135,8 @@ class GradeStatisticsAdapter @Inject constructor() : } } - private fun bindBarChart(holder: GradeStatisticsBar, points: GradePointsStatistics) { - with(holder.view.gradeStatisticsBarTitle) { + private fun bindBarChart(holder: BarViewHolder, points: GradePointsStatistics) { + with(holder.binding.gradeStatisticsBarTitle) { text = points.subject visibility = if (items.size == 1) GONE else VISIBLE } @@ -153,14 +148,14 @@ class GradeStatisticsAdapter @Inject constructor() : with(dataset) { valueTextSize = 12f - valueTextColor = holder.view.context.getThemeAttrColor(android.R.attr.textColorPrimary) + valueTextColor = holder.binding.root.context.getThemeAttrColor(android.R.attr.textColorPrimary) valueFormatter = object : ValueFormatter() { override fun getBarLabel(barEntry: BarEntry) = "${barEntry.y}%" } colors = gradePointsColors } - with(holder.view.gradeStatisticsBar) { + with(holder.binding.gradeStatisticsBar) { setTouchEnabled(false) if (items.size == 1) animateXY(1000, 1000) data = BarData(dataset).apply { @@ -183,7 +178,7 @@ class GradeStatisticsAdapter @Inject constructor() : description.isEnabled = false - holder.view.context.getThemeAttrColor(android.R.attr.textColorPrimary).let { + holder.binding.root.context.getThemeAttrColor(android.R.attr.textColorPrimary).let { axisLeft.textColor = it axisRight.textColor = it } @@ -203,7 +198,9 @@ class GradeStatisticsAdapter @Inject constructor() : } } - class GradeStatisticsPie(val view: View) : RecyclerView.ViewHolder(view) + private class PieViewHolder(val binding: ItemGradeStatisticsPieBinding) : + RecyclerView.ViewHolder(binding.root) - class GradeStatisticsBar(val view: View) : RecyclerView.ViewHolder(view) + private class BarViewHolder(val binding: ItemGradeStatisticsBarBinding) : + RecyclerView.ViewHolder(binding.root) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt index c05cf3800..c6786dbcc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt @@ -1,23 +1,23 @@ package io.github.wulkanowy.ui.modules.grade.statistics import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.TextView import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.pojos.GradeStatisticsItem +import io.github.wulkanowy.databinding.FragmentGradeStatisticsBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment import io.github.wulkanowy.ui.modules.grade.GradeView import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.setOnItemSelectedListener -import kotlinx.android.synthetic.main.fragment_grade_statistics.* import javax.inject.Inject -class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.GradeChildView { +class GradeStatisticsFragment : + BaseFragment(R.layout.fragment_grade_statistics), + GradeStatisticsView, GradeView.GradeChildView { @Inject lateinit var presenter: GradeStatisticsPresenter @@ -36,24 +36,21 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G override val isViewEmpty get() = statisticsAdapter.items.isEmpty() override val currentType - get() = when (gradeStatisticsTypeSwitch.checkedRadioButtonId) { + get() = when (binding.gradeStatisticsTypeSwitch.checkedRadioButtonId) { R.id.gradeStatisticsTypeSemester -> ViewType.SEMESTER R.id.gradeStatisticsTypePartial -> ViewType.PARTIAL else -> ViewType.POINTS } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_grade_statistics, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = gradeStatisticsSwipe + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentGradeStatisticsBinding.bind(view) + messageContainer = binding.gradeStatisticsSwipe presenter.onAttachView(this, savedInstanceState?.getSerializable(SAVED_CHART_TYPE) as? ViewType) } override fun initView() { - with(gradeStatisticsRecycler) { + with(binding.gradeStatisticsRecycler) { layoutManager = LinearLayoutManager(requireContext()) adapter = statisticsAdapter } @@ -61,16 +58,18 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G subjectsAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, mutableListOf()) subjectsAdapter.setDropDownViewResource(R.layout.item_attendance_summary_subject) - with(gradeStatisticsSubjects) { + with(binding.gradeStatisticsSubjects) { adapter = subjectsAdapter setOnItemSelectedListener { presenter.onSubjectSelected(it?.text?.toString()) } } - gradeStatisticsSubjectsContainer.setElevationCompat(requireContext().dpToPx(1f)) + with(binding) { + gradeStatisticsSubjectsContainer.setElevationCompat(requireContext().dpToPx(1f)) - gradeStatisticsSwipe.setOnRefreshListener(presenter::onSwipeRefresh) - gradeStatisticsErrorRetry.setOnClickListener { presenter.onRetry() } - gradeStatisticsErrorDetails.setOnClickListener { presenter.onDetailsClick() } + gradeStatisticsSwipe.setOnRefreshListener(presenter::onSwipeRefresh) + gradeStatisticsErrorRetry.setOnClickListener { presenter.onRetry() } + gradeStatisticsErrorDetails.setOnClickListener { presenter.onDetailsClick() } + } } override fun updateSubjects(data: ArrayList) { @@ -88,8 +87,10 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G } override fun showSubjects(show: Boolean) { - gradeStatisticsSubjectsContainer.visibility = if (show) View.VISIBLE else View.INVISIBLE - gradeStatisticsTypeSwitch.visibility = if (show) View.VISIBLE else View.INVISIBLE + with(binding) { + gradeStatisticsSubjectsContainer.visibility = if (show) View.VISIBLE else View.INVISIBLE + gradeStatisticsTypeSwitch.visibility = if (show) View.VISIBLE else View.INVISIBLE + } } override fun clearView() { @@ -97,35 +98,35 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G } override fun resetView() { - gradeStatisticsScroll.scrollTo(0, 0) + binding.gradeStatisticsScroll.scrollTo(0, 0) } override fun showContent(show: Boolean) { - gradeStatisticsRecycler.visibility = if (show) View.VISIBLE else View.GONE + binding.gradeStatisticsRecycler.visibility = if (show) View.VISIBLE else View.GONE } override fun showEmpty(show: Boolean) { - gradeStatisticsEmpty.visibility = if (show) View.VISIBLE else View.INVISIBLE + binding.gradeStatisticsEmpty.visibility = if (show) View.VISIBLE else View.INVISIBLE } override fun showErrorView(show: Boolean) { - gradeStatisticsError.visibility = if (show) View.VISIBLE else View.GONE + binding.gradeStatisticsError.visibility = if (show) View.VISIBLE else View.GONE } override fun setErrorDetails(message: String) { - gradeStatisticsErrorMessage.text = message + binding.gradeStatisticsErrorMessage.text = message } override fun showProgress(show: Boolean) { - gradeStatisticsProgress.visibility = if (show) View.VISIBLE else View.GONE + binding.gradeStatisticsProgress.visibility = if (show) View.VISIBLE else View.GONE } override fun enableSwipe(enable: Boolean) { - gradeStatisticsSwipe.isEnabled = enable + binding.gradeStatisticsSwipe.isEnabled = enable } override fun showRefresh(show: Boolean) { - gradeStatisticsSwipe.isRefreshing = show + binding.gradeStatisticsSwipe.isRefreshing = show } override fun onParentLoadData(semesterId: Int, forceRefresh: Boolean) { @@ -150,7 +151,7 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G override fun onResume() { super.onResume() - gradeStatisticsTypeSwitch.setOnCheckedChangeListener { _, _ -> presenter.onTypeChange() } + binding.gradeStatisticsTypeSwitch.setOnCheckedChangeListener { _, _ -> presenter.onTypeChange() } } override fun onSaveInstanceState(outState: Bundle) { @@ -159,7 +160,7 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G } override fun onDestroyView() { - super.onDestroyView() presenter.onDetachView() + super.onDestroyView() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/ViewType.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/ViewType.kt index 08c37d587..02e95b0e5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/ViewType.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/ViewType.kt @@ -1,7 +1,7 @@ package io.github.wulkanowy.ui.modules.grade.statistics -enum class ViewType { - SEMESTER, - PARTIAL, - POINTS +enum class ViewType(val id: Int) { + SEMESTER(1), + PARTIAL(2), + POINTS(3) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt index 3addfb6ed..d169f7c62 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt @@ -1,22 +1,22 @@ package io.github.wulkanowy.ui.modules.grade.summary import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.GradeSummary +import io.github.wulkanowy.databinding.FragmentGradeSummaryBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment import io.github.wulkanowy.ui.modules.grade.GradeView -import kotlinx.android.synthetic.main.fragment_grade_summary.* import javax.inject.Inject -class GradeSummaryFragment : BaseFragment(), GradeSummaryView, GradeView.GradeChildView { +class GradeSummaryFragment : + BaseFragment(R.layout.fragment_grade_summary), GradeSummaryView, + GradeView.GradeChildView { @Inject lateinit var presenter: GradeSummaryPresenter @@ -37,24 +37,23 @@ class GradeSummaryFragment : BaseFragment(), GradeSummaryView, GradeView.GradeCh override val finalString get() = getString(R.string.grade_summary_final_grade) - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_grade_summary, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = gradeSummaryRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentGradeSummaryBinding.bind(view) + messageContainer = binding.gradeSummaryRecycler presenter.onAttachView(this) } override fun initView() { - gradeSummaryRecycler.run { + with(binding.gradeSummaryRecycler) { layoutManager = LinearLayoutManager(context) adapter = gradeSummaryAdapter } - gradeSummarySwipe.setOnRefreshListener { presenter.onSwipeRefresh() } - gradeSummaryErrorRetry.setOnClickListener { presenter.onRetry() } - gradeSummaryErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + gradeSummarySwipe.setOnRefreshListener { presenter.onSwipeRefresh() } + gradeSummaryErrorRetry.setOnClickListener { presenter.onRetry() } + gradeSummaryErrorDetails.setOnClickListener { presenter.onDetailsClick() } + } } override fun updateData(data: List) { @@ -72,35 +71,35 @@ class GradeSummaryFragment : BaseFragment(), GradeSummaryView, GradeView.GradeCh } override fun resetView() { - gradeSummaryRecycler.scrollToPosition(0) + binding.gradeSummaryRecycler.scrollToPosition(0) } override fun showContent(show: Boolean) { - gradeSummaryRecycler.visibility = if (show) VISIBLE else INVISIBLE + binding.gradeSummaryRecycler.visibility = if (show) VISIBLE else INVISIBLE } override fun showEmpty(show: Boolean) { - gradeSummaryEmpty.visibility = if (show) VISIBLE else INVISIBLE + binding.gradeSummaryEmpty.visibility = if (show) VISIBLE else INVISIBLE } override fun showErrorView(show: Boolean) { - gradeSummaryError.visibility = if (show) VISIBLE else INVISIBLE + binding.gradeSummaryError.visibility = if (show) VISIBLE else INVISIBLE } override fun setErrorDetails(message: String) { - gradeSummaryErrorMessage.text = message + binding.gradeSummaryErrorMessage.text = message } override fun showProgress(show: Boolean) { - gradeSummaryProgress.visibility = if (show) VISIBLE else GONE + binding.gradeSummaryProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - gradeSummarySwipe.isEnabled = enable + binding.gradeSummarySwipe.isEnabled = enable } override fun showRefresh(show: Boolean) { - gradeSummarySwipe.isRefreshing = show + binding.gradeSummarySwipe.isRefreshing = show } override fun onParentLoadData(semesterId: Int, forceRefresh: Boolean) { @@ -124,7 +123,7 @@ class GradeSummaryFragment : BaseFragment(), GradeSummaryView, GradeView.GradeCh } override fun onDestroyView() { - super.onDestroyView() presenter.onDetachView() + super.onDestroyView() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt index ba0bf1bef..f30529575 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt @@ -1,24 +1,23 @@ package io.github.wulkanowy.ui.modules.homework import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework +import io.github.wulkanowy.databinding.FragmentHomeworkBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.homework.details.HomeworkDetailsDialog import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.dpToPx -import kotlinx.android.synthetic.main.fragment_homework.* import javax.inject.Inject -class HomeworkFragment : BaseFragment(), HomeworkView, MainView.TitledView { +class HomeworkFragment : BaseFragment(R.layout.fragment_homework), + HomeworkView, MainView.TitledView { @Inject lateinit var presenter: HomeworkPresenter @@ -36,33 +35,32 @@ class HomeworkFragment : BaseFragment(), HomeworkView, MainView.TitledView { override val isViewEmpty get() = homeworkAdapter.items.isEmpty() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_homework, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = homeworkRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentHomeworkBinding.bind(view) + messageContainer = binding.homeworkRecycler presenter.onAttachView(this, savedInstanceState?.getLong(SAVED_DATE_KEY)) } override fun initView() { homeworkAdapter.onClickListener = presenter::onHomeworkItemSelected - with(homeworkRecycler) { + with(binding.homeworkRecycler) { layoutManager = LinearLayoutManager(context) adapter = homeworkAdapter addItemDecoration(DividerItemDecoration(context)) } - homeworkSwipe.setOnRefreshListener(presenter::onSwipeRefresh) - homeworkErrorRetry.setOnClickListener { presenter.onRetry() } - homeworkErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + homeworkSwipe.setOnRefreshListener(presenter::onSwipeRefresh) + homeworkErrorRetry.setOnClickListener { presenter.onRetry() } + homeworkErrorDetails.setOnClickListener { presenter.onDetailsClick() } - homeworkPreviousButton.setOnClickListener { presenter.onPreviousDay() } - homeworkNextButton.setOnClickListener { presenter.onNextDay() } + homeworkPreviousButton.setOnClickListener { presenter.onPreviousDay() } + homeworkNextButton.setOnClickListener { presenter.onNextDay() } - homeworkNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + homeworkNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + } } override fun updateData(data: List>) { @@ -84,43 +82,43 @@ class HomeworkFragment : BaseFragment(), HomeworkView, MainView.TitledView { } override fun updateNavigationWeek(date: String) { - homeworkNavDate.text = date + binding.homeworkNavDate.text = date } override fun hideRefresh() { - homeworkSwipe.isRefreshing = false + binding.homeworkSwipe.isRefreshing = false } override fun showEmpty(show: Boolean) { - homeworkEmpty.visibility = if (show) VISIBLE else GONE + binding.homeworkEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - homeworkError.visibility = if (show) VISIBLE else GONE + binding.homeworkError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - homeworkErrorMessage.text = message + binding.homeworkErrorMessage.text = message } override fun showProgress(show: Boolean) { - homeworkProgress.visibility = if (show) VISIBLE else GONE + binding.homeworkProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - homeworkSwipe.isEnabled = enable + binding.homeworkSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - homeworkRecycler.visibility = if (show) VISIBLE else GONE + binding.homeworkRecycler.visibility = if (show) VISIBLE else GONE } override fun showPreButton(show: Boolean) { - homeworkPreviousButton.visibility = if (show) VISIBLE else View.INVISIBLE + binding.homeworkPreviousButton.visibility = if (show) VISIBLE else View.INVISIBLE } override fun showNextButton(show: Boolean) { - homeworkNextButton.visibility = if (show) VISIBLE else View.INVISIBLE + binding.homeworkNextButton.visibility = if (show) VISIBLE else View.INVISIBLE } override fun showTimetableDialog(homework: Homework) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt index 3706b56e1..923ab953a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt @@ -1,14 +1,13 @@ package io.github.wulkanowy.ui.modules.homework.details import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework +import io.github.wulkanowy.databinding.ItemHomeworkDialogAttachmentBinding +import io.github.wulkanowy.databinding.ItemHomeworkDialogAttachmentsHeaderBinding +import io.github.wulkanowy.databinding.ItemHomeworkDialogDetailsBinding import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.synthetic.main.item_homework_dialog_attachment.view.* -import kotlinx.android.synthetic.main.item_homework_dialog_details.view.* import javax.inject.Inject class HomeworkDetailsAdapter @Inject constructor() : @@ -42,9 +41,9 @@ class HomeworkDetailsAdapter @Inject constructor() : val inflater = LayoutInflater.from(parent.context) return when (viewType) { - ViewType.ATTACHMENTS_HEADER.id -> AttachmentsHeaderViewHolder(inflater.inflate(R.layout.item_homework_dialog_attachments_header, parent, false)) - ViewType.ATTACHMENT.id -> AttachmentViewHolder(inflater.inflate(R.layout.item_homework_dialog_attachment, parent, false)) - else -> DetailsViewHolder(inflater.inflate(R.layout.item_homework_dialog_details, parent, false)) + ViewType.ATTACHMENTS_HEADER.id -> AttachmentsHeaderViewHolder(ItemHomeworkDialogAttachmentsHeaderBinding.inflate(inflater, parent, false)) + ViewType.ATTACHMENT.id -> AttachmentViewHolder(ItemHomeworkDialogAttachmentBinding.inflate(inflater, parent, false)) + else -> DetailsViewHolder(ItemHomeworkDialogDetailsBinding.inflate(inflater, parent, false)) } } @@ -56,7 +55,7 @@ class HomeworkDetailsAdapter @Inject constructor() : } private fun bindDetailsViewHolder(holder: DetailsViewHolder) { - with(holder.view) { + with(holder.binding) { homeworkDialogDate.text = homework?.date?.toFormattedString() homeworkDialogEntryDate.text = homework?.entryDate?.toFormattedString() homeworkDialogSubject.text = homework?.subject @@ -68,17 +67,20 @@ class HomeworkDetailsAdapter @Inject constructor() : private fun bindAttachmentViewHolder(holder: AttachmentViewHolder, position: Int) { val item = attachments[position] - with(holder.view) { + with(holder.binding) { homeworkDialogAttachment.text = item.second - setOnClickListener { + root.setOnClickListener { onAttachmentClickListener(item.first) } } } - class DetailsViewHolder(val view: View) : RecyclerView.ViewHolder(view) + class DetailsViewHolder(val binding: ItemHomeworkDialogDetailsBinding) : + RecyclerView.ViewHolder(binding.root) - class AttachmentsHeaderViewHolder(val view: View) : RecyclerView.ViewHolder(view) + class AttachmentsHeaderViewHolder(val binding: ItemHomeworkDialogAttachmentsHeaderBinding) : + RecyclerView.ViewHolder(binding.root) - class AttachmentViewHolder(val view: View) : RecyclerView.ViewHolder(view) + class AttachmentViewHolder(val binding: ItemHomeworkDialogAttachmentBinding) : + RecyclerView.ViewHolder(binding.root) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt index 54cb5c68c..07f21ef85 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt @@ -8,13 +8,13 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework +import io.github.wulkanowy.databinding.DialogHomeworkBinding import io.github.wulkanowy.ui.base.BaseDialogFragment import io.github.wulkanowy.ui.modules.homework.HomeworkFragment import io.github.wulkanowy.utils.openInternetBrowser -import kotlinx.android.synthetic.main.dialog_homework.* import javax.inject.Inject -class HomeworkDetailsDialog : BaseDialogFragment(), HomeworkDetailsView { +class HomeworkDetailsDialog : BaseDialogFragment(), HomeworkDetailsView { @Inject lateinit var presenter: HomeworkDetailsPresenter @@ -43,7 +43,7 @@ class HomeworkDetailsDialog : BaseDialogFragment(), HomeworkDetailsView { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_homework, container, false) + return DialogHomeworkBinding.inflate(inflater).apply { binding = this }.root } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -53,11 +53,13 @@ class HomeworkDetailsDialog : BaseDialogFragment(), HomeworkDetailsView { @SuppressLint("SetTextI18n") override fun initView() { - homeworkDialogRead.text = view?.context?.getString(if (homework.isDone) R.string.homework_mark_as_undone else R.string.homework_mark_as_done) - homeworkDialogRead.setOnClickListener { presenter.toggleDone(homework) } - homeworkDialogClose.setOnClickListener { dismiss() } + with(binding) { + homeworkDialogRead.text = view?.context?.getString(if (homework.isDone) R.string.homework_mark_as_undone else R.string.homework_mark_as_done) + homeworkDialogRead.setOnClickListener { presenter.toggleDone(homework) } + homeworkDialogClose.setOnClickListener { dismiss() } + } - with(homeworkDialogRecycler) { + with(binding.homeworkDialogRecycler) { layoutManager = LinearLayoutManager(context) adapter = detailsAdapter.apply { onAttachmentClickListener = { context.openInternetBrowser(it, ::showMessage) } @@ -68,7 +70,7 @@ class HomeworkDetailsDialog : BaseDialogFragment(), HomeworkDetailsView { override fun updateMarkAsDoneLabel(isDone: Boolean) { (parentFragment as? HomeworkFragment)?.onReloadList() - homeworkDialogRead.text = view?.context?.getString(if (isDone) R.string.homework_mark_as_undone else R.string.homework_mark_as_done) + binding.homeworkDialogRead.text = view?.context?.getString(if (isDone) R.string.homework_mark_as_undone else R.string.homework_mark_as_done) } override fun onDestroyView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt index 19f23593e..ffb36fe6e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt @@ -4,8 +4,8 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.view.MenuItem -import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.ActivityLoginBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter import io.github.wulkanowy.ui.modules.login.advanced.LoginAdvancedFragment @@ -14,10 +14,9 @@ import io.github.wulkanowy.ui.modules.login.recover.LoginRecoverFragment import io.github.wulkanowy.ui.modules.login.studentselect.LoginStudentSelectFragment import io.github.wulkanowy.ui.modules.login.symbol.LoginSymbolFragment import io.github.wulkanowy.utils.setOnSelectPageListener -import kotlinx.android.synthetic.main.activity_login.* import javax.inject.Inject -class LoginActivity : BaseActivity(), LoginView { +class LoginActivity : BaseActivity(), LoginView { @Inject override lateinit var presenter: LoginPresenter @@ -30,13 +29,13 @@ class LoginActivity : BaseActivity(), LoginView { fun getStartIntent(context: Context) = Intent(context, LoginActivity::class.java) } - override val currentViewIndex get() = loginViewpager.currentItem + override val currentViewIndex get() = binding.loginViewpager.currentItem override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_login) - setSupportActionBar(loginToolbar) - messageContainer = loginContainer + setContentView(ActivityLoginBinding.inflate(layoutInflater).apply { binding = this }.root) + setSupportActionBar(binding.loginToolbar) + messageContainer = binding.loginContainer presenter.onAttachView(this) } @@ -48,7 +47,7 @@ class LoginActivity : BaseActivity(), LoginView { } with(loginAdapter) { - containerId = loginViewpager.id + containerId = binding.loginViewpager.id addFragments(listOf( LoginFormFragment.newInstance(), LoginSymbolFragment.newInstance(), @@ -58,7 +57,7 @@ class LoginActivity : BaseActivity(), LoginView { )) } - with(loginViewpager) { + with(binding.loginViewpager) { offscreenPageLimit = 2 adapter = loginAdapter setOnSelectPageListener(presenter::onViewSelected) @@ -71,7 +70,7 @@ class LoginActivity : BaseActivity(), LoginView { } override fun switchView(index: Int) { - loginViewpager.setCurrentItem(index, false) + binding.loginViewpager.setCurrentItem(index, false) } override fun showActionBar(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt index aaea31eca..3b6a985be 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt @@ -1,15 +1,14 @@ package io.github.wulkanowy.ui.modules.login.advanced import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import android.widget.ArrayAdapter import androidx.core.widget.doOnTextChanged import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.FragmentLoginAdvancedBinding import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.login.LoginActivity @@ -17,10 +16,11 @@ import io.github.wulkanowy.ui.modules.login.form.LoginSymbolAdapter import io.github.wulkanowy.utils.hideSoftInput import io.github.wulkanowy.utils.setOnEditorDoneSignIn import io.github.wulkanowy.utils.showSoftInput -import kotlinx.android.synthetic.main.fragment_login_advanced.* import javax.inject.Inject -class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView { +class LoginAdvancedFragment : + BaseFragment(R.layout.fragment_login_advanced), + LoginAdvancedView { @Inject lateinit var presenter: LoginAdvancedPresenter @@ -30,17 +30,17 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView { } override val formLoginType: String - get() = when (loginTypeSwitch.checkedRadioButtonId) { + get() = when (binding.loginTypeSwitch.checkedRadioButtonId) { R.id.loginTypeApi -> "API" R.id.loginTypeScrapper -> "SCRAPPER" else -> "HYBRID" } override val formUsernameValue: String - get() = loginFormUsername.text.toString().trim() + get() = binding.loginFormUsername.text.toString().trim() override val formPassValue: String - get() = loginFormPass.text.toString().trim() + get() = binding.loginFormPass.text.toString().trim() private lateinit var hostKeys: Array @@ -49,19 +49,19 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView { private lateinit var hostSymbols: Array override val formHostValue: String - get() = hostValues.getOrNull(hostKeys.indexOf(loginFormHost.text.toString())).orEmpty() + get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty() override val formHostSymbol: String - get() = hostSymbols.getOrNull(hostKeys.indexOf(loginFormHost.text.toString())).orEmpty() + get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty() override val formPinValue: String - get() = loginFormPin.text.toString().trim() + get() = binding.loginFormPin.text.toString().trim() override val formSymbolValue: String - get() = loginFormSymbol.text.toString().trim() + get() = binding.loginFormSymbol.text.toString().trim() override val formTokenValue: String - get() = loginFormToken.text.toString().trim() + get() = binding.loginFormToken.text.toString().trim() override val nicknameLabel: String get() = getString(R.string.login_nickname_hint) @@ -69,12 +69,9 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView { override val emailLabel: String get() = getString(R.string.login_email_hint) - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_login_advanced, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentLoginAdvancedBinding.bind(view) presenter.onAttachView(this) } @@ -83,191 +80,201 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView { hostValues = resources.getStringArray(R.array.hosts_values) hostSymbols = resources.getStringArray(R.array.hosts_symbols) - loginFormUsername.doOnTextChanged { _, _, _, _ -> presenter.onUsernameTextChanged() } - loginFormPass.doOnTextChanged { _, _, _, _ -> presenter.onPassTextChanged() } - loginFormPin.doOnTextChanged { _, _, _, _ -> presenter.onPinTextChanged() } - loginFormSymbol.doOnTextChanged { _, _, _, _ -> presenter.onSymbolTextChanged() } - loginFormToken.doOnTextChanged { _, _, _, _ -> presenter.onTokenTextChanged() } - loginFormHost.setOnItemClickListener { _, _, _, _ -> presenter.onHostSelected() } - loginFormSignIn.setOnClickListener { presenter.onSignInClick() } + with(binding) { + loginFormUsername.doOnTextChanged { _, _, _, _ -> presenter.onUsernameTextChanged() } + loginFormPass.doOnTextChanged { _, _, _, _ -> presenter.onPassTextChanged() } + loginFormPin.doOnTextChanged { _, _, _, _ -> presenter.onPinTextChanged() } + loginFormSymbol.doOnTextChanged { _, _, _, _ -> presenter.onSymbolTextChanged() } + loginFormToken.doOnTextChanged { _, _, _, _ -> presenter.onTokenTextChanged() } + loginFormHost.setOnItemClickListener { _, _, _, _ -> presenter.onHostSelected() } + loginFormSignIn.setOnClickListener { presenter.onSignInClick() } - loginTypeSwitch.setOnCheckedChangeListener { _, checkedId -> - presenter.onLoginModeSelected(when (checkedId) { - R.id.loginTypeApi -> Sdk.Mode.API - R.id.loginTypeScrapper -> Sdk.Mode.SCRAPPER - else -> Sdk.Mode.HYBRID - }) + loginTypeSwitch.setOnCheckedChangeListener { _, checkedId -> + presenter.onLoginModeSelected(when (checkedId) { + R.id.loginTypeApi -> Sdk.Mode.API + R.id.loginTypeScrapper -> Sdk.Mode.SCRAPPER + else -> Sdk.Mode.HYBRID + }) + } + + loginFormPin.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() } + loginFormPass.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() } + + loginFormSymbol.setAdapter(ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values))) } - loginFormPin.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() } - loginFormPass.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() } - - loginFormSymbol.setAdapter(ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values))) - - with(loginFormHost) { + with(binding.loginFormHost) { setText(hostKeys.getOrNull(0).orEmpty()) setAdapter(LoginSymbolAdapter(context, R.layout.support_simple_spinner_dropdown_item, hostKeys)) - setOnClickListener { if (loginFormContainer.visibility == GONE) dismissDropDown() } + setOnClickListener { if (binding.loginFormContainer.visibility == GONE) dismissDropDown() } } } override fun showMobileApiWarningMessage() { - loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_mobile_api) + binding.loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_mobile_api) } override fun showScraperWarningMessage() { - loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_scraper) + binding.loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_scraper) } override fun showHybridWarningMessage() { - loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_hybrid) + binding.loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_hybrid) } override fun setDefaultCredentials(username: String, pass: String, symbol: String, token: String, pin: String) { - loginFormUsername.setText(username) - loginFormPass.setText(pass) - loginFormToken.setText(token) - loginFormSymbol.setText(symbol) - loginFormPin.setText(pin) + with(binding) { + loginFormUsername.setText(username) + loginFormPass.setText(pass) + loginFormToken.setText(token) + loginFormSymbol.setText(symbol) + loginFormPin.setText(pin) + } } override fun setUsernameLabel(label: String) { - loginFormUsernameLayout.hint = label + binding.loginFormUsernameLayout.hint = label } override fun setSymbol(symbol: String) { - loginFormSymbol.setText(symbol) + binding.loginFormSymbol.setText(symbol) } override fun setErrorUsernameRequired() { - with(loginFormUsernameLayout) { + with(binding.loginFormUsernameLayout) { requestFocus() error = getString(R.string.login_field_required) } } override fun setErrorLoginRequired() { - with(loginFormUsernameLayout) { + with(binding.loginFormUsernameLayout) { requestFocus() error = getString(R.string.login_invalid_login) } } override fun setErrorEmailRequired() { - with(loginFormUsernameLayout) { + with(binding.loginFormUsernameLayout) { requestFocus() error = getString(R.string.login_invalid_email) } } override fun setErrorPassRequired(focus: Boolean) { - with(loginFormPassLayout) { + with(binding.loginFormPassLayout) { if (focus) requestFocus() error = getString(R.string.login_field_required) } } override fun setErrorPassInvalid(focus: Boolean) { - with(loginFormPassLayout) { + with(binding.loginFormPassLayout) { if (focus) requestFocus() error = getString(R.string.login_invalid_password) } } override fun setErrorPassIncorrect() { - with(loginFormPassLayout) { + with(binding.loginFormPassLayout) { requestFocus() error = getString(R.string.login_incorrect_password) } } override fun setErrorPinRequired() { - with(loginFormPinLayout) { + with(binding.loginFormPinLayout) { requestFocus() error = getString(R.string.login_field_required) } } override fun setErrorPinInvalid(message: String) { - with(loginFormPinLayout) { + with(binding.loginFormPinLayout) { requestFocus() error = message } } override fun setErrorSymbolRequired() { - with(loginFormSymbolLayout) { + with(binding.loginFormSymbolLayout) { requestFocus() error = getString(R.string.login_field_required) } } override fun setErrorSymbolInvalid(message: String) { - with(loginFormSymbolLayout) { + with(binding.loginFormSymbolLayout) { requestFocus() error = message } } override fun setErrorTokenRequired() { - with(loginFormTokenLayout) { + with(binding.loginFormTokenLayout) { requestFocus() error = getString(R.string.login_field_required) } } override fun setErrorTokenInvalid(message: String) { - with(loginFormTokenLayout) { + with(binding.loginFormTokenLayout) { requestFocus() error = message } } override fun clearUsernameError() { - loginFormUsernameLayout.error = null + binding.loginFormUsernameLayout.error = null } override fun clearPassError() { - loginFormPassLayout.error = null + binding.loginFormPassLayout.error = null } override fun clearPinKeyError() { - loginFormPinLayout.error = null + binding.loginFormPinLayout.error = null } override fun clearSymbolError() { - loginFormSymbolLayout.error = null + binding.loginFormSymbolLayout.error = null } override fun clearTokenError() { - loginFormTokenLayout.error = null + binding.loginFormTokenLayout.error = null } override fun showOnlyHybridModeInputs() { - loginFormUsernameLayout.visibility = VISIBLE - loginFormPassLayout.visibility = VISIBLE - loginFormHostLayout.visibility = VISIBLE - loginFormPinLayout.visibility = GONE - loginFormSymbolLayout.visibility = VISIBLE - loginFormTokenLayout.visibility = GONE + with(binding) { + loginFormUsernameLayout.visibility = VISIBLE + loginFormPassLayout.visibility = VISIBLE + loginFormHostLayout.visibility = VISIBLE + loginFormPinLayout.visibility = GONE + loginFormSymbolLayout.visibility = VISIBLE + loginFormTokenLayout.visibility = GONE + } } override fun showOnlyScrapperModeInputs() { - loginFormUsernameLayout.visibility = VISIBLE - loginFormPassLayout.visibility = VISIBLE - loginFormHostLayout.visibility = VISIBLE - loginFormPinLayout.visibility = GONE - loginFormSymbolLayout.visibility = VISIBLE - loginFormTokenLayout.visibility = GONE + with(binding) { + loginFormUsernameLayout.visibility = VISIBLE + loginFormPassLayout.visibility = VISIBLE + loginFormHostLayout.visibility = VISIBLE + loginFormPinLayout.visibility = GONE + loginFormSymbolLayout.visibility = VISIBLE + loginFormTokenLayout.visibility = GONE + } } override fun showOnlyMobileApiModeInputs() { - loginFormUsernameLayout.visibility = GONE - loginFormPassLayout.visibility = GONE - loginFormHostLayout.visibility = GONE - loginFormPinLayout.visibility = VISIBLE - loginFormSymbolLayout.visibility = VISIBLE - loginFormTokenLayout.visibility = VISIBLE + with(binding) { + loginFormUsernameLayout.visibility = GONE + loginFormPassLayout.visibility = GONE + loginFormHostLayout.visibility = GONE + loginFormPinLayout.visibility = VISIBLE + loginFormSymbolLayout.visibility = VISIBLE + loginFormTokenLayout.visibility = VISIBLE + } } override fun showSoftKeyboard() { @@ -279,17 +286,17 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView { } override fun showProgress(show: Boolean) { - loginFormProgress.visibility = if (show) VISIBLE else GONE + binding.loginFormProgress.visibility = if (show) VISIBLE else GONE } override fun showContent(show: Boolean) { - loginFormContainer.visibility = if (show) VISIBLE else GONE + binding.loginFormContainer.visibility = if (show) VISIBLE else GONE } override fun notifyParentAccountLogged(students: List) { (activity as? LoginActivity)?.onFormFragmentAccountLogged(students, Triple( - loginFormUsername.text.toString(), - loginFormPass.text.toString(), + binding.loginFormUsername.text.toString(), + binding.loginFormPass.text.toString(), resources.getStringArray(R.array.hosts_values)[1] )) } @@ -300,7 +307,7 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView { } override fun onDestroyView() { - super.onDestroyView() presenter.onDetachView() + super.onDestroyView() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index 058e702e6..a2a083c00 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -2,14 +2,13 @@ package io.github.wulkanowy.ui.modules.login.form import android.annotation.SuppressLint import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.core.widget.doOnTextChanged import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.FragmentLoginFormBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.utils.AppInfo @@ -18,10 +17,10 @@ import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.setOnEditorDoneSignIn import io.github.wulkanowy.utils.showSoftInput -import kotlinx.android.synthetic.main.fragment_login_form.* import javax.inject.Inject -class LoginFormFragment : BaseFragment(), LoginFormView { +class LoginFormFragment : BaseFragment(R.layout.fragment_login_form), + LoginFormView { @Inject lateinit var presenter: LoginFormPresenter @@ -34,16 +33,16 @@ class LoginFormFragment : BaseFragment(), LoginFormView { } override val formUsernameValue: String - get() = loginFormUsername.text.toString() + get() = binding.loginFormUsername.text.toString() override val formPassValue: String - get() = loginFormPass.text.toString() + get() = binding.loginFormPass.text.toString() override val formHostValue: String - get() = hostValues.getOrNull(hostKeys.indexOf(loginFormHost.text.toString())).orEmpty() + get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty() override val formHostSymbol: String - get() = hostSymbols.getOrNull(hostKeys.indexOf(loginFormHost.text.toString())).orEmpty() + get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty() override val nicknameLabel: String get() = getString(R.string.login_nickname_hint) @@ -57,12 +56,9 @@ class LoginFormFragment : BaseFragment(), LoginFormView { private lateinit var hostSymbols: Array - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_login_form, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentLoginFormBinding.bind(view) presenter.onAttachView(this) } @@ -71,81 +67,85 @@ class LoginFormFragment : BaseFragment(), LoginFormView { hostValues = resources.getStringArray(R.array.hosts_values) hostSymbols = resources.getStringArray(R.array.hosts_symbols) - loginFormUsername.doOnTextChanged { _, _, _, _ -> presenter.onUsernameTextChanged() } - loginFormPass.doOnTextChanged { _, _, _, _ -> presenter.onPassTextChanged() } - loginFormHost.setOnItemClickListener { _, _, _, _ -> presenter.onHostSelected() } - loginFormSignIn.setOnClickListener { presenter.onSignInClick() } - loginFormAdvancedButton.setOnClickListener { presenter.onAdvancedLoginClick() } - loginFormPrivacyLink.setOnClickListener { presenter.onPrivacyLinkClick() } - loginFormFaq.setOnClickListener { presenter.onFaqClick() } - loginFormContactEmail.setOnClickListener { presenter.onEmailClick() } - loginFormRecoverLink.setOnClickListener { presenter.onRecoverClick() } - loginFormPass.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() } + with(binding) { + loginFormUsername.doOnTextChanged { _, _, _, _ -> presenter.onUsernameTextChanged() } + loginFormPass.doOnTextChanged { _, _, _, _ -> presenter.onPassTextChanged() } + loginFormHost.setOnItemClickListener { _, _, _, _ -> presenter.onHostSelected() } + loginFormSignIn.setOnClickListener { presenter.onSignInClick() } + loginFormAdvancedButton.setOnClickListener { presenter.onAdvancedLoginClick() } + loginFormPrivacyLink.setOnClickListener { presenter.onPrivacyLinkClick() } + loginFormFaq.setOnClickListener { presenter.onFaqClick() } + loginFormContactEmail.setOnClickListener { presenter.onEmailClick() } + loginFormRecoverLink.setOnClickListener { presenter.onRecoverClick() } + loginFormPass.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() } + } - with(loginFormHost) { + with(binding.loginFormHost) { setText(hostKeys.getOrNull(0).orEmpty()) setAdapter(LoginSymbolAdapter(context, R.layout.support_simple_spinner_dropdown_item, hostKeys)) - setOnClickListener { if (loginFormContainer.visibility == GONE) dismissDropDown() } + setOnClickListener { if (binding.loginFormContainer.visibility == GONE) dismissDropDown() } } } override fun setCredentials(username: String, pass: String) { - loginFormUsername.setText(username) - loginFormPass.setText(pass) + with(binding) { + loginFormUsername.setText(username) + loginFormPass.setText(pass) + } } override fun setUsernameLabel(label: String) { - loginFormUsernameLayout.hint = label + binding.loginFormUsernameLayout.hint = label } override fun setErrorUsernameRequired() { - with(loginFormUsernameLayout) { + with(binding.loginFormUsernameLayout) { requestFocus() error = getString(R.string.login_field_required) } } override fun setErrorLoginRequired() { - with(loginFormUsernameLayout) { + with(binding.loginFormUsernameLayout) { requestFocus() error = getString(R.string.login_invalid_login) } } override fun setErrorEmailRequired() { - with(loginFormUsernameLayout) { + with(binding.loginFormUsernameLayout) { requestFocus() error = getString(R.string.login_invalid_email) } } override fun setErrorPassRequired(focus: Boolean) { - with(loginFormPassLayout) { + with(binding.loginFormPassLayout) { if (focus) requestFocus() error = getString(R.string.login_field_required) } } override fun setErrorPassInvalid(focus: Boolean) { - with(loginFormPassLayout) { + with(binding.loginFormPassLayout) { if (focus) requestFocus() error = getString(R.string.login_invalid_password) } } override fun setErrorPassIncorrect() { - with(loginFormPassLayout) { + with(binding.loginFormPassLayout) { requestFocus() error = getString(R.string.login_incorrect_password) } } override fun clearUsernameError() { - loginFormUsernameLayout.error = null + binding.loginFormUsernameLayout.error = null } override fun clearPassError() { - loginFormPassLayout.error = null + binding.loginFormPassLayout.error = null } override fun showSoftKeyboard() { @@ -157,16 +157,16 @@ class LoginFormFragment : BaseFragment(), LoginFormView { } override fun showProgress(show: Boolean) { - loginFormProgress.visibility = if (show) VISIBLE else GONE + binding.loginFormProgress.visibility = if (show) VISIBLE else GONE } override fun showContent(show: Boolean) { - loginFormContainer.visibility = if (show) VISIBLE else GONE + binding.loginFormContainer.visibility = if (show) VISIBLE else GONE } @SuppressLint("SetTextI18n") override fun showVersion() { - loginFormVersion.text = "v${appInfo.versionName}" + binding.loginFormVersion.text = "v${appInfo.versionName}" } override fun notifyParentAccountLogged(students: List, loginData: Triple) { @@ -178,7 +178,7 @@ class LoginFormFragment : BaseFragment(), LoginFormView { } override fun showContact(show: Boolean) { - loginFormContact.visibility = if (show) VISIBLE else GONE + binding.loginFormContact.visibility = if (show) VISIBLE else GONE } override fun openAdvancedLogin() { @@ -190,8 +190,8 @@ class LoginFormFragment : BaseFragment(), LoginFormView { } override fun onDestroyView() { - super.onDestroyView() presenter.onDetachView() + super.onDestroyView() } override fun openFaqPage() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt index 1bff49262..2accf1fe6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt @@ -3,25 +3,24 @@ package io.github.wulkanowy.ui.modules.login.recover import android.annotation.SuppressLint import android.graphics.Color import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import android.webkit.JavascriptInterface import android.webkit.WebView import android.webkit.WebViewClient import androidx.core.widget.doOnTextChanged import io.github.wulkanowy.R +import io.github.wulkanowy.databinding.FragmentLoginRecoverBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.form.LoginSymbolAdapter import io.github.wulkanowy.utils.hideSoftInput import io.github.wulkanowy.utils.showSoftInput -import kotlinx.android.synthetic.main.fragment_login_recover.* import javax.inject.Inject -class LoginRecoverFragment : BaseFragment(), LoginRecoverView { +class LoginRecoverFragment : + BaseFragment(R.layout.fragment_login_recover), LoginRecoverView { @Inject lateinit var presenter: LoginRecoverPresenter @@ -37,13 +36,13 @@ class LoginRecoverFragment : BaseFragment(), LoginRecoverView { private lateinit var hostSymbols: Array override val recoverHostValue: String - get() = hostValues.getOrNull(hostKeys.indexOf(loginRecoverHost.text.toString())).orEmpty() + get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginRecoverHost.text.toString())).orEmpty() override val formHostSymbol: String - get() = hostSymbols.getOrNull(hostKeys.indexOf(loginRecoverHost.text.toString())).orEmpty() + get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginRecoverHost.text.toString())).orEmpty() override val recoverNameValue: String - get() = loginRecoverName.text.toString().trim() + get() = binding.loginRecoverName.text.toString().trim() override val emailHintString: String get() = getString(R.string.login_email_hint) @@ -54,91 +53,90 @@ class LoginRecoverFragment : BaseFragment(), LoginRecoverView { override val invalidEmailString: String get() = getString(R.string.login_invalid_email) - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_login_recover, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentLoginRecoverBinding.bind(view) presenter.onAttachView(this) } override fun initView() { - loginRecoverWebView.setBackgroundColor(Color.TRANSPARENT) hostKeys = resources.getStringArray(R.array.hosts_keys) hostValues = resources.getStringArray(R.array.hosts_values) hostSymbols = resources.getStringArray(R.array.hosts_symbols) - loginRecoverName.doOnTextChanged { _, _, _, _ -> presenter.onNameTextChanged() } - loginRecoverHost.setOnItemClickListener { _, _, _, _ -> presenter.onHostSelected() } - loginRecoverButton.setOnClickListener { presenter.onRecoverClick() } - loginRecoverErrorRetry.setOnClickListener { presenter.onRecoverClick() } - loginRecoverErrorDetails.setOnClickListener { presenter.onDetailsClick() } - loginRecoverLogin.setOnClickListener { (activity as LoginActivity).switchView(0) } + with(binding) { + loginRecoverWebView.setBackgroundColor(Color.TRANSPARENT) + loginRecoverName.doOnTextChanged { _, _, _, _ -> presenter.onNameTextChanged() } + loginRecoverHost.setOnItemClickListener { _, _, _, _ -> presenter.onHostSelected() } + loginRecoverButton.setOnClickListener { presenter.onRecoverClick() } + loginRecoverErrorRetry.setOnClickListener { presenter.onRecoverClick() } + loginRecoverErrorDetails.setOnClickListener { presenter.onDetailsClick() } + loginRecoverLogin.setOnClickListener { (activity as LoginActivity).switchView(0) } + } - with(loginRecoverHost) { + with(binding.loginRecoverHost) { setText(hostKeys.getOrNull(0).orEmpty()) setAdapter(LoginSymbolAdapter(context, R.layout.support_simple_spinner_dropdown_item, hostKeys)) - setOnClickListener { if (loginRecoverFormContainer.visibility == GONE) dismissDropDown() } + setOnClickListener { if (binding.loginRecoverFormContainer.visibility == GONE) dismissDropDown() } } } override fun setDefaultCredentials(username: String) { - loginRecoverName.setText(username) + binding.loginRecoverName.setText(username) } override fun setErrorNameRequired() { - with(loginRecoverNameLayout) { + with(binding.loginRecoverNameLayout) { requestFocus() error = getString(R.string.login_field_required) } } override fun setUsernameHint(hint: String) { - loginRecoverNameLayout.hint = hint + binding.loginRecoverNameLayout.hint = hint } override fun setUsernameError(message: String) { - with(loginRecoverNameLayout) { + with(binding.loginRecoverNameLayout) { requestFocus() error = message } } override fun clearUsernameError() { - loginRecoverNameLayout.error = null + binding.loginRecoverNameLayout.error = null } override fun showProgress(show: Boolean) { - loginRecoverProgress.visibility = if (show) VISIBLE else GONE + binding.loginRecoverProgress.visibility = if (show) VISIBLE else GONE } override fun showRecoverForm(show: Boolean) { - loginRecoverFormContainer.visibility = if (show) VISIBLE else GONE + binding.loginRecoverFormContainer.visibility = if (show) VISIBLE else GONE } override fun showCaptcha(show: Boolean) { - loginRecoverCaptchaContainer.visibility = if (show) VISIBLE else GONE + binding.loginRecoverCaptchaContainer.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - loginRecoverError.visibility = if (show) VISIBLE else GONE + binding.loginRecoverError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - loginRecoverErrorMessage.text = message + binding.loginRecoverErrorMessage.text = message } override fun showSuccessView(show: Boolean) { - loginRecoverSuccess.visibility = if (show) VISIBLE else GONE + binding.loginRecoverSuccess.visibility = if (show) VISIBLE else GONE } override fun setSuccessTitle(title: String) { - loginRecoverSuccessTitle.text = title + binding.loginRecoverSuccessTitle.text = title } override fun setSuccessMessage(message: String) { - loginRecoverSuccessMessage.text = message + binding.loginRecoverSuccessMessage.text = message } override fun showSoftKeyboard() { @@ -159,7 +157,7 @@ class LoginRecoverFragment : BaseFragment(), LoginRecoverView { callback:e =>Android.captchaCallback(e)}) """.trimIndent() - with(loginRecoverWebView) { + with(binding.loginRecoverWebView) { settings.javaScriptEnabled = true webViewClient = object : WebViewClient() { private var recoverWebViewSuccess: Boolean = true @@ -197,8 +195,9 @@ class LoginRecoverFragment : BaseFragment(), LoginRecoverView { } override fun onDestroyView() { - super.onDestroyView() - loginRecoverWebView.destroy() + binding.loginRecoverWebView.destroy() presenter.onDetachView() + + super.onDestroyView() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index 48a3cc614..b0df51991 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -1,24 +1,24 @@ package io.github.wulkanowy.ui.modules.login.studentselect import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.FragmentLoginStudentSelectBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser -import kotlinx.android.synthetic.main.fragment_login_student_select.* import java.io.Serializable import javax.inject.Inject -class LoginStudentSelectFragment : BaseFragment(), LoginStudentSelectView { +class LoginStudentSelectFragment : + BaseFragment(R.layout.fragment_login_student_select), + LoginStudentSelectView { @Inject lateinit var presenter: LoginStudentSelectPresenter @@ -35,24 +35,24 @@ class LoginStudentSelectFragment : BaseFragment(), LoginStudentSelectView { fun newInstance() = LoginStudentSelectFragment() } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_login_student_select, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentLoginStudentSelectBinding.bind(view) presenter.onAttachView(this, savedInstanceState?.getSerializable(SAVED_STUDENTS)) } override fun initView() { loginAdapter.onClickListener = presenter::onItemSelected - loginStudentSelectSignIn.setOnClickListener { presenter.onSignIn() } - loginStudentSelectContactDiscord.setOnClickListener { presenter.onDiscordClick() } - loginStudentSelectContactEmail.setOnClickListener { presenter.onEmailClick() } - loginStudentSelectRecycler.apply { - layoutManager = LinearLayoutManager(context) - adapter = loginAdapter + with(binding) { + loginStudentSelectSignIn.setOnClickListener { presenter.onSignIn() } + loginStudentSelectContactDiscord.setOnClickListener { presenter.onDiscordClick() } + loginStudentSelectContactEmail.setOnClickListener { presenter.onEmailClick() } + + with(loginStudentSelectRecycler) { + layoutManager = LinearLayoutManager(context) + adapter = loginAdapter + } } } @@ -68,15 +68,15 @@ class LoginStudentSelectFragment : BaseFragment(), LoginStudentSelectView { } override fun showProgress(show: Boolean) { - loginStudentSelectProgress.visibility = if (show) VISIBLE else GONE + binding.loginStudentSelectProgress.visibility = if (show) VISIBLE else GONE } override fun showContent(show: Boolean) { - loginStudentSelectContent.visibility = if (show) VISIBLE else GONE + binding.loginStudentSelectContent.visibility = if (show) VISIBLE else GONE } override fun enableSignIn(enable: Boolean) { - loginStudentSelectSignIn.isEnabled = enable + binding.loginStudentSelectSignIn.isEnabled = enable } fun onParentInitStudentSelectFragment(students: List) { @@ -89,7 +89,7 @@ class LoginStudentSelectFragment : BaseFragment(), LoginStudentSelectView { } override fun showContact(show: Boolean) { - loginStudentSelectContact.visibility = if (show) VISIBLE else GONE + binding.loginStudentSelectContact.visibility = if (show) VISIBLE else GONE } override fun onDestroyView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt index 5602b6248..befbffd50 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt @@ -1,17 +1,16 @@ package io.github.wulkanowy.ui.modules.login.symbol import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import android.view.inputmethod.EditorInfo.IME_ACTION_DONE import android.view.inputmethod.EditorInfo.IME_NULL import android.widget.ArrayAdapter import androidx.core.widget.doOnTextChanged import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.FragmentLoginSymbolBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.utils.AppInfo @@ -19,10 +18,10 @@ import io.github.wulkanowy.utils.hideSoftInput import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.showSoftInput -import kotlinx.android.synthetic.main.fragment_login_symbol.* import javax.inject.Inject -class LoginSymbolFragment : BaseFragment(), LoginSymbolView { +class LoginSymbolFragment : + BaseFragment(R.layout.fragment_login_symbol), LoginSymbolView { @Inject lateinit var presenter: LoginSymbolPresenter @@ -37,29 +36,28 @@ class LoginSymbolFragment : BaseFragment(), LoginSymbolView { } override val symbolNameError: CharSequence? - get() = loginSymbolNameLayout.error + get() = binding.loginSymbolNameLayout.error - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_login_symbol, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentLoginSymbolBinding.bind(view) presenter.onAttachView(this, savedInstanceState?.getSerializable(SAVED_LOGIN_DATA)) } override fun initView() { - loginSymbolSignIn.setOnClickListener { presenter.attemptLogin(loginSymbolName.text.toString()) } - loginSymbolFaq.setOnClickListener { presenter.onFaqClick() } - loginSymbolContactEmail.setOnClickListener { presenter.onEmailClick() } + with(binding) { + loginSymbolSignIn.setOnClickListener { presenter.attemptLogin(loginSymbolName.text.toString()) } + loginSymbolFaq.setOnClickListener { presenter.onFaqClick() } + loginSymbolContactEmail.setOnClickListener { presenter.onEmailClick() } - loginSymbolName.doOnTextChanged { _, _, _, _ -> presenter.onSymbolTextChanged() } + loginSymbolName.doOnTextChanged { _, _, _, _ -> presenter.onSymbolTextChanged() } - loginSymbolName.apply { - setOnEditorActionListener { _, id, _ -> - if (id == IME_ACTION_DONE || id == IME_NULL) loginSymbolSignIn.callOnClick() else false + loginSymbolName.apply { + setOnEditorActionListener { _, id, _ -> + if (id == IME_ACTION_DONE || id == IME_NULL) loginSymbolSignIn.callOnClick() else false + } + setAdapter(ArrayAdapter(context, android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values))) } - setAdapter(ArrayAdapter(context, android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values))) } } @@ -68,25 +66,25 @@ class LoginSymbolFragment : BaseFragment(), LoginSymbolView { } override fun setErrorSymbolIncorrect() { - loginSymbolNameLayout.apply { + binding.loginSymbolNameLayout.apply { requestFocus() error = getString(R.string.login_incorrect_symbol) } } override fun setErrorSymbolRequire() { - loginSymbolNameLayout.apply { + binding.loginSymbolNameLayout.apply { requestFocus() error = getString(R.string.login_field_required) } } override fun clearSymbolError() { - loginSymbolNameLayout.error = null + binding.loginSymbolNameLayout.error = null } override fun clearAndFocusSymbol() { - loginSymbolNameLayout.apply { + binding.loginSymbolNameLayout.apply { editText?.text = null requestFocus() } @@ -101,11 +99,11 @@ class LoginSymbolFragment : BaseFragment(), LoginSymbolView { } override fun showProgress(show: Boolean) { - loginSymbolProgress.visibility = if (show) VISIBLE else GONE + binding.loginSymbolProgress.visibility = if (show) VISIBLE else GONE } override fun showContent(show: Boolean) { - loginSymbolContainer.visibility = if (show) VISIBLE else GONE + binding.loginSymbolContainer.visibility = if (show) VISIBLE else GONE } override fun notifyParentAccountLogged(students: List) { @@ -118,12 +116,12 @@ class LoginSymbolFragment : BaseFragment(), LoginSymbolView { } override fun showContact(show: Boolean) { - loginSymbolContact.visibility = if (show) VISIBLE else GONE + binding.loginSymbolContact.visibility = if (show) VISIBLE else GONE } override fun onDestroyView() { - super.onDestroyView() presenter.onDetachView() + super.onDestroyView() } override fun openFaqPage() { @@ -139,7 +137,7 @@ class LoginSymbolFragment : BaseFragment(), LoginSymbolView { "${appInfo.systemManufacturer} ${appInfo.systemModel}", appInfo.systemVersion.toString(), appInfo.versionName, - "$host/${loginSymbolName.text}", + "$host/${binding.loginSymbolName.text}", lastError ) ) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt index 12bf1a132..0775ce189 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt @@ -1,19 +1,19 @@ package io.github.wulkanowy.ui.modules.luckynumber import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.LuckyNumber +import io.github.wulkanowy.databinding.FragmentLuckyNumberBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainView -import kotlinx.android.synthetic.main.fragment_lucky_number.* import javax.inject.Inject -class LuckyNumberFragment : BaseFragment(), LuckyNumberView, MainView.TitledView { +class LuckyNumberFragment : + BaseFragment(R.layout.fragment_lucky_number), LuckyNumberView, + MainView.TitledView { @Inject lateinit var presenter: LuckyNumberPresenter @@ -25,58 +25,57 @@ class LuckyNumberFragment : BaseFragment(), LuckyNumberView, MainView.TitledView override val titleStringId: Int get() = R.string.lucky_number_title - override val isViewEmpty get() = luckyNumberText.text.isBlank() + override val isViewEmpty get() = binding.luckyNumberText.text.isBlank() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_lucky_number, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = luckyNumberSwipe + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentLuckyNumberBinding.bind(view) + messageContainer = binding.luckyNumberSwipe presenter.onAttachView(this) } override fun initView() { - luckyNumberSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } - luckyNumberErrorRetry.setOnClickListener { presenter.onRetry() } - luckyNumberErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + luckyNumberSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } + luckyNumberErrorRetry.setOnClickListener { presenter.onRetry() } + luckyNumberErrorDetails.setOnClickListener { presenter.onDetailsClick() } + } } override fun updateData(data: LuckyNumber) { - luckyNumberText.text = data.luckyNumber.toString() + binding.luckyNumberText.text = data.luckyNumber.toString() } override fun hideRefresh() { - luckyNumberSwipe.isRefreshing = false + binding.luckyNumberSwipe.isRefreshing = false } override fun showEmpty(show: Boolean) { - luckyNumberEmpty.visibility = if (show) VISIBLE else GONE + binding.luckyNumberEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - luckyNumberError.visibility = if (show) VISIBLE else GONE + binding.luckyNumberError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - luckyNumberErrorMessage.text = message + binding.luckyNumberErrorMessage.text = message } override fun showProgress(show: Boolean) { - luckyNumberProgress.visibility = if (show) VISIBLE else GONE + binding.luckyNumberProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - luckyNumberSwipe.isEnabled = enable + binding.luckyNumberSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - luckyNumberContent.visibility = if (show) VISIBLE else GONE + binding.luckyNumberContent.visibility = if (show) VISIBLE else GONE } override fun onDestroyView() { - super.onDestroyView() presenter.onDetachView() + super.onDestroyView() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt index 84f4e06e1..d7d5c4ff1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt @@ -10,13 +10,14 @@ import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.ActivityWidgetConfigureBinding import io.github.wulkanowy.ui.base.BaseActivity -import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.base.WidgetConfigureAdapter -import kotlinx.android.synthetic.main.activity_widget_configure.* +import io.github.wulkanowy.ui.modules.login.LoginActivity import javax.inject.Inject -class LuckyNumberWidgetConfigureActivity : BaseActivity(), +class LuckyNumberWidgetConfigureActivity : + BaseActivity(), LuckyNumberWidgetConfigureView { @Inject @@ -30,7 +31,7 @@ class LuckyNumberWidgetConfigureActivity : BaseActivity(), MainView { +class MainActivity : BaseActivity(), MainView { @Inject override lateinit var presenter: MainPresenter @@ -82,9 +82,9 @@ class MainActivity : BaseActivity(), MainView { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - setSupportActionBar(mainToolbar) - messageContainer = mainFragmentContainer + setContentView(ActivityMainBinding.inflate(layoutInflater).apply { binding = this }.root) + setSupportActionBar(binding.mainToolbar) + messageContainer = binding.mainFragmentContainer presenter.onAttachView(this, intent.getSerializableExtra(EXTRA_START_MENU) as? MainView.Section) @@ -100,12 +100,12 @@ class MainActivity : BaseActivity(), MainView { } override fun initView() { - with(mainToolbar) { + with(binding.mainToolbar) { if (SDK_INT >= LOLLIPOP) stateListAnimator = null setBackgroundColor(overlayProvider.get().compositeOverlayWithThemeSurfaceColorIfNeeded(dpToPx(4f))) } - with(mainBottomNav) { + with(binding.mainBottomNav) { addItems(listOf( AHBottomNavigationItem(R.string.grade_title, R.drawable.ic_main_grade, 0), AHBottomNavigationItem(R.string.attendance_title, R.drawable.ic_main_attendance, 0), @@ -166,7 +166,7 @@ class MainActivity : BaseActivity(), MainView { } override fun showActionBarElevation(show: Boolean) { - ViewCompat.setElevation(mainToolbar, if (show) dpToPx(4f) else 0f) + ViewCompat.setElevation(binding.mainToolbar, if (show) dpToPx(4f) else 0f) } override fun notifyMenuViewReselected() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt index 7a3e135dd..4a9d217b0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt @@ -1,16 +1,15 @@ package io.github.wulkanowy.ui.modules.message import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE -import android.view.ViewGroup import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED import io.github.wulkanowy.data.repositories.message.MessageFolder.SENT import io.github.wulkanowy.data.repositories.message.MessageFolder.TRASHED +import io.github.wulkanowy.databinding.FragmentMessageBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter import io.github.wulkanowy.ui.modules.main.MainView @@ -18,10 +17,10 @@ import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity import io.github.wulkanowy.ui.modules.message.tab.MessageTabFragment import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.setOnSelectPageListener -import kotlinx.android.synthetic.main.fragment_message.* import javax.inject.Inject -class MessageFragment : BaseFragment(), MessageView, MainView.TitledView { +class MessageFragment : BaseFragment(R.layout.fragment_message), + MessageView, MainView.TitledView { @Inject lateinit var presenter: MessagePresenter @@ -35,20 +34,17 @@ class MessageFragment : BaseFragment(), MessageView, MainView.TitledView { override val titleStringId get() = R.string.message_title - override val currentPageIndex get() = messageViewPager.currentItem + override val currentPageIndex get() = binding.messageViewPager.currentItem - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_message, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentMessageBinding.bind(view) presenter.onAttachView(this) } override fun initView() { with(pagerAdapter) { - containerId = messageViewPager.id + containerId = binding.messageViewPager.id addFragmentsWithTitle(mapOf( MessageTabFragment.newInstance(RECEIVED) to getString(R.string.message_inbox), MessageTabFragment.newInstance(SENT) to getString(R.string.message_sent), @@ -56,27 +52,29 @@ class MessageFragment : BaseFragment(), MessageView, MainView.TitledView { )) } - with(messageViewPager) { + with(binding.messageViewPager) { adapter = pagerAdapter offscreenPageLimit = 2 setOnSelectPageListener(presenter::onPageSelected) } - with(messageTabLayout) { - setupWithViewPager(messageViewPager) + with(binding.messageTabLayout) { + setupWithViewPager(binding.messageViewPager) setElevationCompat(context.dpToPx(4f)) } - openSendMessageButton.setOnClickListener { presenter.onSendMessageButtonClicked() } + binding.openSendMessageButton.setOnClickListener { presenter.onSendMessageButtonClicked() } } override fun showContent(show: Boolean) { - messageViewPager.visibility = if (show) VISIBLE else INVISIBLE - messageTabLayout.visibility = if (show) VISIBLE else INVISIBLE + with(binding) { + messageViewPager.visibility = if (show) VISIBLE else INVISIBLE + messageTabLayout.visibility = if (show) VISIBLE else INVISIBLE + } } override fun showProgress(show: Boolean) { - messageProgress.visibility = if (show) VISIBLE else INVISIBLE + binding.messageProgress.visibility = if (show) VISIBLE else INVISIBLE } fun onDeleteMessage(message: Message) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt index a0ac6ec70..436dee53f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt @@ -10,10 +10,11 @@ import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.repositories.message.MessageFolder +import io.github.wulkanowy.databinding.ItemMessageAttachmentBinding +import io.github.wulkanowy.databinding.ItemMessageDividerBinding +import io.github.wulkanowy.databinding.ItemMessagePreviewBinding import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.synthetic.main.item_message_attachment.view.* -import kotlinx.android.synthetic.main.item_message_preview.view.* import javax.inject.Inject class MessagePreviewAdapter @Inject constructor() : @@ -45,44 +46,47 @@ class MessagePreviewAdapter @Inject constructor() : val inflater = LayoutInflater.from(parent.context) return when (viewType) { - ViewType.MESSAGE.id -> MessageViewHolder(inflater.inflate(R.layout.item_message_preview, parent, false)) - ViewType.DIVIDER.id -> DividerViewHolder(inflater.inflate(R.layout.item_message_divider, parent, false)) - ViewType.ATTACHMENT.id -> AttachmentViewHolder(inflater.inflate(R.layout.item_message_attachment, parent, false)) + ViewType.MESSAGE.id -> MessageViewHolder(ItemMessagePreviewBinding.inflate(inflater, parent, false)) + ViewType.DIVIDER.id -> DividerViewHolder(ItemMessageDividerBinding.inflate(inflater, parent, false)) + ViewType.ATTACHMENT.id -> AttachmentViewHolder(ItemMessageAttachmentBinding.inflate(inflater, parent, false)) else -> throw IllegalStateException() } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { - is MessageViewHolder -> bindMessage(holder.view, requireNotNull(messageWithAttachment).message) - is AttachmentViewHolder -> bindAttachment(holder.view, requireNotNull(messageWithAttachment).attachments[position - 2]) + is MessageViewHolder -> bindMessage(holder, requireNotNull(messageWithAttachment).message) + is AttachmentViewHolder -> bindAttachment(holder, requireNotNull(messageWithAttachment).attachments[position - 2]) } } @SuppressLint("SetTextI18n") - private fun bindMessage(view: View, message: Message) { - with(view) { - messagePreviewSubject.text = if (message.subject.isNotBlank()) message.subject else context.getString(R.string.message_no_subject) - messagePreviewDate.text = context.getString(R.string.message_date, message.date.toFormattedString("yyyy-MM-dd HH:mm:ss")) + private fun bindMessage(holder: MessageViewHolder, message: Message) { + with(holder.binding) { + messagePreviewSubject.text = if (message.subject.isNotBlank()) message.subject else root.context.getString(R.string.message_no_subject) + messagePreviewDate.text = root.context.getString(R.string.message_date, message.date.toFormattedString("yyyy-MM-dd HH:mm:ss")) messagePreviewContent.text = message.content - messagePreviewAuthor.text = if (message.folderId == MessageFolder.SENT.id) "${context.getString(R.string.message_to)} ${message.recipient}" - else "${context.getString(R.string.message_from)} ${message.sender}" + messagePreviewAuthor.text = if (message.folderId == MessageFolder.SENT.id) "${root.context.getString(R.string.message_to)} ${message.recipient}" + else "${root.context.getString(R.string.message_from)} ${message.sender}" } } - private fun bindAttachment(view: View, attachment: MessageAttachment) { - with(view) { + private fun bindAttachment(holder: AttachmentViewHolder, attachment: MessageAttachment) { + with(holder.binding) { messagePreviewAttachment.visibility = View.VISIBLE messagePreviewAttachment.text = attachment.filename - setOnClickListener { - context.openInternetBrowser(attachment.url) { } + root.setOnClickListener { + root.context.openInternetBrowser(attachment.url) { } } } } - class MessageViewHolder(val view: View) : RecyclerView.ViewHolder(view) + class MessageViewHolder(val binding: ItemMessagePreviewBinding) : + RecyclerView.ViewHolder(binding.root) - class DividerViewHolder(val view: View) : RecyclerView.ViewHolder(view) + class DividerViewHolder(val binding: ItemMessageDividerBinding) : + RecyclerView.ViewHolder(binding.root) - class AttachmentViewHolder(val view: View) : RecyclerView.ViewHolder(view) + class AttachmentViewHolder(val binding: ItemMessageAttachmentBinding) : + RecyclerView.ViewHolder(binding.root) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index 953238c08..99eede15a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -1,27 +1,27 @@ package io.github.wulkanowy.ui.modules.message.preview import android.os.Bundle -import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment +import io.github.wulkanowy.databinding.FragmentMessagePreviewBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity -import kotlinx.android.synthetic.main.fragment_message_preview.* import javax.inject.Inject -class MessagePreviewFragment : BaseFragment(), MessagePreviewView, MainView.TitledView { +class MessagePreviewFragment : + BaseFragment(R.layout.fragment_message_preview), + MessagePreviewView, MainView.TitledView { @Inject lateinit var presenter: MessagePreviewPresenter @@ -56,20 +56,17 @@ class MessagePreviewFragment : BaseFragment(), MessagePreviewView, MainView.Titl setHasOptionsMenu(true) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_message_preview, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = messagePreviewContainer + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentMessagePreviewBinding.bind(view) + messageContainer = binding.messagePreviewContainer presenter.onAttachView(this, (savedInstanceState ?: arguments)?.getSerializable(MESSAGE_ID_KEY) as? Message) } override fun initView() { - messagePreviewErrorDetails.setOnClickListener { presenter.onDetailsClick() } + binding.messagePreviewErrorDetails.setOnClickListener { presenter.onDetailsClick() } - with(messagePreviewRecycler) { + with(binding.messagePreviewRecycler) { layoutManager = LinearLayoutManager(context) adapter = previewAdapter } @@ -100,11 +97,11 @@ class MessagePreviewFragment : BaseFragment(), MessagePreviewView, MainView.Titl } override fun showProgress(show: Boolean) { - messagePreviewProgress.visibility = if (show) VISIBLE else GONE + binding.messagePreviewProgress.visibility = if (show) VISIBLE else GONE } override fun showContent(show: Boolean) { - messagePreviewRecycler.visibility = if (show) VISIBLE else GONE + binding.messagePreviewRecycler.visibility = if (show) VISIBLE else GONE } override fun showOptions(show: Boolean) { @@ -122,15 +119,15 @@ class MessagePreviewFragment : BaseFragment(), MessagePreviewView, MainView.Titl } override fun showErrorView(show: Boolean) { - messagePreviewError.visibility = if (show) VISIBLE else GONE + binding.messagePreviewError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - messagePreviewErrorMessage.text = message + binding.messagePreviewErrorMessage.text = message } override fun setErrorRetryCallback(callback: () -> Unit) { - messagePreviewErrorRetry.setOnClickListener { callback() } + binding.messagePreviewErrorRetry.setOnClickListener { callback() } } override fun openMessageReply(message: Message?) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt index 232b05d79..7b7503433 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt @@ -14,14 +14,14 @@ import android.widget.Toast.LENGTH_LONG import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.ReportingUnit +import io.github.wulkanowy.databinding.ActivitySendMessageBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.hideSoftInput import io.github.wulkanowy.utils.showSoftInput -import kotlinx.android.synthetic.main.activity_send_message.* import javax.inject.Inject -class SendMessageActivity : BaseActivity(), SendMessageView { +class SendMessageActivity : BaseActivity(), SendMessageView { @Inject override lateinit var presenter: SendMessagePresenter @@ -41,17 +41,17 @@ class SendMessageActivity : BaseActivity(), SendMessageVie } override val isDropdownListVisible: Boolean - get() = sendMessageTo.isDropdownListVisible + get() = binding.sendMessageTo.isDropdownListVisible @Suppress("UNCHECKED_CAST") override val formRecipientsData: List - get() = sendMessageTo.addedChipItems as List + get() = binding.sendMessageTo.addedChipItems as List override val formSubjectValue: String - get() = sendMessageSubject.text.toString() + get() = binding.sendMessageSubject.text.toString() override val formContentValue: String - get() = sendMessageMessageContent.text.toString() + get() = binding.sendMessageMessageContent.text.toString() override val messageRequiredRecipients: String get() = getString(R.string.message_required_recipients) @@ -64,18 +64,20 @@ class SendMessageActivity : BaseActivity(), SendMessageVie override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_send_message) - setSupportActionBar(sendMessageToolbar) + setContentView(ActivitySendMessageBinding.inflate(layoutInflater).apply { binding = this }.root) + setSupportActionBar(binding.sendMessageToolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) - messageContainer = sendMessageContainer + messageContainer = binding.sendMessageContainer presenter.onAttachView(this, intent.getSerializableExtra(EXTRA_MESSAGE) as? Message, intent.getSerializableExtra(EXTRA_REPLY) as? Boolean) } override fun initView() { setUpExtendedHitArea() - sendMessageScroll.setOnTouchListener { _, _ -> presenter.onTouchScroll() } - sendMessageTo.onTextChangeListener = presenter::onRecipientsTextChange + with(binding) { + sendMessageScroll.setOnTouchListener { _, _ -> presenter.onTouchScroll() } + sendMessageTo.onTextChangeListener = presenter::onRecipientsTextChange + } } override fun onCreateOptionsMenu(menu: Menu?): Boolean { @@ -93,27 +95,27 @@ class SendMessageActivity : BaseActivity(), SendMessageVie } override fun setReportingUnit(unit: ReportingUnit) { - sendMessageFrom.text = unit.senderName + binding.sendMessageFrom.text = unit.senderName } override fun setRecipients(recipients: List) { - sendMessageTo.filterableChipItems = recipients + binding.sendMessageTo.filterableChipItems = recipients } override fun setSelectedRecipients(recipients: List) { - sendMessageTo.addChips(recipients) + binding.sendMessageTo.addChips(recipients) } override fun showProgress(show: Boolean) { - sendMessageProgress.visibility = if (show) VISIBLE else GONE + binding.sendMessageProgress.visibility = if (show) VISIBLE else GONE } override fun showContent(show: Boolean) { - sendMessageContent.visibility = if (show) VISIBLE else GONE + binding.sendMessageContent.visibility = if (show) VISIBLE else GONE } override fun showEmpty(show: Boolean) { - sendMessageEmpty.visibility = if (show) VISIBLE else GONE + binding.sendMessageEmpty.visibility = if (show) VISIBLE else GONE } override fun showActionBar(show: Boolean) { @@ -121,11 +123,11 @@ class SendMessageActivity : BaseActivity(), SendMessageVie } override fun setSubject(subject: String) { - sendMessageSubject.setText(subject) + binding.sendMessageSubject.setText(subject) } override fun setContent(content: String) { - sendMessageMessageContent.setText(content) + binding.sendMessageMessageContent.setText(content) } override fun showMessage(text: String) { @@ -137,12 +139,14 @@ class SendMessageActivity : BaseActivity(), SendMessageVie } override fun hideDropdownList() { - sendMessageTo.hideDropdownList() + binding.sendMessageTo.hideDropdownList() } override fun scrollToRecipients() { - sendMessageScroll.post { - sendMessageScroll.scrollTo(0, sendMessageTo.bottom - dpToPx(53f).toInt()) + with(binding.sendMessageScroll) { + post { + scrollTo(0, binding.sendMessageTo.bottom - dpToPx(53f).toInt()) + } } } @@ -153,24 +157,24 @@ class SendMessageActivity : BaseActivity(), SendMessageVie private fun setUpExtendedHitArea() { fun extendHitArea() { val containerHitRect = Rect().apply { - sendMessageContent.getHitRect(this) + binding.sendMessageContent.getHitRect(this) } val contentHitRect = Rect().apply { - sendMessageMessageContent.getHitRect(this) + binding.sendMessageMessageContent.getHitRect(this) } contentHitRect.top = contentHitRect.bottom contentHitRect.bottom = containerHitRect.bottom - sendMessageContent.touchDelegate = TouchDelegate(contentHitRect, sendMessageMessageContent) + binding.sendMessageContent.touchDelegate = TouchDelegate(contentHitRect, binding.sendMessageMessageContent) } - sendMessageMessageContent.post { - sendMessageMessageContent.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> + with(binding.sendMessageMessageContent) { + post { + addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> extendHitArea() } extendHitArea() } - extendHitArea() } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt index c39aa3e28..3fdf16845 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt @@ -1,25 +1,24 @@ package io.github.wulkanowy.ui.modules.message.tab import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.message.MessageFolder +import io.github.wulkanowy.databinding.FragmentMessageTabBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.message.preview.MessagePreviewFragment -import kotlinx.android.synthetic.main.fragment_message_tab.* +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import javax.inject.Inject -class MessageTabFragment : BaseFragment(), MessageTabView { +class MessageTabFragment : BaseFragment(R.layout.fragment_message_tab), + MessageTabView { @Inject lateinit var presenter: MessageTabPresenter @@ -42,13 +41,10 @@ class MessageTabFragment : BaseFragment(), MessageTabView { override val isViewEmpty get() = tabAdapter.items.isEmpty() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_message_tab, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = messageTabRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentMessageTabBinding.bind(view) + messageContainer = binding.messageTabRecycler presenter.onAttachView(this, MessageFolder.valueOf( (savedInstanceState ?: arguments)?.getString(MESSAGE_TAB_FOLDER_ID).orEmpty() )) @@ -57,14 +53,16 @@ class MessageTabFragment : BaseFragment(), MessageTabView { override fun initView() { tabAdapter.onClickListener = presenter::onMessageItemSelected - messageTabRecycler.run { + with(binding.messageTabRecycler) { layoutManager = LinearLayoutManager(context) adapter = tabAdapter addItemDecoration(DividerItemDecoration(context)) } - messageTabSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } - messageTabErrorRetry.setOnClickListener { presenter.onRetry() } - messageTabErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + messageTabSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } + messageTabErrorRetry.setOnClickListener { presenter.onRetry() } + messageTabErrorDetails.setOnClickListener { presenter.onDetailsClick() } + } } override fun updateData(data: List) { @@ -82,31 +80,31 @@ class MessageTabFragment : BaseFragment(), MessageTabView { } override fun showProgress(show: Boolean) { - messageTabProgress.visibility = if (show) VISIBLE else GONE + binding.messageTabProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - messageTabSwipe.isEnabled = enable + binding.messageTabSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - messageTabRecycler.visibility = if (show) VISIBLE else INVISIBLE + binding.messageTabRecycler.visibility = if (show) VISIBLE else INVISIBLE } override fun showEmpty(show: Boolean) { - messageTabEmpty.visibility = if (show) VISIBLE else INVISIBLE + binding.messageTabEmpty.visibility = if (show) VISIBLE else INVISIBLE } override fun showErrorView(show: Boolean) { - messageTabError.visibility = if (show) VISIBLE else GONE + binding.messageTabError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - messageTabErrorMessage.text = message + binding.messageTabErrorMessage.text = message } override fun showRefresh(show: Boolean) { - messageTabSwipe.isRefreshing = show + binding.messageTabSwipe.isRefreshing = show } override fun openMessage(message: Message) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt index 08ec26755..6a3e5a441 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt @@ -1,25 +1,25 @@ package io.github.wulkanowy.ui.modules.mobiledevice import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.core.view.postDelayed import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.snackbar.Snackbar import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.MobileDevice +import io.github.wulkanowy.databinding.FragmentMobileDeviceBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.mobiledevice.token.MobileDeviceTokenDialog -import kotlinx.android.synthetic.main.fragment_mobile_device.* +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import javax.inject.Inject -class MobileDeviceFragment : BaseFragment(), MobileDeviceView, MainView.TitledView { +class MobileDeviceFragment : + BaseFragment(R.layout.fragment_mobile_device), MobileDeviceView, + MainView.TitledView { @Inject lateinit var presenter: MobileDevicePresenter @@ -37,29 +37,28 @@ class MobileDeviceFragment : BaseFragment(), MobileDeviceView, MainView.TitledVi override val isViewEmpty: Boolean get() = devicesAdapter.items.isEmpty() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_mobile_device, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = mobileDevicesRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentMobileDeviceBinding.bind(view) + messageContainer = binding.mobileDevicesRecycler presenter.onAttachView(this) } override fun initView() { devicesAdapter.onDeviceUnregisterListener = presenter::onUnregisterDevice - with(mobileDevicesRecycler) { + with(binding.mobileDevicesRecycler) { layoutManager = LinearLayoutManager(context) adapter = devicesAdapter addItemDecoration(DividerItemDecoration(context)) } - mobileDevicesSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } - mobileDevicesErrorRetry.setOnClickListener { presenter.onRetry() } - mobileDevicesErrorDetails.setOnClickListener { presenter.onDetailsClick() } - mobileDeviceAddButton.setOnClickListener { presenter.onRegisterDevice() } + with(binding) { + mobileDevicesSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } + mobileDevicesErrorRetry.setOnClickListener { presenter.onRetry() } + mobileDevicesErrorDetails.setOnClickListener { presenter.onDetailsClick() } + mobileDeviceAddButton.setOnClickListener { presenter.onRegisterDevice() } + } } override fun updateData(data: List) { @@ -88,7 +87,7 @@ class MobileDeviceFragment : BaseFragment(), MobileDeviceView, MainView.TitledVi override fun showUndo(device: MobileDevice, position: Int) { var confirmed = true - Snackbar.make(mobileDevicesRecycler, getString(R.string.mobile_device_removed), 3000) + Snackbar.make(binding.mobileDevicesRecycler, getString(R.string.mobile_device_removed), 3000) .setAction(R.string.all_undo) { confirmed = false presenter.onUnregisterCancelled(device, position) @@ -100,31 +99,31 @@ class MobileDeviceFragment : BaseFragment(), MobileDeviceView, MainView.TitledVi } override fun hideRefresh() { - mobileDevicesSwipe.isRefreshing = false + binding.mobileDevicesSwipe.isRefreshing = false } override fun showProgress(show: Boolean) { - mobileDevicesProgress.visibility = if (show) VISIBLE else GONE + binding.mobileDevicesProgress.visibility = if (show) VISIBLE else GONE } override fun showEmpty(show: Boolean) { - mobileDevicesEmpty.visibility = if (show) VISIBLE else GONE + binding.mobileDevicesEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - mobileDevicesError.visibility = if (show) VISIBLE else GONE + binding.mobileDevicesError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - mobileDevicesErrorMessage.text = message + binding.mobileDevicesErrorMessage.text = message } override fun enableSwipe(enable: Boolean) { - mobileDevicesSwipe.isEnabled = enable + binding.mobileDevicesSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - mobileDevicesRecycler.visibility = if (show) VISIBLE else GONE + binding.mobileDevicesRecycler.visibility = if (show) VISIBLE else GONE } override fun showTokenDialog() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenDialog.kt index 8b81156b1..9ac6049e9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenDialog.kt @@ -14,11 +14,11 @@ import android.widget.Toast import androidx.core.content.getSystemService import io.github.wulkanowy.R import io.github.wulkanowy.data.pojos.MobileDeviceToken +import io.github.wulkanowy.databinding.DialogMobileDeviceBinding import io.github.wulkanowy.ui.base.BaseDialogFragment -import kotlinx.android.synthetic.main.dialog_mobile_device.* import javax.inject.Inject -class MobileDeviceTokenDialog : BaseDialogFragment(), MobileDeviceTokenVIew { +class MobileDeviceTokenDialog : BaseDialogFragment(), MobileDeviceTokenVIew { @Inject lateinit var presenter: MobileDeviceTokenPresenter @@ -33,7 +33,7 @@ class MobileDeviceTokenDialog : BaseDialogFragment(), MobileDeviceTokenVIew { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_mobile_device, container, false) + return DialogMobileDeviceBinding.inflate(inflater).apply { binding = this }.root } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -42,24 +42,24 @@ class MobileDeviceTokenDialog : BaseDialogFragment(), MobileDeviceTokenVIew { } override fun initView() { - mobileDeviceDialogClose.setOnClickListener { dismiss() } + binding.mobileDeviceDialogClose.setOnClickListener { dismiss() } } override fun updateData(token: MobileDeviceToken) { - with(mobileDeviceDialogToken) { + with(binding.mobileDeviceDialogToken) { text = token.token setOnClickListener { clickCopy(token.token) } } - with(mobileDeviceDialogSymbol) { + with(binding.mobileDeviceDialogSymbol) { text = token.symbol setOnClickListener { clickCopy(token.symbol) } } - with(mobileDeviceDialogPin) { + with(binding.mobileDeviceDialogPin) { text = token.pin setOnClickListener { clickCopy(token.pin) } } - mobileDeviceQr.setImageBitmap(Base64.decode(token.qr, Base64.DEFAULT).let { + binding.mobileDeviceQr.setImageBitmap(Base64.decode(token.qr, Base64.DEFAULT).let { BitmapFactory.decodeByteArray(it, 0, it.size) }) } @@ -71,11 +71,11 @@ class MobileDeviceTokenDialog : BaseDialogFragment(), MobileDeviceTokenVIew { } override fun hideLoading() { - mobileDeviceDialogProgress.visibility = GONE + binding.mobileDeviceDialogProgress.visibility = GONE } override fun showContent() { - mobileDeviceDialogContent.visibility = VISIBLE + binding.mobileDeviceDialogContent.visibility = VISIBLE } override fun closeDialog() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt index 25cda2b2a..a79087de2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt @@ -2,11 +2,10 @@ package io.github.wulkanowy.ui.modules.more import android.graphics.drawable.Drawable import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R +import io.github.wulkanowy.databinding.FragmentMoreBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.about.AboutFragment import io.github.wulkanowy.ui.modules.homework.HomeworkFragment @@ -19,10 +18,10 @@ import io.github.wulkanowy.ui.modules.note.NoteFragment import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersFragment import io.github.wulkanowy.ui.modules.settings.SettingsFragment import io.github.wulkanowy.utils.getCompatDrawable -import kotlinx.android.synthetic.main.fragment_more.* import javax.inject.Inject -class MoreFragment : BaseFragment(), MoreView, MainView.TitledView, MainView.MainChildView { +class MoreFragment : BaseFragment(R.layout.fragment_more), MoreView, + MainView.TitledView, MainView.MainChildView { @Inject lateinit var presenter: MorePresenter @@ -61,19 +60,16 @@ class MoreFragment : BaseFragment(), MoreView, MainView.TitledView, MainView.Mai override val aboutRes: Pair? get() = context?.run { getString(R.string.about_title) to getCompatDrawable(R.drawable.ic_all_about) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_more, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentMoreBinding.bind(view) presenter.onAttachView(this) } override fun initView() { moreAdapter.onClickListener = presenter::onItemSelected - moreRecycler.apply { + with(binding.moreRecycler) { layoutManager = LinearLayoutManager(context) adapter = moreAdapter } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteDialog.kt index 20ffea4eb..6d1b181ac 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteDialog.kt @@ -9,13 +9,16 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.DialogFragment import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Note +import io.github.wulkanowy.databinding.DialogNoteBinding import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.synthetic.main.dialog_note.* import io.github.wulkanowy.sdk.scrapper.notes.Note.CategoryType +import io.github.wulkanowy.utils.lifecycleAwareVariable class NoteDialog : DialogFragment() { + private var binding: DialogNoteBinding by lifecycleAwareVariable() + private lateinit var note: Note companion object { @@ -37,19 +40,22 @@ class NoteDialog : DialogFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_note, container, false) + return DialogNoteBinding.inflate(inflater).apply { binding = this }.root } @SuppressLint("SetTextI18n") override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - noteDialogDate.text = note.date.toFormattedString() - noteDialogCategory.text = note.category - noteDialogTeacher.text = note.teacher - noteDialogContent.text = note.content + with(binding) { + noteDialogDate.text = note.date.toFormattedString() + noteDialogCategory.text = note.category + noteDialogTeacher.text = note.teacher + noteDialogContent.text = note.content + } + if (note.isPointsShow) { - with(noteDialogPoints) { + with(binding.noteDialogPoints) { text = "${if (note.points > 0) "+" else ""}${note.points}" setTextColor(when (CategoryType.getByValue(note.categoryType)) { CategoryType.POSITIVE -> ContextCompat.getColor(requireContext(), R.color.note_positive) @@ -58,6 +64,7 @@ class NoteDialog : DialogFragment() { }) } } - noteDialogClose.setOnClickListener { dismiss() } + + binding.noteDialogClose.setOnClickListener { dismiss() } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt index b01dc4939..473381659 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt @@ -1,22 +1,21 @@ package io.github.wulkanowy.ui.modules.note import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Note +import io.github.wulkanowy.databinding.FragmentNoteBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView -import kotlinx.android.synthetic.main.fragment_note.* +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import javax.inject.Inject -class NoteFragment : BaseFragment(), NoteView, MainView.TitledView { +class NoteFragment : BaseFragment(R.layout.fragment_note), NoteView, + MainView.TitledView { @Inject lateinit var presenter: NotePresenter @@ -34,26 +33,25 @@ class NoteFragment : BaseFragment(), NoteView, MainView.TitledView { override val isViewEmpty: Boolean get() = noteAdapter.items.isEmpty() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_note, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentNoteBinding.bind(view) presenter.onAttachView(this) } override fun initView() { noteAdapter.onClickListener = presenter::onNoteItemSelected - noteRecycler.run { + with(binding.noteRecycler) { layoutManager = LinearLayoutManager(context) adapter = noteAdapter addItemDecoration(DividerItemDecoration(context)) } - noteSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } - noteErrorRetry.setOnClickListener { presenter.onRetry() } - noteErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + noteSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } + noteErrorRetry.setOnClickListener { presenter.onRetry() } + noteErrorDetails.setOnClickListener { presenter.onDetailsClick() } + } } override fun showNoteDialog(note: Note) { @@ -82,31 +80,31 @@ class NoteFragment : BaseFragment(), NoteView, MainView.TitledView { } override fun showEmpty(show: Boolean) { - noteEmpty.visibility = if (show) VISIBLE else GONE + binding.noteEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - noteError.visibility = if (show) VISIBLE else GONE + binding.noteError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - noteErrorMessage.text = message + binding.noteErrorMessage.text = message } override fun showProgress(show: Boolean) { - noteProgress.visibility = if (show) VISIBLE else GONE + binding.noteProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - noteSwipe.isEnabled = enable + binding.noteSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - noteRecycler.visibility = if (show) VISIBLE else GONE + binding.noteRecycler.visibility = if (show) VISIBLE else GONE } override fun hideRefresh() { - noteSwipe.isRefreshing = false + binding.noteSwipe.isRefreshing = false } override fun onDestroyView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt index 5f9c0b9a0..0245aa076 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt @@ -1,12 +1,11 @@ package io.github.wulkanowy.ui.modules.schoolandteachers import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE -import android.view.ViewGroup import io.github.wulkanowy.R +import io.github.wulkanowy.databinding.FragmentSchoolandteachersBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter import io.github.wulkanowy.ui.modules.main.MainView @@ -14,10 +13,11 @@ import io.github.wulkanowy.ui.modules.schoolandteachers.school.SchoolFragment import io.github.wulkanowy.ui.modules.schoolandteachers.teacher.TeacherFragment import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.setOnSelectPageListener -import kotlinx.android.synthetic.main.fragment_schoolandteachers.* import javax.inject.Inject -class SchoolAndTeachersFragment : BaseFragment(), SchoolAndTeachersView, MainView.TitledView { +class SchoolAndTeachersFragment : + BaseFragment(R.layout.fragment_schoolandteachers), + SchoolAndTeachersView, MainView.TitledView { @Inject lateinit var presenter: SchoolAndTeachersPresenter @@ -31,45 +31,44 @@ class SchoolAndTeachersFragment : BaseFragment(), SchoolAndTeachersView, MainVie override val titleStringId: Int get() = R.string.schoolandteachers_title - override val currentPageIndex get() = schoolandteachersViewPager.currentItem + override val currentPageIndex get() = binding.schoolandteachersViewPager.currentItem - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_schoolandteachers, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentSchoolandteachersBinding.bind(view) presenter.onAttachView(this) } override fun initView() { with(pagerAdapter) { - containerId = schoolandteachersViewPager.id + containerId = binding.schoolandteachersViewPager.id addFragmentsWithTitle(mapOf( SchoolFragment.newInstance() to getString(R.string.school_title), TeacherFragment.newInstance() to getString(R.string.teachers_title) )) } - with(schoolandteachersViewPager) { + with(binding.schoolandteachersViewPager) { adapter = pagerAdapter offscreenPageLimit = 2 setOnSelectPageListener(presenter::onPageSelected) } - with(schoolandteachersTabLayout) { - setupWithViewPager(schoolandteachersViewPager) + with(binding.schoolandteachersTabLayout) { + setupWithViewPager(binding.schoolandteachersViewPager) setElevationCompat(context.dpToPx(4f)) } } override fun showContent(show: Boolean) { - schoolandteachersViewPager.visibility = if (show) VISIBLE else INVISIBLE - schoolandteachersTabLayout.visibility = if (show) VISIBLE else INVISIBLE + with(binding) { + schoolandteachersViewPager.visibility = if (show) VISIBLE else INVISIBLE + schoolandteachersTabLayout.visibility = if (show) VISIBLE else INVISIBLE + } } override fun showProgress(show: Boolean) { - schoolandteachersProgress.visibility = if (show) VISIBLE else INVISIBLE + binding.schoolandteachersProgress.visibility = if (show) VISIBLE else INVISIBLE } fun onChildFragmentLoaded() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt index 5a7c4cade..722999f86 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt @@ -1,89 +1,89 @@ package io.github.wulkanowy.ui.modules.schoolandteachers.school import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.School +import io.github.wulkanowy.databinding.FragmentSchoolBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersChildView import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersFragment import io.github.wulkanowy.utils.openDialer import io.github.wulkanowy.utils.openNavigation -import kotlinx.android.synthetic.main.fragment_school.* import javax.inject.Inject -class SchoolFragment : BaseFragment(), SchoolView, MainView.TitledView, SchoolAndTeachersChildView { +class SchoolFragment : BaseFragment(R.layout.fragment_school), SchoolView, + MainView.TitledView, SchoolAndTeachersChildView { @Inject lateinit var presenter: SchoolPresenter override val titleStringId get() = R.string.school_title - override val isViewEmpty get() = schoolName.text.isBlank() + override val isViewEmpty get() = binding.schoolName.text.isBlank() companion object { fun newInstance() = SchoolFragment() } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_school, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentSchoolBinding.bind(view) presenter.onAttachView(this) } override fun initView() { - schoolSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } - schoolErrorRetry.setOnClickListener { presenter.onRetry() } - schoolErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + schoolSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } + schoolErrorRetry.setOnClickListener { presenter.onRetry() } + schoolErrorDetails.setOnClickListener { presenter.onDetailsClick() } - schoolAddressButton.setOnClickListener { presenter.onAddressSelected() } - schoolTelephoneButton.setOnClickListener { presenter.onTelephoneSelected() } + schoolAddressButton.setOnClickListener { presenter.onAddressSelected() } + schoolTelephoneButton.setOnClickListener { presenter.onTelephoneSelected() } + } } override fun updateData(data: School) { - schoolName.text = data.name - schoolAddress.text = data.address.ifBlank { "-" } - schoolAddressButton.visibility = if (data.address.isNotBlank()) VISIBLE else GONE - schoolTelephone.text = data.contact.ifBlank { "-" } - schoolTelephoneButton.visibility = if (data.contact.isNotBlank()) VISIBLE else GONE - schoolHeadmaster.text = data.headmaster - schoolPedagogue.text = data.pedagogue + with(binding) { + schoolName.text = data.name + schoolAddress.text = data.address.ifBlank { "-" } + schoolAddressButton.visibility = if (data.address.isNotBlank()) VISIBLE else GONE + schoolTelephone.text = data.contact.ifBlank { "-" } + schoolTelephoneButton.visibility = if (data.contact.isNotBlank()) VISIBLE else GONE + schoolHeadmaster.text = data.headmaster + schoolPedagogue.text = data.pedagogue + } } override fun showEmpty(show: Boolean) { - schoolEmpty.visibility = if (show) VISIBLE else GONE + binding.schoolEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - schoolError.visibility = if (show) VISIBLE else GONE + binding.schoolError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - schoolErrorMessage.text = message + binding.schoolErrorMessage.text = message } override fun showProgress(show: Boolean) { - schoolProgress.visibility = if (show) VISIBLE else GONE + binding.schoolProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - schoolSwipe.isEnabled = enable + binding.schoolSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - schoolContent.visibility = if (show) VISIBLE else GONE + binding.schoolContent.visibility = if (show) VISIBLE else GONE } override fun hideRefresh() { - schoolSwipe.isRefreshing = false + binding.schoolSwipe.isRefreshing = false } override fun notifyParentDataLoaded() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt index 7d1003263..aa50339c1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt @@ -1,24 +1,22 @@ package io.github.wulkanowy.ui.modules.schoolandteachers.teacher import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Teacher +import io.github.wulkanowy.databinding.FragmentTeacherBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersChildView import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersFragment -import kotlinx.android.synthetic.main.fragment_teacher.* +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import javax.inject.Inject -class TeacherFragment : BaseFragment(), TeacherView, MainView.TitledView, - SchoolAndTeachersChildView { +class TeacherFragment : BaseFragment(R.layout.fragment_teacher), + TeacherView, MainView.TitledView, SchoolAndTeachersChildView { @Inject lateinit var presenter: TeacherPresenter @@ -38,24 +36,23 @@ class TeacherFragment : BaseFragment(), TeacherView, MainView.TitledView, override val isViewEmpty: Boolean get() = teacherAdapter.items.isEmpty() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_teacher, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentTeacherBinding.bind(view) presenter.onAttachView(this) } override fun initView() { - teacherRecycler.run { + with(binding.teacherRecycler) { layoutManager = LinearLayoutManager(context) adapter = teacherAdapter addItemDecoration(DividerItemDecoration(context)) } - teacherSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } - teacherErrorRetry.setOnClickListener { presenter.onRetry() } - teacherErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + teacherSwipe.setOnRefreshListener { presenter.onSwipeRefresh() } + teacherErrorRetry.setOnClickListener { presenter.onRetry() } + teacherErrorDetails.setOnClickListener { presenter.onDetailsClick() } + } } override fun updateData(data: List) { @@ -66,31 +63,31 @@ class TeacherFragment : BaseFragment(), TeacherView, MainView.TitledView, } override fun showEmpty(show: Boolean) { - teacherEmpty.visibility = if (show) VISIBLE else GONE + binding.teacherEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - teacherError.visibility = if (show) VISIBLE else GONE + binding.teacherError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - teacherErrorMessage.text = message + binding.teacherErrorMessage.text = message } override fun showProgress(show: Boolean) { - teacherProgress.visibility = if (show) VISIBLE else GONE + binding.teacherProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - teacherSwipe.isEnabled = enable + binding.teacherSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - teacherRecycler.visibility = if (show) VISIBLE else GONE + binding.teacherRecycler.visibility = if (show) VISIBLE else GONE } override fun hideRefresh() { - teacherSwipe.isRefreshing = false + binding.teacherSwipe.isRefreshing = false } override fun notifyParentDataLoaded() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index fe0a97632..aa38a87af 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -91,19 +91,19 @@ class SettingsFragment : PreferenceFragmentCompat(), } override fun showError(text: String, error: Throwable) { - (activity as? BaseActivity<*>)?.showError(text, error) + (activity as? BaseActivity<*, *>)?.showError(text, error) } override fun showMessage(text: String) { - (activity as? BaseActivity<*>)?.showMessage(text) + (activity as? BaseActivity<*, *>)?.showMessage(text) } override fun showExpiredDialog() { - (activity as? BaseActivity<*>)?.showExpiredDialog() + (activity as? BaseActivity<*, *>)?.showExpiredDialog() } override fun openClearLoginView() { - (activity as? BaseActivity<*>)?.openClearLoginView() + (activity as? BaseActivity<*, *>)?.openClearLoginView() } override fun showErrorDetailsDialog(error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt index 3e0106d1a..23a437506 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt @@ -3,12 +3,13 @@ package io.github.wulkanowy.ui.modules.splash import android.os.Bundle import android.widget.Toast import android.widget.Toast.LENGTH_LONG +import androidx.viewbinding.ViewBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.main.MainActivity import javax.inject.Inject -class SplashActivity : BaseActivity(), SplashView { +class SplashActivity : BaseActivity(), SplashView { @Inject override lateinit var presenter: SplashPresenter diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt index 57ec5998d..8efecf07c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt @@ -11,13 +11,16 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable +import io.github.wulkanowy.databinding.DialogTimetableBinding import io.github.wulkanowy.utils.getThemeAttrColor +import io.github.wulkanowy.utils.lifecycleAwareVariable import io.github.wulkanowy.utils.toFormattedString -import kotlinx.android.synthetic.main.dialog_timetable.* import org.threeten.bp.LocalDateTime class TimetableDialog : DialogFragment() { + private var binding: DialogTimetableBinding by lifecycleAwareVariable() + private lateinit var lesson: Timetable companion object { @@ -39,13 +42,13 @@ class TimetableDialog : DialogFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_timetable, container, false) + return DialogTimetableBinding.inflate(inflater).apply { binding = this }.root } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - lesson.run { + with(lesson) { setInfo(info, teacher, canceled, changes) setSubject(subject, subjectOld) setTeacher(teacher, teacherOld) @@ -54,74 +57,81 @@ class TimetableDialog : DialogFragment() { setTime(start, end) } - timetableDialogClose.setOnClickListener { dismiss() } + binding.timetableDialogClose.setOnClickListener { dismiss() } } private fun setSubject(subject: String, subjectOld: String) { - timetableDialogSubject.text = subject - if (subjectOld.isNotBlank() && subjectOld != subject) { - timetableDialogSubject.run { - paintFlags = paintFlags or STRIKE_THRU_TEXT_FLAG - text = subjectOld - } - timetableDialogSubjectNew.run { - visibility = VISIBLE - text = subject + with(binding) { + timetableDialogSubject.text = subject + if (subjectOld.isNotBlank() && subjectOld != subject) { + timetableDialogSubject.run { + paintFlags = paintFlags or STRIKE_THRU_TEXT_FLAG + text = subjectOld + } + timetableDialogSubjectNew.run { + visibility = VISIBLE + text = subject + } } } } private fun setInfo(info: String, teacher: String, canceled: Boolean, changes: Boolean) { - when { - info.isNotBlank() -> { - if (canceled) { - timetableDialogChangesTitle.setTextColor(requireContext().getThemeAttrColor(R.attr.colorPrimary)) - timetableDialogChanges.setTextColor(requireContext().getThemeAttrColor(R.attr.colorPrimary)) - } else { - timetableDialogChangesTitle.setTextColor(requireContext().getThemeAttrColor(R.attr.colorTimetableChange)) - timetableDialogChanges.setTextColor(requireContext().getThemeAttrColor(R.attr.colorTimetableChange)) - } + with(binding) { + when { + info.isNotBlank() -> { + if (canceled) { + timetableDialogChangesTitle.setTextColor(requireContext().getThemeAttrColor(R.attr.colorPrimary)) + timetableDialogChanges.setTextColor(requireContext().getThemeAttrColor(R.attr.colorPrimary)) + } else { + timetableDialogChangesTitle.setTextColor(requireContext().getThemeAttrColor(R.attr.colorTimetableChange)) + timetableDialogChanges.setTextColor(requireContext().getThemeAttrColor(R.attr.colorTimetableChange)) + } - timetableDialogChanges.text = when { - canceled && !changes -> "Lekcja odwołana: $info" - changes && teacher.isNotBlank() -> "Zastępstwo: $teacher" - changes && teacher.isBlank() -> "Zastępstwo, ${info.decapitalize()}" - else -> info.capitalize() + timetableDialogChanges.text = when { + canceled && !changes -> "Lekcja odwołana: $info" + changes && teacher.isNotBlank() -> "Zastępstwo: $teacher" + changes && teacher.isBlank() -> "Zastępstwo, ${info.decapitalize()}" + else -> info.capitalize() + } + } + else -> { + timetableDialogChangesTitle.visibility = GONE + timetableDialogChanges.visibility = GONE } - } else -> { - timetableDialogChangesTitle.visibility = GONE - timetableDialogChanges.visibility = GONE } } } private fun setTeacher(teacher: String, teacherOld: String) { - when { - teacherOld.isNotBlank() && teacherOld != teacher -> { - timetableDialogTeacher.run { - visibility = VISIBLE - paintFlags = paintFlags or STRIKE_THRU_TEXT_FLAG - text = teacherOld - } - if (teacher.isNotBlank()) { - timetableDialogTeacherNew.run { + with(binding) { + when { + teacherOld.isNotBlank() && teacherOld != teacher -> { + timetableDialogTeacher.run { visibility = VISIBLE - text = teacher + paintFlags = paintFlags or STRIKE_THRU_TEXT_FLAG + text = teacherOld + } + if (teacher.isNotBlank()) { + timetableDialogTeacherNew.run { + visibility = VISIBLE + text = teacher + } } } - } - teacher.isNotBlank() -> timetableDialogTeacher.text = teacher - else -> { - timetableDialogTeacherTitle.visibility = GONE - timetableDialogTeacher.visibility = GONE + teacher.isNotBlank() -> timetableDialogTeacher.text = teacher + else -> { + timetableDialogTeacherTitle.visibility = GONE + timetableDialogTeacher.visibility = GONE + } } } } private fun setGroup(group: String) { - group.let { + with(binding) { when { - it.isNotBlank() -> timetableDialogGroup.text = it + group.isNotBlank() -> timetableDialogGroup.text = group else -> { timetableDialogGroupTitle.visibility = GONE timetableDialogGroup.visibility = GONE @@ -131,30 +141,32 @@ class TimetableDialog : DialogFragment() { } private fun setRoom(room: String, roomOld: String) { - when { - roomOld.isNotBlank() && roomOld != room -> { - timetableDialogRoom.run { - visibility = VISIBLE - paintFlags = paintFlags or STRIKE_THRU_TEXT_FLAG - text = roomOld - } - if (room.isNotBlank()) { - timetableDialogRoomNew.run { + with(binding) { + when { + roomOld.isNotBlank() && roomOld != room -> { + timetableDialogRoom.run { visibility = VISIBLE - text = room + paintFlags = paintFlags or STRIKE_THRU_TEXT_FLAG + text = roomOld + } + if (room.isNotBlank()) { + timetableDialogRoomNew.run { + visibility = VISIBLE + text = room + } } } - } - room.isNotBlank() -> timetableDialogRoom.text = room - else -> { - timetableDialogRoomTitle.visibility = GONE - timetableDialogRoom.visibility = GONE + room.isNotBlank() -> timetableDialogRoom.text = room + else -> { + timetableDialogRoomTitle.visibility = GONE + timetableDialogRoom.visibility = GONE + } } } } @SuppressLint("SetTextI18n") private fun setTime(start: LocalDateTime, end: LocalDateTime) { - timetableDialogTime.text = "${start.toFormattedString("HH:mm")} - ${end.toFormattedString("HH:mm")}" + binding.timetableDialogTime.text = "${start.toFormattedString("HH:mm")} - ${end.toFormattedString("HH:mm")}" } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index 2c15b9b3f..2119cebde 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -1,31 +1,29 @@ package io.github.wulkanowy.ui.modules.timetable import android.os.Bundle -import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import com.wdullaer.materialdatetimepicker.date.DatePickerDialog import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable +import io.github.wulkanowy.databinding.FragmentTimetableBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.timetable.completed.CompletedLessonsFragment +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.SchooldaysRangeLimiter import io.github.wulkanowy.utils.dpToPx -import kotlinx.android.synthetic.main.fragment_timetable.* import org.threeten.bp.LocalDate import javax.inject.Inject -class TimetableFragment : BaseFragment(), TimetableView, MainView.MainChildView, - MainView.TitledView { +class TimetableFragment : BaseFragment(R.layout.fragment_timetable), + TimetableView, MainView.MainChildView, MainView.TitledView { @Inject lateinit var presenter: TimetablePresenter @@ -50,34 +48,33 @@ class TimetableFragment : BaseFragment(), TimetableView, MainView.MainChildView, setHasOptionsMenu(true) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_timetable, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = timetableRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentTimetableBinding.bind(view) + messageContainer = binding.timetableRecycler presenter.onAttachView(this, savedInstanceState?.getLong(SAVED_DATE_KEY)) } override fun initView() { timetableAdapter.onClickListener = presenter::onTimetableItemSelected - with(timetableRecycler) { + with(binding.timetableRecycler) { layoutManager = LinearLayoutManager(context) adapter = timetableAdapter addItemDecoration(DividerItemDecoration(context)) } - timetableSwipe.setOnRefreshListener(presenter::onSwipeRefresh) - timetableErrorRetry.setOnClickListener { presenter.onRetry() } - timetableErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + timetableSwipe.setOnRefreshListener(presenter::onSwipeRefresh) + timetableErrorRetry.setOnClickListener { presenter.onRetry() } + timetableErrorDetails.setOnClickListener { presenter.onDetailsClick() } - timetablePreviousButton.setOnClickListener { presenter.onPreviousDay() } - timetableNavDate.setOnClickListener { presenter.onPickDate() } - timetableNextButton.setOnClickListener { presenter.onNextDay() } + timetablePreviousButton.setOnClickListener { presenter.onPreviousDay() } + timetableNavDate.setOnClickListener { presenter.onPickDate() } + timetableNextButton.setOnClickListener { presenter.onNextDay() } - timetableNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + timetableNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + } } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { @@ -105,15 +102,15 @@ class TimetableFragment : BaseFragment(), TimetableView, MainView.MainChildView, } override fun updateNavigationDay(date: String) { - timetableNavDate.text = date + binding.timetableNavDate.text = date } override fun hideRefresh() { - timetableSwipe.isRefreshing = false + binding.timetableSwipe.isRefreshing = false } override fun resetView() { - timetableRecycler.smoothScrollToPosition(0) + binding.timetableRecycler.smoothScrollToPosition(0) } override fun onFragmentReselected() { @@ -125,35 +122,35 @@ class TimetableFragment : BaseFragment(), TimetableView, MainView.MainChildView, } override fun showEmpty(show: Boolean) { - timetableEmpty.visibility = if (show) VISIBLE else GONE + binding.timetableEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - timetableError.visibility = if (show) VISIBLE else GONE + binding.timetableError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - timetableErrorMessage.text = message + binding.timetableErrorMessage.text = message } override fun showProgress(show: Boolean) { - timetableProgress.visibility = if (show) VISIBLE else GONE + binding.timetableProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - timetableSwipe.isEnabled = enable + binding.timetableSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - timetableRecycler.visibility = if (show) VISIBLE else GONE + binding.timetableRecycler.visibility = if (show) VISIBLE else GONE } override fun showPreButton(show: Boolean) { - timetablePreviousButton.visibility = if (show) VISIBLE else View.INVISIBLE + binding.timetablePreviousButton.visibility = if (show) VISIBLE else View.INVISIBLE } override fun showNextButton(show: Boolean) { - timetableNextButton.visibility = if (show) VISIBLE else View.INVISIBLE + binding.timetableNextButton.visibility = if (show) VISIBLE else View.INVISIBLE } override fun showTimetableDialog(lesson: Timetable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonDialog.kt index 8f7b1ec5b..56ea16cfa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonDialog.kt @@ -6,12 +6,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.DialogFragment -import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.CompletedLesson -import kotlinx.android.synthetic.main.dialog_lesson_completed.* +import io.github.wulkanowy.databinding.DialogLessonCompletedBinding +import io.github.wulkanowy.utils.lifecycleAwareVariable class CompletedLessonDialog : DialogFragment() { + private var binding: DialogLessonCompletedBinding by lifecycleAwareVariable() + private lateinit var completedLesson: CompletedLesson companion object { @@ -28,46 +30,54 @@ class CompletedLessonDialog : DialogFragment() { super.onCreate(savedInstanceState) setStyle(STYLE_NO_TITLE, 0) arguments?.run { - completedLesson = getSerializable(CompletedLessonDialog.ARGUMENT_KEY) as CompletedLesson + completedLesson = getSerializable(ARGUMENT_KEY) as CompletedLesson } } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_lesson_completed, container, false) + return DialogLessonCompletedBinding.inflate(inflater).apply { binding = this }.root } @SuppressLint("SetTextI18n") override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - completedLessonDialogSubject.text = completedLesson.subject - completedLessonDialogTopic.text = completedLesson.topic - completedLessonDialogTeacher.text = completedLesson.teacher - completedLessonDialogAbsence.text = completedLesson.absence - completedLessonDialogChanges.text = completedLesson.substitution - completedLessonDialogResources.text = completedLesson.resources + with(binding) { + completedLessonDialogSubject.text = completedLesson.subject + completedLessonDialogTopic.text = completedLesson.topic + completedLessonDialogTeacher.text = completedLesson.teacher + completedLessonDialogAbsence.text = completedLesson.absence + completedLessonDialogChanges.text = completedLesson.substitution + completedLessonDialogResources.text = completedLesson.resources + } completedLesson.substitution.let { if (it.isBlank()) { - completedLessonDialogChangesTitle.visibility = View.GONE - completedLessonDialogChanges.visibility = View.GONE - } else completedLessonDialogChanges.text = it + with(binding) { + completedLessonDialogChangesTitle.visibility = View.GONE + completedLessonDialogChanges.visibility = View.GONE + } + } else binding.completedLessonDialogChanges.text = it } completedLesson.absence.let { if (it.isBlank()) { - completedLessonDialogAbsenceTitle.visibility = View.GONE - completedLessonDialogAbsence.visibility = View.GONE - } else completedLessonDialogAbsence.text = it + with(binding) { + completedLessonDialogAbsenceTitle.visibility = View.GONE + completedLessonDialogAbsence.visibility = View.GONE + } + } else binding.completedLessonDialogAbsence.text = it } completedLesson.resources.let { if (it.isBlank()) { - completedLessonDialogResourcesTitle.visibility = View.GONE - completedLessonDialogResources.visibility = View.GONE - } else completedLessonDialogResources.text = it + with(binding) { + completedLessonDialogResourcesTitle.visibility = View.GONE + completedLessonDialogResources.visibility = View.GONE + } + } else binding.completedLessonDialogResources.text = it } - completedLessonDialogClose.setOnClickListener { dismiss() } + binding.completedLessonDialogClose.setOnClickListener { dismiss() } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt index 544343a42..2efd30a34 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt @@ -1,28 +1,28 @@ package io.github.wulkanowy.ui.modules.timetable.completed import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE -import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import com.wdullaer.materialdatetimepicker.date.DatePickerDialog import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.CompletedLesson +import io.github.wulkanowy.databinding.FragmentTimetableCompletedBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.SchooldaysRangeLimiter import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.getCompatDrawable -import kotlinx.android.synthetic.main.fragment_timetable_completed.* import org.threeten.bp.LocalDate import javax.inject.Inject -class CompletedLessonsFragment : BaseFragment(), CompletedLessonsView, MainView.TitledView { +class CompletedLessonsFragment : + BaseFragment(R.layout.fragment_timetable_completed), + CompletedLessonsView, MainView.TitledView { @Inject lateinit var presenter: CompletedLessonsPresenter @@ -40,34 +40,33 @@ class CompletedLessonsFragment : BaseFragment(), CompletedLessonsView, MainView. override val isViewEmpty get() = completedLessonsAdapter.items.isEmpty() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_timetable_completed, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - messageContainer = completedLessonsRecycler + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentTimetableCompletedBinding.bind(view) + messageContainer = binding.completedLessonsRecycler presenter.onAttachView(this, savedInstanceState?.getLong(SAVED_DATE_KEY)) } override fun initView() { completedLessonsAdapter.onClickListener = presenter::onCompletedLessonsItemSelected - with(completedLessonsRecycler) { + with(binding.completedLessonsRecycler) { layoutManager = LinearLayoutManager(context) adapter = completedLessonsAdapter addItemDecoration(DividerItemDecoration(context)) } - completedLessonsSwipe.setOnRefreshListener(presenter::onSwipeRefresh) - completedLessonErrorRetry.setOnClickListener { presenter.onRetry() } - completedLessonErrorDetails.setOnClickListener { presenter.onDetailsClick() } + with(binding) { + completedLessonsSwipe.setOnRefreshListener(presenter::onSwipeRefresh) + completedLessonErrorRetry.setOnClickListener { presenter.onRetry() } + completedLessonErrorDetails.setOnClickListener { presenter.onDetailsClick() } - completedLessonsPreviousButton.setOnClickListener { presenter.onPreviousDay() } - completedLessonsNavDate.setOnClickListener { presenter.onPickDate() } - completedLessonsNextButton.setOnClickListener { presenter.onNextDay() } + completedLessonsPreviousButton.setOnClickListener { presenter.onPreviousDay() } + completedLessonsNavDate.setOnClickListener { presenter.onPickDate() } + completedLessonsNextButton.setOnClickListener { presenter.onNextDay() } - completedLessonsNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + completedLessonsNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + } } override fun updateData(data: List) { @@ -85,48 +84,50 @@ class CompletedLessonsFragment : BaseFragment(), CompletedLessonsView, MainView. } override fun updateNavigationDay(date: String) { - completedLessonsNavDate.text = date + binding.completedLessonsNavDate.text = date } override fun hideRefresh() { - completedLessonsSwipe.isRefreshing = false + binding.completedLessonsSwipe.isRefreshing = false } override fun showEmpty(show: Boolean) { - completedLessonsEmpty.visibility = if (show) VISIBLE else GONE + binding.completedLessonsEmpty.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - completedLessonError.visibility = if (show) VISIBLE else GONE + binding.completedLessonError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - completedLessonErrorMessage.text = message + binding.completedLessonErrorMessage.text = message } override fun showFeatureDisabled() { - completedLessonsInfo.text = getString(R.string.error_feature_disabled) - completedLessonsInfoImage.setImageDrawable(requireContext().getCompatDrawable(R.drawable.ic_all_close_circle)) + with(binding) { + completedLessonsInfo.text = getString(R.string.error_feature_disabled) + completedLessonsInfoImage.setImageDrawable(requireContext().getCompatDrawable(R.drawable.ic_all_close_circle)) + } } override fun showProgress(show: Boolean) { - completedLessonsProgress.visibility = if (show) VISIBLE else GONE + binding.completedLessonsProgress.visibility = if (show) VISIBLE else GONE } override fun enableSwipe(enable: Boolean) { - completedLessonsSwipe.isEnabled = enable + binding.completedLessonsSwipe.isEnabled = enable } override fun showContent(show: Boolean) { - completedLessonsRecycler.visibility = if (show) VISIBLE else GONE + binding.completedLessonsRecycler.visibility = if (show) VISIBLE else GONE } override fun showPreButton(show: Boolean) { - completedLessonsPreviousButton.visibility = if (show) VISIBLE else INVISIBLE + binding.completedLessonsPreviousButton.visibility = if (show) VISIBLE else INVISIBLE } override fun showNextButton(show: Boolean) { - completedLessonsNextButton.visibility = if (show) VISIBLE else INVISIBLE + binding.completedLessonsNextButton.visibility = if (show) VISIBLE else INVISIBLE } override fun showCompletedLessonDialog(completedLesson: CompletedLesson) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt index 9208cd9e6..75548c9cc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt @@ -11,14 +11,15 @@ import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.ActivityWidgetConfigureBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.WidgetConfigureAdapter import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.EXTRA_FROM_PROVIDER -import kotlinx.android.synthetic.main.activity_widget_configure.* import javax.inject.Inject -class TimetableWidgetConfigureActivity : BaseActivity(), +class TimetableWidgetConfigureActivity : + BaseActivity(), TimetableWidgetConfigureView { @Inject @@ -32,7 +33,7 @@ class TimetableWidgetConfigureActivity : BaseActivity : ReadWriteProperty, LifecycleObserver { + + private var _value: T? = null + + override fun setValue(thisRef: Fragment, property: KProperty<*>, value: T) { + thisRef.viewLifecycleOwner.lifecycle.removeObserver(this) + _value = value + thisRef.viewLifecycleOwner.lifecycle.addObserver(this) + } + + override fun getValue(thisRef: Fragment, property: KProperty<*>) = _value + ?: throw IllegalStateException("Trying to call an lifecycle-aware value outside of the view lifecycle, or the value has not been initialized") + + @Suppress("unused") + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + fun onDestroyView() { + _value = null + } +} + +class LifecycleAwareVariableActivity : ReadWriteProperty, LifecycleObserver { + + private var _value: T? = null + + override fun setValue(thisRef: AppCompatActivity, property: KProperty<*>, value: T) { + thisRef.lifecycle.removeObserver(this) + _value = value + thisRef.lifecycle.addObserver(this) + } + + override fun getValue(thisRef: AppCompatActivity, property: KProperty<*>) = _value + ?: throw IllegalStateException("Trying to call an lifecycle-aware value outside of the view lifecycle, or the value has not been initialized") + + @Suppress("unused") + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + fun onDestroyView() { + _value = null + } +} + + +@Suppress("unused") +fun Fragment.lifecycleAwareVariable() = LifecycleAwareVariable() + +fun AppCompatActivity.lifecycleAwareVariable() = LifecycleAwareVariableActivity() diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml index 556bdfd09..6747b7d0c 100644 --- a/app/src/main/res/layout/fragment_about.xml +++ b/app/src/main/res/layout/fragment_about.xml @@ -1,10 +1,12 @@ + android:layout_height="match_parent" + tools:listitem="@layout/item_about" /> diff --git a/app/src/main/res/layout/fragment_creator.xml b/app/src/main/res/layout/fragment_contributor.xml similarity index 100% rename from app/src/main/res/layout/fragment_creator.xml rename to app/src/main/res/layout/fragment_contributor.xml From 6d1fa0cf056289457c3ca7616861a3dd362caea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 10 May 2020 10:51:01 +0200 Subject: [PATCH 0014/1526] Optimize grade average provider (#792) --- app/build.gradle | 2 +- .../data/repositories/grade/GradeLocalTest.kt | 4 +- .../repositories/grade/GradeRepositoryTest.kt | 27 +-- .../data/repositories/grade/GradeLocal.kt | 21 +- .../data/repositories/grade/GradeRemote.kt | 20 +- .../repositories/grade/GradeRepository.kt | 58 +++-- .../gradessummary/GradeSummaryLocal.kt | 24 --- .../gradessummary/GradeSummaryRemote.kt | 35 --- .../gradessummary/GradeSummaryRepository.kt | 35 --- .../wulkanowy/services/ServicesModule.kt | 5 - .../services/sync/works/GradeSummaryWork.kt | 14 -- .../services/sync/works/GradeWork.kt | 1 - .../ui/modules/grade/GradeAverageProvider.kt | 87 ++++---- .../modules/grade/GradeDetailsWithAverage.kt | 12 ++ .../grade/details/GradeDetailsAdapter.kt | 2 +- .../modules/grade/details/GradeDetailsItem.kt | 1 - .../grade/details/GradeDetailsPresenter.kt | 25 +-- .../grade/summary/GradeSummaryPresenter.kt | 26 +-- .../modules/grade/GradeAverageProviderTest.kt | 203 ++++++++++-------- 19 files changed, 278 insertions(+), 324 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRemote.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRepository.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/services/sync/works/GradeSummaryWork.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeDetailsWithAverage.kt diff --git a/app/build.gradle b/app/build.gradle index 412dd1bd5..0f35bc822 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -122,7 +122,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.17.4" + implementation "io.github.wulkanowy:sdk:445905b" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt index 7233c306a..eb1a55480 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt @@ -24,7 +24,7 @@ class GradeLocalTest { fun createDb() { testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) .build() - gradeLocal = GradeLocal(testDb.gradeDao) + gradeLocal = GradeLocal(testDb.gradeDao, testDb.gradeSummaryDao) } @After @@ -43,7 +43,7 @@ class GradeLocalTest { val semester = Semester(1, 2, "", 2019, 2, 1, now(), now(), 1, 1) val grades = gradeLocal - .getGrades(semester) + .getGradesDetails(semester) .blockingGet() assertEquals(2, grades.size) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt index f3c6b7a17..cdd514772 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt @@ -11,6 +11,7 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.sdk.pojo.Grade import io.mockk.MockKAnnotations import io.mockk.every import io.mockk.impl.annotations.MockK @@ -52,7 +53,7 @@ class GradeRepositoryTest { fun initApi() { MockKAnnotations.init(this) testDb = Room.inMemoryDatabaseBuilder(getApplicationContext(), AppDatabase::class.java).build() - gradeLocal = GradeLocal(testDb.gradeDao) + gradeLocal = GradeLocal(testDb.gradeDao, testDb.gradeSummaryDao) gradeRemote = GradeRemote(mockSdk) every { studentMock.registrationDate } returns LocalDateTime.of(2019, 2, 27, 12, 0) @@ -75,10 +76,10 @@ class GradeRepositoryTest { createGradeApi(5, 4.0, of(2019, 2, 26), "przed zalogowanie w aplikacji"), createGradeApi(5, 4.0, of(2019, 2, 27), "Ocena z dnia logowania"), createGradeApi(5, 4.0, of(2019, 2, 28), "Ocena jeszcze nowsza") - )) + ) to emptyList()) val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet().sortedByDescending { it.date } + .getGrades(studentMock, semesterMock, true).blockingGet().first.sortedByDescending { it.date } assertFalse { grades[0].isRead } assertFalse { grades[1].isRead } @@ -99,10 +100,10 @@ class GradeRepositoryTest { createGradeApi(4, 3.0, of(2019, 2, 26), "starszą niż ostatnia lokalnie"), createGradeApi(3, 4.0, of(2019, 2, 27), "Ta jest z tego samego dnia co ostatnia lokalnie"), createGradeApi(2, 5.0, of(2019, 2, 28), "Ta jest już w ogóle nowa") - )) + ) to emptyList()) val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet().sortedByDescending { it.date } + .getGrades(studentMock, semesterMock, true).blockingGet().first.sortedByDescending { it.date } assertFalse { grades[0].isRead } assertFalse { grades[1].isRead } @@ -121,12 +122,12 @@ class GradeRepositoryTest { every { mockSdk.getGrades(1) } returns Single.just(listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") - )) + ) to emptyList()) val grades = GradeRepository(settings, gradeLocal, gradeRemote) .getGrades(studentMock, semesterMock, true).blockingGet() - assertEquals(2, grades.size) + assertEquals(2, grades.first.size) } @Test @@ -140,12 +141,12 @@ class GradeRepositoryTest { createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") - )) + ) to emptyList()) val grades = GradeRepository(settings, gradeLocal, gradeRemote) .getGrades(studentMock, semesterMock, true).blockingGet() - assertEquals(3, grades.size) + assertEquals(3, grades.first.size) } @Test @@ -156,12 +157,12 @@ class GradeRepositoryTest { createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") - )) + ) to emptyList()) val grades = GradeRepository(settings, gradeLocal, gradeRemote) .getGrades(studentMock, semesterMock, true).blockingGet() - assertEquals(3, grades.size) + assertEquals(3, grades.first.size) } @Test @@ -171,11 +172,11 @@ class GradeRepositoryTest { createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") )) - every { mockSdk.getGrades(1) } returns Single.just(listOf()) + every { mockSdk.getGrades(1) } returns Single.just(emptyList() to emptyList()) val grades = GradeRepository(settings, gradeLocal, gradeRemote) .getGrades(studentMock, semesterMock, true).blockingGet() - assertEquals(0, grades.size) + assertEquals(0, grades.first.size) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt index 4983a4740..944ed34ae 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt @@ -1,14 +1,19 @@ package io.github.wulkanowy.data.repositories.grade import io.github.wulkanowy.data.db.dao.GradeDao +import io.github.wulkanowy.data.db.dao.GradeSummaryDao import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton -class GradeLocal @Inject constructor(private val gradeDb: GradeDao) { +class GradeLocal @Inject constructor( + private val gradeDb: GradeDao, + private val gradeSummaryDb: GradeSummaryDao +) { fun saveGrades(grades: List) { gradeDb.insertAll(grades) @@ -22,7 +27,19 @@ class GradeLocal @Inject constructor(private val gradeDb: GradeDao) { gradeDb.updateAll(grades) } - fun getGrades(semester: Semester): Maybe> { + fun getGradesDetails(semester: Semester): Maybe> { return gradeDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() } } + + fun saveGradesSummary(gradesSummary: List) { + gradeSummaryDb.insertAll(gradesSummary) + } + + fun deleteGradesSummary(gradesSummary: List) { + gradeSummaryDb.deleteAll(gradesSummary) + } + + fun getGradesSummary(semester: Semester): Maybe> { + return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() } + } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt index 6f19095ba..abb2f98c9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.repositories.grade import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk @@ -12,11 +13,11 @@ import javax.inject.Singleton @Singleton class GradeRemote @Inject constructor(private val sdk: Sdk) { - fun getGrades(student: Student, semester: Semester): Single> { + fun getGrades(student: Student, semester: Semester): Single, List>> { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getGrades(semester.semesterId) - .map { grades -> - grades.map { + .map { (details, summary) -> + details.map { Grade( studentId = semester.studentId, semesterId = semester.semesterId, @@ -33,6 +34,19 @@ class GradeRemote @Inject constructor(private val sdk: Sdk) { date = it.date, teacher = it.teacher ) + } to summary.map { + GradeSummary( + semesterId = semester.semesterId, + studentId = semester.studentId, + position = 0, + subject = it.name, + predictedGrade = it.predicted, + finalGrade = it.final, + pointsSum = it.pointsSum, + proposedPoints = it.proposedPoints, + finalPoints = it.finalPoints, + average = it.average + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt index 351ebc392..e28350a51 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.grade import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract @@ -19,34 +20,47 @@ class GradeRepository @Inject constructor( private val remote: GradeRemote ) { - fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Single> { - return local.getGrades(semester).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getGrades(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getGrades(semester).toSingle(emptyList()) - .doOnSuccess { old -> - val notifyBreakDate = old.maxBy { it.date }?.date ?: student.registrationDate.toLocalDate() - local.deleteGrades(old.uniqueSubtract(new)) - local.saveGrades(new.uniqueSubtract(old) - .onEach { - if (it.date >= notifyBreakDate) it.apply { - isRead = false - if (notify) isNotified = false - } - }) - } - }.flatMap { local.getGrades(semester).toSingle(emptyList()) }) + fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Single, List>> { + return local.getGradesDetails(semester).flatMap { details -> + local.getGradesSummary(semester).map { summary -> details to summary } + }.filter { !forceRefresh } + .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings).flatMap { + if (it) remote.getGrades(student, semester) + else Single.error(UnknownHostException()) + }.flatMap { (newDetails, newSummary) -> + local.getGradesDetails(semester).toSingle(emptyList()) + .doOnSuccess { old -> + val notifyBreakDate = old.maxBy { it.date }?.date ?: student.registrationDate.toLocalDate() + local.deleteGrades(old.uniqueSubtract(newDetails)) + local.saveGrades(newDetails.uniqueSubtract(old) + .onEach { + if (it.date >= notifyBreakDate) it.apply { + isRead = false + if (notify) isNotified = false + } + }) + }.flatMap { + local.getGradesSummary(semester).toSingle(emptyList()) + .doOnSuccess { old -> + local.deleteGradesSummary(old.uniqueSubtract(newSummary)) + local.saveGradesSummary(newSummary.uniqueSubtract(old)) + } + } + }.flatMap { + local.getGradesDetails(semester).toSingle(emptyList()).flatMap { details -> + local.getGradesSummary(semester).toSingle(emptyList()).map { summary -> + details to summary + } + } + }) } fun getUnreadGrades(semester: Semester): Single> { - return local.getGrades(semester).map { it.filter { grade -> !grade.isRead } }.toSingle(emptyList()) + return local.getGradesDetails(semester).map { it.filter { grade -> !grade.isRead } }.toSingle(emptyList()) } fun getNotNotifiedGrades(semester: Semester): Single> { - return local.getGrades(semester).map { it.filter { grade -> !grade.isNotified } }.toSingle(emptyList()) + return local.getGradesDetails(semester).map { it.filter { grade -> !grade.isNotified } }.toSingle(emptyList()) } fun updateGrade(grade: Grade): Completable { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt deleted file mode 100644 index e74641d3a..000000000 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt +++ /dev/null @@ -1,24 +0,0 @@ -package io.github.wulkanowy.data.repositories.gradessummary - -import io.github.wulkanowy.data.db.dao.GradeSummaryDao -import io.github.wulkanowy.data.db.entities.GradeSummary -import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class GradeSummaryLocal @Inject constructor(private val gradeSummaryDb: GradeSummaryDao) { - - fun saveGradesSummary(gradesSummary: List) { - gradeSummaryDb.insertAll(gradesSummary) - } - - fun deleteGradesSummary(gradesSummary: List) { - gradeSummaryDb.deleteAll(gradesSummary) - } - - fun getGradesSummary(semester: Semester): Maybe> { - return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() } - } -} diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRemote.kt deleted file mode 100644 index 1b09974dd..000000000 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRemote.kt +++ /dev/null @@ -1,35 +0,0 @@ -package io.github.wulkanowy.data.repositories.gradessummary - -import io.github.wulkanowy.data.db.entities.GradeSummary -import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.utils.init -import io.reactivex.Single -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class GradeSummaryRemote @Inject constructor(private val sdk: Sdk) { - - fun getGradeSummary(student: Student, semester: Semester): Single> { - return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) - .getGradesSummary(semester.semesterId) - .map { gradesSummary -> - gradesSummary.map { - GradeSummary( - semesterId = semester.semesterId, - studentId = semester.studentId, - position = 0, - subject = it.name, - predictedGrade = it.predicted, - finalGrade = it.final, - pointsSum = it.pointsSum, - proposedPoints = it.proposedPoints, - finalPoints = it.finalPoints, - average = it.average - ) - } - } - } -} diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRepository.kt deleted file mode 100644 index f1d7a6c1c..000000000 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRepository.kt +++ /dev/null @@ -1,35 +0,0 @@ -package io.github.wulkanowy.data.repositories.gradessummary - -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings -import io.github.wulkanowy.data.db.entities.GradeSummary -import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class GradeSummaryRepository @Inject constructor( - private val settings: InternetObservingSettings, - private val local: GradeSummaryLocal, - private val remote: GradeSummaryRemote -) { - - fun getGradesSummary(student: Student, semester: Semester, forceRefresh: Boolean = false): Single> { - return local.getGradesSummary(semester).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getGradeSummary(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getGradesSummary(semester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteGradesSummary(old.uniqueSubtract(new)) - local.saveGradesSummary(new.uniqueSubtract(old)) - } - }.flatMap { local.getGradesSummary(semester).toSingle(emptyList()) }) - } -} diff --git a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt index 7240a50bb..c7c573e27 100644 --- a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt +++ b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt @@ -21,7 +21,6 @@ import io.github.wulkanowy.services.sync.works.AttendanceWork import io.github.wulkanowy.services.sync.works.CompletedLessonWork import io.github.wulkanowy.services.sync.works.ExamWork import io.github.wulkanowy.services.sync.works.GradeStatisticsWork -import io.github.wulkanowy.services.sync.works.GradeSummaryWork import io.github.wulkanowy.services.sync.works.GradeWork import io.github.wulkanowy.services.sync.works.HomeworkWork import io.github.wulkanowy.services.sync.works.LuckyNumberWork @@ -64,10 +63,6 @@ abstract class ServicesModule { @IntoSet abstract fun provideAttendanceWork(work: AttendanceWork): Work - @Binds - @IntoSet - abstract fun provideGradeSummaryWork(work: GradeSummaryWork): Work - @Binds @IntoSet abstract fun provideExamWork(work: ExamWork): Work diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeSummaryWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeSummaryWork.kt deleted file mode 100644 index 4c8e955d1..000000000 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeSummaryWork.kt +++ /dev/null @@ -1,14 +0,0 @@ -package io.github.wulkanowy.services.sync.works - -import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.gradessummary.GradeSummaryRepository -import io.reactivex.Completable -import javax.inject.Inject - -class GradeSummaryWork @Inject constructor(private val gradeSummaryRepository: GradeSummaryRepository) : Work { - - override fun create(student: Student, semester: Semester): Completable { - return gradeSummaryRepository.getGradesSummary(student, semester, true).ignoreElement() - } -} diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt index 7559d2892..6e90826ad 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt @@ -58,4 +58,3 @@ class GradeWork @Inject constructor( ) } } - diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index 3bb084d3a..954b57566 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -3,71 +3,76 @@ package io.github.wulkanowy.ui.modules.grade import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.grade.GradeRepository -import io.github.wulkanowy.data.repositories.gradessummary.GradeSummaryRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository +import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.calcAverage import io.github.wulkanowy.utils.changeModifier -import io.reactivex.Maybe import io.reactivex.Single import javax.inject.Inject class GradeAverageProvider @Inject constructor( - private val preferencesRepository: PreferencesRepository, + private val semesterRepository: SemesterRepository, private val gradeRepository: GradeRepository, - private val gradeSummaryRepository: GradeSummaryRepository + private val preferencesRepository: PreferencesRepository ) { private val plusModifier = preferencesRepository.gradePlusModifier private val minusModifier = preferencesRepository.gradeMinusModifier - fun getGradeAverage(student: Student, semesters: List, selectedSemesterId: Int, forceRefresh: Boolean): Single>> { - return when (preferencesRepository.gradeAverageMode) { - "all_year" -> getAllYearAverage(student, semesters, selectedSemesterId, forceRefresh) - "only_one_semester" -> getOnlyOneSemesterAverage(student, semesters, selectedSemesterId, forceRefresh) - else -> throw IllegalArgumentException("Incorrect grade average mode: ${preferencesRepository.gradeAverageMode} ") + fun getGradesDetailsWithAverage(student: Student, semesterId: Int, forceRefresh: Boolean = false): Single> { + return semesterRepository.getSemesters(student).flatMap { semesters -> + when (preferencesRepository.gradeAverageMode) { + "only_one_semester" -> getSemesterDetailsWithAverage(student, semesters.single { it.semesterId == semesterId }, forceRefresh) + "all_year" -> calculateWholeYearAverage(student, semesters, semesterId, forceRefresh) + else -> throw IllegalArgumentException("Incorrect grade average mode: ${preferencesRepository.gradeAverageMode} ") + } } } - private fun getAllYearAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Single>> { + private fun calculateWholeYearAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Single> { val selectedSemester = semesters.single { it.semesterId == semesterId } val firstSemester = semesters.single { it.diaryId == selectedSemester.diaryId && it.semesterName == 1 } - return getAverageFromGradeSummary(student, selectedSemester, forceRefresh) - .switchIfEmpty(gradeRepository.getGrades(student, selectedSemester, forceRefresh) - .flatMap { firstGrades -> - if (selectedSemester == firstSemester) Single.just(firstGrades) - else { - gradeRepository.getGrades(student, firstSemester) - .map { secondGrades -> secondGrades + firstGrades } + return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).flatMap { selectedDetails -> + val isAnyAverage = selectedDetails.any { it.average != .0 } + + if (selectedSemester != firstSemester) { + getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).map { secondDetails -> + selectedDetails.map { selected -> + val second = secondDetails.singleOrNull { it.subject == selected.subject } + selected.copy( + average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { + (selected.grades + second?.grades.orEmpty()).calcAverage() + } else (selected.average + (second?.average ?: selected.average)) / 2 + ) } - }.map { grades -> - grades.map { if (student.loginMode == Sdk.Mode.SCRAPPER.name) it.changeModifier(plusModifier, minusModifier) else it } - .groupBy { it.subject } - .map { Triple(it.key, it.value.calcAverage(), "") } - }) + } + } else Single.just(selectedDetails) + } } - private fun getOnlyOneSemesterAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Single>> { - val selectedSemester = semesters.single { it.semesterId == semesterId } + private fun getSemesterDetailsWithAverage(student: Student, semester: Semester, forceRefresh: Boolean): Single> { + return gradeRepository.getGrades(student, semester, forceRefresh).map { (details, summaries) -> + val isAnyAverage = summaries.any { it.average != .0 } + val allGrades = details.groupBy { it.subject } - return getAverageFromGradeSummary(student, selectedSemester, forceRefresh) - .switchIfEmpty(gradeRepository.getGrades(student, selectedSemester, forceRefresh) - .map { grades -> - grades.map { if (student.loginMode == Sdk.Mode.SCRAPPER.name) it.changeModifier(plusModifier, minusModifier) else it } - .groupBy { it.subject } - .map { Triple(it.key, it.value.calcAverage(), "") } - }) - } - - private fun getAverageFromGradeSummary(student: Student, selectedSemester: Semester, forceRefresh: Boolean): Maybe>> { - return gradeSummaryRepository.getGradesSummary(student, selectedSemester, forceRefresh) - .toMaybe() - .flatMap { - if (it.any { summary -> summary.average != .0 }) { - Maybe.just(it.map { summary -> Triple(summary.subject, summary.average, summary.pointsSum) }) - } else Maybe.empty() - }.filter { !preferencesRepository.gradeAverageForceCalc } + summaries.map { summary -> + val grades = allGrades[summary.subject].orEmpty() + GradeDetailsWithAverage( + subject = summary.subject, + average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { + grades.map { + if (student.loginMode == Sdk.Mode.SCRAPPER.name) it.changeModifier(plusModifier, minusModifier) + else it + }.calcAverage() + } else summary.average, + points = summary.pointsSum, + summary = summary, + grades = grades + ) + } + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeDetailsWithAverage.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeDetailsWithAverage.kt new file mode 100644 index 000000000..3f5d706b3 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeDetailsWithAverage.kt @@ -0,0 +1,12 @@ +package io.github.wulkanowy.ui.modules.grade + +import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeSummary + +data class GradeDetailsWithAverage( + val subject: String, + val average: Double, + val points: String, + val summary: GradeSummary, + val grades: List +) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt index 22367d02c..7adab547e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt @@ -107,7 +107,7 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter 0) View.VISIBLE else View.GONE if (header.newGrades > 0) gradeHeaderNote.text = header.newGrades.toString(10) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt index f1adbdea2..281974969 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt @@ -12,7 +12,6 @@ data class GradeDetailsItem( data class GradeDetailsHeader( val subject: String, - val number: Int, val average: Double?, val pointsSum: String?, var newGrades: Int, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index 83501182d..26c222643 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider +import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import timber.log.Timber @@ -126,14 +127,7 @@ class GradeDetailsPresenter @Inject constructor( private fun loadData(semesterId: Int, forceRefresh: Boolean) { Timber.i("Loading grade details data started") disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getSemesters(it).map { semester -> it to semester } } - .flatMap { (student, semesters) -> - averageProvider.getGradeAverage(student, semesters, semesterId, forceRefresh).flatMap { averages -> - gradeRepository.getGrades(student, semesters.first { it.semesterId == semesterId }, forceRefresh) - .map { it.sortedByDescending { grade -> grade.date } } - .map { createGradeItems(it, averages) } - } - } + .flatMap { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { @@ -146,16 +140,14 @@ class GradeDetailsPresenter @Inject constructor( } .subscribe({ grades -> Timber.i("Loading grade details result: Success") - newGradesAmount = grades - .filter { it.viewType == ViewType.HEADER } - .sumBy { item -> (item.value as GradeDetailsHeader).newGrades } + newGradesAmount = grades.sumBy { it.grades.sumBy { grade -> if (!grade.isRead) 1 else 0 } } updateMarkAsDoneButton() view?.run { showEmpty(grades.isEmpty()) showErrorView(false) showContent(grades.isNotEmpty()) updateData( - data = grades, + data = createGradeItems(grades), isGradeExpandable = preferencesRepository.isGradeExpandable, gradeColorTheme = preferencesRepository.gradeColorTheme ) @@ -178,17 +170,16 @@ class GradeDetailsPresenter @Inject constructor( } } - private fun createGradeItems(items: List, averages: List>): List { - return items.groupBy { grade -> grade.subject }.toSortedMap().map { (subject, grades) -> + private fun createGradeItems(items: List): List { + return items.filter { it.grades.isNotEmpty() }.map { (subject, average, points, _, grades) -> val subItems = grades.map { GradeDetailsItem(it, ViewType.ITEM) } listOf(GradeDetailsItem(GradeDetailsHeader( subject = subject, - average = averages.singleOrNull { subject == it.first }?.second, - pointsSum = averages.singleOrNull { subject == it.first }?.third, - number = grades.size, + average = average, + pointsSum = points, newGrades = grades.filter { grade -> !grade.isRead }.size, grades = subItems ), ViewType.HEADER)) + if (preferencesRepository.isGradeExpandable) emptyList() else subItems diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 53c69db70..9b8372136 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -1,12 +1,11 @@ package io.github.wulkanowy.ui.modules.grade.summary import io.github.wulkanowy.data.db.entities.GradeSummary -import io.github.wulkanowy.data.repositories.gradessummary.GradeSummaryRepository -import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider +import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import timber.log.Timber @@ -16,8 +15,6 @@ class GradeSummaryPresenter @Inject constructor( schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, - private val gradeSummaryRepository: GradeSummaryRepository, - private val semesterRepository: SemesterRepository, private val averageProvider: GradeAverageProvider, private val analytics: FirebaseAnalyticsHelper ) : BasePresenter(errorHandler, studentRepository, schedulers) { @@ -33,15 +30,8 @@ class GradeSummaryPresenter @Inject constructor( fun onParentViewLoadData(semesterId: Int, forceRefresh: Boolean) { Timber.i("Loading grade summary data started") disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getSemesters(it).map { semesters -> it to semesters } } - .flatMap { (student, semesters) -> - gradeSummaryRepository.getGradesSummary(student, semesters.first { it.semesterId == semesterId }, forceRefresh) - .map { it.sortedBy { subject -> subject.subject } } - .flatMap { gradesSummary -> - averageProvider.getGradeAverage(student, semesters, semesterId, forceRefresh) - .map { averages -> createGradeSummaryItems(gradesSummary, averages) } - } - } + .flatMap { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } + .map { createGradeSummaryItems(it) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { @@ -112,12 +102,10 @@ class GradeSummaryPresenter @Inject constructor( disposable.clear() } - private fun createGradeSummaryItems(gradesSummary: List, averages: List>): List { - return gradesSummary - .filter { !checkEmpty(it, averages) } - .map { gradeSummary -> - gradeSummary.copy(average = averages.singleOrNull { gradeSummary.subject == it.first }?.second ?: .0) - } + private fun createGradeSummaryItems(items: List): List { + return items.map { + it.summary.copy(average = it.average) + } } private fun checkEmpty(gradeSummary: GradeSummary, averages: List>): Boolean { diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index 009ed610e..68b3f6bbf 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -3,17 +3,17 @@ package io.github.wulkanowy.ui.modules.grade import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.grade.GradeRepository -import io.github.wulkanowy.data.repositories.gradessummary.GradeSummaryRepository -import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.createSemesterEntity +import io.github.wulkanowy.data.repositories.grade.GradeRepository +import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository +import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.sdk.Sdk import io.reactivex.Single import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test import org.mockito.Mock -import org.mockito.Mockito.doReturn +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.of @@ -25,10 +25,10 @@ class GradeAverageProviderTest { lateinit var preferencesRepository: PreferencesRepository @Mock - lateinit var gradeRepository: GradeRepository + lateinit var semesterRepository: SemesterRepository @Mock - lateinit var gradeSummaryRepository: GradeSummaryRepository + lateinit var gradeRepository: GradeRepository private lateinit var gradeAverageProvider: GradeAverageProvider @@ -41,165 +41,192 @@ class GradeAverageProviderTest { ) private val firstGrades = listOf( + // avg: 3.5 getGrade(22, "Matematyka", 4.0), getGrade(22, "Matematyka", 3.0), + + // avg: 3.5 getGrade(22, "Fizyka", 6.0), getGrade(22, "Fizyka", 1.0) ) - private val secondGrade = listOf( + private val firstSummaries = listOf( + getSummary(semesterId = 22, subject = "Matematyka", average = 3.9), + getSummary(semesterId = 22, subject = "Fizyka", average = 3.1) + ) + + private val secondGrades = listOf( + // avg: 2.5 getGrade(23, "Matematyka", 2.0), getGrade(23, "Matematyka", 3.0), + + // avg: 3.0 getGrade(23, "Fizyka", 4.0), getGrade(23, "Fizyka", 2.0) ) + private val secondSummaries = listOf( + getSummary(semesterId = 23, subject = "Matematyka", average = 2.9), + getSummary(semesterId = 23, subject = "Fizyka", average = 3.4) + ) + private val secondGradeWithModifier = listOf( + // avg: 3.375 getGrade(24, "Język polski", 3.0, -0.50), getGrade(24, "Język polski", 4.0, 0.25) ) + private val secondSummariesWithModifier = listOf( + getSummary(24, "Język polski", 3.49) + ) + @Before - fun initTest() { + fun setUp() { MockitoAnnotations.initMocks(this) - gradeAverageProvider = GradeAverageProvider(preferencesRepository, gradeRepository, gradeSummaryRepository) - doReturn(.33).`when`(preferencesRepository).gradeMinusModifier - doReturn(.33).`when`(preferencesRepository).gradePlusModifier - doReturn(false).`when`(preferencesRepository).gradeAverageForceCalc + `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) + `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) + `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - doReturn(Single.just(firstGrades)).`when`(gradeRepository).getGrades(student, semesters[1], true) - doReturn(Single.just(secondGrade)).`when`(gradeRepository).getGrades(student, semesters[2], true) + gradeAverageProvider = GradeAverageProvider(semesterRepository, gradeRepository, preferencesRepository) } @Test fun onlyOneSemesterTest() { - doReturn("only_one_semester").`when`(preferencesRepository).gradeAverageMode - doReturn(Single.just(emptyList())).`when`(gradeSummaryRepository).getGradesSummary(student, semesters[2], true) + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) - val averages = gradeAverageProvider.getGradeAverage(student, semesters, semesters[2].semesterId, true) - .blockingGet() + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() - assertEquals(2, averages.size) - assertEquals(2.5, averages.single { it.first == "Matematyka" }.second, .0) - assertEquals(3.0, averages.single { it.first == "Fizyka" }.second, .0) + assertEquals(2, items.size) + assertEquals(2.5, items.single { it.subject == "Matematyka" }.average, .0) + assertEquals(3.0, items.single { it.subject == "Fizyka" }.average, .0) } @Test fun onlyOneSemester_gradesWithModifiers_default() { - doReturn("only_one_semester").`when`(preferencesRepository).gradeAverageMode - doReturn(Single.just(emptyList())).`when`(gradeSummaryRepository).getGradesSummary(student, semesters[2], true) - doReturn(Single.just(secondGradeWithModifier)).`when`(gradeRepository).getGrades(student, semesters[2], true) + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) - val averages = gradeAverageProvider.getGradeAverage(student, semesters, semesters[2].semesterId, true) - .blockingGet() + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() - assertEquals(3.5, averages.single { it.first == "Język polski" }.second, .0) + assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) } @Test fun onlyOneSemester_gradesWithModifiers_api() { - doReturn("only_one_semester").`when`(preferencesRepository).gradeAverageMode - doReturn(Single.just(emptyList())).`when`(gradeSummaryRepository).getGradesSummary(student.copy(loginMode = Sdk.Mode.API.name), semesters[2], true) - doReturn(Single.just(secondGradeWithModifier)).`when`(gradeRepository).getGrades(student.copy(loginMode = Sdk.Mode.API.name), semesters[2], true) + val student = student.copy(loginMode = Sdk.Mode.API.name) - val averages = gradeAverageProvider.getGradeAverage(student.copy(loginMode = Sdk.Mode.API.name), semesters, semesters[2].semesterId, true) - .blockingGet() + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) - assertEquals(3.375, averages.single { it.first == "Język polski" }.second, .0) + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) } @Test fun onlyOneSemester_gradesWithModifiers_scrapper() { - doReturn("only_one_semester").`when`(preferencesRepository).gradeAverageMode - doReturn(Single.just(emptyList())).`when`(gradeSummaryRepository).getGradesSummary(student, semesters[2], true) - doReturn(Single.just(secondGradeWithModifier)).`when`(gradeRepository).getGrades(student.copy(loginMode = Sdk.Mode.SCRAPPER.name), semesters[2], true) + val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) - val averages = gradeAverageProvider.getGradeAverage(student.copy(loginMode = Sdk.Mode.SCRAPPER.name), semesters, semesters[2].semesterId, true) - .blockingGet() + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) - assertEquals(3.5, averages.single { it.first == "Język polski" }.second, .0) + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) } @Test fun onlyOneSemester_gradesWithModifiers_hybrid() { - doReturn("only_one_semester").`when`(preferencesRepository).gradeAverageMode - doReturn(Single.just(emptyList())).`when`(gradeSummaryRepository).getGradesSummary(student.copy(loginMode = Sdk.Mode.HYBRID.name), semesters[2], true) - doReturn(Single.just(secondGradeWithModifier)).`when`(gradeRepository).getGrades(student.copy(loginMode = Sdk.Mode.HYBRID.name), semesters[2], true) + val student = student.copy(loginMode = Sdk.Mode.HYBRID.name) - val averages = gradeAverageProvider.getGradeAverage(student.copy(loginMode = Sdk.Mode.HYBRID.name), semesters, semesters[2].semesterId, true) - .blockingGet() + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) - assertEquals(3.375, averages.single { it.first == "Język polski" }.second, .0) + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) } @Test fun allYearFirstSemesterTest() { - doReturn("all_year").`when`(preferencesRepository).gradeAverageMode - doReturn(Single.just(emptyList())).`when`(gradeSummaryRepository).getGradesSummary(student, semesters[1], true) + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) - val averages = gradeAverageProvider.getGradeAverage(student, semesters, semesters[1].semesterId, true) - .blockingGet() + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[1].semesterId).blockingGet() - assertEquals(2, averages.size) - assertEquals(3.5, averages.single { it.first == "Matematyka" }.second, .0) - assertEquals(3.5, averages.single { it.first == "Fizyka" }.second, .0) + assertEquals(2, items.size) + assertEquals(3.5, items.single { it.subject == "Matematyka" }.average, .0) + assertEquals(3.5, items.single { it.subject == "Fizyka" }.average, .0) } @Test fun allYearSecondSemesterTest() { - doReturn("all_year").`when`(preferencesRepository).gradeAverageMode - doReturn(Single.just(firstGrades)).`when`(gradeRepository).getGrades(student, semesters[1], false) - doReturn(Single.just(emptyList())).`when`(gradeSummaryRepository).getGradesSummary(student, semesters[2], true) + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) - val averages = gradeAverageProvider.getGradeAverage(student, semesters, semesters[2].semesterId, true) - .blockingGet() + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() - assertEquals(2, averages.size) - assertEquals(3.0, averages.single { it.first == "Matematyka" }.second, .0) - assertEquals(3.25, averages.single { it.first == "Fizyka" }.second, .0) + assertEquals(2, items.size) + assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) + assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) } @Test(expected = IllegalArgumentException::class) fun incorrectAverageModeTest() { - doReturn("test_mode").`when`(preferencesRepository).gradeAverageMode + `when`(preferencesRepository.gradeAverageMode).thenReturn("test_mode") - gradeAverageProvider.getGradeAverage(student, semesters, semesters[2].semesterId, true).blockingGet() + gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).blockingGet() } @Test - fun onlyOneSemester_averageFromSummary() { - doReturn("all_year").`when`(preferencesRepository).gradeAverageMode - doReturn(Single.just(firstGrades)).`when`(gradeRepository).getGrades(student, semesters[1], false) - doReturn(Single.just(listOf( - getSummary(22, "Matematyka", 3.1), - getSummary(22, "Fizyka", 3.26) - ))).`when`(gradeSummaryRepository).getGradesSummary(student, semesters[2], true) + fun allYearSemester_averageFromSummary() { + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to listOf( + getSummary(22, "Matematyka", 3.0), + getSummary(22, "Fizyka", 3.5) + ))) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( + getSummary(22, "Matematyka", 3.5), + getSummary(22, "Fizyka", 4.0) + ))) - val averages = gradeAverageProvider.getGradeAverage(student, semesters, semesters[2].semesterId, true) - .blockingGet() + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() - assertEquals(2, averages.size) - assertEquals(3.1, averages.single { it.first == "Matematyka" }.second, .0) - assertEquals(3.26, averages.single { it.first == "Fizyka" }.second, .0) + assertEquals(2, items.size) + assertEquals(3.25, items.single { it.subject == "Matematyka" }.average, .0) + assertEquals(3.75, items.single { it.subject == "Fizyka" }.average, .0) } @Test fun onlyOneSemester_averageFromSummary_forceCalc() { - doReturn(true).`when`(preferencesRepository).gradeAverageForceCalc - doReturn("all_year").`when`(preferencesRepository).gradeAverageMode - doReturn(Single.just(firstGrades)).`when`(gradeRepository).getGrades(student, semesters[1], false) - doReturn(Single.just(listOf( - getSummary(22, "Matematyka", 3.1), - getSummary(22, "Fizyka", 3.26) - ))).`when`(gradeSummaryRepository).getGradesSummary(student, semesters[2], true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( + getSummary(22, "Matematyka", 1.1), + getSummary(22, "Fizyka", 7.26) + ))) - val averages = gradeAverageProvider.getGradeAverage(student, semesters, semesters[2].semesterId, true) - .blockingGet() + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() - assertEquals(2, averages.size) - assertEquals(3.0, averages.single { it.first == "Matematyka" }.second, .0) - assertEquals(3.25, averages.single { it.first == "Fizyka" }.second, .0) + assertEquals(2, items.size) + assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) + assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) } private fun getGrade(semesterId: Int, subject: String, value: Double, modifier: Double = 0.0): Grade { @@ -221,12 +248,12 @@ class GradeAverageProviderTest { ) } - private fun getSummary(semesterId: Int, subject: String, value: Double): GradeSummary { + private fun getSummary(semesterId: Int, subject: String, average: Double): GradeSummary { return GradeSummary( studentId = 101, semesterId = semesterId, subject = subject, - average = value, + average = average, pointsSum = "", proposedPoints = "", finalPoints = "", From 45fc76a9a506cfc02847d3b2e95482501ab85789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 10 May 2020 11:34:54 +0200 Subject: [PATCH 0015/1526] Update translations (#794) --- .../main/res/values-de/preferences_values.xml | 32 +- app/src/main/res/values-de/strings.xml | 79 +---- .../main/res/values-pl/preferences_values.xml | 32 +- app/src/main/res/values-pl/strings.xml | 74 +--- .../main/res/values-ru/preferences_values.xml | 19 +- app/src/main/res/values-ru/strings.xml | 196 ++++------- .../main/res/values-uk/preferences_values.xml | 19 +- app/src/main/res/values-uk/strings.xml | 315 ++++++++---------- app/src/main/res/values/strings.xml | 2 +- 9 files changed, 273 insertions(+), 495 deletions(-) diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 8eae84194..28ad08bc2 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -1,5 +1,18 @@ + + Licht + Dunkel + Schwarz (AMOLED) + + + System Sprache + Polski + English + Pусский + Українська + Deutsch + 15 Minuten 30 Minuten @@ -9,22 +22,6 @@ 12 Stunden 24 Stunden - - - Licht - Dunkel - Schwarz (AMOLED) - - - - System Sprache - Polski - English - Pусский - Українська - Deutsch - - 0,0 0,25 @@ -32,18 +29,15 @@ 0,5 0,75 - Dzienniczek+ Wulkanowy Farben der Bewertungen im Logbuch - Durchschnittsnote für das 2. Semester Durchschnitt der Bewertungen für das ganze Jahr - Nicht zeigen Alle zeigen diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 239c40437..e294593ca 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,8 +1,6 @@ Wulkanowy - - Anmelden Wulkanowy @@ -21,11 +19,8 @@ Eintragen und Erfolgen Hausaufgaben Wählen Sie ein Konto - Semester %d, %d/%d - - Melden Sie sich mit dem Studenten- oder Elternkonto an Geben Sie das Symbol @@ -56,24 +51,25 @@ Das Symbol finden Sie auf der Registerseite unter Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne Wählen Sie die Studenten aus, die sich bei der Anwendung anmelden sollen. Andere Optionen + In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices + This mode displays the same data as it appears on the register website + The combination of the best features of the other two modes. It works faster than scraper and provides features not available in the Mobile API mode. It is in the experimental phase Datenschutzerklärung Probleme bei der Anmeldung? Kontaktieren Sie uns! Email Discord email senden + Describe details of problem: + Make sure the correct UONET+ register is selected! Ich habe mein Passwort vergessen. Ihr Konto wiederherstellen Wiederherstellen Student ist bereits angemeldet - - Kundenbetreuer Anmelden Die Sitzung ist abgelaufen Die Sitzung ist abgelaufen, bitte loggen Sie sich erneut ein - - Note Semester %d @@ -112,8 +108,6 @@ Du hast %1$d Note bekommen Du hast %1$d Noten bekommen - - Lektion Klassenzimmer @@ -121,17 +115,13 @@ Stunden Änderungen Kein Unterricht an diesem Tag - - - + Beendete Lektionen Beendete Lektionen anzeigen Keine Informationen über beendete Lektionen Thema Abwesenheit Ressourcen - - Übersicht über die Schulbesuch Aus schulischen Gründen abwesend @@ -152,19 +142,13 @@ Abwesenheit erfolgreich entschuldigt! Sie müssen mindestens eine Abwesenheit auswählen! Verzeihung - - Schulbesuch Gesamt - - Diese Woche keine Prüfungen Form Eintrittsdatum - - Posteingang Gesendet @@ -198,8 +182,6 @@ Du hast %1$d nachricht bekommen Du hast %1$d nachrichten bekommen - - Keine Informationen über Eintragen Punkte @@ -215,23 +197,17 @@ Du hast %1$d Eintrag bekommen Du hast %1$d Eintragen bekommen - - Keine Informationen über Hausaufgaben Gemacht Unvollständig Anhänge - - Glückliche Nummer - "Die heutige Glücksnummer ist " + Die heutige Glücksnummer ist Keine Information über die Glücksnummer. Glücksnummer für heute - "Die heutige Glücksnummer ist: " - - + Die heutige Glücksnummer ist: Mobile Geräte Keine Geräte @@ -241,12 +217,8 @@ Token Symbol PIN - - Schule und Lehrer - - Schule Keine Informationen über die Schule @@ -257,21 +229,15 @@ Name des Pädagogen Auf Karte anzeigen Rufen Sie an - - Lehrerinnen und Lehrer Keine Informationen über Lehrer Kein Thema - - Konto hinzufügen Abmelden Wollen Sie sich von einem aktiven Studenten abmelden? Abmeldung von Student - - Version der App Mitarbeiter @@ -288,21 +254,14 @@ Besuchen Sie die Website und helfen Sie bei der Entwicklung der Anwendung Lizenzen Lizenzen der in der Anwendung verwendeten Bibliotheken - - Lizenz - - - + Avatar Sehen Sie mehr auf GitHub - Logs teilen Aktualisieren - - Inhalt Wiederhol @@ -319,15 +278,11 @@ Thema Zurück Nächste - - Keine Lektionen Thema wählen Licht Dunkel - - Erscheinungsbild Standard Ansicht @@ -347,12 +302,18 @@ An Feiertagen suspendiert Aktualisierungsintervall Nur Wi-Fi + Sync now + Synced! + Sync failed + Sync in progress + Synchronization + Manual sync doesn\'t refresh app views. + \nTo see the synced data relaunch the app after syncing. + Andere Wert des Plus Wert des Minus Antwort mit Nachrichtenhistorie - - Neue Einträge im Klassenbuch Neue Noten @@ -361,8 +322,6 @@ Neue Eintragen Push-Benachrichtigungen Debuggen - - Schwarz Rot @@ -370,13 +329,9 @@ Grün Violett Keine Farbe - - Kopiert lösen - - Keine Internetverbindung Das Zeitlimit für die Verbindung zum Klassenbuch ist abgelaufen diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 5553760a1..475f7327f 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -1,5 +1,18 @@ + + Jasny + Ciemny + Czarny (AMOLED) + + + Język systemu + Polski + English + Pусский + Українська + Deutsch + 15 minut 30 minut @@ -9,22 +22,6 @@ 12 godzin 24 godziny - - - Jasny - Ciemny - Czarny (AMOLED) - - - - Język systemu - Polski - English - Pусский - Українська - Deutsch - - 0,0 0,25 @@ -32,18 +29,15 @@ 0,5 0,75 - Dzienniczek+ Wulkanowy Kolory ocen w dzienniku - Średnia ocen z 2 semestru Średnia ocen z całego roku - Nie pokazuj Pokazuj wszystkie diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 742d61ed2..30d80acdb 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,9 +1,6 @@ - Wulkanowy - - Logowanie Wulkanowy @@ -22,11 +19,8 @@ Uwagi i osiągnięcia Zadania domowe Wybierz konto - Semestr %d, %d/%d - - Zaloguj się za pomocą konta ucznia lub rodzica Podaj symbol @@ -35,13 +29,13 @@ Login, PESEL lub e-mail Hasło Dziennik UONET+ - Symbol Mobilne API Scraper Hybrydowe Token PIN Klucz API + Symbol Zaloguj To hasło jest za krótkie Dane logowania są niepoprawne. Upewnij się, że został wybrany odpowiedni dziennik UONET+ w polu poniżej @@ -65,20 +59,17 @@ Email Discord Wyślij email + Opisz problem: Upewnij się, że został wybrany odpowiedni dziennik UONET+! Nie pamiętam hasła Przywróć swoje konto Przywróć Uczeń jest już zalogowany - - Menadżer kont Zaloguj się Sesja wygasła Sesja wygasła, zaloguj się ponownie - - Ocena Semestr %d @@ -123,8 +114,6 @@ Masz %1$d nowych ocen Masz %1$d nowych ocen - - Lekcja Sala @@ -132,17 +121,13 @@ Godziny Zmiany Brak lekcji w tym dniu - - - + Lekcje zrealizowane Zobacz lekcje zrealizowane Brak informacji o lekcjach zrealizowanych Temat Nieobecność Zasoby - - Podsumowanie frekwencji Nieobecność z przyczyn szkolnych @@ -165,19 +150,13 @@ Usprawiedliwiono pomyślnie! Musisz wybrać co najmniej jedną nieobecność! Usprawiedliw - - Frekwencja Razem - - Brak sprawdzianów w tym tygodniu Typ Data wpisu - - Odebrane Wysłane @@ -217,8 +196,6 @@ Masz %1$d nowych wiadomości Masz %1$d nowych wiadomości - - Brak informacji o uwagach Punkty @@ -240,23 +217,17 @@ Masz %1$d nowych uwag Masz %1$d nowych uwag - - Brak zadań domowych Wykonane Niewykonane Załączniki - - Szczęśliwy numerek Dzisiejszym szczęśliwym numerkiem jest Brak informacji o szczęśliwym numerku Szczęśliwy numerek na dzisiaj Dziś szczęśliwym numerkiem jest: %d - - Dostęp mobilny Brak urządzeń @@ -266,12 +237,8 @@ Token Symbol PIN - - Szkoła i nauczyciele - - Szkoła Brak informacji o szkole @@ -282,21 +249,15 @@ Imię i nazwisko pedagoga Pokaż na mapie Zadzwoń - - Nauczyciele Brak informacji o nauczycielach Brak przedmiotu - - Dodaj konto Wyloguj Czy chcesz wylogować aktualnego ucznia? Wylogowanie ucznia - - Wersja aplikacji Twórcy @@ -313,21 +274,14 @@ Odwiedź stronę i pomóż rozwijać aplikację Licencje Licencje użytych bibliotek w aplikacji - - Licencja - - - + Awatar Zobacz więcej na GitHub - Udostępnij logi Odśwież - - Treść Ponów @@ -344,15 +298,11 @@ Przedmiot Poprzedni Następny - - Brak lekcji Wybierz motyw Jasny Ciemny - - Wygląd Domyślny widok @@ -364,11 +314,9 @@ Pokazuj lekcje całej klasy Schemat kolorów ocen Język aplikacji - Powiadomienia Pokazuj powiadomienia Pokazuj powiadomienia debugowania - Synchronizacja Automatyczna aktualizacja Zawieszona na wakacjach @@ -379,27 +327,21 @@ Synchronizacja nie powiodła się Synchronizacja w trakcie Synchronizacja - - Ręczna synchronizacja nie odświeża widoków w aplikacji. + Ręczna synchronizacja nie odświeża widoków w aplikacji. \nAby zobaczyć zsynchronizowane informacje uruchom ponownie aplikację po zsynchronizowaniu. - Inne Wartość plusa Wartość minusa Odpowiadaj z historią wiadomości - - Nowe wpisy w dzienniku - Szczęśliwy numerek Nowe oceny + Szczęśliwy numerek Nowe wiadomości Nowe uwagi Powiadomienia push Debugowanie - - Czarny Czerwony @@ -407,13 +349,9 @@ Zielony Fioletowy Brak koloru - - Skopiowano Cofnij - - Brak połączenia z internetem Upłynął limit czasu na połączenie z dziennikiem diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index 23cb5ac4d..6c1522682 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -1,14 +1,5 @@ - - 15 минут - 30 минут - 1 час - 2 часа - 6 часов - 12 часов - 24 часа - Светлая Тёмная @@ -22,6 +13,15 @@ Українська Deutsch + + 15 минут + 30 минут + 1 час + 2 часа + 6 часов + 12 часов + 24 часа + 0,0 0,25 @@ -38,7 +38,6 @@ Средняя оценка со 2 семестра Средняя оценка с целого года - Не показывать Показать все diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e2f13f30c..a4666d730 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,9 +1,6 @@ - - + Wulkanowy - - Авторизация Wulkanowy @@ -12,21 +9,18 @@ Тесты Расписание Настройки - Ещё + Другое О приложении Просмотр журнала - Творцы + Разработчики Лицензии Сообщения Новое сообщение Предупреждения и свершения Домашние задания Выберите аккаунт - - Семестр %d, %d/%d - - + %d семестр, %d/%d Авторизируйтесь при помощи аккаунта ученика или родителя Впишите \"symbol\" @@ -35,72 +29,73 @@ Логин, PESEL или электронная почта Пароль Дневник UONET+ - Мобильный API + Mobile API Scraper - Гибрид + Hybrid Token PIN - клавиша API + Ключ API Symbol Войти Слишком короткий пароль - Указаны неверные данные - Недействительный PIN - Недействительный token + Указаны неверные данные. Убедитесь, что вы выбрали нужный дневник + Неправильный PIN + Неправильный token Токен просрочен Неверный адрес электронной почты Неправильный логин - Недействительный symbol - Не удалось найти ученика. Пожалуйста, проверьте \"symbol\" - Это поле обязательно + Неправильный symbol + Не удалось найти ученика. Проверьте \"symbol\" + Обязательное поле Данный ученик уже авторизован Вы можете найти \"symbol\" в Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne Выберите учеников для авторизации в приложении Другие варианты + В этом режиме не работают: счастливый номер, статистика класса по оценкам, статистика посещаемости и уроков, информация о школе и список зарегистрированных устройств + Scraper - режим, который показывает данные так же, как и сайт дневника + Hybrid - это комбинация лучших функций остальных двух режимов. Он работает быстрее, чем Scraper, и вводит функции, которых нет в режиме Mobile API. Находится в экспериментальной стадии Политика приватности Проблемы с авторизацией? Свяжитесь с нами! Электронная почта Discord Отправить письмо - восстановление - Я не помню пароль + Опишите детали проблемы: + Убедитесь, что выбран нужный дневник! + Забыли пароль? Восстановите свой аккаунт + Восстановить Студент уже вошел в систему - - Менеджер аккаунтов Войти Сеанс истёк Сеанс истёк, пожалуйста, авторизируйтесь ещё раз - - Оценка Семестр %d Сменить семестр Оценки отсутствуют - Вес - Bес: %s + Стоимость + Стоимость: %s Комментарий Новые оценки отсутствуют Количество новых оценок: %1$d Средняя оценка: %1$.2f - точек: %s + Баллы: %s Средняя оценка отсутствует Ожидаемая оценка: %1$s Итоговая оценка: %1$s - Сумма очков + Сумма баллов Итоговая оценка Ожидаемая оценка Рассчитанная средняя оценка Итоговая средняя оценка Итоги Класс - Пометить как \"прочитанное* + Пометить как \"прочитанное\" Частичные - Семестровые - Очки + За семестр + Баллы %d оценка %d оценки @@ -108,7 +103,7 @@ %d оценок - Новая оценка + Новая оценка Новые оценки Новые оценки Новые оценки @@ -119,34 +114,28 @@ Вы получили %1$d оценок Вы получили %1$d оценок - - Урок Аудитория Группа Часы Изменения - Нету уроков в данный день - - - + Нет уроков в данный день + Проведённые уроки Просмотреть проведённые уроки Нет информации о проведённых уроках Тема Отсутствие Ресурсы - - Итоговая посещаемость Отсутствие по школьным причинам - Оправданное отсутствие - Неоправданное отсутствие + Отсутствие по уважительной причине + Отсутствие по неуважительной причине Освобождение - Оправданное опоздание - Неоправданное опоздание + Опоздание по уважительным причинам + Опоздание по неуважительным причинам Присутствие Урок № Данные не найдены @@ -158,29 +147,23 @@ Причина отсутствия (необязательно) Послать - Отсутствие оправдано успешно! - Вы должны выбрать хотя бы одно отсутствие! - Oбосновывать - - + Статус отсутствия изменён + Выберите хотя-бы одно отсутствие + Изменить статус Посещаемость - вместе - - + Общая - Тесты на этой неделе не запланированы + Нет тестов на этой неделе Тип Дата записи - - Полученные Отправленные Корзина - (нету темы) + (нет темы) Нет сообщений - Произошла ошибка во время получения текста сообщения + Произошла ошибка во время получения содержания сообщения От: Кому: Дата: %s @@ -202,7 +185,7 @@ %d сообщений - Новое сообщение + Новое сообщение Новые сообщения Новые сообщения Новые сообщения @@ -213,11 +196,9 @@ Вы получили %1$d новых сообщений Вы получили %1$d новых сообщений - - Нет данных о предупреждениях - точек + Баллы %d предупреждение %d предупреждения @@ -225,7 +206,7 @@ %d предупреждений - Новое предупреждение + Новое предупреждение Новые предупреждения Новых предупреждений Новых предупреждений @@ -236,23 +217,17 @@ Вы получили %1$d предупреждений Вы получили %1$d предупреждений - - Нет домашних заданий сделанный Не сделано Вложения - - Счастливый номер Сегодняшний счастливый номер Нет данных о счастливом номере Сегодняшний счастливый номер Сегодняшний счастливый номер: %d - - Мобильные устройства Нет устройств @@ -262,12 +237,8 @@ Token Symbol PIN - - Школа и учителя - - Школа Нет информации о школе @@ -278,56 +249,42 @@ Педагог Показать на карте Позвонить - - Учителя Нет информации о учителях Нет предмета - - Добавить аккаунт Выйти Вы точно хотите выйти из данного аккаунта? Выйти - - Версия приложения - Творцы - Список Wulkanowy программистов - Сообщить о ошибке - Отправить сообщение о ошибке через электронную почту + Разработчики + Список разработчиков \"Wulkanowy\" + Возникла ошибка? + Сообщить о ошибке FAQ - Читайте часто задаваемые вопросы + Часто задаваемые вопросы Сервер Discord Присоединиться к сообществу приложения Политика приватности - Правила сбора личных данных + Правила хранения личных данных Домашняя страница - Посетить страницу и помочь в развитии приложения + Помочь в развитии приложения Лицензии - Лицензии использованных в приложении библиотек - - + Лицензии использованных библиотек Лицензия - - - + Aватар - Смотрите больше на GitHub - - + Страница проекта на GitHub - Share logs - Обновление - - + Поделиться логами + Обновить Содержание - Снова + Повторить Описание Нет описания Учитель @@ -341,19 +298,15 @@ Предмет Предыдущий Следующий - - Нет уроков Выбрать тему Светлая Тёмная - - - Внешний вид - При входе открывать - Рассчитывание средней годовой оценки + Вид + Окно по умолчанию + Способ определения средней годовой оценки Принудительно высчитать среднюю оценку через приложение Показывать присутствия в посещаемости Тема приложения @@ -361,33 +314,34 @@ Показать уроки всего класса Схема цветов оценок Язык приложения - Уведомления Показывать уведомления Показывать дебаг-уведомления - Синхронизация Автоматическая синхронизация Приостановить синхронизации во время каникул Интервал синхронизации Только через Wi-Fi - + Синхронизировать + Синхронизировано! + Синхронизация не удалась + Идёт синхронизация + Синхронизация + Ручная синхронизация не обновляет данные в приложении. + \nЧтобы увидеть обновлённые данные, перезапустите приложение. + Другие - Вес плюса - Вес минуса - Ответить с историей сообщений - - + Стоимость плюса + Стоимость минуса + Отвечать с историей сообщений Новые данные в дневнике Новые оценки Счастливый номер Новые сообщения Новые заметки - Push-уведомления + Показывать push-уведомления Дебаг - - Чёрный Красный @@ -395,17 +349,13 @@ Зелёный Фиолетовый Нет цвета - - Скопировано Отменить - - Нет интернет-подключения Слишком долгое ожидание соединения с дневником - Авторизация не удалась. Пожалуйста, попробуйте ещё раз или перезапустите дневник + Авторизация не удалась. Попробуйте ещё раз или перезапустите дневник Требуется смена пароля Технический перерыв в журнале UONET + продолжается. Попробуйте позже Произошла неожиданная ошибка diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index e09ae8cdd..3c70c9d09 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -1,14 +1,5 @@ - - 15 хвилин - 30 хвилин - 1 година - 2 години - 6 годин - 12 годин - 24 години - Світла Темна @@ -22,6 +13,15 @@ Українська Deutsch + + 15 хвилин + 30 хвилин + 1 година + 2 години + 6 годин + 12 годин + 24 години + 0,0 0,25 @@ -38,7 +38,6 @@ Середня оцінка з 2 семестру Середня оцінка за весь рік - Не показувати Показати все diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index d9db3f068..e1117a884 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,9 +1,6 @@ - - + Wulkanowy - - Авторизація Wulkanowy @@ -12,83 +9,80 @@ Тести Розклад Налаштування - Ще + Інше Про додаток Переглядач журналів - Творці + Розробники Ліцензії Повідомлення Нове повідомлення Нотатки та досягнення Домашні завдання - Виберіть акаунт - - + Оберіть аккаунт - Семестр %d, %d/%d - - + %d семестр, %d/%d - Авторизуйтеся за допомогою акаунта учня або батьків + Авторизуйтеся за допомогою аккаунта учня або батька Впишіть \"symbol\" Ім\'я користувача Електронна пошта Логін, PESEL або електронна пошта Пароль Щоденник - Мобільний API + Мobile API Scraper - Гібрид + Hybrid Token PIN Ключ API Symbol - Ввійти - Дуже короткий пароль - Вказані неправильні дані - Недійсний PIN - Недійсний token + Увійти + Занадто короткий пароль + Вказані невірні дані. Впевніться, що ви увібрали потрібний щоденник + Неправильний PIN + Неправильний token + Минув термін дії токену Недійсна адреса електронної пошти - Невірний логін - Токен протермінований - Недійсний symbol + Неправильний логін + Неправильний symbol Не вдалося знайти учня. Будь ласка, перевірте \"symbol\" - Це поле обов\'язкове - Даний учень вже авторизований + Обов\'язкове поле + Даного учня вже авторизовано Ви можете знайти \"symbol\" в Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne Виберіть учнів для авторизації в додатку Інші варіанти + У цьому режимі не працюють: щасливий номер, статистика класу по оцінкам, статистика відвідуваності і уроків, інформація про школу і список зареєстрованних пристроїв + Scraper - режим, котрий показує дані так само, як і сторінка щоденника + Hybrid - це комбінація найкращих функцій інших двох режимів. Він працює швидше, ніж Scraper, и впроваджує функції, котрих нема в режимі Mobile API. Знаходиться в експериментальній стадії Політика приватності Проблеми з авторизацією? Зв\'яжіться з нами! Електронна пошта Discord - Відправити листа - Я забув свій пароль - Відновіть свій акаунт + Відправити лист + Опишіть деталі помилки: + Переконайтесь, що обрано потрібний щоденник! + Забули пароль? + Відновіть свій аккаунт Відновити - Учень вже ввійшов в систему - - + Учень вже увійшов до системи - Менеджер акаунтів - Ввійти - Сесія закінчилася - Сесія закінчилася, будь ласка, авторизуйтеся знову - - + Менеджер аккаунтів + Увійти + Минув термін дії сесії + Минув термін дії сесії, авторизуйтеся знову Оцінка - Семестр %d + %d семестр Змінити семестр - Оцінки відсутні - Вага - Вага: %s + Брак оцінок + Вартість + Вартість: %s Коментар - Нові оцінки відсутні + Брак нових оцінок Кількість нових оцінок: %1$d Середня оцінка: %1$.2f точок: %s - Середня оцінка відсутня + Брак середньої оцінки Очікувана оцінка: %1$s Підсумкова оцінка: %1$s Сума балів @@ -96,9 +90,9 @@ Очікувана оцінка Розрахована середня оцінка Підсумкова середня оцінка - Підсумки + Підсумок Клас - Відмітити як \"прочитане* + Позначити як прочитане Поточні Семестрові Бали @@ -109,7 +103,7 @@ %d оцінок - Нова оцінка + Нова оцінка Нові оцінки Нові оцінки Нові оцінки @@ -118,39 +112,33 @@ Ви отримали %1$d оцінку Ви отримали %1$d оцінки Ви отримали %1$d оцінок - ви отримали %1$d оцінок + Ви отримали %1$d оцінок - - Урок Аудиторія Група Години Зміни - Цього дня уроків немає - - - - Проведені уроки - Подивитися проведені уроки - Інформації про проведені уроки немає + Брак уроків у цей день + + Уроки, що відбулися + Показати уроки, що відбулися + Брак інформації о уроках, що відбулися Тема Відсутність Ресурси - - - Підсумкова відвідуваність + Підсумок відвідуваності Відсутність зі шкільних причин - Виправдана відсутність - Невиправдана відсутність + Відсутність з поважних причин + Відсутність з не поважних причин Звільнення - Виправдане запізнення - Невиправдане запізнення + Спізнення з поважних причин + Спізнення з не поважних причин Присутність - урок № - Дані не знайдені + Номер уроку + Брак записів %1$d відсутність %1$d відсутності @@ -159,43 +147,37 @@ Причина відсутності (необов’язково) Надіслати - Відсутність виправдана успішно! - Ви повинні вибрати хоча б одну відсутність! - Oбґрунтовувати - - + Змінено статус відсутності + Оберіть хоча б одну відсутність + Змінити статус Відвідуваність Загальна - - - Тести на цьому тижні не заплановані + Брак тестів у цьому тижні Тип Дата запису - - Отримані Відправлені Кошик - (нема теми) + (брак теми) Нема повідомлень - Сталася помилка під час отримання тексту повідомлення + З\'явилася помилка підчас завантаження змісту повідомлення Від: Кому: Дата: %s - Відповідь + Відповісти Переслати Видалити - Перемістити в кошик + Перемістити у кошик Видалити назавжди - Повідомлення успішно видалено + Повідомлення було успішно видалено Тема Зміст - Повідомлення успішно відправлено - Ви повинні вибрати щонайменше одного отримувача - Текст повідомлення повинен містити щонайменше 3 знаки + Повідомлення було успішно відправлено + Необхідно обрати принаймні 1 адресата + Зміст повідомлення мусить складатися принаймні з 3 знаків %d повідомлення %d повідомлення @@ -203,7 +185,7 @@ %d повідомлень - Нове повідомлення + Нове повідомлення Нові повідомлення Нові повідомлення Нові повідомлення @@ -214,123 +196,97 @@ Ви отримали %1$d нових повідомлень Ви отримали %1$d нових повідомлень - - - Немає даних про нотатки - точок + Брак інформації о зауваженнях + Бали - %d нотатка - %d нотатки - %d нотаток - %d нотатки + %d зауваження + %d зауваження + %d зауважень + %d зауважень - Нова нотатка + Нова нотатка Нові нотатки Нових нотаток Нових нотаток - Ви отримали %1$d нотатку - Ви отримали %1$d нотатки - Ви отримали %1$d нотаток - Ви отримали %1$d нотаток + %1$d нове зауваження + %1$d нових зауваження + %1$d нових зауважень + %1$d нових зауважень - - - Немає домашніх завдань - зроблений - Не зроблено - Вкладення - - + Брак домашніх завдань + Позначити як зроблене + Позначити як не зроблене + Додатки Щасливий номер - Сьогодні щасливий номер - Немає даних про щасливий номер - Сьогодні щасливий номер - Сьогодні щасливий номер: %d - - + Сьогоднішній щасливий номер + Брак інформації о щасливому номері + Сьогоднішній щасливий номер + Сьогоднішнім щасливим номером є %d Мобільні пристрої - Пристрої відсутні + Брак пристроїв Видалити - Пристрій видалений + Пристрій видалено QR-код Token Symbol PIN - - Школа та вчителі - - Школа - Немає інформації про школу + Брак інформації про школу Назва школи Адреса школи Телефон Директор Викладач - Показати на карті + Показати на мапі Зателефонувати - - Вчителі - Немає інформації про вчителів - Нема предмету - - + Брак інформації про вчителів + Брак предмету - Додати акаунт + Додати аккаунт Вийти - Ви дійсно бажаєте вийти з даного акаунту? - Вийти - - + Ви впевнені, що хочете вийти з цього аккаунту? + Вийти з аккаунту учня - Версія додатку - Tворці - Список Wulkanowy програмістів - Повідомити про помилку - Відправити повідомлення про помилку електронною поштою + Версія додатка + Розробники + Список розробників \"Wulkanowy\" + Виникла помилка? + Повідомити о помилці за допомогою e-mail FAQ - Читайте запитання, які часто задають + Запитання, які часто задають Сервер Discord Приєднатися до спільноти додатка - Політика приватності - Правила збору особистих даних + Політика конфіденційності + Правила зберігання особистих даних Домашня сторінка - Відвідати сторінку та допомогти в розвитку додатку + Допомогти розвитку додатка Ліцензії - Ліцензії використаних в додатку бібліотек - - + Ліцензії вжитих бібліотек Ліцензія - - - + Аватар - Дивіться більше на GitHub - - + Сторінка проекту на GitHub - Поділитися журналами + Поділитися логами Оновити - - Зміст - Знову + Повторити Опис - Нема опису + Брак опису Вчитель Дата Дата запису @@ -342,71 +298,64 @@ Предмет Попередній Наступний - - - Немає уроків - Вибрати тему - Світла + Брак уроків + Увібрати тему + Яскрава Темна - - - Зовнішній вигляд - При вході відкривати - Розрахунок середньої річної оцінки + Вигляд + Вікно за замовчуванням + Спосіб облічування оцінки на кінець року Примусово розрахувати середню оцінку через додаток Показувати присутність у відвідуваності Тема додатку Більше оцінок Показати уроки всього класу - Колірна гама оцінок + Схема кольорів оцінок Мова додатку - Повідомлення Показувати повідомлення Показувати дебаг-повідомлення - Синхронізація Автоматична синхронізація - Призупинити синхронізації на час канікул - Інтервал синхронізації + Призупинено на час канікул + Інтервал оновлення Тільки через Wi-Fi - + Синхронізувати + Синхронізовано! + Синхронізація не вдалася + Триває синхронізація + Синхронізація + Ручна синхронізація не оновлює дані в додатку. + \nЩоб побачити оновлені дані, перезавантажте додаток. + Інші - Вага плюса + Вартість плюсу Вага мінуса Відповісти з історією повідомлень - - Нові дані в щоденнику - Щасливий номер Нові оцінки + Щасливий номер Нові повідомлення Нові нотатки - Повідомлення pushs + Показувати push-повідомлення Дебаг - - Чорний Червоний Голубий Зелений Фіолетовий - Нема кольору - - + Брак кольору Скопійовано Відмінити - - - Відсутнє інтернет-підключення + Брак з\'єднання з інтернетом Занадто довге очікування з\'єднання з щоденником - Авторизація не відбулася. Будь ласка, авторизуйтеся знову або перезавантажте щоденник + Аутентифікація не вдалася. Спробуйте ще раз або запустіть додаток знову Потрібно змінити пароль Технічна перерва в журналі UONET + продовжується. Спробуйте пізніше Відбулася несподівана помилка diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c7b41f698..429cd7404 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,7 +55,7 @@ Student not found. Check the symbol This field is required Selected student is already logged in - The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne + The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne Select students to log in to the application Other options In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices From 6ac5c6a0b4b7dac8edd4454b0efad1b80ff088af Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak <53345435+PanTajemnic@users.noreply.github.com> Date: Sun, 10 May 2020 12:00:21 +0200 Subject: [PATCH 0016/1526] Add widget system theme option (#759) --- .../LuckyNumberWidgetConfigureActivity.kt | 8 ++++- .../LuckyNumberWidgetConfigurePresenter.kt | 2 +- .../LuckyNumberWidgetProvider.kt | 34 +++++++++++++------ .../TimetableWidgetConfigureActivity.kt | 8 ++++- .../timetablewidget/TimetableWidgetFactory.kt | 28 ++++++++------- .../TimetableWidgetProvider.kt | 22 ++++++++++-- .../res/layout/activity_widget_configure.xml | 2 -- .../main/res/layout/item_widget_timetable.xml | 22 ++++++------ .../res/layout/item_widget_timetable_dark.xml | 33 +++++------------- .../layout/item_widget_timetable_small.xml | 5 +-- app/src/main/res/layout/widget_timetable.xml | 7 ---- .../main/res/layout/widget_timetable_dark.xml | 7 ---- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values/api_hosts.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 18 files changed, 99 insertions(+), 86 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt index d7d5c4ff1..961ac6338 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt @@ -4,6 +4,7 @@ import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS import android.content.Intent +import android.os.Build import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AlertDialog @@ -14,6 +15,7 @@ import io.github.wulkanowy.databinding.ActivityWidgetConfigureBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.WidgetConfigureAdapter import io.github.wulkanowy.ui.modules.login.LoginActivity +import io.github.wulkanowy.utils.AppInfo import javax.inject.Inject class LuckyNumberWidgetConfigureActivity : @@ -26,6 +28,9 @@ class LuckyNumberWidgetConfigureActivity : @Inject override lateinit var presenter: LuckyNumberWidgetConfigurePresenter + @Inject + lateinit var appInfo: AppInfo + private var dialog: AlertDialog? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -48,10 +53,11 @@ class LuckyNumberWidgetConfigureActivity : } override fun showThemeDialog() { - val items = arrayOf( + var items = arrayOf( getString(R.string.widget_timetable_theme_light), getString(R.string.widget_timetable_theme_dark) ) + if (appInfo.systemVersion >= Build.VERSION_CODES.Q) items += (getString(R.string.widget_timetable_theme_system)) dialog = AlertDialog.Builder(this, R.style.WulkanowyTheme_WidgetAccountSwitcher) .setTitle(R.string.widget_timetable_theme_title) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt index 1bb7447a2..468f9b575 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt @@ -40,7 +40,7 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( registerStudent(selectedStudent) } - fun onDismissThemeView(){ + fun onDismissThemeView() { view?.finishView() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index e4b1072b6..55a048b32 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -8,6 +8,7 @@ import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH import android.appwidget.AppWidgetProvider import android.content.Context import android.content.Intent +import android.content.res.Configuration import android.os.Bundle import android.view.View.GONE import android.view.View.VISIBLE @@ -62,14 +63,12 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray?) { super.onUpdate(context, appWidgetManager, appWidgetIds) appWidgetIds?.forEach { appWidgetId -> - val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) - val layoutId = if (savedTheme == 0L) R.layout.widget_luckynumber else R.layout.widget_luckynumber_dark val luckyNumber = getLuckyNumber(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId) val appIntent = PendingIntent.getActivity(context, MainView.Section.LUCKY_NUMBER.id, MainActivity.getStartIntent(context, MainView.Section.LUCKY_NUMBER, true), FLAG_UPDATE_CURRENT) - val remoteView = RemoteViews(context.packageName, layoutId).apply { + val remoteView = RemoteViews(context.packageName, getCorrectLayoutId(appWidgetId, context)).apply { setTextViewText(R.id.luckyNumberWidgetNumber, luckyNumber?.luckyNumber?.toString() ?: "#") setOnClickPendingIntent(R.id.luckyNumberWidgetContainer, appIntent) } @@ -82,17 +81,19 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { override fun onDeleted(context: Context?, appWidgetIds: IntArray?) { super.onDeleted(context, appWidgetIds) appWidgetIds?.forEach { appWidgetId -> - if (appWidgetId != 0) sharedPref.delete(getStudentWidgetKey(appWidgetId)) + with(sharedPref) { + delete(getHeightWidgetKey(appWidgetId)) + delete(getStudentWidgetKey(appWidgetId)) + delete(getThemeWidgetKey(appWidgetId)) + delete(getWidthWidgetKey(appWidgetId)) + } } } override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, newOptions: Bundle?) { super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions) - val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) - val layoutId = if (savedTheme == 0L) R.layout.widget_luckynumber else R.layout.widget_luckynumber_dark - - val remoteView = RemoteViews(context.packageName, layoutId) + val remoteView = RemoteViews(context.packageName, getCorrectLayoutId(appWidgetId, context)) setStyles(remoteView, appWidgetId, newOptions) appWidgetManager.updateAppWidget(appWidgetId, remoteView) @@ -102,8 +103,10 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { val width = options?.getInt(OPTION_APPWIDGET_MIN_WIDTH) ?: sharedPref.getLong(getWidthWidgetKey(appWidgetId), 74).toInt() val height = options?.getInt(OPTION_APPWIDGET_MAX_HEIGHT) ?: sharedPref.getLong(getHeightWidgetKey(appWidgetId), 74).toInt() - sharedPref.putLong(getWidthWidgetKey(appWidgetId), width.toLong()) - sharedPref.putLong(getHeightWidgetKey(appWidgetId), height.toLong()) + with(sharedPref) { + putLong(getWidthWidgetKey(appWidgetId), width.toLong()) + putLong(getHeightWidgetKey(appWidgetId), height.toLong()) + } val rows = getCellsForSize(height) val cols = getCellsForSize(width) @@ -162,4 +165,15 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { null } } + + private fun getCorrectLayoutId(appWidgetId: Int, context: Context): Int { + val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) + val isSystemDarkMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES + + return if (savedTheme == 1L || (savedTheme == 2L && isSystemDarkMode)) { + R.layout.widget_luckynumber_dark + } else { + R.layout.widget_luckynumber + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt index 75548c9cc..3dc7a3a8c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt @@ -4,6 +4,7 @@ import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS import android.content.Intent +import android.os.Build import android.os.Bundle import android.widget.Toast import android.widget.Toast.LENGTH_LONG @@ -16,6 +17,7 @@ import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.WidgetConfigureAdapter import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.EXTRA_FROM_PROVIDER +import io.github.wulkanowy.utils.AppInfo import javax.inject.Inject class TimetableWidgetConfigureActivity : @@ -28,6 +30,9 @@ class TimetableWidgetConfigureActivity : @Inject override lateinit var presenter: TimetableWidgetConfigurePresenter + @Inject + lateinit var appInfo: AppInfo + private var dialog: AlertDialog? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -50,10 +55,11 @@ class TimetableWidgetConfigureActivity : } override fun showThemeDialog() { - val items = arrayOf( + var items = arrayOf( getString(R.string.widget_timetable_theme_light), getString(R.string.widget_timetable_theme_dark) ) + if (appInfo.systemVersion >= Build.VERSION_CODES.Q) items += getString(R.string.widget_timetable_theme_system) dialog = AlertDialog.Builder(this, R.style.WulkanowyTheme_WidgetAccountSwitcher) .setTitle(R.string.widget_timetable_theme_title) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index fb8c59586..dd223ad8b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -18,9 +18,9 @@ import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.data.repositories.timetable.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.getThemeWidgetKey import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.toFormattedString @@ -41,9 +41,7 @@ class TimetableWidgetFactory( private var lessons = emptyList() - private var savedTheme: Long? = null - - private var layoutId: Int? = null + private var savedCurrentTheme: Long? = null private var primaryColor: Int? = null @@ -71,28 +69,32 @@ class TimetableWidgetFactory( val studentId = sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0) updateTheme(appWidgetId) - updateLessons(date, studentId) } } private fun updateTheme(appWidgetId: Int) { - savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) - layoutId = if (savedTheme == 0L) R.layout.item_widget_timetable else R.layout.item_widget_timetable_dark + savedCurrentTheme = sharedPref.getLong(getCurrentThemeWidgetKey(appWidgetId), 0) - primaryColor = if (savedTheme == 0L) R.color.colorPrimary else R.color.colorPrimaryLight - textColor = if (savedTheme == 0L) android.R.color.black else android.R.color.white - timetableChangeColor = if (savedTheme == 0L) R.color.timetable_change_dark else R.color.timetable_change_light + if (savedCurrentTheme == 0L) { + primaryColor = R.color.colorPrimary + textColor = android.R.color.black + timetableChangeColor = R.color.timetable_change_dark + } else { + primaryColor = R.color.colorPrimaryLight + textColor = android.R.color.white + timetableChangeColor = R.color.timetable_change_light + } } private fun getItemLayout(lesson: Timetable): Int { return when { prefRepository.showWholeClassPlan == "small" && !lesson.isStudentPlan -> { - if (savedTheme == 0L) R.layout.item_widget_timetable_small + if (savedCurrentTheme == 0L) R.layout.item_widget_timetable_small else R.layout.item_widget_timetable_small_dark } - savedTheme == 0L -> R.layout.item_widget_timetable - else -> R.layout.item_widget_timetable_dark + savedCurrentTheme == 1L -> R.layout.item_widget_timetable_dark + else -> R.layout.item_widget_timetable } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 62192a1b0..79888f83d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -13,6 +13,7 @@ import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK import android.content.Intent.FLAG_ACTIVITY_NEW_TASK +import android.content.res.Configuration import android.widget.RemoteViews import dagger.android.AndroidInjection import io.github.wulkanowy.R @@ -71,6 +72,8 @@ class TimetableWidgetProvider : BroadcastReceiver() { fun getStudentWidgetKey(appWidgetId: Int) = "timetable_widget_student_$appWidgetId" fun getThemeWidgetKey(appWidgetId: Int) = "timetable_widget_theme_$appWidgetId" + + fun getCurrentThemeWidgetKey(appWidgetId: Int) = "timetable_widget_current_theme_$appWidgetId" } override fun onReceive(context: Context, intent: Intent) { @@ -110,14 +113,23 @@ class TimetableWidgetProvider : BroadcastReceiver() { with(sharedPref) { delete(getStudentWidgetKey(appWidgetId)) delete(getDateWidgetKey(appWidgetId)) + delete(getThemeWidgetKey(appWidgetId)) + delete(getCurrentThemeWidgetKey(appWidgetId)) } } } @SuppressLint("DefaultLocale") private fun updateWidget(context: Context, appWidgetId: Int, date: LocalDate, student: Student?) { - val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) - val layoutId = if (savedTheme == 0L) R.layout.widget_timetable else R.layout.widget_timetable_dark + val savedConfigureTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) + val isSystemDarkMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES + var currentTheme = 0L + var layoutId = R.layout.widget_timetable + + if (savedConfigureTheme == 1L || (savedConfigureTheme == 2L && isSystemDarkMode)) { + currentTheme = 1L + layoutId = R.layout.widget_timetable_dark + } val nextNavIntent = createNavIntent(context, appWidgetId, appWidgetId, BUTTON_NEXT) val prevNavIntent = createNavIntent(context, -appWidgetId, appWidgetId, BUTTON_PREV) @@ -150,7 +162,11 @@ class TimetableWidgetProvider : BroadcastReceiver() { setPendingIntentTemplate(R.id.timetableWidgetList, appIntent) } - sharedPref.putLong(getDateWidgetKey(appWidgetId), date.toEpochDay(), true) + with(sharedPref) { + putLong(getCurrentThemeWidgetKey(appWidgetId), currentTheme) + putLong(getDateWidgetKey(appWidgetId), date.toEpochDay(), true) + } + with(appWidgetManager) { notifyAppWidgetViewDataChanged(appWidgetId, R.id.timetableWidgetList) updateAppWidget(appWidgetId, remoteView) diff --git a/app/src/main/res/layout/activity_widget_configure.xml b/app/src/main/res/layout/activity_widget_configure.xml index 548b86041..9a463284e 100644 --- a/app/src/main/res/layout/activity_widget_configure.xml +++ b/app/src/main/res/layout/activity_widget_configure.xml @@ -10,9 +10,7 @@ android:layout_width="match_parent" android:layout_height="64dp" android:paddingStart="24dp" - android:paddingLeft="24dp" android:paddingEnd="24dp" - android:paddingRight="24dp" android:text="@string/account_title" android:textSize="20sp" android:textStyle="bold" diff --git a/app/src/main/res/layout/item_widget_timetable.xml b/app/src/main/res/layout/item_widget_timetable.xml index c69bade8a..33f686dac 100644 --- a/app/src/main/res/layout/item_widget_timetable.xml +++ b/app/src/main/res/layout/item_widget_timetable.xml @@ -12,12 +12,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" - android:paddingTop="6dp" - android:paddingBottom="6dp" - android:paddingLeft="6dp" android:paddingStart="6dp" + android:paddingLeft="6dp" + android:paddingTop="6dp" android:paddingEnd="12dp" - android:paddingRight="12dp"> + android:paddingRight="12dp" + android:paddingBottom="6dp"> + tools:visibility="gone" /> + android:paddingBottom="6dp"> + tools:visibility="gone" /> + @@ -60,7 +55,6 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:backgroundTint="@color/colorPrimaryDark" android:contentDescription="@string/all_prev" android:src="@drawable/ic_widget_chevron" @@ -72,7 +66,6 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toEndOf="@id/timetableWidgetPrev" - android:layout_toRightOf="@id/timetableWidgetPrev" android:backgroundTint="@color/colorPrimaryDark" android:contentDescription="@string/all_next" android:rotation="180" diff --git a/app/src/main/res/layout/widget_timetable_dark.xml b/app/src/main/res/layout/widget_timetable_dark.xml index 3a301eb94..5533eaeee 100644 --- a/app/src/main/res/layout/widget_timetable_dark.xml +++ b/app/src/main/res/layout/widget_timetable_dark.xml @@ -16,9 +16,7 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toStartOf="@id/timetableWidgetAccount" - android:layout_toLeftOf="@id/timetableWidgetAccount" android:layout_toEndOf="@id/timetableWidgetNext" - android:layout_toRightOf="@id/timetableWidgetNext" android:orientation="vertical"> @@ -60,7 +55,6 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" android:backgroundTint="@color/colorWidgetNavButton" android:contentDescription="@string/all_prev" android:src="@drawable/ic_widget_chevron" @@ -72,7 +66,6 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toEndOf="@id/timetableWidgetPrev" - android:layout_toRightOf="@id/timetableWidgetPrev" android:backgroundTint="@color/colorWidgetNavButton" android:contentDescription="@string/all_next" android:rotation="180" diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e294593ca..8af2ed6f0 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -283,6 +283,7 @@ Thema wählen Licht Dunkel + Systemthema Erscheinungsbild Standard Ansicht diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 30d80acdb..82aa81180 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -303,6 +303,7 @@ Wybierz motyw Jasny Ciemny + Motyw systemu Wygląd Domyślny widok diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a4666d730..426bfe241 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -303,6 +303,7 @@ Выбрать тему Светлая Тёмная + Системная тема Вид Окно по умолчанию diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index e1117a884..0a5ac733b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -303,6 +303,7 @@ Увібрати тему Яскрава Темна + Тема системи Вигляд Вікно за замовчуванням diff --git a/app/src/main/res/values/api_hosts.xml b/app/src/main/res/values/api_hosts.xml index 5ce26b1d6..f661b88c5 100644 --- a/app/src/main/res/values/api_hosts.xml +++ b/app/src/main/res/values/api_hosts.xml @@ -36,7 +36,7 @@ https://vulcan.net.pl/ https://vulcan.net.pl/ https://vulcan.net.pl/ - http://fakelog.cf/?standard + http://fakelog.tk/?standard Default diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 429cd7404..c2cbeada2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -336,6 +336,7 @@ Choose theme Light Dark + System Theme From 52d66ac30bcbba199dd7046d2b4a77a94951ec5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 13 May 2020 11:25:50 +0200 Subject: [PATCH 0017/1526] New Crowdin translations (#797) --- app/src/main/res/values-de/strings.xml | 28 +++++++++++++------------- app/src/main/res/values-ru/strings.xml | 4 ++-- app/src/main/res/values-uk/strings.xml | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8af2ed6f0..f57805469 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -48,19 +48,19 @@ Student nicht gefunden. Überprüfen Sie das Symbol Dieses Datenfeld ist erforderlich Ausgewählter Student ist bereits angemeldet. - Das Symbol finden Sie auf der Registerseite unter Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne + Das Symbol finden Sie auf der Registerseite unter Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne Wählen Sie die Studenten aus, die sich bei der Anwendung anmelden sollen. Andere Optionen - In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices - This mode displays the same data as it appears on the register website - The combination of the best features of the other two modes. It works faster than scraper and provides features not available in the Mobile API mode. It is in the experimental phase + In diesem Modus funktioniert eine Glücknummer, eine Klassenstatistik, eine Zusammenfassung der Anwesenheit, eine Entschuldigung für die Abwesenheit, abgeschlossene Lektionen, Schulinformationen und eine Vorschau der Liste der registrierten Geräte nicht + In diesem Modus werden dieselben Daten angezeigt, die auf der Klassenbuch-Website angezeigt werden + Die Kombination der besten Eigenschaften der beiden anderen Modus. Es arbeitet schneller als Scraper und bietet Funktionen, die im mobilen API-Modus nicht verfügbar sind. Es ist in der experimentellen Phase Datenschutzerklärung Probleme bei der Anmeldung? Kontaktieren Sie uns! Email Discord email senden - Describe details of problem: - Make sure the correct UONET+ register is selected! + Beschreiben Sie die Details des Problems: + Stellen Sie sicher, dass das richtige UONET + Klassenbuch ausgewählt ist! Ich habe mein Passwort vergessen. Ihr Konto wiederherstellen Wiederherstellen @@ -257,7 +257,7 @@ Lizenz - Avatar + Benutzerbild Sehen Sie mehr auf GitHub Logs teilen @@ -303,13 +303,13 @@ An Feiertagen suspendiert Aktualisierungsintervall Nur Wi-Fi - Sync now - Synced! - Sync failed - Sync in progress - Synchronization - Manual sync doesn\'t refresh app views. - \nTo see the synced data relaunch the app after syncing. + Jetzt synchronisieren + Synchronisiert! + Synchronisierung fehlgeschlagen + Synchronisierung läuft + Synchronisation + Die manuelle Synchronisierung aktualisiert die App-Ansichten nicht. + \nUm die synchronisierten Daten anzuzeigen, starten Sie die App nach der Synchronisierung neu. Andere Wert des Plus diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 426bfe241..e68454550 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -48,7 +48,7 @@ Не удалось найти ученика. Проверьте \"symbol\" Обязательное поле Данный ученик уже авторизован - Вы можете найти \"symbol\" в Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne + Вы можете найти \"symbol\" на странице VULCAN по пути Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne Выберите учеников для авторизации в приложении Другие варианты В этом режиме не работают: счастливый номер, статистика класса по оценкам, статистика посещаемости и уроков, информация о школе и список зарегистрированных устройств @@ -303,7 +303,7 @@ Выбрать тему Светлая Тёмная - Системная тема + Тема системы Вид Окно по умолчанию diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0a5ac733b..303eb8b9a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -48,7 +48,7 @@ Не вдалося знайти учня. Будь ласка, перевірте \"symbol\" Обов\'язкове поле Даного учня вже авторизовано - Ви можете знайти \"symbol\" в Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne + Ви можете знайти \"symbol\" на сторінцi VULCAN стежкою Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne Виберіть учнів для авторизації в додатку Інші варіанти У цьому режимі не працюють: щасливий номер, статистика класу по оцінкам, статистика відвідуваності і уроків, інформація про школу і список зареєстрованних пристроїв From f7b5b9c413a63ce9bcb8183166f13d33839e4452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 16 May 2020 22:06:00 +0200 Subject: [PATCH 0018/1526] Add fullscreen mode to homework dialog (#806) --- .../details/HomeworkDetailsAdapter.kt | 16 +++++++++++++ .../homework/details/HomeworkDetailsDialog.kt | 4 ++++ .../login/recover/LoginRecoverFragment.kt | 1 - app/src/main/res/drawable/ic_fullscreen.xml | 5 ++++ .../main/res/drawable/ic_fullscreen_exit.xml | 5 ++++ .../layout/item_homework_dialog_details.xml | 24 +++++++++++++++++++ 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_fullscreen.xml create mode 100644 app/src/main/res/drawable/ic_fullscreen_exit.xml diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt index 923ab953a..5d6ee162a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt @@ -1,6 +1,8 @@ package io.github.wulkanowy.ui.modules.homework.details import android.view.LayoutInflater +import android.view.View.GONE +import android.view.View.VISIBLE import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.data.db.entities.Homework @@ -29,6 +31,10 @@ class HomeworkDetailsAdapter @Inject constructor() : var onAttachmentClickListener: (url: String) -> Unit = {} + var onFullScreenClickListener = {} + + var onFullScreenExitClickListener = {} + override fun getItemCount() = 1 + if (attachments.isNotEmpty()) attachments.size + 1 else 0 override fun getItemViewType(position: Int) = when (position) { @@ -61,6 +67,16 @@ class HomeworkDetailsAdapter @Inject constructor() : homeworkDialogSubject.text = homework?.subject homeworkDialogTeacher.text = homework?.teacher homeworkDialogContent.text = homework?.content + homeworkDialogFullScreen.setOnClickListener { + homeworkDialogFullScreen.visibility = GONE + homeworkDialogFullScreenExit.visibility = VISIBLE + onFullScreenClickListener() + } + homeworkDialogFullScreenExit.setOnClickListener { + homeworkDialogFullScreen.visibility = VISIBLE + homeworkDialogFullScreenExit.visibility = GONE + onFullScreenExitClickListener() + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt index 07f21ef85..7b3b9821a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt @@ -5,6 +5,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework @@ -63,6 +65,8 @@ class HomeworkDetailsDialog : BaseDialogFragment(), Homew layoutManager = LinearLayoutManager(context) adapter = detailsAdapter.apply { onAttachmentClickListener = { context.openInternetBrowser(it, ::showMessage) } + onFullScreenClickListener = { dialog?.window?.setLayout(MATCH_PARENT, MATCH_PARENT) } + onFullScreenExitClickListener = { dialog?.window?.setLayout(WRAP_CONTENT, WRAP_CONTENT) } homework = this@HomeworkDetailsDialog.homework } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt index 2accf1fe6..06c91cbea 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt @@ -195,7 +195,6 @@ class LoginRecoverFragment : } override fun onDestroyView() { - binding.loginRecoverWebView.destroy() presenter.onDetachView() super.onDestroyView() diff --git a/app/src/main/res/drawable/ic_fullscreen.xml b/app/src/main/res/drawable/ic_fullscreen.xml new file mode 100644 index 000000000..86b7649b6 --- /dev/null +++ b/app/src/main/res/drawable/ic_fullscreen.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_fullscreen_exit.xml b/app/src/main/res/drawable/ic_fullscreen_exit.xml new file mode 100644 index 000000000..bb7140f29 --- /dev/null +++ b/app/src/main/res/drawable/ic_fullscreen_exit.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/item_homework_dialog_details.xml b/app/src/main/res/layout/item_homework_dialog_details.xml index bfd246c83..3b5705bf8 100644 --- a/app/src/main/res/layout/item_homework_dialog_details.xml +++ b/app/src/main/res/layout/item_homework_dialog_details.xml @@ -1,4 +1,5 @@ + + + + Date: Sat, 16 May 2020 22:21:14 +0200 Subject: [PATCH 0019/1526] Add option to hide/show chart list in grade class stats (#807) --- .../preferences/PreferencesRepository.kt | 3 +++ .../statistics/GradeStatisticsAdapter.kt | 6 +++-- .../statistics/GradeStatisticsFragment.kt | 16 ++++++------- .../statistics/GradeStatisticsPresenter.kt | 23 ++++++++----------- .../grade/statistics/GradeStatisticsView.kt | 2 +- .../res/layout/fragment_grade_statistics.xml | 6 ++--- app/src/main/res/values-pl/strings.xml | 1 + .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/scheme_preferences.xml | 9 ++++++-- 11 files changed, 39 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index 523caf6c9..b7a539925 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -26,6 +26,9 @@ class PreferencesRepository @Inject constructor( val isGradeExpandable: Boolean get() = !getBoolean(R.string.pref_key_expand_grade, R.bool.pref_default_expand_grade) + val showAllSubjectsOnStatisticsList: Boolean + get() = getBoolean(R.string.pref_key_grade_statistics_list, R.bool.pref_default_grade_statistics_list) + val appThemeKey = context.getString(R.string.pref_key_app_theme) val appTheme: String get() = getString(appThemeKey, R.string.pref_default_app_theme) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt index 8c1f0b0d6..dbb60910a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt @@ -32,6 +32,8 @@ class GradeStatisticsAdapter @Inject constructor() : var theme: String = "vulcan" + var showAllSubjectsOnList: Boolean = false + private val vulcanGradeColors = listOf( 6 to R.color.grade_vulcan_six, 5 to R.color.grade_vulcan_five, @@ -59,7 +61,7 @@ class GradeStatisticsAdapter @Inject constructor() : "6, 6-", "5, 5-, 5+", "4, 4-, 4+", "3, 3-, 3+", "2, 2-, 2+", "1, 1+" ) - override fun getItemCount() = items.size + override fun getItemCount() = if (showAllSubjectsOnList) items.size else (if (items.isEmpty()) 0 else 1) override fun getItemViewType(position: Int) = items[position].type.id @@ -82,7 +84,7 @@ class GradeStatisticsAdapter @Inject constructor() : private fun bindPieChart(holder: PieViewHolder, partials: List) { with(holder.binding.gradeStatisticsPieTitle) { text = partials.firstOrNull()?.subject - visibility = if (items.size == 1) GONE else VISIBLE + visibility = if (items.size == 1 || !showAllSubjectsOnList) GONE else VISIBLE } val gradeColors = when (theme) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt index c6786dbcc..3a8f40073 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt @@ -80,17 +80,17 @@ class GradeStatisticsFragment : } } - override fun updateData(items: List, theme: String) { - statisticsAdapter.theme = theme - statisticsAdapter.items = items - statisticsAdapter.notifyDataSetChanged() + override fun updateData(items: List, theme: String, showAllSubjectsOnStatisticsList: Boolean) { + with(statisticsAdapter) { + this.showAllSubjectsOnList = showAllSubjectsOnStatisticsList + this.theme = theme + this.items = items + notifyDataSetChanged() + } } override fun showSubjects(show: Boolean) { - with(binding) { - gradeStatisticsSubjectsContainer.visibility = if (show) View.VISIBLE else View.INVISIBLE - gradeStatisticsTypeSwitch.visibility = if (show) View.VISIBLE else View.INVISIBLE - } + binding.gradeStatisticsSubjectsContainer.visibility = if (show) View.VISIBLE else View.GONE } override fun clearView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt index 90c4e38ef..5cc733cd0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt @@ -128,10 +128,7 @@ class GradeStatisticsPresenter @Inject constructor( .observeOn(schedulers.mainThread) .subscribe({ Timber.i("Loading grade stats subjects result: Success") - view?.run { - updateSubjects(it) - showSubjects(true) - } + view?.updateSubjects(it) }, { Timber.i("Loading grade stats subjects result: An exception occurred") errorHandler.dispatch(it) @@ -140,22 +137,21 @@ class GradeStatisticsPresenter @Inject constructor( } private fun loadDataByType(semesterId: Int, subjectName: String, type: ViewType, forceRefresh: Boolean = false) { - currentSubjectName = subjectName + currentSubjectName = if (preferencesRepository.showAllSubjectsOnStatisticsList) "Wszystkie" else subjectName currentType = type - loadData(semesterId, subjectName, type, forceRefresh) - } - private fun loadData(semesterId: Int, subjectName: String, type: ViewType, forceRefresh: Boolean) { Timber.i("Loading grade stats data started") disposable.add(studentRepository.getCurrentStudent() .flatMap { student -> semesterRepository.getSemesters(student).flatMap { semesters -> val semester = semesters.first { item -> item.semesterId == semesterId } - when (type) { - ViewType.SEMESTER -> gradeStatisticsRepository.getGradesStatistics(student, semester, subjectName, true, forceRefresh) - ViewType.PARTIAL -> gradeStatisticsRepository.getGradesStatistics(student, semester, subjectName, false, forceRefresh) - ViewType.POINTS -> gradeStatisticsRepository.getGradesPointsStatistics(student, semester, subjectName, forceRefresh) + with(gradeStatisticsRepository) { + when (type) { + ViewType.SEMESTER -> getGradesStatistics(student, semester, currentSubjectName, true, forceRefresh) + ViewType.PARTIAL -> getGradesStatistics(student, semester, currentSubjectName, false, forceRefresh) + ViewType.POINTS -> getGradesPointsStatistics(student, semester, currentSubjectName, forceRefresh) + } } } } @@ -175,7 +171,8 @@ class GradeStatisticsPresenter @Inject constructor( showEmpty(it.isEmpty()) showContent(it.isNotEmpty()) showErrorView(false) - updateData(it, preferencesRepository.gradeColorTheme) + updateData(it, preferencesRepository.gradeColorTheme, preferencesRepository.showAllSubjectsOnStatisticsList) + showSubjects(!preferencesRepository.showAllSubjectsOnStatisticsList) } analytics.logEvent("load_grade_statistics", "items" to it.size, "force_refresh" to forceRefresh) }) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsView.kt index 9ba8524c2..26b4a119a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsView.kt @@ -13,7 +13,7 @@ interface GradeStatisticsView : BaseView { fun updateSubjects(data: ArrayList) - fun updateData(items: List, theme: String) + fun updateData(items: List, theme: String, showAllSubjectsOnStatisticsList: Boolean) fun showSubjects(show: Boolean) diff --git a/app/src/main/res/layout/fragment_grade_statistics.xml b/app/src/main/res/layout/fragment_grade_statistics.xml index ecc2e3e00..b3fcac448 100644 --- a/app/src/main/res/layout/fragment_grade_statistics.xml +++ b/app/src/main/res/layout/fragment_grade_statistics.xml @@ -12,7 +12,7 @@ android:layout_height="wrap_content" android:background="?android:windowBackground" android:padding="5dp" - android:visibility="invisible" + android:visibility="gone" tools:ignore="UnusedAttribute" tools:listitem="@layout/item_attendance_summary" tools:visibility="visible"> @@ -59,9 +59,7 @@ android:orientation="horizontal" android:paddingStart="16dp" android:paddingTop="5dp" - android:paddingEnd="16dp" - android:visibility="invisible" - tools:visibility="visible"> + android:paddingEnd="16dp"> Pokazuj obecność we frekwencji Motyw aplikacji Rozwiń oceny + Pokazuj listę wykresów w ocenach klasy Pokazuj lekcje całej klasy Schemat kolorów ocen Język aplikacji diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index be31b440f..29e8751e4 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -5,6 +5,7 @@ only_one_semester false false + false light vulcan system diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 559e2159c..6d683f3f8 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -7,6 +7,7 @@ expand_grade grade_average_mode grade_average_always_calc + grade_statistics_list app_language services_enable services_interval diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c2cbeada2..4deba2130 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -347,6 +347,7 @@ Show presence in attendance Application theme Expand grades + Show chart list in class grades Show whole class lessons Grades color scheme App language diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index bb9eb5fcd..b4adabb98 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -29,6 +29,11 @@ app:iconSpaceReserved="false" app:key="@string/pref_key_expand_grade" app:title="@string/pref_view_expand_grade" /> + + app:key="@string/pref_key_services_force_sync" + app:title="@string/pref_services_force_sync" /> Date: Sat, 16 May 2020 20:46:11 +0000 Subject: [PATCH 0020/1526] Bump firebase-analytics from 17.4.0 to 17.4.1 (#809) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0f35bc822..194296d48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -178,7 +178,7 @@ dependencies { implementation 'com.wdullaer:materialdatetimepicker:4.2.3' implementation "io.coil-kt:coil:0.10.1" - playImplementation 'com.google.firebase:firebase-analytics:17.4.0' + playImplementation 'com.google.firebase:firebase-analytics:17.4.1' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.6' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.6" playImplementation 'com.google.firebase:firebase-messaging:20.1.6' From 9bf5c2dc40c6ca8b684527ecc910a20e8ff8f603 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 16 May 2020 20:48:15 +0000 Subject: [PATCH 0021/1526] Bump firebase-crashlytics-gradle from 2.0.0 to 2.1.0 (#810) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b00d3d797..2b92bc7d8 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.android.tools.build:gradle:3.6.3' classpath 'com.google.gms:google-services:4.3.3' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.0.0' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.0' classpath "com.github.triplet.gradle:play-publisher:2.7.5" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.8" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" From 45265d025d9f7955db9e4e0d305a07284ad4d94b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 16 May 2020 20:52:37 +0000 Subject: [PATCH 0022/1526] Bump appcompat from 1.2.0-beta01 to 1.2.0-rc01 (#811) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 194296d48..c315ac365 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -127,7 +127,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" implementation "androidx.activity:activity-ktx:1.1.0" - implementation "androidx.appcompat:appcompat:1.2.0-beta01" + implementation "androidx.appcompat:appcompat:1.2.0-rc01" implementation "androidx.appcompat:appcompat-resources:1.1.0" implementation "androidx.fragment:fragment-ktx:1.2.4" implementation "androidx.annotation:annotation:1.1.0" From 78a90591fd2ed4b2ab7fd49565fcf6ff397d6f2d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 16 May 2020 21:06:45 +0000 Subject: [PATCH 0023/1526] Bump coil from 0.10.1 to 0.11.0 (#812) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c315ac365..89febc8e3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -176,7 +176,7 @@ dependencies { implementation "fr.bipi.treessence:treessence:0.3.2" implementation "com.mikepenz:aboutlibraries-core:$about_libraries" implementation 'com.wdullaer:materialdatetimepicker:4.2.3' - implementation "io.coil-kt:coil:0.10.1" + implementation "io.coil-kt:coil:0.11.0" playImplementation 'com.google.firebase:firebase-analytics:17.4.1' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.6' From 6cd1877af781e5355a5103bc526c294ba213fdf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 20 May 2020 12:34:29 +0200 Subject: [PATCH 0024/1526] Fix notifications on android 8.0 (#814) --- app/build.gradle | 2 +- .../main/java/io/github/wulkanowy/services/sync/SyncManager.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 89febc8e3..acf4ddd02 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -122,7 +122,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:445905b" + implementation "io.github.wulkanowy:sdk:46619e3" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt index dda2abe0c..965ed0ad9 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt @@ -42,7 +42,7 @@ class SyncManager @Inject constructor( init { if (now().isHolidays) stopSyncWorker() - if (SDK_INT > O) { + if (SDK_INT >= O) { channels.forEach { it.create() } notificationManager.deleteNotificationChannel("new_entries_channel") } From 115da641671e91d5678e1fd3d201b531cd074f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 20 May 2020 14:12:32 +0200 Subject: [PATCH 0025/1526] Add search in messages (#804) --- app/src/main/AndroidManifest.xml | 3 +- .../modules/message/tab/MessageTabAdapter.kt | 38 ++++++++++++++-- .../modules/message/tab/MessageTabFragment.kt | 40 +++++++++++++---- .../message/tab/MessageTabPresenter.kt | 43 ++++++++++++++++--- .../ui/modules/message/tab/MessageTabView.kt | 2 + app/src/main/res/drawable/ic_search.xml | 9 ++++ app/src/main/res/layout/activity_main.xml | 4 +- .../main/res/menu/action_menu_message_tab.xml | 11 +++++ app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values/strings.xml | 2 + 10 files changed, 133 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/drawable/ic_search.xml create mode 100644 app/src/main/res/menu/action_menu_message_tab.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4478f4087..4dd70721e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,7 +39,8 @@ android:name=".ui.modules.main.MainActivity" android:configChanges="orientation|screenSize" android:label="@string/main_title" - android:theme="@style/WulkanowyTheme.NoActionBar" /> + android:theme="@style/WulkanowyTheme.NoActionBar" + android:windowSoftInputMode="adjustPan" /> () { - var items = mutableListOf() - var onClickListener: (Message, position: Int) -> Unit = { _, _ -> } - override fun getItemCount() = items.size + private val items = SortedList(Message::class.java, object : + SortedListAdapterCallback(this) { + + override fun compare(item1: Message, item2: Message): Int { + return item2.date.compareTo(item1.date) + } + + override fun areContentsTheSame(oldItem: Message?, newItem: Message?): Boolean { + return oldItem == newItem + } + + override fun areItemsTheSame(item1: Message, item2: Message): Boolean { + return item1 == item2 + } + }) + + fun replaceAll(models: List) { + items.beginBatchedUpdates() + for (i in items.size() - 1 downTo 0) { + val model = items.get(i) + if (model !in models) { + items.remove(model) + } + } + items.addAll(models) + items.endBatchedUpdates() + } + + fun updateItem(position: Int, item: Message) { + items.updateItemAt(position, item) + } + + override fun getItemCount() = items.size() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( ItemMessageBinding.inflate(LayoutInflater.from(parent.context), parent, false) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt index 3fdf16845..909bb6873 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt @@ -1,10 +1,13 @@ package io.github.wulkanowy.ui.modules.message.tab import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater import android.view.View import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE +import androidx.appcompat.widget.SearchView import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message @@ -39,7 +42,12 @@ class MessageTabFragment : BaseFragment(R.layout.frag } override val isViewEmpty - get() = tabAdapter.items.isEmpty() + get() = tabAdapter.itemCount == 0 + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setHasOptionsMenu(true) + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -65,18 +73,28 @@ class MessageTabFragment : BaseFragment(R.layout.frag } } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + super.onCreateOptionsMenu(menu, inflater) + inflater.inflate(R.menu.action_menu_message_tab, menu) + + val searchView = menu.findItem(R.id.action_search).actionView as SearchView + searchView.queryHint = getString(R.string.all_search_hint) + searchView.maxWidth = Int.MAX_VALUE + searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String) = false + override fun onQueryTextChange(query: String): Boolean { + presenter.onSearchQueryTextChange(query) + return true + } + }) + } + override fun updateData(data: List) { - with(tabAdapter) { - items = data.toMutableList() - notifyDataSetChanged() - } + tabAdapter.replaceAll(data) } override fun updateItem(item: Message, position: Int) { - with(tabAdapter) { - items[position] = item - notifyItemChanged(position) - } + tabAdapter.updateItem(position, item) } override fun showProgress(show: Boolean) { @@ -87,6 +105,10 @@ class MessageTabFragment : BaseFragment(R.layout.frag binding.messageTabSwipe.isEnabled = enable } + override fun resetListPosition() { + binding.messageTabRecycler.scrollToPosition(0) + } + override fun showContent(show: Boolean) { binding.messageTabRecycler.visibility = if (show) VISIBLE else INVISIBLE } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 37b45d03d..f96fb6c2a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.message.tab +import android.annotation.SuppressLint import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.message.MessageFolder import io.github.wulkanowy.data.repositories.message.MessageRepository @@ -9,6 +10,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.toFormattedString import timber.log.Timber import javax.inject.Inject @@ -25,6 +27,10 @@ class MessageTabPresenter @Inject constructor( private lateinit var lastError: Throwable + private var lastSearchQuery = "" + + private var messages = emptyList() + fun onAttachView(view: MessageTabView, folder: MessageFolder) { super.onAttachView(view) view.initView() @@ -89,12 +95,8 @@ class MessageTabPresenter @Inject constructor( } .subscribe({ Timber.i("Loading $folder message result: Success") - view?.run { - showEmpty(it.isEmpty()) - showContent(it.isNotEmpty()) - showErrorView(false) - updateData(it) - } + messages = it + onSearchQueryTextChange(lastSearchQuery) analytics.logEvent("load_messages", "items" to it.size, "folder" to folder.name) }) { Timber.i("Loading $folder message result: An exception occurred") @@ -113,4 +115,33 @@ class MessageTabPresenter @Inject constructor( } else showError(message, error) } } + + @SuppressLint("DefaultLocale") + fun onSearchQueryTextChange(query: String) { + lastSearchQuery = query + + val lowerCaseQuery = query.toLowerCase() + val filteredList = mutableListOf() + messages.forEach { + if (lowerCaseQuery in it.subject.toLowerCase() || + lowerCaseQuery in it.sender.toLowerCase() || + lowerCaseQuery in it.recipient.toLowerCase() || + lowerCaseQuery in it.date.toFormattedString() + ) { + filteredList.add(it) + } + } + + updateData(filteredList) + } + + private fun updateData(data: List) { + view?.run { + showEmpty(data.isEmpty()) + showContent(data.isNotEmpty()) + showErrorView(false) + updateData(data) + resetListPosition() + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt index 94ece8ec2..f521191cf 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt @@ -9,6 +9,8 @@ interface MessageTabView : BaseView { fun initView() + fun resetListPosition() + fun updateData(data: List) fun updateItem(item: Message, position: Int) diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 000000000..cd9985cb1 --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d07dbbd8a..2ea0a4d39 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,6 @@ @@ -8,7 +9,8 @@ android:id="@+id/mainToolbar" style="@style/Widget.MaterialComponents.Toolbar.Surface" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + app:contentInsetStartWithNavigation="0dp" /> + + + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 523221f01..bff422927 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -298,6 +298,7 @@ Przedmiot Poprzedni Następny + Szukaj Brak lekcji Wybierz motyw diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4deba2130..0a837c46b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -329,6 +329,8 @@ Subject Prev Next + Search + Search... From 29226dd93e9dfcf72ec80e476331d1bcc43c6e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 20 May 2020 15:11:01 +0200 Subject: [PATCH 0026/1526] Add notification about upcoming lesson (#578) --- .../timetable/TimetableRepositoryTest.kt | 20 ++- app/src/main/AndroidManifest.xml | 2 + .../github/wulkanowy/data/RepositoryModule.kt | 2 + .../preferences/PreferencesRepository.kt | 4 + .../timetable/TimetableRepository.kt | 10 +- .../io/github/wulkanowy/di/BindingModule.kt | 4 + .../wulkanowy/services/ServicesModule.kt | 11 ++ .../alarm/TimetableNotificationReceiver.kt | 117 ++++++++++++++++++ .../TimetableNotificationSchedulerHelper.kt | 109 ++++++++++++++++ .../sync/channels/UpcomingLessonsChannel.kt | 31 +++++ .../ui/modules/settings/SettingsPresenter.kt | 6 +- .../github/wulkanowy/utils/TimeExtension.kt | 8 ++ .../res/drawable-hdpi/ic_stat_timetable.png | Bin 0 -> 312 bytes .../res/drawable-mdpi/ic_stat_timetable.png | Bin 0 -> 275 bytes .../res/drawable-xhdpi/ic_stat_timetable.png | Bin 0 -> 358 bytes .../res/drawable-xxhdpi/ic_stat_timetable.png | Bin 0 -> 459 bytes .../drawable-xxxhdpi/ic_stat_timetable.png | Bin 0 -> 659 bytes app/src/main/res/values-pl/strings.xml | 5 + .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 5 + app/src/main/res/xml/scheme_preferences.xml | 5 + 22 files changed, 333 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt create mode 100644 app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt create mode 100644 app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt create mode 100644 app/src/main/res/drawable-hdpi/ic_stat_timetable.png create mode 100644 app/src/main/res/drawable-mdpi/ic_stat_timetable.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_stat_timetable.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_stat_timetable.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_stat_timetable.png diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt index fdf193a26..75f2f0b83 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt @@ -8,12 +8,15 @@ import androidx.test.filters.SdkSuppress import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy import io.github.wulkanowy.data.repositories.getStudent +import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper import io.github.wulkanowy.sdk.Sdk import io.mockk.MockKAnnotations import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.mockk import io.reactivex.Single import org.junit.After import org.junit.Before @@ -34,11 +37,17 @@ class TimetableRepositoryTest { .strategy(TestInternetObservingStrategy()) .build() + @MockK + private lateinit var studentMock: Student + private val student = getStudent() @MockK private lateinit var semesterMock: Semester + @MockK + private lateinit var timetableNotificationSchedulerHelper: TimetableNotificationSchedulerHelper + private lateinit var timetableRemote: TimetableRemote private lateinit var timetableLocal: TimetableLocal @@ -52,10 +61,17 @@ class TimetableRepositoryTest { timetableLocal = TimetableLocal(testDb.timetableDao) timetableRemote = TimetableRemote(mockSdk) + every { timetableNotificationSchedulerHelper.scheduleNotifications(any(), any()) } returns mockk() + every { timetableNotificationSchedulerHelper.cancelScheduled(any(), any()) } returns mockk() + + every { studentMock.studentId } returns 1 + every { studentMock.studentName } returns "Jan Kowalski" + every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 2 every { semesterMock.schoolYear } returns 2019 every { semesterMock.semesterId } returns 1 + every { mockSdk.switchDiary(any(), any()) } returns mockSdk } @@ -80,7 +96,7 @@ class TimetableRepositoryTest { createTimetableRemote(of(2019, 3, 5, 10, 30), 4, "", "W-F") )) - val lessons = TimetableRepository(settings, timetableLocal, timetableRemote) + val lessons = TimetableRepository(settings, timetableLocal, timetableRemote, timetableNotificationSchedulerHelper) .getTimetable(student, semesterMock, LocalDate.of(2019, 3, 5), LocalDate.of(2019, 3, 5), true) .blockingGet() @@ -126,7 +142,7 @@ class TimetableRepositoryTest { createTimetableRemote(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "Paweł Czwartkowski", true) )) - val lessons = TimetableRepository(settings, timetableLocal, timetableRemote) + val lessons = TimetableRepository(settings, timetableLocal, timetableRemote, timetableNotificationSchedulerHelper) .getTimetable(student, semesterMock, LocalDate.of(2019, 12, 23), LocalDate.of(2019, 12, 25), true) .blockingGet() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4dd70721e..4ec2f7816 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -92,6 +92,8 @@ android:resource="@xml/provider_widget_lucky_number" /> + + > { @@ -31,8 +33,8 @@ class TimetableRepository @Inject constructor( local.getTimetable(semester, monday, friday) .toSingle(emptyList()) .doOnSuccess { old -> - local.deleteTimetable(old.uniqueSubtract(new)) - local.saveTimetable(new.uniqueSubtract(old).map { item -> + local.deleteTimetable(old.uniqueSubtract(new).also { schedulerHelper.cancelScheduled(it) }) + local.saveTimetable(new.uniqueSubtract(old).also { schedulerHelper.scheduleNotifications(it, student) }.map { item -> item.also { new -> old.singleOrNull { new.start == it.start }?.let { old -> return@map new.copy( @@ -45,7 +47,7 @@ class TimetableRepository @Inject constructor( } }.flatMap { local.getTimetable(semester, monday, friday).toSingle(emptyList()) - }).map { list -> list.filter { it.date in start..end } } + }).map { list -> list.filter { it.date in start..end }.also { schedulerHelper.scheduleNotifications(it, student) } } } } } diff --git a/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt b/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt index ba8c78d3f..1b462964d 100644 --- a/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt @@ -4,6 +4,7 @@ import dagger.Module import dagger.android.ContributesAndroidInjector import io.github.wulkanowy.di.scopes.PerActivity import io.github.wulkanowy.ui.base.ErrorDialog +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginModule import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetConfigureActivity @@ -48,4 +49,7 @@ internal abstract class BindingModule { @ContributesAndroidInjector abstract fun bindLuckyNumberWidgetProvider(): LuckyNumberWidgetProvider + + @ContributesAndroidInjector + abstract fun bindTimetableNotificationReceiver(): TimetableNotificationReceiver } diff --git a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt index c7c573e27..b87f0e683 100644 --- a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt +++ b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt @@ -1,7 +1,9 @@ package io.github.wulkanowy.services +import android.app.AlarmManager import android.content.Context import androidx.core.app.NotificationManagerCompat +import androidx.core.content.getSystemService import androidx.work.WorkManager import com.squareup.inject.assisted.dagger2.AssistedModule import dagger.Binds @@ -15,6 +17,7 @@ import io.github.wulkanowy.services.sync.channels.LuckyNumberChannel import io.github.wulkanowy.services.sync.channels.NewGradesChannel import io.github.wulkanowy.services.sync.channels.NewMessagesChannel import io.github.wulkanowy.services.sync.channels.NewNotesChannel +import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel import io.github.wulkanowy.services.sync.channels.PushChannel import io.github.wulkanowy.services.sync.works.AttendanceSummaryWork import io.github.wulkanowy.services.sync.works.AttendanceWork @@ -46,6 +49,10 @@ abstract class ServicesModule { @Singleton @Provides fun provideNotificationManager(context: Context) = NotificationManagerCompat.from(context) + + @Singleton + @Provides + fun provideAlarmManager(context: Context): AlarmManager = context.getSystemService()!! } @ContributesAndroidInjector @@ -126,4 +133,8 @@ abstract class ServicesModule { @Binds @IntoSet abstract fun providePushChannel(channel: PushChannel): Channel + + @Binds + @IntoSet + abstract fun provideUpcomingLessonsChannel(channel: UpcomingLessonsChannel): Channel } diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt new file mode 100644 index 000000000..0130f4673 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt @@ -0,0 +1,117 @@ +package io.github.wulkanowy.services.alarm + +import android.annotation.SuppressLint +import android.app.PendingIntent +import android.app.PendingIntent.FLAG_UPDATE_CURRENT +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.os.Build +import android.os.Build.VERSION_CODES.N +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import dagger.android.AndroidInjection +import io.github.wulkanowy.R +import io.github.wulkanowy.data.repositories.student.StudentRepository +import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel.Companion.CHANNEL_ID +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.getCompatColor +import io.github.wulkanowy.utils.toLocalDateTime +import timber.log.Timber +import javax.inject.Inject + +class TimetableNotificationReceiver : BroadcastReceiver() { + + @Inject + lateinit var studentRepository: StudentRepository + + @Inject + lateinit var schedulers: SchedulersProvider + + companion object { + const val NOTIFICATION_TYPE_CURRENT = 1 + const val NOTIFICATION_TYPE_UPCOMING = 2 + const val NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION = 3 + + const val NOTIFICATION_ID = "id" + + const val STUDENT_NAME = "student_name" + const val STUDENT_ID = "student_id" + const val LESSON_TYPE = "type" + const val LESSON_TITLE = "title" + const val LESSON_ROOM = "room" + const val LESSON_NEXT_TITLE = "next_title" + const val LESSON_NEXT_ROOM = "next_room" + const val LESSON_START = "start_timestamp" + const val LESSON_END = "end_timestamp" + } + + @SuppressLint("CheckResult") + override fun onReceive(context: Context, intent: Intent) { + Timber.d("Receiving intent... ${intent.toUri(0)}") + AndroidInjection.inject(this, context) + + studentRepository.getCurrentStudent(false) + .subscribeOn(schedulers.backgroundThread) + .observeOn(schedulers.mainThread) + .subscribe({ + val studentId = intent.getIntExtra(STUDENT_ID, 0) + if (it.studentId == studentId) prepareNotification(context, intent) + else Timber.d("Notification studentId($studentId) differs from current(${it.studentId})") + }, { Timber.e(it) }) + } + + private fun prepareNotification(context: Context, intent: Intent) { + val type = intent.getIntExtra(LESSON_TYPE, 0) + val notificationId = intent.getIntExtra(NOTIFICATION_ID, MainView.Section.TIMETABLE.id) + + if (type == NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION) { + return NotificationManagerCompat.from(context).cancel(notificationId) + } + + val studentId = intent.getIntExtra(STUDENT_ID, 0) + val studentName = intent.getStringExtra(STUDENT_NAME) + + val subject = intent.getStringExtra(LESSON_TITLE) + val room = intent.getStringExtra(LESSON_ROOM) + + val start = intent.getLongExtra(LESSON_START, 0) + val end = intent.getLongExtra(LESSON_END, 0) + + val nextSubject = intent.getStringExtra(LESSON_NEXT_TITLE) + val nextRoom = intent.getStringExtra(LESSON_NEXT_ROOM) + + Timber.d("TimetableNotification receive: type: $type, subject: $subject, start: ${start.toLocalDateTime()}, student: $studentId") + + showNotification(context, notificationId, studentName, + if (type == NOTIFICATION_TYPE_CURRENT) end else start, end - start, + context.getString(if (type == NOTIFICATION_TYPE_CURRENT) R.string.timetable_now else R.string.timetable_next, "($room) $subject".removePrefix("()")), + nextSubject?.let { context.getString(R.string.timetable_later, "($nextRoom) $nextSubject".removePrefix("()")) } + ) + } + + private fun showNotification(context: Context, notificationId: Int, studentName: String?, countDown: Long, timeout: Long, title: String, next: String?) { + NotificationManagerCompat.from(context).notify(notificationId, NotificationCompat.Builder(context, CHANNEL_ID) + .setContentTitle(title) + .setContentText(next) + .setAutoCancel(false) + .setOngoing(true) + .setWhen(countDown) + .apply { + if (Build.VERSION.SDK_INT >= N) setUsesChronometer(true) + } + .setTimeoutAfter(timeout) + .setSmallIcon(R.drawable.ic_stat_timetable) + .setColor(context.getCompatColor(R.color.colorPrimary)) + .setStyle(NotificationCompat.InboxStyle().also { + it.setSummaryText(studentName) + it.addLine(next) + }) + .setContentIntent(PendingIntent.getActivity(context, MainView.Section.TIMETABLE.id, + MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true), FLAG_UPDATE_CURRENT)) + .build() + ) + } +} diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt new file mode 100644 index 000000000..5374c4767 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt @@ -0,0 +1,109 @@ +package io.github.wulkanowy.services.alarm + +import android.app.AlarmManager +import android.app.AlarmManager.RTC_WAKEUP +import android.app.PendingIntent +import android.app.PendingIntent.FLAG_CANCEL_CURRENT +import android.content.Context +import android.content.Intent +import androidx.core.app.AlarmManagerCompat +import androidx.core.app.NotificationManagerCompat +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.Timetable +import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.LESSON_END +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.LESSON_NEXT_ROOM +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.LESSON_NEXT_TITLE +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.LESSON_ROOM +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.LESSON_START +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.LESSON_TITLE +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.LESSON_TYPE +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.NOTIFICATION_ID +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.NOTIFICATION_TYPE_CURRENT +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.NOTIFICATION_TYPE_UPCOMING +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_ID +import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_NAME +import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.utils.toTimestamp +import org.threeten.bp.LocalDateTime +import org.threeten.bp.LocalDateTime.now +import timber.log.Timber +import javax.inject.Inject + +class TimetableNotificationSchedulerHelper @Inject constructor( + private val context: Context, + private val alarmManager: AlarmManager, + private val preferencesRepository: PreferencesRepository +) { + + private fun getRequestCode(time: LocalDateTime, studentId: Int) = (time.toTimestamp() * studentId).toInt() + + private fun getUpcomingLessonTime(index: Int, day: List, lesson: Timetable): LocalDateTime { + return day.getOrNull(index - 1)?.end ?: lesson.start.minusMinutes(30) + } + + fun cancelScheduled(lessons: List, studentId: Int = 1) { + lessons.sortedBy { it.start }.forEachIndexed { index, lesson -> + val upcomingTime = getUpcomingLessonTime(index, lessons, lesson) + 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") + } + } + + private fun cancelScheduledTo(range: ClosedRange, requestCode: Int) { + if (now() in range) cancelNotification() + alarmManager.cancel(PendingIntent.getBroadcast(context, requestCode, Intent(), FLAG_CANCEL_CURRENT)) + } + + fun cancelNotification() = NotificationManagerCompat.from(context).cancel(MainView.Section.TIMETABLE.id) + + fun scheduleNotifications(lessons: List, student: Student) { + if (!preferencesRepository.isUpcomingLessonsNotificationsEnable) return cancelScheduled(lessons, student.studentId) + + lessons.groupBy { it.date } + .map { it.value.sortedBy { lesson -> lesson.start } } + .map { it.filter { lesson -> !lesson.canceled && lesson.isStudentPlan } } + .map { day -> + day.forEachIndexed { index, lesson -> + val intent = createIntent(student, lesson, day.getOrNull(index + 1)) + + if (lesson.start > now()) { + scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_UPCOMING, getUpcomingLessonTime(index, day, lesson)) + } + + if (lesson.end > now()) { + scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_CURRENT, lesson.start) + if (day.lastIndex == index) { + scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION, lesson.end) + } + } + } + } + } + + private fun createIntent(student: Student, lesson: Timetable, nextLesson: Timetable?): Intent { + return Intent(context, TimetableNotificationReceiver::class.java).apply { + putExtra(STUDENT_ID, student.studentId) + putExtra(STUDENT_NAME, student.studentName) + putExtra(LESSON_ROOM, lesson.room) + putExtra(LESSON_START, lesson.start.toTimestamp()) + putExtra(LESSON_END, lesson.end.toTimestamp()) + putExtra(LESSON_TITLE, lesson.subject) + putExtra(LESSON_NEXT_TITLE, nextLesson?.subject) + putExtra(LESSON_NEXT_ROOM, nextLesson?.room) + } + } + + private fun scheduleBroadcast(intent: Intent, studentId: Int, notificationType: Int, time: LocalDateTime) { + AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, RTC_WAKEUP, time.toTimestamp(), + PendingIntent.getBroadcast(context, getRequestCode(time, studentId), intent.also { + it.putExtra(NOTIFICATION_ID, MainView.Section.TIMETABLE.id) + it.putExtra(LESSON_TYPE, notificationType) + }, FLAG_CANCEL_CURRENT) + ) + Timber.d("TimetableNotification scheduled: type: $notificationType, subject: ${intent.getStringExtra(LESSON_TITLE)}, start: $time, student: $studentId") + } +} diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt new file mode 100644 index 000000000..a292c8b53 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt @@ -0,0 +1,31 @@ +package io.github.wulkanowy.services.sync.channels + +import android.annotation.TargetApi +import android.app.Notification.VISIBILITY_PUBLIC +import android.app.NotificationChannel +import android.app.NotificationManager.IMPORTANCE_DEFAULT +import android.content.Context +import androidx.core.app.NotificationManagerCompat +import io.github.wulkanowy.R +import javax.inject.Inject + +@TargetApi(26) +class UpcomingLessonsChannel @Inject constructor( + private val notificationManager: NotificationManagerCompat, + private val context: Context +) : Channel { + + companion object { + const val CHANNEL_ID = "lesson_channel" + } + + override fun create() { + notificationManager.createNotificationChannel( + NotificationChannel(CHANNEL_ID, context.getString(R.string.channel_upcoming_lessons), IMPORTANCE_DEFAULT).apply { + lockscreenVisibility = VISIBILITY_PUBLIC + setShowBadge(false) + enableVibration(false) + } + ) + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt index c8545ac0e..09fc2d707 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt @@ -4,6 +4,7 @@ import androidx.work.WorkInfo import com.chuckerteam.chucker.api.ChuckerCollector import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.student.StudentRepository +import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler @@ -20,6 +21,7 @@ class SettingsPresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, private val preferencesRepository: PreferencesRepository, + private val timetableNotificationHelper: TimetableNotificationSchedulerHelper, private val analytics: FirebaseAnalyticsHelper, private val syncManager: SyncManager, private val chuckerCollector: ChuckerCollector, @@ -36,17 +38,17 @@ class SettingsPresenter @Inject constructor( fun onSharedPreferenceChanged(key: String) { Timber.i("Change settings $key") - with(preferencesRepository) { + preferencesRepository.apply { when (key) { serviceEnableKey -> with(syncManager) { if (isServiceEnabled) startPeriodicSyncWorker() else stopSyncWorker() } servicesIntervalKey, servicesOnlyWifiKey -> syncManager.startPeriodicSyncWorker(true) isDebugNotificationEnableKey -> chuckerCollector.showNotification = isDebugNotificationEnable appThemeKey -> view?.recreateView() + isUpcomingLessonsNotificationsEnableKey -> if (!isUpcomingLessonsNotificationsEnable) timetableNotificationHelper.cancelNotification() appLanguageKey -> view?.run { updateLanguage(if (appLanguage == "system") appInfo.systemLanguage else appLanguage) recreateView() } - else -> Unit } } analytics.logEvent("setting_changed", "name" to key) diff --git a/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt index a91f823fa..8d022fc5d 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt @@ -4,9 +4,13 @@ import org.threeten.bp.DayOfWeek.FRIDAY import org.threeten.bp.DayOfWeek.MONDAY import org.threeten.bp.DayOfWeek.SATURDAY import org.threeten.bp.DayOfWeek.SUNDAY +import org.threeten.bp.Instant.ofEpochMilli import org.threeten.bp.LocalDate import org.threeten.bp.LocalDateTime +import org.threeten.bp.LocalDateTime.ofInstant import org.threeten.bp.Month +import org.threeten.bp.ZoneId +import org.threeten.bp.ZoneOffset import org.threeten.bp.format.DateTimeFormatter.ofPattern import org.threeten.bp.format.TextStyle.FULL_STANDALONE import org.threeten.bp.temporal.TemporalAdjusters.firstInMonth @@ -18,6 +22,10 @@ private const val DATE_PATTERN = "dd.MM.yyyy" fun String.toLocalDate(format: String = DATE_PATTERN): LocalDate = LocalDate.parse(this, ofPattern(format)) +fun LocalDateTime.toTimestamp() = atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneOffset.UTC).toInstant().toEpochMilli() + +fun Long.toLocalDateTime() = ofInstant(ofEpochMilli(this), ZoneId.systemDefault()) + fun LocalDate.toFormattedString(format: String = DATE_PATTERN): String = format(ofPattern(format)) fun LocalDateTime.toFormattedString(format: String = DATE_PATTERN): String = format(ofPattern(format)) diff --git a/app/src/main/res/drawable-hdpi/ic_stat_timetable.png b/app/src/main/res/drawable-hdpi/ic_stat_timetable.png new file mode 100644 index 0000000000000000000000000000000000000000..201419d5d48501c657d592ea41c27763c5e6eb7f GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?{P%Qm45_&Fc7`F>Ap?=N z=r00ane_AyI=%>-W8?OI0sD(k8Ji|Pt1og{FK=w@4hS&#*BJgn=}W7N_a*s#2Os{e zIqZE|iY58jAB`X{Mj_T>J;j#Hg)u=higSy$w*(k4dT(Hr)UbXk*=(lz_g$+H%;Jzqs#YF15yVeRuwq zE7ecAWDnfFw0pvV1> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_stat_timetable.png b/app/src/main/res/drawable-mdpi/ic_stat_timetable.png new file mode 100644 index 0000000000000000000000000000000000000000..dcfe95f26582f0cb2cee7b00e660fd2f50f7523e GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoZh5*mhE&{2PLSC4;Q#;s ziyYSQ9;vCg^1<cM~h eL$(bA!bd+c{ zby-xvC_Z7WiIBNN_Ri)N+cs!*2JdLj)ez-#^xnBPLvzDDmEasTsXFV)vF}ym7yr0l zGx^Mh)geg|&;CzRIcebPZm@jvywqTYxgG}UUi^z36j=?nv#}*`hNWo=y*|HB(ahYr ze8oD!75|ey1{bh|fAHDV|7u60@QjtF9xT5eBxF8(@A7Sdx**5bbGy4<@u@O#Cof2U z*z}?294l*=ihzW@@+O57K?htl0yG-$%x8>SEb?ROf!Ru)He7!eJ2-z(NxSqwahU_( z`iuGJ9435!-`K$<@<7+6vA^x?!NU)QXTF-}&7$_;(TB<(Jja9@&2BXAZa%vDoNk6E z%c@_zU)|oft-bzwRW|Rg1xmIdq8F|x?Q1oD@LKO`-gW>xpPn@89S-al9}J9&9Wzrv2P0#Vl$e6gEebN^sp`A%uuf+pE@`?LPvNh1aZ28J0D&tvqu=S#`0Ut!R1IYIt|c-!&SixdPJIb0U3 z3)UqBpnn8S9&;y4#&Jx9qZ*Fh5se{?pDopY|U#x-iRT zit}{2!v?=sr7mEue0=HYtuJz->z+CuYW(vieOhCc==VAQ~LV|G6={L=x|_Bx)8$Z^)j$IbzUvV5eiJbg$HJBXHjkBa8Y0qd{N&R zWoj3+CF0plc91TmfGwwM92FoYd=FGkpP4QXQrF=iEdRl)PVLX5L+x*(*sP}YbF%N6 z?mn%t?C}1KDG77*D;3Lin17yM@a<`KQ)ApA&bSRcCfd`VwC$O~|8Q5|&v}p2-<&Gl zsgb@Wysa(gRPIjo+k*QYuJRfGiu}7hua^fDbjKb^@7i+j?NW~ATR>b-S3j3^P6qC8z3Ln>~)oonkI<0#=a zy@Q3tGf|KuTTu6sdyqy)rifw`$2GN@4oB#><@d%FjQ2cV^f3S*IBpAmB)Qao)1Fxr}|wH(xV6DzQMU zmEm~sic$v_1qMbA2L>jA28Nlwj|V#Xf7U%Ucq^PnlncZ-f4JXEuwCuM=1O_`WyUEPQ3&EvRF`?k-?HEqT9Xh5Gc@ zh7Lvo4GdsG2L`4MJgLgZ+%U9Coxk0=I^Q;5`oYpS)9yc+X0y#) z?f;gKSuXk&SJQTFko+6`DEx`^Pn$17Z{Pptm)IbBc$I95<{}2w*)MnRe{!Py+tH?D z$2Yj;P0-!s+;^hTQny=B*SXv5@{Y4VZl&d&fJOKf{(6S(WqGodziny Zmiany Brak lekcji w tym dniu + Teraz: %s + Za chwilę: %s + Później: %s Lekcje zrealizowane Zobacz lekcje zrealizowane @@ -319,6 +322,7 @@ Język aplikacji Powiadomienia Pokazuj powiadomienia + Pokazuj powiadomienia o następnych lekcjach Pokazuj powiadomienia debugowania Synchronizacja Automatyczna aktualizacja @@ -344,6 +348,7 @@ Nowe wiadomości Nowe uwagi Powiadomienia push + Nadchodzące lekcje Debugowanie Czarny diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 29e8751e4..c8704a50b 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -13,6 +13,7 @@ 60 false true + false false 0.33 0.33 diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 6d683f3f8..1d43f79fd 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -14,6 +14,7 @@ services_disable_wifi_only services_force_sync notifications_enable + notifications_upcoming_lessons_enable notification_debug grade_modifier_plus grade_modifier_minus diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0a837c46b..bfaece677 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -130,6 +130,9 @@ Hours Changes No lessons this day + Now: %s + Next: %s + Later: %s @@ -356,6 +359,7 @@ Notifications Show notifications + Show upcoming lesson notifications Show debug notifications Synchronization @@ -386,6 +390,7 @@ New messages New notes Push notifications + Upcoming lessons Debug diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index b4adabb98..d890fdb24 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -96,6 +96,11 @@ app:iconSpaceReserved="false" app:key="@string/pref_key_notifications_enable" app:title="@string/pref_notify_switch" /> + Date: Wed, 20 May 2020 16:06:24 +0200 Subject: [PATCH 0027/1526] Add lesson time left display (#550) --- .../preferences/PreferencesRepository.kt | 3 + .../login/recover/LoginRecoverFragment.kt | 2 + .../ui/modules/timetable/TimetableAdapter.kt | 125 +++++++++++++++--- .../ui/modules/timetable/TimetableFragment.kt | 7 +- .../modules/timetable/TimetablePresenter.kt | 2 +- .../ui/modules/timetable/TimetableView.kt | 2 +- .../wulkanowy/utils/TimetableExtension.kt | 29 ++++ .../background_timetable_time_left.xml | 6 + app/src/main/res/layout/item_timetable.xml | 56 +++++++- app/src/main/res/values-pl/strings.xml | 6 + .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 6 + app/src/main/res/xml/scheme_preferences.xml | 5 + .../repositories => }/TestEnityCreator.kt | 29 +++- .../attendance/AttendanceRemoteTest.kt | 3 +- .../CompletedLessonsRemoteTest.kt | 2 +- .../data/repositories/exam/ExamRemoteTest.kt | 2 +- .../GradeStatisticsRemoteTest.kt | 2 +- .../luckynumber/LuckyNumberRemoteTest.kt | 2 +- .../MobileDeviceRepositoryTest.kt | 2 +- .../semester/SemesterRepositoryTest.kt | 2 +- .../timetable/TimetableRemoteTest.kt | 2 +- .../modules/grade/GradeAverageProviderTest.kt | 2 +- .../wulkanowy/utils/TimetableExtensionTest.kt | 43 ++++++ 25 files changed, 309 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt create mode 100644 app/src/main/res/drawable/background_timetable_time_left.xml rename app/src/test/java/io/github/wulkanowy/{data/repositories => }/TestEnityCreator.kt (67%) create mode 100644 app/src/test/java/io/github/wulkanowy/utils/TimetableExtensionTest.kt diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index b916bf96f..6b13563a4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -75,6 +75,9 @@ class PreferencesRepository @Inject constructor( val showWholeClassPlan: String get() = getString(R.string.pref_key_timetable_show_whole_class, R.string.pref_default_timetable_show_whole_class) + val showTimetableTimers: Boolean + get() = getBoolean(R.string.pref_key_timetable_show_timers, R.bool.pref_default_timetable_show_timers) + private fun getString(id: Int, default: Int) = getString(context.getString(id), default) private fun getString(id: String, default: Int) = sharedPref.getString(id, context.getString(default)) ?: context.getString(default) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt index 06c91cbea..97e45be9b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt @@ -179,6 +179,8 @@ class LoginRecoverFragment : loadDataWithBaseURL(url, html, "text/html", "UTF-8", null) addJavascriptInterface(object { + + @Suppress("UNUSED") @JavascriptInterface fun captchaCallback(reCaptchaResponse: String) { activity?.runOnUiThread { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index b4b2671e0..5354442aa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -2,6 +2,8 @@ package io.github.wulkanowy.ui.modules.timetable import android.graphics.Paint import android.view.LayoutInflater +import android.view.View.GONE +import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView @@ -10,8 +12,16 @@ import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.databinding.ItemTimetableBinding import io.github.wulkanowy.databinding.ItemTimetableSmallBinding import io.github.wulkanowy.utils.getThemeAttrColor +import io.github.wulkanowy.utils.isJustFinished +import io.github.wulkanowy.utils.isShowTimeUntil +import io.github.wulkanowy.utils.left import io.github.wulkanowy.utils.toFormattedString +import io.github.wulkanowy.utils.until +import org.threeten.bp.LocalDateTime +import timber.log.Timber +import java.util.Timer import javax.inject.Inject +import kotlin.concurrent.timer class TimetableAdapter @Inject constructor() : RecyclerView.Adapter() { @@ -20,12 +30,28 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter() + var items = mutableListOf() + set(value) { + field = value + resetTimers() + } var onClickListener: (Timetable) -> Unit = {} var showWholeClassPlan: String = "no" + var showTimers: Boolean = false + + private val timers = mutableMapOf() + + private fun resetTimers() { + Timber.d("Timetable timers reset") + with(timers) { + forEach { (_, timer) -> timer.cancel() } + clear() + } + } + override fun getItemCount() = items.size override fun getItemViewType(position: Int) = when { @@ -43,11 +69,16 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter bindNormalView(holder.binding, lesson) + is ItemViewHolder -> bindNormalView(holder.binding, lesson, position) is SmallItemViewHolder -> bindSmallView(holder.binding, lesson) } } @@ -68,7 +99,7 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter i < position && !item.isStudentPlan }.size)?.let { + if (!it.canceled && it.isStudentPlan) it.end + else null + } + } + + private fun updateTimeLeft(binding: ItemTimetableBinding, lesson: Timetable, position: Int) { + with(binding) { + when { + // before lesson + lesson.isShowTimeUntil(getPreviousLesson(position)) -> { + Timber.d("Show time until lesson: $position") + timetableItemTimeLeft.visibility = GONE + with(timetableItemTimeUntil) { + visibility = VISIBLE + text = context.getString(R.string.timetable_time_until, + if (lesson.until.seconds <= 60) { + context.getString(R.string.timetable_seconds, lesson.until.seconds.toString(10)) + } else { + context.getString(R.string.timetable_minutes, lesson.until.toMinutes().toString(10)) + } + ) + } + } + // after lesson start + lesson.left != null -> { + Timber.d("Show time left lesson: $position") + timetableItemTimeUntil.visibility = GONE + with(timetableItemTimeLeft) { + visibility = VISIBLE + text = context.getString( + R.string.timetable_time_left, + if (lesson.left!!.seconds < 60) { + context.getString(R.string.timetable_seconds, lesson.left?.seconds?.toString(10)) + } else { + context.getString(R.string.timetable_minutes, lesson.left?.toMinutes()?.toString(10)) + } + ) + } + } + // right after lesson finish + lesson.isJustFinished -> { + Timber.d("Show just finished lesson: $position") + timetableItemTimeUntil.visibility = GONE + timetableItemTimeLeft.visibility = VISIBLE + timetableItemTimeLeft.text = root.context.getString(R.string.timetable_finished) + } + else -> { + timetableItemTimeUntil.visibility = GONE + timetableItemTimeLeft.visibility = GONE + } + } + } + } + private fun bindSubjectStyle(subjectView: TextView, lesson: Timetable) { subjectView.paintFlags = if (lesson.canceled) subjectView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG else subjectView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() @@ -93,20 +188,20 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter(R.layout.fragme else false } - override fun updateData(data: List, showWholeClassPlanType: String) { + override fun updateData(data: List, showWholeClassPlanType: String, showTimetableTimers: Boolean) { with(timetableAdapter) { - items = data + items = data.toMutableList() + showTimers = showTimetableTimers showWholeClassPlan = showWholeClassPlanType notifyDataSetChanged() } @@ -96,7 +97,7 @@ class TimetableFragment : BaseFragment(R.layout.fragme override fun clearData() { with(timetableAdapter) { - items = emptyList() + items = mutableListOf() notifyDataSetChanged() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 03d79081d..50c123646 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -149,7 +149,7 @@ class TimetablePresenter @Inject constructor( .subscribe({ Timber.i("Loading timetable result: Success") view?.apply { - updateData(it, prefRepository.showWholeClassPlan) + updateData(it, prefRepository.showWholeClassPlan, prefRepository.showTimetableTimers) showEmpty(it.isEmpty()) showErrorView(false) showContent(it.isNotEmpty()) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt index 8399498c6..1efa320fc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt @@ -12,7 +12,7 @@ interface TimetableView : BaseView { fun initView() - fun updateData(data: List, showWholeClassPlanType: String) + fun updateData(data: List, showWholeClassPlanType: String, showTimetableTimers: Boolean) fun updateNavigationDay(date: String) diff --git a/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt new file mode 100644 index 000000000..ccb2afeb0 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt @@ -0,0 +1,29 @@ +package io.github.wulkanowy.utils + +import io.github.wulkanowy.data.db.entities.Timetable +import org.threeten.bp.Duration +import org.threeten.bp.Duration.between +import org.threeten.bp.LocalDateTime +import org.threeten.bp.LocalDateTime.now + +fun Timetable.isShowTimeUntil(previousLessonEnd: LocalDateTime?) = when { + !isStudentPlan -> false + canceled -> false + now().isAfter(start) -> false + previousLessonEnd != null && now().isBefore(previousLessonEnd) -> false + else -> between(now(), start) <= Duration.ofMinutes(60) +} + +inline val Timetable.left: Duration? + get() = when { + canceled -> null + !isStudentPlan -> null + end.isAfter(now()) && start.isBefore(now()) -> between(now(), end) + else -> null + } + +inline val Timetable.until: Duration + get() = between(now(), start) + +inline val Timetable.isJustFinished: Boolean + get() = end.isBefore(now()) && end.plusSeconds(15).isAfter(now()) && !canceled diff --git a/app/src/main/res/drawable/background_timetable_time_left.xml b/app/src/main/res/drawable/background_timetable_time_left.xml new file mode 100644 index 000000000..dd974a4c1 --- /dev/null +++ b/app/src/main/res/drawable/background_timetable_time_left.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_timetable.xml b/app/src/main/res/layout/item_timetable.xml index b15e46754..f2218105e 100644 --- a/app/src/main/res/layout/item_timetable.xml +++ b/app/src/main/res/layout/item_timetable.xml @@ -29,12 +29,12 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="10dp" - android:layout_marginEnd="40dp" + android:layout_marginEnd="16dp" android:ellipsize="end" android:maxLines="1" android:textColor="?android:textColorPrimary" android:textSize="15sp" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@id/timetableItemTimeBarrier" app:layout_constraintStart_toEndOf="@+id/timetableItemTimeStart" app:layout_constraintTop_toTopOf="parent" tools:text="@tools:sample/lorem" /> @@ -106,4 +106,56 @@ tools:text="Lekcja odwołana: uczniowie zwolnieni do domu" tools:visibility="visible" /> + + + + + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e6fe6da64..a4af0dec4 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -121,6 +121,11 @@ Godziny Zmiany Brak lekcji w tym dniu + %s min + %s sek + jeszcze %1$s + za %1$s + Zakończona Teraz: %s Za chwilę: %s Później: %s @@ -317,6 +322,7 @@ Motyw aplikacji Rozwiń oceny Pokazuj listę wykresów w ocenach klasy + Oznaczaj bieżącą lekcję na planie Pokazuj lekcje całej klasy Schemat kolorów ocen Język aplikacji diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index c8704a50b..a82b14eb7 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -19,4 +19,5 @@ 0.33 true no + false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 1d43f79fd..868a3c898 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -20,4 +20,5 @@ grade_modifier_minus fill_message_content show_whole_class_plan + timetable_show_timers diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bfaece677..06f136c7c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -130,6 +130,11 @@ Hours Changes No lessons this day + %s min + %s sec + %1$s left + in %1$s + Finished Now: %s Next: %s Later: %s @@ -352,6 +357,7 @@ Show presence in attendance Application theme Expand grades + Mark current lesson in timetable Show chart list in class grades Show whole class lessons Grades color scheme diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index d890fdb24..a138177f4 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -29,6 +29,11 @@ app:iconSpaceReserved="false" app:key="@string/pref_key_expand_grade" app:title="@string/pref_view_expand_grade" /> + Date: Wed, 20 May 2020 16:59:26 +0200 Subject: [PATCH 0028/1526] Add app killer manager to settings (#808) --- app/build.gradle | 3 ++- app/src/main/AndroidManifest.xml | 3 ++- .../ui/modules/settings/SettingsFragment.kt | 21 +++++++++++++++++++ .../ui/modules/settings/SettingsPresenter.kt | 4 ++++ .../ui/modules/settings/SettingsView.kt | 1 + app/src/main/res/values-pl/strings.xml | 3 +++ app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 3 +++ app/src/main/res/xml/scheme_preferences.xml | 12 +++++++---- 9 files changed, 45 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index acf4ddd02..c20c80c59 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -177,11 +177,12 @@ dependencies { implementation "com.mikepenz:aboutlibraries-core:$about_libraries" implementation 'com.wdullaer:materialdatetimepicker:4.2.3' implementation "io.coil-kt:coil:0.11.0" + implementation "io.github.wulkanowy:AppKillerManager:c33b658" playImplementation 'com.google.firebase:firebase-analytics:17.4.1' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.6' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.6" - playImplementation 'com.google.firebase:firebase-messaging:20.1.6' + playImplementation 'com.google.firebase:firebase-messaging:20.1.7' playImplementation 'com.google.firebase:firebase-crashlytics:17.0.0' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4ec2f7816..802cf1ad2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,7 +18,8 @@ android:supportsRtl="false" android:theme="@style/WulkanowyTheme" android:usesCleartextTraffic="true" - tools:ignore="GoogleAppIndexingWarning,UnusedAttribute"> + tools:ignore="GoogleAppIndexingWarning,UnusedAttribute" + tools:replace="android:supportsRtl,android:allowBackup"> (getString(R.string.pref_key_notifications_fix_issues))?.run { + isVisible = AppKillerManager.isDeviceSupported() && AppKillerManager.isAnyActionAvailable(requireContext()) + setOnPreferenceClickListener { + presenter.onFixSyncIssuesClicked() + true + } + } } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -119,6 +127,19 @@ class SettingsFragment : PreferenceFragmentCompat(), .show() } + override fun showFixSyncDialog() { + AlertDialog.Builder(requireContext()) + .setTitle(R.string.pref_notify_fix_sync_issues) + .setMessage(R.string.pref_notify_fix_sync_issues_message) + .setNegativeButton(android.R.string.cancel) { _, _ -> } + .setPositiveButton(R.string.pref_notify_fix_sync_issues_settings_button) { _, _ -> + AppKillerManager.doActionPowerSaving(requireContext()) + AppKillerManager.doActionAutoStart(requireContext()) + AppKillerManager.doActionNotification(requireContext()) + } + .show() + } + override fun onResume() { super.onResume() preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt index 09fc2d707..bccb6f0bb 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt @@ -58,6 +58,10 @@ class SettingsPresenter @Inject constructor( view?.showForceSyncDialog() } + fun onFixSyncIssuesClicked() { + view?.showFixSyncDialog() + } + fun onForceSyncDialogSubmit() { view?.run { val successString = syncSuccessString diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt index 4a1b0c766..3786ba4b2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt @@ -19,4 +19,5 @@ interface SettingsView : BaseView { fun setSyncInProgress(inProgress: Boolean) fun showForceSyncDialog() + fun showFixSyncDialog() } diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a4af0dec4..03ccaa2d9 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -329,6 +329,9 @@ Powiadomienia Pokazuj powiadomienia Pokazuj powiadomienia o następnych lekcjach + Napraw problemy z synchronizacją i powiadomieniami + Na twoim urządzeniu mogą występować problemy z synchronizacją danych i powiadomieniami.\n\nBy je naprawić, dodaj Wulkanowego do autostartu i wyłącz optymalizację/oszczędzanie baterii w ustawieniach systemowych telefonu. + Przejdź do ustawień Pokazuj powiadomienia debugowania Synchronizacja Automatyczna aktualizacja diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 868a3c898..6cb877ec2 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -13,6 +13,7 @@ services_interval services_disable_wifi_only services_force_sync + notifications_fix_issues notifications_enable notifications_upcoming_lessons_enable notification_debug diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 06f136c7c..6e08fded6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -366,6 +366,9 @@ Notifications Show notifications Show upcoming lesson notifications + Fix synchronization & notifications issues + Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. + Go to settings Show debug notifications Synchronization diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index a138177f4..c05910f99 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -1,4 +1,4 @@ - + + app:key="@string/pref_key_timetable_show_timers" + app:title="@string/pref_view_timetable_show_timers" /> + app:title="@string/pref_view_grade_statistics_list" /> + Date: Wed, 20 May 2020 22:48:09 +0200 Subject: [PATCH 0029/1526] New Crowdin translations (#813) --- app/src/main/res/values-de/strings.xml | 17 +++++++++++++++++ app/src/main/res/values-pl/strings.xml | 5 +++-- app/src/main/res/values-ru/strings.xml | 17 +++++++++++++++++ app/src/main/res/values-uk/strings.xml | 17 +++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f57805469..f92186c4e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -115,6 +115,14 @@ Stunden Änderungen Kein Unterricht an diesem Tag + %s min + %s sek + noch %1$s + in %1$s + Fertig + Jetzt: %s + In einem Moment: %s + Später: %s Beendete Lektionen Beendete Lektionen anzeigen @@ -278,6 +286,8 @@ Thema Zurück Nächste + Suchen + Suchen... Keine Lektionen Thema wählen @@ -292,11 +302,17 @@ Anwesenheit in Schulbesuch zeigen Thema der Anwendung Noten erweitern + Aktuelle Lektion im Stundenplan markieren + Liste der Diagramme in Klassenbewertungen anzeigen Unterricht der ganzen Klasse anzeigen Farbschema der Noten App Sprache Benachrichtigungen Benachrichtigungen anzeigen + Benachrichtigungen über bevorstehende Lektionen anzeigen + Synchronisierungs- und Benachrichtigungsprobleme reparieren + Ihr Gerät hat möglicherweise Probleme mit der Datensynchronisierung und Benachrichtigungen.\n\nUm diese zu reparieren, fügen Sie Wulkanowy zum Autostart hinzu und deaktivieren Sie die Batterieoptimierung in den Systemeinstellungen des Geräts. + Gehe zu den Einstellungen Debug-Benachrichtigungen anzeigen Synchronisierung Automatische Aktualisierung @@ -322,6 +338,7 @@ Neue Nachrichten Neue Eintragen Push-Benachrichtigungen + Bevorstehende Lektionen Debuggen Schwarz diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 03ccaa2d9..6bf0c324e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -307,6 +307,7 @@ Poprzedni Następny Szukaj + Szukaj... Brak lekcji Wybierz motyw @@ -321,14 +322,14 @@ Pokazuj obecność we frekwencji Motyw aplikacji Rozwiń oceny - Pokazuj listę wykresów w ocenach klasy Oznaczaj bieżącą lekcję na planie + Pokazuj listę wykresów w ocenach klasy Pokazuj lekcje całej klasy Schemat kolorów ocen Język aplikacji Powiadomienia Pokazuj powiadomienia - Pokazuj powiadomienia o następnych lekcjach + Pokazuj powiadomienia o nadchodzących lekcjach Napraw problemy z synchronizacją i powiadomieniami Na twoim urządzeniu mogą występować problemy z synchronizacją danych i powiadomieniami.\n\nBy je naprawić, dodaj Wulkanowego do autostartu i wyłącz optymalizację/oszczędzanie baterii w ustawieniach systemowych telefonu. Przejdź do ustawień diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e68454550..c0666e2c1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -121,6 +121,14 @@ Часы Изменения Нет уроков в данный день + %s min + %s sec + %1$s left + in %1$s + Finished + Now: %s + Next: %s + Later: %s Проведённые уроки Просмотреть проведённые уроки @@ -298,6 +306,8 @@ Предмет Предыдущий Следующий + Search + Search... Нет уроков Выбрать тему @@ -312,11 +322,17 @@ Показывать присутствия в посещаемости Тема приложения Больше оценок + Mark current lesson in timetable + Show chart list in class grades Показать уроки всего класса Схема цветов оценок Язык приложения Уведомления Показывать уведомления + Show upcoming lesson notifications + Fix synchronization & notifications issues + Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. + Go to settings Показывать дебаг-уведомления Синхронизация Автоматическая синхронизация @@ -342,6 +358,7 @@ Новые сообщения Новые заметки Показывать push-уведомления + Upcoming lessons Дебаг Чёрный diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 303eb8b9a..8a9918124 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -121,6 +121,14 @@ Години Зміни Брак уроків у цей день + %s min + %s sec + %1$s left + in %1$s + Finished + Now: %s + Next: %s + Later: %s Уроки, що відбулися Показати уроки, що відбулися @@ -298,6 +306,8 @@ Предмет Попередній Наступний + Search + Search... Брак уроків Увібрати тему @@ -312,11 +322,17 @@ Показувати присутність у відвідуваності Тема додатку Більше оцінок + Mark current lesson in timetable + Show chart list in class grades Показати уроки всього класу Схема кольорів оцінок Мова додатку Повідомлення Показувати повідомлення + Show upcoming lesson notifications + Fix synchronization & notifications issues + Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. + Go to settings Показувати дебаг-повідомлення Синхронізація Автоматична синхронізація @@ -342,6 +358,7 @@ Нові повідомлення Нові нотатки Показувати push-повідомлення + Upcoming lessons Дебаг Чорний From 7850412ba9853627cc4ea625f467238c9faa6d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 20 May 2020 23:08:32 +0200 Subject: [PATCH 0030/1526] Fix crash in timetable on api < 21 (#816) --- .../res/drawable/background_timetable_time_left.xml | 3 +-- app/src/main/res/layout/item_timetable.xml | 10 +++------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/drawable/background_timetable_time_left.xml b/app/src/main/res/drawable/background_timetable_time_left.xml index dd974a4c1..0f3326112 100644 --- a/app/src/main/res/drawable/background_timetable_time_left.xml +++ b/app/src/main/res/drawable/background_timetable_time_left.xml @@ -1,6 +1,5 @@ - - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_timetable.xml b/app/src/main/res/layout/item_timetable.xml index f2218105e..4e278261a 100644 --- a/app/src/main/res/layout/item_timetable.xml +++ b/app/src/main/res/layout/item_timetable.xml @@ -117,9 +117,6 @@ android:id="@+id/timetableItemTimeUntil" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignTop="@id/timetableItemSubject" - android:layout_alignBottom="@id/timetableItemSubject" - android:layout_alignParentEnd="true" android:layout_marginStart="4dp" android:ellipsize="end" android:gravity="center" @@ -138,22 +135,21 @@ android:id="@+id/timetableItemTimeLeft" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignTop="@id/timetableItemSubject" - android:layout_alignBottom="@id/timetableItemSubject" android:layout_alignParentEnd="true" android:layout_marginStart="4dp" android:background="@drawable/background_timetable_time_left" android:ellipsize="end" android:gravity="center" - android:maxLines="1" android:includeFontPadding="false" + android:maxLines="1" android:paddingLeft="7dp" - android:paddingRight="7dp" android:paddingTop="2dp" + android:paddingRight="7dp" android:paddingBottom="2dp" android:textColor="?colorOnPrimary" android:textSize="13sp" android:visibility="gone" + app:backgroundTint="?colorPrimary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="jeszcze 15 min" From 4c1c4f8a435400ac8169c8076d15db2127c9298f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 21 May 2020 00:59:05 +0200 Subject: [PATCH 0031/1526] Version 0.18.0 --- .travis.yml | 2 +- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 12 ++++++++---- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 88b711a6c..ee3e6f3af 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.17.4 + - 0.18.0 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index c20c80c59..c1e8b581f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 57 - versionName "0.17.4" + versionCode 59 + versionName "0.18.0" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -122,7 +122,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:46619e3" + implementation "io.github.wulkanowy:sdk:0.18.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" @@ -177,7 +177,7 @@ dependencies { implementation "com.mikepenz:aboutlibraries-core:$about_libraries" implementation 'com.wdullaer:materialdatetimepicker:4.2.3' implementation "io.coil-kt:coil:0.11.0" - implementation "io.github.wulkanowy:AppKillerManager:c33b658" + implementation "io.github.wulkanowy:AppKillerManager:3.0.0" playImplementation 'com.google.firebase:firebase-analytics:17.4.1' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.6' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 6e72dd828..427ad4dc0 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,10 @@ -- naprawiliśmy wyświetlanie przycisku oznaczania zadania domowego jako wykonanego -- naprawiliśmy rzadki błąd ze stabilnością przy wysyłaniu wiadomości -- naprawiliśmy błąd po logowaniu w domyślnym trybie, jeśli wcześniej użytkownik zalogowany był w trybie Mobilnego API -- ulepszyliśmy wygląd okienka ze szczegółami błędu +Wersja 0.18.0 +- naprawiliśmy odświeżanie zadań domowych +- naprawiliśmy powiadomienia na androidzie 8.0 +- oceny powinny się teraz odświeżać trochę szybciej +- dodaliśmy tryb pełnoekranowy w zadaniach +- dodaliśmy wyszukiwanie w wiadomościach +- dodaliśmy opcje oznaczania bieżącej lekcji na planie/w powiadomieniu (domyślnie wyłączone) +- dodaliśmy testową opcję naprawy powiadomień na np. Huawei, Xiaomi (znajdziesz ją w ustawieniach) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From d558c4db6694b9d292356498ca8c21df831be465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 23 May 2020 16:34:26 +0200 Subject: [PATCH 0032/1526] New Crowdin translations (#817) --- app/src/main/res/values-ru/strings.xml | 34 +++++++++++++------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c0666e2c1..965b75ab7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -121,14 +121,14 @@ Часы Изменения Нет уроков в данный день - %s min - %s sec - %1$s left - in %1$s - Finished - Now: %s - Next: %s - Later: %s + %s мин + %s сек + %1$s осталось + через %1$s + Окончен + Сейчас: %s + Следующий: %s + Позже: %s Проведённые уроки Просмотреть проведённые уроки @@ -306,8 +306,8 @@ Предмет Предыдущий Следующий - Search - Search... + Поиск + Поиск... Нет уроков Выбрать тему @@ -322,17 +322,17 @@ Показывать присутствия в посещаемости Тема приложения Больше оценок - Mark current lesson in timetable - Show chart list in class grades + Отмечать текущий урок в расписании + Показывать диаграммы в оценках класса Показать уроки всего класса Схема цветов оценок Язык приложения Уведомления Показывать уведомления - Show upcoming lesson notifications - Fix synchronization & notifications issues - Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. - Go to settings + Показывать уведомления о будущих уроках + Исправить проблемы с синхронизацией и уведомлениями + На вашем устройстве могут быть проблемы с синхронизацией данных и уведомлениями.\n\nЧтобы их исправить, вам необходимо добавить Wulkanowy в авто-старт и выключить оптимизацию/экономию батареи в настройках устройства. + Перейти в настройски Показывать дебаг-уведомления Синхронизация Автоматическая синхронизация @@ -358,7 +358,7 @@ Новые сообщения Новые заметки Показывать push-уведомления - Upcoming lessons + Будущие уроки Дебаг Чёрный From c3a6f8253a7a7ce8a05828b46b04808c164ec6d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 19:23:35 +0200 Subject: [PATCH 0033/1526] Fix grade sorting (#825) --- .../grade/details/GradeDetailsPresenter.kt | 27 ++++++++++--------- .../grade/summary/GradeSummaryPresenter.kt | 12 +++------ 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index 26c222643..2212bfd61 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -171,19 +171,22 @@ class GradeDetailsPresenter @Inject constructor( } private fun createGradeItems(items: List): List { - return items.filter { it.grades.isNotEmpty() }.map { (subject, average, points, _, grades) -> - val subItems = grades.map { - GradeDetailsItem(it, ViewType.ITEM) - } + return items + .filter { it.grades.isNotEmpty() } + .sortedBy { it.subject } + .map { (subject, average, points, _, grades) -> + val subItems = grades + .sortedByDescending { it.date } + .map { GradeDetailsItem(it, ViewType.ITEM) } - listOf(GradeDetailsItem(GradeDetailsHeader( - subject = subject, - average = average, - pointsSum = points, - newGrades = grades.filter { grade -> !grade.isRead }.size, - grades = subItems - ), ViewType.HEADER)) + if (preferencesRepository.isGradeExpandable) emptyList() else subItems - }.flatten() + listOf(GradeDetailsItem(GradeDetailsHeader( + subject = subject, + average = average, + pointsSum = points, + newGrades = grades.filter { grade -> !grade.isRead }.size, + grades = subItems + ), ViewType.HEADER)) + if (preferencesRepository.isGradeExpandable) emptyList() else subItems + }.flatten() } private fun updateGrade(grade: Grade) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 9b8372136..26f922dee 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -103,14 +103,8 @@ class GradeSummaryPresenter @Inject constructor( } private fun createGradeSummaryItems(items: List): List { - return items.map { - it.summary.copy(average = it.average) - } - } - - private fun checkEmpty(gradeSummary: GradeSummary, averages: List>): Boolean { - return gradeSummary.run { - finalGrade.isBlank() && predictedGrade.isBlank() && averages.singleOrNull { it.first == subject } == null - } + return items + .sortedBy { it.subject } + .map { it.summary.copy(average = it.average) } } } From 9c013161789dedf410e646af59d8c9dd4d4cdb1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 19:24:01 +0200 Subject: [PATCH 0034/1526] Fix mark message as read in search mode (#828) --- .../wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt | 2 +- .../wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt index a889dfef6..6064f10ae 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt @@ -77,7 +77,7 @@ class MessageTabAdapter @Inject constructor() : } messageItemAttachmentIcon.visibility = if (item.hasAttachments) View.VISIBLE else View.GONE - root.setOnClickListener { onClickListener(item, position) } + root.setOnClickListener { onClickListener(item, holder.adapterPosition) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index f96fb6c2a..6513adcde 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -64,7 +64,7 @@ class MessageTabPresenter @Inject constructor( } fun onMessageItemSelected(message: Message, position: Int) { - Timber.i("Select message ${message.id} item") + Timber.i("Select message ${message.id} item (position: $position)") view?.run { openMessage(message) if (message.unread) { @@ -132,6 +132,8 @@ class MessageTabPresenter @Inject constructor( } } + Timber.d("Applying filter. Full list: ${messages.size}, filtered: ${filteredList.size}") + updateData(filteredList) } From f737018548fad22c8d25aaeb887103cbc6f92fca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 19:33:04 +0200 Subject: [PATCH 0035/1526] Add debug statements to get/update methods in grade details adapter (#827) --- .../ui/modules/grade/GradePresenter.kt | 1 + .../grade/details/GradeDetailsAdapter.kt | 19 +++++++++++++++++-- .../grade/details/GradeDetailsPresenter.kt | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index 78885ebd5..ec66e2bd9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -133,6 +133,7 @@ class GradePresenter @Inject constructor( } private fun loadChild(index: Int, forceRefresh: Boolean = false) { + Timber.d("Load grade tab child. Selected semester: $selectedIndex, semesters: ${semesters.joinToString { it.semesterName.toString() }}") semesters.first { it.semesterName == selectedIndex }.semesterId.also { if (forceRefresh || loadedSemesterId[index] != it) { Timber.i("Load grade child view index: $index") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt index 7adab547e..d5e05f3b9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.databinding.ItemGradeDetailsBinding import io.github.wulkanowy.ui.base.BaseExpandableAdapter import io.github.wulkanowy.utils.getBackgroundColor import io.github.wulkanowy.utils.toFormattedString +import timber.log.Timber import javax.inject.Inject class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter() { @@ -38,12 +39,26 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter 1) { + Timber.e("Header with subject $subject found ${candidates.size} times! Items: $candidates, expanded: $expandedPosition") + } + + return candidates.first() } fun updateHeaderItem(item: GradeDetailsItem) { @@ -92,7 +107,7 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter bindItemViewHolder( binding = holder.binding, grade = items[position].value as Grade, - position = position + position = holder.adapterPosition ) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index 2212bfd61..b674bf771 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -43,7 +43,7 @@ class GradeDetailsPresenter @Inject constructor( } fun onGradeItemSelected(grade: Grade, position: Int) { - Timber.i("Select grade item ${grade.id}") + Timber.i("Select grade item ${grade.id}, position: $position") view?.apply { showGradeDialog(grade, preferencesRepository.gradeColorTheme) if (!grade.isRead) { From cec1068f2e3cc0279537edbcad5f957cc35f4538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 19:34:10 +0200 Subject: [PATCH 0036/1526] Fix crash in timetable time left (#826) --- .../ui/modules/timetable/TimetableAdapter.kt | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index 5354442aa..85ded2025 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -132,41 +132,46 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter { + isShowTimeUntil -> { Timber.d("Show time until lesson: $position") timetableItemTimeLeft.visibility = GONE with(timetableItemTimeUntil) { visibility = VISIBLE text = context.getString(R.string.timetable_time_until, - if (lesson.until.seconds <= 60) { - context.getString(R.string.timetable_seconds, lesson.until.seconds.toString(10)) + if (until.seconds <= 60) { + context.getString(R.string.timetable_seconds, until.seconds.toString(10)) } else { - context.getString(R.string.timetable_minutes, lesson.until.toMinutes().toString(10)) + context.getString(R.string.timetable_minutes, until.toMinutes().toString(10)) } ) } } // after lesson start - lesson.left != null -> { + left != null -> { Timber.d("Show time left lesson: $position") timetableItemTimeUntil.visibility = GONE with(timetableItemTimeLeft) { visibility = VISIBLE text = context.getString( R.string.timetable_time_left, - if (lesson.left!!.seconds < 60) { - context.getString(R.string.timetable_seconds, lesson.left?.seconds?.toString(10)) + if (left.seconds < 60) { + context.getString(R.string.timetable_seconds, left.seconds.toString(10)) } else { - context.getString(R.string.timetable_minutes, lesson.left?.toMinutes()?.toString(10)) + context.getString(R.string.timetable_minutes, left.toMinutes().toString(10)) } ) } } // right after lesson finish - lesson.isJustFinished -> { + isJustFinished -> { Timber.d("Show just finished lesson: $position") timetableItemTimeUntil.visibility = GONE timetableItemTimeLeft.visibility = VISIBLE From 7fa14e507739a6a43c78816bf5127ddffccc10f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 19:36:40 +0200 Subject: [PATCH 0037/1526] Set app_name in build.gradle (#830) --- app/build.gradle | 2 ++ app/src/debug/res/values/strings.xml | 3 --- app/src/main/res/layout/fragment_attendance.xml | 4 ++-- app/src/main/res/layout/fragment_exam.xml | 4 ++-- app/src/main/res/layout/fragment_homework.xml | 4 ++-- app/src/main/res/layout/fragment_timetable.xml | 4 ++-- .../res/layout/fragment_timetable_completed.xml | 16 ++++++++-------- app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values/strings.xml | 4 ---- 12 files changed, 18 insertions(+), 27 deletions(-) delete mode 100644 app/src/debug/res/values/strings.xml diff --git a/app/build.gradle b/app/build.gradle index c1e8b581f..ea86127ba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,7 @@ android { versionCode 59 versionName "0.18.0" multiDexEnabled true + resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true manifestPlaceholders = [ @@ -56,6 +57,7 @@ android { signingConfig signingConfigs.release } debug { + resValue "string", "app_name", "Wulkanowy DEV " + defaultConfig.versionCode applicationIdSuffix ".dev" versionNameSuffix "-dev" testCoverageEnabled = project.hasProperty('coverage') diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml deleted file mode 100644 index c90641ddb..000000000 --- a/app/src/debug/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Wulkanowy DEV - diff --git a/app/src/main/res/layout/fragment_attendance.xml b/app/src/main/res/layout/fragment_attendance.xml index cd8b60364..39b00d306 100644 --- a/app/src/main/res/layout/fragment_attendance.xml +++ b/app/src/main/res/layout/fragment_attendance.xml @@ -153,8 +153,8 @@ android:background="?selectableItemBackgroundBorderless" android:fontFamily="sans-serif" android:gravity="center" - android:text="@string/app_name" - android:textSize="16sp" /> + android:textSize="16sp" + tools:text="@tools:sample/date/ddmmyy" /> + android:textSize="16sp" + tools:text="@tools:sample/date/ddmmyy" /> + android:textSize="16sp" + tools:text="@tools:sample/date/ddmmyy" /> + android:textSize="16sp" + tools:text="@tools:sample/date/ddmmyy" /> + app:srcCompat="@drawable/ic_chevron_left" /> + android:textSize="16sp" + tools:text="@tools:sample/date/ddmmyy" /> + app:srcCompat="@drawable/ic_chevron_right" /> diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f92186c4e..084e3a86d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,6 +1,5 @@ - Wulkanowy Anmelden Wulkanowy diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 6bf0c324e..4bcfbb774 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,6 +1,5 @@ - Wulkanowy Logowanie Wulkanowy diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 965b75ab7..41771a3cf 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,6 +1,5 @@ - Wulkanowy Авторизация Wulkanowy diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8a9918124..652249c68 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,6 +1,5 @@ - Wulkanowy Авторизація Wulkanowy diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6e08fded6..2f13e031d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,9 +1,5 @@ - - Wulkanowy - - Login Wulkanowy From 3541ab81b865f906e7eddb95ff1c657448a9b76e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 19:47:20 +0200 Subject: [PATCH 0038/1526] Destroy webview in password recover before setting binding to null (#829) --- app/build.gradle | 2 +- .../login/recover/LoginRecoverFragment.kt | 48 +++++++++++-------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ea86127ba..0e95493c9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,7 +124,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.18.0" + implementation "io.github.wulkanowy:sdk:fd51552" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt index 97e45be9b..e27c845a6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt @@ -22,6 +22,10 @@ import javax.inject.Inject class LoginRecoverFragment : BaseFragment(R.layout.fragment_login_recover), LoginRecoverView { + private var _binding: FragmentLoginRecoverBinding? = null + + private val bindingLocal: FragmentLoginRecoverBinding get() = _binding!! + @Inject lateinit var presenter: LoginRecoverPresenter @@ -36,13 +40,13 @@ class LoginRecoverFragment : private lateinit var hostSymbols: Array override val recoverHostValue: String - get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginRecoverHost.text.toString())).orEmpty() + get() = hostValues.getOrNull(hostKeys.indexOf(bindingLocal.loginRecoverHost.text.toString())).orEmpty() override val formHostSymbol: String - get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginRecoverHost.text.toString())).orEmpty() + get() = hostSymbols.getOrNull(hostKeys.indexOf(bindingLocal.loginRecoverHost.text.toString())).orEmpty() override val recoverNameValue: String - get() = binding.loginRecoverName.text.toString().trim() + get() = bindingLocal.loginRecoverName.text.toString().trim() override val emailHintString: String get() = getString(R.string.login_email_hint) @@ -55,7 +59,7 @@ class LoginRecoverFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding = FragmentLoginRecoverBinding.bind(view) + _binding = FragmentLoginRecoverBinding.bind(view) presenter.onAttachView(this) } @@ -64,7 +68,7 @@ class LoginRecoverFragment : hostValues = resources.getStringArray(R.array.hosts_values) hostSymbols = resources.getStringArray(R.array.hosts_symbols) - with(binding) { + with(bindingLocal) { loginRecoverWebView.setBackgroundColor(Color.TRANSPARENT) loginRecoverName.doOnTextChanged { _, _, _, _ -> presenter.onNameTextChanged() } loginRecoverHost.setOnItemClickListener { _, _, _, _ -> presenter.onHostSelected() } @@ -74,69 +78,69 @@ class LoginRecoverFragment : loginRecoverLogin.setOnClickListener { (activity as LoginActivity).switchView(0) } } - with(binding.loginRecoverHost) { + with(bindingLocal.loginRecoverHost) { setText(hostKeys.getOrNull(0).orEmpty()) setAdapter(LoginSymbolAdapter(context, R.layout.support_simple_spinner_dropdown_item, hostKeys)) - setOnClickListener { if (binding.loginRecoverFormContainer.visibility == GONE) dismissDropDown() } + setOnClickListener { if (bindingLocal.loginRecoverFormContainer.visibility == GONE) dismissDropDown() } } } override fun setDefaultCredentials(username: String) { - binding.loginRecoverName.setText(username) + bindingLocal.loginRecoverName.setText(username) } override fun setErrorNameRequired() { - with(binding.loginRecoverNameLayout) { + with(bindingLocal.loginRecoverNameLayout) { requestFocus() error = getString(R.string.login_field_required) } } override fun setUsernameHint(hint: String) { - binding.loginRecoverNameLayout.hint = hint + bindingLocal.loginRecoverNameLayout.hint = hint } override fun setUsernameError(message: String) { - with(binding.loginRecoverNameLayout) { + with(bindingLocal.loginRecoverNameLayout) { requestFocus() error = message } } override fun clearUsernameError() { - binding.loginRecoverNameLayout.error = null + bindingLocal.loginRecoverNameLayout.error = null } override fun showProgress(show: Boolean) { - binding.loginRecoverProgress.visibility = if (show) VISIBLE else GONE + bindingLocal.loginRecoverProgress.visibility = if (show) VISIBLE else GONE } override fun showRecoverForm(show: Boolean) { - binding.loginRecoverFormContainer.visibility = if (show) VISIBLE else GONE + bindingLocal.loginRecoverFormContainer.visibility = if (show) VISIBLE else GONE } override fun showCaptcha(show: Boolean) { - binding.loginRecoverCaptchaContainer.visibility = if (show) VISIBLE else GONE + bindingLocal.loginRecoverCaptchaContainer.visibility = if (show) VISIBLE else GONE } override fun showErrorView(show: Boolean) { - binding.loginRecoverError.visibility = if (show) VISIBLE else GONE + bindingLocal.loginRecoverError.visibility = if (show) VISIBLE else GONE } override fun setErrorDetails(message: String) { - binding.loginRecoverErrorMessage.text = message + bindingLocal.loginRecoverErrorMessage.text = message } override fun showSuccessView(show: Boolean) { - binding.loginRecoverSuccess.visibility = if (show) VISIBLE else GONE + bindingLocal.loginRecoverSuccess.visibility = if (show) VISIBLE else GONE } override fun setSuccessTitle(title: String) { - binding.loginRecoverSuccessTitle.text = title + bindingLocal.loginRecoverSuccessTitle.text = title } override fun setSuccessMessage(message: String) { - binding.loginRecoverSuccessMessage.text = message + bindingLocal.loginRecoverSuccessMessage.text = message } override fun showSoftKeyboard() { @@ -157,7 +161,7 @@ class LoginRecoverFragment : callback:e =>Android.captchaCallback(e)}) """.trimIndent() - with(binding.loginRecoverWebView) { + with(bindingLocal.loginRecoverWebView) { settings.javaScriptEnabled = true webViewClient = object : WebViewClient() { private var recoverWebViewSuccess: Boolean = true @@ -197,6 +201,8 @@ class LoginRecoverFragment : } override fun onDestroyView() { + bindingLocal.loginRecoverWebView.destroy() + _binding = null presenter.onDetachView() super.onDestroyView() From 428b599be04652cd1aa8948873252ad8cc05deab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 19:48:14 +0200 Subject: [PATCH 0039/1526] Improve firebase logging (#832) --- .../github/wulkanowy/utils/CrashlyticsUtils.kt | 2 -- .../wulkanowy/utils/FirebaseAnalyticsHelper.kt | 7 ++++++- .../modules/attendance/AttendancePresenter.kt | 7 ++++++- .../summary/AttendanceSummaryPresenter.kt | 8 +++++++- .../wulkanowy/ui/modules/exam/ExamPresenter.kt | 7 ++++++- .../grade/details/GradeDetailsPresenter.kt | 7 ++++++- .../statistics/GradeStatisticsPresenter.kt | 7 ++++++- .../grade/summary/GradeSummaryPresenter.kt | 7 ++++++- .../ui/modules/homework/HomeworkPresenter.kt | 7 ++++++- .../luckynumber/LuckyNumberPresenter.kt | 7 ++++++- .../wulkanowy/ui/modules/main/MainActivity.kt | 8 ++++++++ .../wulkanowy/ui/modules/main/MainPresenter.kt | 3 ++- .../wulkanowy/ui/modules/main/MainView.kt | 2 ++ .../message/preview/MessagePreviewPresenter.kt | 6 +++++- .../modules/message/tab/MessageTabPresenter.kt | 7 ++++++- .../mobiledevice/MobileDevicePresenter.kt | 7 ++++++- .../wulkanowy/ui/modules/note/NotePresenter.kt | 7 ++++++- .../school/SchoolPresenter.kt | 6 +++++- .../teacher/TeacherPresenter.kt | 7 ++++++- .../ui/modules/timetable/TimetablePresenter.kt | 7 ++++++- .../completed/CompletedLessonsPresenter.kt | 7 ++++++- .../utils/FragNavControlerExtension.kt | 6 +++--- .../github/wulkanowy/utils/CrashlyticsUtils.kt | 18 ++++++++++-------- .../wulkanowy/utils/FirebaseAnalyticsHelper.kt | 5 +++++ 24 files changed, 131 insertions(+), 31 deletions(-) diff --git a/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt b/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt index 60dc6b56a..6351997d0 100644 --- a/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt +++ b/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt @@ -5,8 +5,6 @@ package io.github.wulkanowy.utils import android.content.Context import timber.log.Timber -fun initCrashlytics(context: Context, appInfo: AppInfo) {} - open class TimberTreeNoOp : Timber.Tree() { override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {} } diff --git a/app/src/fdroid/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt b/app/src/fdroid/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt index 0b1274f15..f23645bc3 100644 --- a/app/src/fdroid/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt +++ b/app/src/fdroid/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt @@ -1,13 +1,18 @@ package io.github.wulkanowy.utils +import android.app.Activity import javax.inject.Inject import javax.inject.Singleton @Singleton +@Suppress("UNUSED_PARAMETER") class FirebaseAnalyticsHelper @Inject constructor() { - @Suppress("UNUSED_PARAMETER") fun logEvent(name: String, vararg params: Pair) { // do nothing } + + fun setCurrentScreen(activity: Activity, name: String?) { + // do nothing + } } 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 3a1fb0ceb..437e06c92 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 @@ -215,7 +215,12 @@ class AttendancePresenter @Inject constructor( showContent(it.isNotEmpty()) showExcuseButton(it.any { item -> item.excusable }) } - analytics.logEvent("load_attendance", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "attendance", + "items" to it.size, + "force_refresh" to forceRefresh + ) }) { Timber.i("Loading attendance result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt index 72dfc327e..33e18c2e7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt @@ -99,7 +99,13 @@ class AttendanceSummaryPresenter @Inject constructor( showContent(it.isNotEmpty()) updateDataSet(it) } - analytics.logEvent("load_attendance_summary", "items" to it.size, "force_refresh" to forceRefresh, "item_id" to subjectId) + analytics.logEvent( + "load_data", + "type" to "attendance_summary", + "items" to it.size, + "force_refresh" to forceRefresh, + "item_id" to subjectId + ) }) { Timber.i("Loading attendance summary result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index 495602fc5..1c47cc7db 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -131,7 +131,12 @@ class ExamPresenter @Inject constructor( showErrorView(false) showContent(it.isNotEmpty()) } - analytics.logEvent("load_exam", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "exam", + "items" to it.size, + "force_refresh" to forceRefresh + ) }) { Timber.i("Loading exam result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index b674bf771..37f2c935a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -152,7 +152,12 @@ class GradeDetailsPresenter @Inject constructor( gradeColorTheme = preferencesRepository.gradeColorTheme ) } - analytics.logEvent("load_grade_details", "items" to grades.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "grade_details", + "items" to grades.size, + "force_refresh" to forceRefresh + ) }) { Timber.i("Loading grade details result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt index 5cc733cd0..590e9ce12 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt @@ -174,7 +174,12 @@ class GradeStatisticsPresenter @Inject constructor( updateData(it, preferencesRepository.gradeColorTheme, preferencesRepository.showAllSubjectsOnStatisticsList) showSubjects(!preferencesRepository.showAllSubjectsOnStatisticsList) } - analytics.logEvent("load_grade_statistics", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "grade_statistics", + "items" to it.size, + "force_refresh" to forceRefresh + ) }) { Timber.i("Loading grade stats result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 26f922dee..9b88689db 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -49,7 +49,12 @@ class GradeSummaryPresenter @Inject constructor( showErrorView(false) updateData(it) } - analytics.logEvent("load_grade_summary", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "grade_summary", + "items" to it.size, + "force_refresh" to forceRefresh + ) }) { Timber.i("Loading grade summary result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index d39efde14..fafc33191 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -124,7 +124,12 @@ class HomeworkPresenter @Inject constructor( showErrorView(false) showContent(it.isNotEmpty()) } - analytics.logEvent("load_homework", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "homework", + "items" to it.size, + "force_refresh" to forceRefresh + ) }) { Timber.i("Loading homework result: An exception occurred") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt index 1d3a17bdc..e932fedc0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt @@ -54,7 +54,12 @@ class LuckyNumberPresenter @Inject constructor( showEmpty(false) showErrorView(false) } - analytics.logEvent("load_lucky_number", "lucky_number" to it.luckyNumber, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_item", + "type" to "lucky_number", + "number" to it.luckyNumber, + "force_refresh" to forceRefresh + ) }, { Timber.i("Loading lucky number result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 9ce190795..f5b7c47c8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -31,6 +31,7 @@ import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.more.MoreFragment import io.github.wulkanowy.ui.modules.note.NoteFragment import io.github.wulkanowy.ui.modules.timetable.TimetableFragment +import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.safelyPopFragments @@ -46,6 +47,9 @@ class MainActivity : BaseActivity(), MainVie @Inject lateinit var navController: FragNavController + @Inject + lateinit var analytics: FirebaseAnalyticsHelper + @Inject lateinit var overlayProvider: Lazy @@ -136,6 +140,10 @@ class MainActivity : BaseActivity(), MainVie } } + override fun setCurrentScreen(name: String?) { + analytics.setCurrentScreen(this, name) + } + override fun onOptionsItemSelected(item: MenuItem?): Boolean { return if (item?.itemId == R.id.mainMenuAccount) presenter.onAccountManagerSelected() else false diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index f5a490044..233d44917 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -37,8 +37,9 @@ class MainPresenter @Inject constructor( analytics.logEvent("app_open", "destination" to initMenu?.name) } - fun onViewChange(section: MainView.Section?) { + fun onViewChange(section: MainView.Section?, name: String?) { view?.apply { + setCurrentScreen(name) showActionBarElevation(section != GRADE && section != MESSAGE && section != SCHOOL) currentViewTitle?.let { setViewTitle(it) } currentViewSubtitle?.let { setViewSubTitle(it.ifBlank { null }) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt index 97b556e3e..7e5831471 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt @@ -24,6 +24,8 @@ interface MainView : BaseView { fun showAccountPicker() + fun setCurrentScreen(name: String?) + fun showActionBarElevation(show: Boolean) fun notifyMenuViewReselected() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index 62ac5a532..24678c70e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -60,7 +60,11 @@ class MessagePreviewPresenter @Inject constructor( setMessageWithAttachment(message) initOptions() } - analytics.logEvent("load_message_preview", "length" to message.message.content.length) + analytics.logEvent( + "load_item", + "type" to "message_preview", + "length" to message.message.content.length + ) }) { Timber.i("Loading message ${message.messageId} preview result: An exception occurred ") retryCallback = { onMessageLoadRetry(message) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 6513adcde..221762d16 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -97,7 +97,12 @@ class MessageTabPresenter @Inject constructor( Timber.i("Loading $folder message result: Success") messages = it onSearchQueryTextChange(lastSearchQuery) - analytics.logEvent("load_messages", "items" to it.size, "folder" to folder.name) + analytics.logEvent( + "load_data", + "type" to "messages", + "items" to it.size, + "folder" to folder.name + ) }) { Timber.i("Loading $folder message result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt index d8c99b221..459ca17e8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt @@ -70,7 +70,12 @@ class MobileDevicePresenter @Inject constructor( showEmpty(it.isEmpty()) showErrorView(false) } - analytics.logEvent("load_devices", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "devices", + "items" to it.size, + "force_refresh" to forceRefresh + ) }) { Timber.i("Loading mobile devices result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt index 00df71b96..7d301c66b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt @@ -69,7 +69,12 @@ class NotePresenter @Inject constructor( showErrorView(false) showContent(it.isNotEmpty()) } - analytics.logEvent("load_note", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "note", + "items" to it.size, + "force_refresh" to forceRefresh + ) }, { Timber.i("Loading note result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt index e2eb614dc..7beff922d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt @@ -88,7 +88,11 @@ class SchoolPresenter @Inject constructor( showEmpty(false) showErrorView(false) } - analytics.logEvent("load_school", "force_refresh" to forceRefresh) + analytics.logEvent( + "load_item", + "type" to "school", + "force_refresh" to forceRefresh + ) }, { Timber.i("Loading school result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt index e888308fd..0d8eec6d4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt @@ -75,7 +75,12 @@ class TeacherPresenter @Inject constructor( showEmpty(it.isEmpty()) showErrorView(false) } - analytics.logEvent("load_teachers", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "teachers", + "items" to it.size, + "force_refresh" to forceRefresh + ) }) { Timber.i("Loading teachers result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 50c123646..e1ce005e3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -154,7 +154,12 @@ class TimetablePresenter @Inject constructor( showErrorView(false) showContent(it.isNotEmpty()) } - analytics.logEvent("load_timetable", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "timetable", + "items" to it.size, + "force_refresh" to forceRefresh + ) }) { Timber.i("Loading timetable result: An exception occurred") errorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt index 355411eb5..7243061d6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt @@ -134,7 +134,12 @@ class CompletedLessonsPresenter @Inject constructor( showErrorView(false) showContent(it.isNotEmpty()) } - analytics.logEvent("load_completed_lessons", "items" to it.size, "force_refresh" to forceRefresh) + analytics.logEvent( + "load_data", + "type" to "completed_lessons", + "items" to it.size, + "force_refresh" to forceRefresh + ) }) { Timber.i("Loading completed lessons result: An exception occurred") completedLessonsErrorHandler.dispatch(it) diff --git a/app/src/main/java/io/github/wulkanowy/utils/FragNavControlerExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/FragNavControlerExtension.kt index 9cec331f8..9dc1e18a0 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/FragNavControlerExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/FragNavControlerExtension.kt @@ -4,14 +4,14 @@ import androidx.fragment.app.Fragment import com.ncapdevi.fragnav.FragNavController import io.github.wulkanowy.ui.modules.main.MainView -inline fun FragNavController.setOnViewChangeListener(crossinline listener: (section: MainView.Section?) -> Unit) { +inline fun FragNavController.setOnViewChangeListener(crossinline listener: (section: MainView.Section?, name: String?) -> Unit) { transactionListener = object : FragNavController.TransactionListener { override fun onFragmentTransaction(fragment: Fragment?, transactionType: FragNavController.TransactionType) { - listener(fragment?.toSection()) + listener(fragment?.toSection(), fragment?.let { it::class.java.simpleName }) } override fun onTabTransaction(fragment: Fragment?, index: Int) { - listener(fragment?.toSection()) + listener(fragment?.toSection(), fragment?.let { it::class.java.simpleName }) } } } diff --git a/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt b/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt index e374577df..e87177c1d 100644 --- a/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt @@ -6,20 +6,14 @@ import fr.bipi.tressence.base.FormatterPriorityTree import fr.bipi.tressence.common.StackTraceRecorder import io.github.wulkanowy.sdk.exception.FeatureDisabledException import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException +import java.io.InterruptedIOException +import java.net.SocketTimeoutException import java.net.UnknownHostException class CrashlyticsTree : FormatterPriorityTree(Log.VERBOSE) { private val crashlytics by lazy { FirebaseCrashlytics.getInstance() } - override fun skipLog(priority: Int, tag: String?, message: String, t: Throwable?): Boolean { - if (t is FeatureDisabledException || t is FeatureNotAvailableException || t is UnknownHostException) { - return true - } - - return super.skipLog(priority, tag, message, t) - } - override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { if (skipLog(priority, tag, message, t)) return @@ -31,6 +25,14 @@ class CrashlyticsExceptionTree : FormatterPriorityTree(Log.ERROR) { private val crashlytics by lazy { FirebaseCrashlytics.getInstance() } + override fun skipLog(priority: Int, tag: String?, message: String, t: Throwable?): Boolean { + if (t is FeatureDisabledException || t is FeatureNotAvailableException || t is UnknownHostException || t is SocketTimeoutException || t is InterruptedIOException) { + return true + } + + return super.skipLog(priority, tag, message, t) + } + override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { if (skipLog(priority, tag, message, t)) return diff --git a/app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt b/app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt index 6810e66ac..b0b2fda4d 100644 --- a/app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.utils +import android.app.Activity import android.content.Context import android.os.Bundle import com.google.firebase.analytics.FirebaseAnalytics @@ -24,4 +25,8 @@ class FirebaseAnalyticsHelper @Inject constructor(private val context: Context) analytics.logEvent(name, this) } } + + fun setCurrentScreen(activity: Activity, name: String?) { + analytics.setCurrentScreen(activity, name, null) + } } From 2cdde78c54468cf58ade166ca4972d4d98e92287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 19:48:56 +0200 Subject: [PATCH 0040/1526] Allow access to saturday in timetable and attendance (#833) --- .../repositories/attendance/AttendanceRepository.kt | 10 +++++----- .../completedlessons/CompletedLessonsRepository.kt | 10 +++++----- .../data/repositories/exam/ExamRepository.kt | 10 +++++----- .../data/repositories/homework/HomeworkRepository.kt | 4 ++-- .../repositories/timetable/TimetableRepository.kt | 12 ++++++------ .../wulkanowy/services/sync/works/AttendanceWork.kt | 4 ++-- .../services/sync/works/CompletedLessonWork.kt | 4 ++-- .../github/wulkanowy/services/sync/works/ExamWork.kt | 4 ++-- .../wulkanowy/services/sync/works/HomeworkWork.kt | 4 ++-- .../wulkanowy/services/sync/works/TimetableWork.kt | 4 ++-- .../wulkanowy/ui/modules/exam/ExamPresenter.kt | 6 +++--- .../ui/modules/homework/HomeworkPresenter.kt | 4 ++-- .../github/wulkanowy/utils/SchooldaysRangeLimiter.kt | 2 +- .../java/io/github/wulkanowy/utils/TimeExtension.kt | 4 ++-- .../io/github/wulkanowy/utils/TimeExtensionTest.kt | 12 ++++++------ 15 files changed, 47 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt index 22fe7fa51..68e7c5f12 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt @@ -5,7 +5,7 @@ import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.Inter 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.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.uniqueSubtract import io.reactivex.Single @@ -22,19 +22,19 @@ class AttendanceRepository @Inject constructor( ) { fun getAttendance(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean): Single> { - return local.getAttendance(semester, start.monday, end.friday).filter { !forceRefresh } + return local.getAttendance(semester, start.monday, end.sunday).filter { !forceRefresh } .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getAttendance(student, semester, start.monday, end.friday) + if (it) remote.getAttendance(student, semester, start.monday, end.sunday) else Single.error(UnknownHostException()) }.flatMap { newAttendance -> - local.getAttendance(semester, start.monday, end.friday) + local.getAttendance(semester, start.monday, end.sunday) .toSingle(emptyList()) .doOnSuccess { oldAttendance -> local.deleteAttendance(oldAttendance.uniqueSubtract(newAttendance)) local.saveAttendance(newAttendance.uniqueSubtract(oldAttendance)) } }.flatMap { - local.getAttendance(semester, start.monday, end.friday) + local.getAttendance(semester, start.monday, end.sunday) .toSingle(emptyList()) }).map { list -> list.filter { it.date in start..end } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt index f31e30552..72cc93eb4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt @@ -5,7 +5,7 @@ import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.Inter import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.uniqueSubtract import io.reactivex.Single @@ -22,20 +22,20 @@ class CompletedLessonsRepository @Inject constructor( ) { fun getCompletedLessons(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return local.getCompletedLessons(semester, start.monday, end.friday).filter { !forceRefresh } + return local.getCompletedLessons(semester, start.monday, end.sunday).filter { !forceRefresh } .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) .flatMap { - if (it) remote.getCompletedLessons(student, semester, start.monday, end.friday) + if (it) remote.getCompletedLessons(student, semester, start.monday, end.sunday) else Single.error(UnknownHostException()) }.flatMap { new -> - local.getCompletedLessons(semester, start.monday, end.friday) + local.getCompletedLessons(semester, start.monday, end.sunday) .toSingle(emptyList()) .doOnSuccess { old -> local.deleteCompleteLessons(old.uniqueSubtract(new)) local.saveCompletedLessons(new.uniqueSubtract(old)) } }.flatMap { - local.getCompletedLessons(semester, start.monday, end.friday) + local.getCompletedLessons(semester, start.monday, end.sunday) .toSingle(emptyList()) }).map { list -> list.filter { it.date in start..end } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt index 452a15510..f29e4fdf8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt @@ -5,7 +5,7 @@ import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.Inter import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.uniqueSubtract import io.reactivex.Single @@ -22,20 +22,20 @@ class ExamRepository @Inject constructor( ) { fun getExams(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return local.getExams(semester, start.monday, end.friday).filter { !forceRefresh } + return local.getExams(semester, start.monday, end.sunday).filter { !forceRefresh } .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) .flatMap { - if (it) remote.getExams(student, semester, start.monday, end.friday) + if (it) remote.getExams(student, semester, start.monday, end.sunday) else Single.error(UnknownHostException()) }.flatMap { new -> - local.getExams(semester, start.monday, end.friday) + local.getExams(semester, start.monday, end.sunday) .toSingle(emptyList()) .doOnSuccess { old -> local.deleteExams(old.uniqueSubtract(new)) local.saveExams(new.uniqueSubtract(old)) } }.flatMap { - local.getExams(semester, start.monday, end.friday) + local.getExams(semester, start.monday, end.sunday) .toSingle(emptyList()) }).map { list -> list.filter { it.date in start..end } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt index 4454fd88e..7e8fd5c30 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt @@ -5,7 +5,7 @@ import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.Inter import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.uniqueSubtract import io.reactivex.Completable @@ -23,7 +23,7 @@ class HomeworkRepository @Inject constructor( ) { fun getHomework(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return Single.fromCallable { start.monday to end.friday }.flatMap { (monday, friday) -> + return Single.fromCallable { start.monday to end.sunday }.flatMap { (monday, friday) -> local.getHomework(semester, monday, friday).filter { !forceRefresh } .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) .flatMap { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt index 082b03cf8..4a7a0eb24 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt @@ -6,7 +6,7 @@ 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.services.alarm.TimetableNotificationSchedulerHelper -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.uniqueSubtract import io.reactivex.Single @@ -24,13 +24,13 @@ class TimetableRepository @Inject constructor( ) { fun getTimetable(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return Single.fromCallable { start.monday to end.friday }.flatMap { (monday, friday) -> - local.getTimetable(semester, monday, friday).filter { !forceRefresh } + return Single.fromCallable { start.monday to end.sunday }.flatMap { (monday, sunday) -> + local.getTimetable(semester, monday, sunday).filter { !forceRefresh } .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getTimetable(student, semester, monday, friday) + if (it) remote.getTimetable(student, semester, monday, sunday) else Single.error(UnknownHostException()) }.flatMap { new -> - local.getTimetable(semester, monday, friday) + local.getTimetable(semester, monday, sunday) .toSingle(emptyList()) .doOnSuccess { old -> local.deleteTimetable(old.uniqueSubtract(new).also { schedulerHelper.cancelScheduled(it) }) @@ -46,7 +46,7 @@ class TimetableRepository @Inject constructor( }) } }.flatMap { - local.getTimetable(semester, monday, friday).toSingle(emptyList()) + local.getTimetable(semester, monday, sunday).toSingle(emptyList()) }).map { list -> list.filter { it.date in start..end }.also { schedulerHelper.scheduleNotifications(it, student) } } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt index e8579ddba..063b74825 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable import org.threeten.bp.LocalDate.now @@ -12,7 +12,7 @@ import javax.inject.Inject class AttendanceWork @Inject constructor(private val attendanceRepository: AttendanceRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return attendanceRepository.getAttendance(student, semester, now().monday, now().friday, true) + return attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true) .ignoreElement() } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt index 0da597e0a..26f79a0d5 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRepository -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable import org.threeten.bp.LocalDate.now @@ -14,7 +14,7 @@ class CompletedLessonWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return completedLessonsRepository.getCompletedLessons(student, semester, now().monday, now().friday, true) + return completedLessonsRepository.getCompletedLessons(student, semester, now().monday, now().sunday, true) .ignoreElement() } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt index c6110bbbf..1ef97f59c 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.exam.ExamRepository -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable import org.threeten.bp.LocalDate.now @@ -12,6 +12,6 @@ import javax.inject.Inject class ExamWork @Inject constructor(private val examRepository: ExamRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return examRepository.getExams(student, semester, now().monday, now().friday, true).ignoreElement() + return examRepository.getExams(student, semester, now().monday, now().sunday, true).ignoreElement() } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt index cf3484394..186d57b03 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.homework.HomeworkRepository -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable import org.threeten.bp.LocalDate.now @@ -12,6 +12,6 @@ import javax.inject.Inject class HomeworkWork @Inject constructor(private val homeworkRepository: HomeworkRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return homeworkRepository.getHomework(student, semester, now().monday, now().friday, true).ignoreElement() + return homeworkRepository.getHomework(student, semester, now().monday, now().sunday, true).ignoreElement() } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt index 0990ed67a..d79d24033 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.timetable.TimetableRepository -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable import org.threeten.bp.LocalDate.now @@ -12,7 +12,7 @@ import javax.inject.Inject class TimetableWork @Inject constructor(private val timetableRepository: TimetableRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return timetableRepository.getTimetable(student, semester, now().monday, now().friday, true) + return timetableRepository.getTimetable(student, semester, now().monday, now().sunday, true) .ignoreElement() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index 1c47cc7db..1140cb020 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.monday @@ -110,7 +110,7 @@ class ExamPresenter @Inject constructor( add(studentRepository.getCurrentStudent() .flatMap { student -> semesterRepository.getCurrentSemester(student).flatMap { semester -> - examRepository.getExams(student, semester, currentDate.monday, currentDate.friday, forceRefresh) + examRepository.getExams(student, semester, currentDate.monday, currentDate.sunday, forceRefresh) } } .map { createExamItems(it) } @@ -181,7 +181,7 @@ class ExamPresenter @Inject constructor( showPreButton(!currentDate.minusDays(7).isHolidays) showNextButton(!currentDate.plusDays(7).isHolidays) updateNavigationWeek("${currentDate.monday.toFormattedString("dd.MM")} - " + - currentDate.friday.toFormattedString("dd.MM")) + currentDate.sunday.toFormattedString("dd.MM")) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index fafc33191..41735a23f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import io.github.wulkanowy.utils.friday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.monday @@ -175,7 +175,7 @@ class HomeworkPresenter @Inject constructor( showPreButton(!currentDate.minusDays(7).isHolidays) showNextButton(!currentDate.plusDays(7).isHolidays) updateNavigationWeek("${currentDate.monday.toFormattedString("dd.MM")} - " + - currentDate.friday.toFormattedString("dd.MM")) + currentDate.sunday.toFormattedString("dd.MM")) } } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/SchooldaysRangeLimiter.kt b/app/src/main/java/io/github/wulkanowy/utils/SchooldaysRangeLimiter.kt index 922aafbd8..46a707abb 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SchooldaysRangeLimiter.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SchooldaysRangeLimiter.kt @@ -17,7 +17,7 @@ class SchooldaysRangeLimiter : DateRangeLimiter { override fun isOutOfRange(year: Int, month: Int, day: Int): Boolean { val date = LocalDate.of(year, month + 1, day) val dayOfWeek = date.dayOfWeek - return dayOfWeek == DayOfWeek.SUNDAY || dayOfWeek == DayOfWeek.SATURDAY || date.isHolidays + return dayOfWeek == DayOfWeek.SUNDAY || date.isHolidays } override fun getStartDate(): Calendar { diff --git a/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt index 8d022fc5d..802b2ee0f 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt @@ -92,8 +92,8 @@ inline val LocalDate.weekDayName: String inline val LocalDate.monday: LocalDate get() = with(MONDAY) -inline val LocalDate.friday: LocalDate - get() = with(FRIDAY) +inline val LocalDate.sunday: LocalDate + get() = with(SUNDAY) /** * [Dz.U. 2016 poz. 1335](http://prawo.sejm.gov.pl/isap.nsf/DocDetails.xsp?id=WDU20160001335) diff --git a/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt index 024b4727b..72d08c411 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt @@ -38,12 +38,12 @@ class TimeExtensionTest { } @Test - fun fridayTest() { - assertEquals(of(2018, 10, 5), of(2018, 10, 2).friday) - assertEquals(of(2018, 10, 5), of(2018, 10, 5).friday) - assertEquals(of(2018, 10, 5), of(2018, 10, 6).friday) - assertEquals(of(2018, 10, 5), of(2018, 10, 7).friday) - assertEquals(of(2018, 10, 12), of(2018, 10, 8).friday) + fun sundayTestTest() { + assertEquals(of(2018, 10, 7), of(2018, 10, 2).sunday) + assertEquals(of(2018, 10, 7), of(2018, 10, 5).sunday) + assertEquals(of(2018, 10, 7), of(2018, 10, 6).sunday) + assertEquals(of(2018, 10, 7), of(2018, 10, 7).sunday) + assertEquals(of(2018, 10, 14), of(2018, 10, 8).sunday) } @Test From 3308d7fe6f85c76837db1dd761147f64fd1919f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 19:52:01 +0200 Subject: [PATCH 0041/1526] Wrap long preference titles (#836) --- app/src/main/res/xml/scheme_preferences.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index c05910f99..4cdb989c7 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -38,6 +38,7 @@ app:defaultValue="@bool/pref_default_grade_statistics_list" app:iconSpaceReserved="false" app:key="@string/pref_key_grade_statistics_list" + app:singleLineTitle="false" app:title="@string/pref_view_grade_statistics_list" /> From 0c4364609bf2cb6110075a95b0f2ecf5c5a88751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 20:03:46 +0200 Subject: [PATCH 0042/1526] Show `check for updates` dialog before report a bug (#834) --- .../io/github/wulkanowy/ui/base/ErrorDialog.kt | 17 ++++++++++++++++- .../wulkanowy/ui/modules/about/AboutFragment.kt | 9 +++++++-- .../ui/modules/about/AboutPresenter.kt | 5 ++++- .../wulkanowy/ui/modules/about/AboutView.kt | 2 ++ .../github/wulkanowy/utils/ContextExtension.kt | 8 +++++++- app/src/main/res/values-de/strings.xml | 3 +++ app/src/main/res/values-pl/strings.xml | 3 +++ app/src/main/res/values-ru/strings.xml | 3 +++ app/src/main/res/values-uk/strings.xml | 3 +++ app/src/main/res/values/strings.xml | 5 +++++ 10 files changed, 53 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt index 5fd6a86a5..896e4ff1c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt @@ -9,6 +9,7 @@ import android.view.ViewGroup import android.widget.HorizontalScrollView import android.widget.Toast import android.widget.Toast.LENGTH_LONG +import androidx.appcompat.app.AlertDialog import androidx.core.content.getSystemService import io.github.wulkanowy.R import io.github.wulkanowy.databinding.DialogErrorBinding @@ -17,6 +18,7 @@ import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException import io.github.wulkanowy.sdk.exception.ServiceUnavailableException import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.getString +import io.github.wulkanowy.utils.openAppInMarket import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser import java.io.InterruptedIOException @@ -74,7 +76,9 @@ class ErrorDialog : BaseDialogFragment() { Toast.makeText(context, R.string.all_copied, LENGTH_LONG).show() } errorDialogCancel.setOnClickListener { dismiss() } - errorDialogReport.setOnClickListener { openEmailClient(stringWriter.toString()) } + errorDialogReport.setOnClickListener { + openConfirmDialog { openEmailClient(stringWriter.toString()) } + } errorDialogMessage.text = resources.getString(error) errorDialogReport.isEnabled = when (error) { is UnknownHostException, @@ -88,6 +92,17 @@ class ErrorDialog : BaseDialogFragment() { } } + private fun openConfirmDialog(callback: () -> Unit) { + AlertDialog.Builder(requireContext()) + .setTitle(R.string.dialog_error_check_update) + .setMessage(R.string.dialog_error_check_update_message) + .setNeutralButton(R.string.about_feedback) { _, _ -> callback() } + .setPositiveButton(R.string.dialog_error_check_update) { _, _ -> + requireContext().openAppInMarket(::showMessage) + } + .show() + } + private fun openEmailClient(content: String) { requireContext().openEmailClient( chooserTitle = getString(R.string.about_feedback), diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt index 3828a2bc4..d85d01e9e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.getCompatDrawable +import io.github.wulkanowy.utils.openAppInMarket import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject @@ -98,8 +99,12 @@ class AboutFragment : BaseFragment(R.layout.fragment_about } } + override fun openAppInMarket() { + context?.openAppInMarket(::showMessage) + } + override fun openLogViewer() { - if (appInfo.isDebug) (activity as? MainActivity)?.pushView(LogViewerFragment.newInstance()) + (activity as? MainActivity)?.pushView(LogViewerFragment.newInstance()) } override fun openDiscordInvite() { @@ -115,7 +120,7 @@ class AboutFragment : BaseFragment(R.layout.fragment_about chooserTitle = getString(R.string.about_feedback), email = "wulkanowyinc@gmail.com", subject = "Zgłoszenie błędu", - body = requireContext().getString(R.string.about_feedback_template, + body = getString(R.string.about_feedback_template, "${appInfo.systemManufacturer} ${appInfo.systemModel}", appInfo.systemVersion.toString(), appInfo.versionName ), onActivityNotFound = { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt index 27237ea6f..ee892adfc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.about import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler +import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import timber.log.Timber @@ -12,6 +13,7 @@ class AboutPresenter @Inject constructor( schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, + private val appInfo: AppInfo, private val analytics: FirebaseAnalyticsHelper ) : BasePresenter(errorHandler, studentRepository, schedulers) { @@ -27,7 +29,8 @@ class AboutPresenter @Inject constructor( when (name) { versionRes?.first -> { Timber.i("Opening log viewer") - openLogViewer() + if (appInfo.isDebug) openLogViewer() + else openAppInMarket() analytics.logEvent("about_open", "name" to "log_viewer") } feedbackRes?.first -> { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt index 79b700ea3..4c4b002f9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt @@ -25,6 +25,8 @@ interface AboutView : BaseView { fun updateData(data: List>) + fun openAppInMarket() + fun openLogViewer() fun openDiscordInvite() diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt index 489e7e6fb..2b40cb476 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt @@ -10,7 +10,7 @@ import androidx.annotation.ColorRes import androidx.annotation.DrawableRes import androidx.core.content.ContextCompat import androidx.core.graphics.ColorUtils -import io.github.wulkanowy.R +import io.github.wulkanowy.BuildConfig.APPLICATION_ID @ColorInt fun Context.getThemeAttrColor(@AttrRes colorAttr: Int): Int { @@ -39,6 +39,12 @@ fun Context.openInternetBrowser(uri: String, onActivityNotFound: (uri: String) - } } +fun Context.openAppInMarket(onActivityNotFound: (uri: String) -> Unit) { + openInternetBrowser("market://details?id=${APPLICATION_ID}") { + openInternetBrowser("https://github.com/wulkanowy/wulkanowy/releases", onActivityNotFound) + } +} + fun Context.openEmailClient(chooserTitle: String, email: String, subject: String, body: String, onActivityNotFound: () -> Unit = {}) { val intent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")).apply { putExtra(Intent.EXTRA_EMAIL, arrayOf(email)) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 084e3a86d..4b1669371 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -269,6 +269,9 @@ Logs teilen Aktualisieren + + Check for updates + Before reporting a bug, check first if an update with the bug fix is available Inhalt Wiederhol diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4bcfbb774..ffd66912c 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -289,6 +289,9 @@ Udostępnij logi Odśwież + + Sprawdź aktualizację + Przed zgłoszeniem błędu sprawdź wcześniej, czy dostępna jest już aktualizacja z poprawką błędu Treść Ponów diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 41771a3cf..c0c751960 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -289,6 +289,9 @@ Поделиться логами Обновить + + Check for updates + Before reporting a bug, check first if an update with the bug fix is available Содержание Повторить diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 652249c68..a63e5682a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -289,6 +289,9 @@ Поділитися логами Оновити + + Check for updates + Before reporting a bug, check first if an update with the bug fix is available Зміст Повторити diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2f13e031d..7793cd9c2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -317,6 +317,11 @@ Refresh + + Check for updates + Before reporting a bug, check first if an update with the bug fix is available + + Content Retry From b744a4182bc6754dbcb44c20772043f5355163a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 20:04:09 +0200 Subject: [PATCH 0043/1526] Open dontkillmyapp.com if no action found in app killer manager (#835) --- .../ui/modules/settings/SettingsFragment.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index 0d1d25656..248417fd1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -7,6 +7,7 @@ import androidx.appcompat.app.AlertDialog import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.thelittlefireman.appkillermanager.AppKillerManager +import com.thelittlefireman.appkillermanager.exceptions.NoActionFoundException import com.yariksoffice.lingver.Lingver import dagger.android.support.AndroidSupportInjection import io.github.wulkanowy.R @@ -14,6 +15,7 @@ import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject class SettingsFragment : PreferenceFragmentCompat(), @@ -133,9 +135,13 @@ class SettingsFragment : PreferenceFragmentCompat(), .setMessage(R.string.pref_notify_fix_sync_issues_message) .setNegativeButton(android.R.string.cancel) { _, _ -> } .setPositiveButton(R.string.pref_notify_fix_sync_issues_settings_button) { _, _ -> - AppKillerManager.doActionPowerSaving(requireContext()) - AppKillerManager.doActionAutoStart(requireContext()) - AppKillerManager.doActionNotification(requireContext()) + try { + AppKillerManager.doActionPowerSaving(requireContext()) + AppKillerManager.doActionAutoStart(requireContext()) + AppKillerManager.doActionNotification(requireContext()) + } catch (e: NoActionFoundException) { + requireContext().openInternetBrowser("https://dontkillmyapp.com/${AppKillerManager.getDevice()?.manufacturer}", ::showMessage) + } } .show() } From 63f2576ff1dd90d855eb38376087b0a6a8061057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 20:07:24 +0200 Subject: [PATCH 0044/1526] Hide advanced login options button (#837) --- app/build.gradle | 2 +- .../wulkanowy/data/repositories/student/StudentRemote.kt | 4 ++-- app/src/main/res/layout/fragment_login_form.xml | 6 +----- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0e95493c9..7c1309964 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,7 +124,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:fd51552" + implementation "io.github.wulkanowy:sdk:3c2763c" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt index 9b77c9ad3..15c336505 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt @@ -39,7 +39,7 @@ class StudentRemote @Inject constructor(private val sdk: Sdk) { } fun getStudentsMobileApi(token: String, pin: String, symbol: String): Single> { - return sdk.getStudentsFromMobileApi(token, pin, symbol).map { mapStudents(it, "", "") } + return sdk.getStudentsFromMobileApi(token, pin, symbol, "").map { mapStudents(it, "", "") } } fun getStudentsScrapper(email: String, password: String, scrapperBaseUrl: String, symbol: String): Single> { @@ -47,6 +47,6 @@ class StudentRemote @Inject constructor(private val sdk: Sdk) { } fun getStudentsHybrid(email: String, password: String, scrapperBaseUrl: String, symbol: String): Single> { - return sdk.getStudentsHybrid(email, password, scrapperBaseUrl, symbol).map { mapStudents(it, email, password) } + return sdk.getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol).map { mapStudents(it, email, password) } } } diff --git a/app/src/main/res/layout/fragment_login_form.xml b/app/src/main/res/layout/fragment_login_form.xml index e4a5fab78..d91d7b037 100644 --- a/app/src/main/res/layout/fragment_login_form.xml +++ b/app/src/main/res/layout/fragment_login_form.xml @@ -67,7 +67,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="8dp" - android:layout_marginRight="8dp" android:layout_weight="1" android:text="@string/login_contact_email" app:icon="@drawable/ic_more_messages" /> @@ -78,7 +77,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" - android:layout_marginLeft="8dp" android:layout_weight="1" android:text="@string/about_faq" app:icon="@drawable/ic_about_faq" /> @@ -182,7 +180,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="24dp" - android:layout_marginRight="24dp" android:text="@string/login_recover_button" android:textAppearance="?android:textAppearance" app:backgroundTint="?android:windowBackground" @@ -223,9 +220,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" android:text="@string/login_advanced" android:textAppearance="?android:textAppearance" + android:visibility="gone" app:backgroundTint="?android:windowBackground" app:fontFamily="sans-serif-medium" app:layout_constraintBottom_toBottomOf="@id/loginFormSignIn" @@ -241,7 +238,6 @@ android:layout_gravity="center_vertical" android:layout_marginTop="48dp" android:layout_marginEnd="24dp" - android:layout_marginRight="24dp" android:layout_marginBottom="16dp" android:text="@string/login_sign_in" app:layout_constraintBottom_toBottomOf="parent" From c71b533645d3fae30816a01a9b7ae67bb2a062a1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 24 May 2020 18:10:47 +0000 Subject: [PATCH 0045/1526] Bump firebase-inappmessaging-display-ktx from 19.0.6 to 19.0.7 (#838) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 7c1309964..3904b6aaa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -182,7 +182,7 @@ dependencies { implementation "io.github.wulkanowy:AppKillerManager:3.0.0" playImplementation 'com.google.firebase:firebase-analytics:17.4.1' - playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.6' + playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.6" playImplementation 'com.google.firebase:firebase-messaging:20.1.7' playImplementation 'com.google.firebase:firebase-crashlytics:17.0.0' From dcbaa170db65e8a1b219ec365e8f88e8080e6e56 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 24 May 2020 20:36:09 +0200 Subject: [PATCH 0046/1526] Bump about_libraries from 8.1.2 to 8.1.3 (#845) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2b92bc7d8..e5577904a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext.kotlin_version = '1.3.72' - ext.about_libraries = '8.1.2' + ext.about_libraries = '8.1.3' repositories { mavenCentral() google() From 4c295f2ab4316cc3cf9f0b4301ecb8500b63cae1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 24 May 2020 18:42:24 +0000 Subject: [PATCH 0047/1526] Bump firebase-messaging from 20.1.7 to 20.2.0 (#839) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3904b6aaa..aceed6733 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -184,7 +184,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics:17.4.1' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.6" - playImplementation 'com.google.firebase:firebase-messaging:20.1.7' + playImplementation 'com.google.firebase:firebase-messaging:20.2.0' playImplementation 'com.google.firebase:firebase-crashlytics:17.0.0' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' From 699fbff082e618ba6ead131007ef1b41f45eba1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 24 May 2020 20:53:23 +0200 Subject: [PATCH 0048/1526] Fix debug channel (#846) --- .../io/github/wulkanowy/services/sync/channels/DebugChannel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt index 9b6f213bd..a67350550 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt @@ -22,7 +22,7 @@ class DebugChannel @Inject constructor( } override fun create() { - if (appInfo.isDebug) return + if (!appInfo.isDebug) return notificationManager.createNotificationChannel( NotificationChannel(CHANNEL_ID, context.getString(R.string.channel_debug), IMPORTANCE_DEFAULT) .apply { From 0b4434fdb66d049290b7648955dbb6c9ba6e78d3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 24 May 2020 20:53:59 +0200 Subject: [PATCH 0049/1526] Bump firebase-crashlytics-gradle from 2.1.0 to 2.1.1 (#841) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e5577904a..696e778f5 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.android.tools.build:gradle:3.6.3' classpath 'com.google.gms:google-services:4.3.3' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.0' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1' classpath "com.github.triplet.gradle:play-publisher:2.7.5" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.8" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" From c8b32fdb3b4a4bbe7cef10be0503110a409bfebb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 24 May 2020 21:02:42 +0200 Subject: [PATCH 0050/1526] Bump firebase-analytics from 17.4.1 to 17.4.2 (#843) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index aceed6733..4c36f0a64 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -181,7 +181,7 @@ dependencies { implementation "io.coil-kt:coil:0.11.0" implementation "io.github.wulkanowy:AppKillerManager:3.0.0" - playImplementation 'com.google.firebase:firebase-analytics:17.4.1' + playImplementation 'com.google.firebase:firebase-analytics:17.4.2' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.6" playImplementation 'com.google.firebase:firebase-messaging:20.2.0' From 27b1d076c7eb3ad5302739d3cf4a8a9707584c0b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 24 May 2020 21:03:35 +0200 Subject: [PATCH 0051/1526] Bump firebase-inappmessaging-ktx from 19.0.6 to 19.0.7 (#844) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4c36f0a64..224234fc3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -183,7 +183,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics:17.4.2' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' - playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.6" + playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.7" playImplementation 'com.google.firebase:firebase-messaging:20.2.0' playImplementation 'com.google.firebase:firebase-crashlytics:17.0.0' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' From 1ee10a5902ea7cbf498183ab4a34ac69863c62d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 24 May 2020 21:18:49 +0200 Subject: [PATCH 0052/1526] New Crowdin translations (#847) --- app/src/main/res/values-pl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ffd66912c..7f25d8a67 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -47,7 +47,7 @@ Nie znaleziono ucznia. Sprawdź symbol To pole jest wymagane Wybrany uczeń jest już zalogowany - Symbol znajdziesz na stronie dziennika w Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne + Symbol znajdziesz na stronie dziennika w Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne.\n\nUpewnij się, że w polu Dziennik UONET+ na poprzednim ekranie został ustawiony odpowiedni dziennik Wybierz uczniów do zalogowania w aplikacji Inne opcje W tym trybie nie działa szczęśliwy numerek, uczeń na tle klasy, podsumowanie frekwencji, usprawiedliwianie nieobecności, lekcje zrealizowane, informacje o szkole i podgląd listy zarejestrowanych urządzeń @@ -290,7 +290,7 @@ Udostępnij logi Odśwież - Sprawdź aktualizację + Sprawdź dostępność aktualizacji Przed zgłoszeniem błędu sprawdź wcześniej, czy dostępna jest już aktualizacja z poprawką błędu Treść From 4044cdd9a553c76900e1b14758d509ec80cf485d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 May 2020 21:20:17 +0200 Subject: [PATCH 0053/1526] Version 0.18.1 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 14 ++++++-------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index ee3e6f3af..d858cf3e0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.18.0 + - 0.18.1 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index 224234fc3..31cada744 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 59 - versionName "0.18.0" + versionCode 60 + versionName "0.18.1" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -124,7 +124,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:3c2763c" + implementation "io.github.wulkanowy:sdk:0.18.1" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 427ad4dc0..d61f1b97b 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,10 +1,8 @@ -Wersja 0.18.0 -- naprawiliśmy odświeżanie zadań domowych -- naprawiliśmy powiadomienia na androidzie 8.0 -- oceny powinny się teraz odświeżać trochę szybciej -- dodaliśmy tryb pełnoekranowy w zadaniach -- dodaliśmy wyszukiwanie w wiadomościach -- dodaliśmy opcje oznaczania bieżącej lekcji na planie/w powiadomieniu (domyślnie wyłączone) -- dodaliśmy testową opcję naprawy powiadomień na np. Huawei, Xiaomi (znajdziesz ją w ustawieniach) +Wersja 0.18.1 +- naprawiliśmy sortowanie w ocenach +- naprawilismy wiele problemów ze stabilnością +- nazwy opcji w ustawieniach nie są już ucięte +- w zadaniach domowych wyświetlają się teraz pozycje na weekend +- wyłączyliśmy logowanie przez token (bo nie działa i nie wiadomo kiedy będzie działać) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 2ff031005e3d542e1033f16f814771b22a8d41ec Mon Sep 17 00:00:00 2001 From: Piotr Romanowski Date: Sat, 30 May 2020 13:15:28 +0200 Subject: [PATCH 0054/1526] Fix displaying the feature disabled message in completed lessons (#849) --- .../ui/modules/timetable/completed/CompletedLessonsPresenter.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt index 7243061d6..92aeb5814 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt @@ -43,6 +43,7 @@ class CompletedLessonsPresenter @Inject constructor( completedLessonsErrorHandler.showErrorMessage = ::showErrorViewOnError completedLessonsErrorHandler.onFeatureDisabled = { this.view?.showFeatureDisabled() + this.view?.showEmpty(true); Timber.i("Completed lessons feature disabled by school") } loadData(ofEpochDay(date ?: baseDate.toEpochDay())) From df57d16d21dc053bd837c43bbea493192b669d93 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 30 May 2020 11:16:58 +0000 Subject: [PATCH 0055/1526] Bump dagger from 2.27 to 2.28 (#850) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 31cada744..2521a10ed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -114,7 +114,7 @@ play { ext { work_manager = "2.3.4" room = "2.2.5" - dagger = "2.27" + dagger = "2.28" chucker = "3.2.0" mockk = "1.9.2" } From 2149a4db9f7cf77e7d2cdb0592b9625613763acf Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 30 May 2020 11:17:22 +0000 Subject: [PATCH 0056/1526] Bump about_libraries from 8.1.3 to 8.1.4 (#851) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 696e778f5..ad2eddaac 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext.kotlin_version = '1.3.72' - ext.about_libraries = '8.1.3' + ext.about_libraries = '8.1.4' repositories { mavenCentral() google() From 1cfa1f15c0853da971ed7d6e3a49946a044ba9ac Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 30 May 2020 11:33:43 +0000 Subject: [PATCH 0057/1526] Bump gradle from 3.6.3 to 4.0.0 (#852) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ad2eddaac..7b4d04770 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.android.tools.build:gradle:3.6.3' + classpath 'com.android.tools.build:gradle:4.0.0' classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1' classpath "com.github.triplet.gradle:play-publisher:2.7.5" From ab7d30c9950c9f0eab5581494b8197425cb12394 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 30 May 2020 12:19:52 +0000 Subject: [PATCH 0058/1526] Bump sonarqube-gradle-plugin from 2.8 to 3.0 (#853) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7b4d04770..069c62b24 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1' classpath "com.github.triplet.gradle:play-publisher:2.7.5" - classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.8" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${about_libraries}" } From 5c0160a24d2bc3e9e1f9205b2bccec2b2b2138a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 2 Jun 2020 00:57:22 +0200 Subject: [PATCH 0059/1526] Don't capture click on login student select checkbox (#862) --- .../login/studentselect/LoginStudentSelectAdapter.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt index 7383a5ecb..f59260b43 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt @@ -31,9 +31,14 @@ class LoginStudentSelectAdapter @Inject constructor() : loginItemSchool.text = student.schoolName loginItemName.isEnabled = !alreadySaved loginItemSchool.isEnabled = !alreadySaved - loginItemCheck.isEnabled = !alreadySaved loginItemSignedIn.visibility = if (alreadySaved) View.VISIBLE else View.GONE + with(loginItemCheck) { + isEnabled = !alreadySaved + keyListener = null + isChecked = false + } + root.setOnClickListener { onClickListener(student, alreadySaved) From d8d13c73fb249326a6bd717ed9ed78c020c1c998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 2 Jun 2020 01:01:02 +0200 Subject: [PATCH 0060/1526] Filter out empty items in grade summary (#857) --- .../ui/modules/grade/summary/GradeSummaryPresenter.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 9b88689db..a61ad4af9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -109,7 +109,17 @@ class GradeSummaryPresenter @Inject constructor( private fun createGradeSummaryItems(items: List): List { return items + .filter { !checkEmpty(it) } .sortedBy { it.subject } .map { it.summary.copy(average = it.average) } } + + private fun checkEmpty(gradeSummary: GradeDetailsWithAverage): Boolean { + return gradeSummary.run { + summary.finalGrade.isBlank() + && summary.predictedGrade.isBlank() + && average == .0 + && points == "-" + } + } } From fb554a4a3b3fed614ce11cf66e8ed0572b26593b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 2 Jun 2020 01:01:58 +0200 Subject: [PATCH 0061/1526] Fix capitalization in new message activity (#860) --- app/src/main/res/layout/activity_send_message.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_send_message.xml b/app/src/main/res/layout/activity_send_message.xml index f59dcabdf..e0ec52bb6 100644 --- a/app/src/main/res/layout/activity_send_message.xml +++ b/app/src/main/res/layout/activity_send_message.xml @@ -148,7 +148,7 @@ android:hint="@string/message_content" android:imeOptions="flagNoExtractUi" android:importantForAutofill="no" - android:inputType="textMultiLine" + android:inputType="textMultiLine|textCapSentences" android:minHeight="58dp" android:paddingStart="16dp" android:paddingLeft="16dp" From 1db42210e8492a707cea4aaaffd6835e6a93130d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2020 01:02:16 +0200 Subject: [PATCH 0062/1526] Bump about_libraries from 8.1.4 to 8.1.6 (#861) Bumps `about_libraries` from 8.1.4 to 8.1.6. Updates `aboutlibraries-plugin` from 8.1.4 to 8.1.6 - [Release notes](https://github.com/mikepenz/AboutLibraries/releases) - [Changelog](https://github.com/mikepenz/AboutLibraries/blob/develop/gradle-release.gradle) - [Commits](https://github.com/mikepenz/AboutLibraries/compare/v8.1.4...v8.1.6) Updates `aboutlibraries-core` from 8.1.4 to 8.1.6 - [Release notes](https://github.com/mikepenz/AboutLibraries/releases) - [Changelog](https://github.com/mikepenz/AboutLibraries/blob/develop/gradle-release.gradle) - [Commits](https://github.com/mikepenz/AboutLibraries/compare/v8.1.4...v8.1.6) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 069c62b24..98cc971e0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext.kotlin_version = '1.3.72' - ext.about_libraries = '8.1.4' + ext.about_libraries = '8.1.6' repositories { mavenCentral() google() From 54f41aaa6387da74a559707146d37b746b8603a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 2 Jun 2020 01:04:02 +0200 Subject: [PATCH 0063/1526] Fix too many alarms on samsung devices (#859) --- .../services/alarm/TimetableNotificationSchedulerHelper.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt index 5374c4767..54b245ddb 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.services.alarm import android.app.AlarmManager import android.app.AlarmManager.RTC_WAKEUP import android.app.PendingIntent -import android.app.PendingIntent.FLAG_CANCEL_CURRENT +import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.content.Context import android.content.Intent import androidx.core.app.AlarmManagerCompat @@ -55,7 +55,7 @@ class TimetableNotificationSchedulerHelper @Inject constructor( private fun cancelScheduledTo(range: ClosedRange, requestCode: Int) { if (now() in range) cancelNotification() - alarmManager.cancel(PendingIntent.getBroadcast(context, requestCode, Intent(), FLAG_CANCEL_CURRENT)) + alarmManager.cancel(PendingIntent.getBroadcast(context, requestCode, Intent(), FLAG_UPDATE_CURRENT)) } fun cancelNotification() = NotificationManagerCompat.from(context).cancel(MainView.Section.TIMETABLE.id) @@ -102,7 +102,7 @@ class TimetableNotificationSchedulerHelper @Inject constructor( PendingIntent.getBroadcast(context, getRequestCode(time, studentId), intent.also { it.putExtra(NOTIFICATION_ID, MainView.Section.TIMETABLE.id) it.putExtra(LESSON_TYPE, notificationType) - }, FLAG_CANCEL_CURRENT) + }, FLAG_UPDATE_CURRENT) ) Timber.d("TimetableNotification scheduled: type: $notificationType, subject: ${intent.getStringExtra(LESSON_TITLE)}, start: $time, student: $studentId") } From ba5dbf90d82719c11dbf3e94816bcbd702373f72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 2 Jun 2020 01:04:41 +0200 Subject: [PATCH 0064/1526] Fixes in updating adapter items (#854) --- .../grade/details/GradeDetailsAdapter.kt | 59 +++++++++++-------- .../modules/message/tab/MessageTabAdapter.kt | 5 +- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt index d5e05f3b9..c129d9485 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt @@ -7,6 +7,7 @@ import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.NO_POSITION import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.databinding.HeaderGradeDetailsBinding @@ -23,7 +24,7 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter() - private var expandedPosition = RecyclerView.NO_POSITION + private var expandedPosition = NO_POSITION private var isExpandable = false @@ -35,7 +36,7 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter 1) { - Timber.e("Header with subject $subject found ${candidates.size} times! Items: $candidates, expanded: $expandedPosition") + Timber.e("Header with subject $subject found ${candidates.size} times! Expanded: $expandedPosition. Items: $candidates") } return candidates.first() } fun updateHeaderItem(item: GradeDetailsItem) { - headers[headers.indexOf(item)] = item - items[items.indexOf(item)] = item - notifyItemChanged(items.indexOf(item)) + val headerPosition = headers.indexOf(item) + val itemPosition = items.indexOf(item) + + if (headerPosition == NO_POSITION || itemPosition == NO_POSITION) { + Timber.e("Invalid update header positions! Header: $headerPosition, item: $itemPosition") + } + + headers[headerPosition] = item + items[itemPosition] = item + notifyItemChanged(itemPosition) } fun collapseAll() { if (expandedPosition != -1) { refreshList(headers) - expandedPosition = RecyclerView.NO_POSITION + expandedPosition = NO_POSITION } } @Synchronized - private fun refreshList(newItems: List) { + private fun refreshList(newItems: MutableList) { val diffCallback = GradeDetailsDiffUtil(items, newItems) val diffResult = DiffUtil.calculateDiff(diffCallback) - items = newItems.toMutableList() + items = newItems diffResult.dispatchUpdatesTo(this) } @@ -99,23 +103,24 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter bindHeaderViewHolder( - binding = holder.binding, + holder = holder, header = items[position].value as GradeDetailsHeader, - headerPosition = headers.indexOf(items[position]), - adapterPosition = position + position = position ) is ItemViewHolder -> bindItemViewHolder( - binding = holder.binding, - grade = items[position].value as Grade, - position = holder.adapterPosition + holder = holder, + grade = items[position].value as Grade ) } } - private fun bindHeaderViewHolder(binding: HeaderGradeDetailsBinding, header: GradeDetailsHeader, headerPosition: Int, adapterPosition: Int) { - with(binding) { + private fun bindHeaderViewHolder(holder: HeaderViewHolder, header: GradeDetailsHeader, position: Int) { + val headerPosition = headers.indexOf(items[position]) + val adapterPosition = holder.adapterPosition + + with(holder.binding) { gradeHeaderDivider.visibility = if (adapterPosition == 0) View.GONE else View.VISIBLE - gradeHeaderSubject.apply { + with(gradeHeaderSubject) { text = header.subject maxLines = if (headerPosition == expandedPosition) 2 else 1 } @@ -130,7 +135,7 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter Date: Tue, 2 Jun 2020 15:13:41 +0200 Subject: [PATCH 0065/1526] Revert "Bump sonarqube-gradle-plugin from 2.8 to 3.0" (#864) This reverts commit ab7d30c9950c9f0eab5581494b8197425cb12394. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 98cc971e0..7e5759d12 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1' 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:2.8" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${about_libraries}" } From ff5a47b0dfceddce73067448736da7c0cf3713ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 2 Jun 2020 15:18:41 +0200 Subject: [PATCH 0066/1526] New Crowdin translations (#856) --- app/src/main/res/values-ru/strings.xml | 4 +-- app/src/main/res/values-uk/strings.xml | 38 +++++++++++++------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c0c751960..6eb8f7741 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -290,8 +290,8 @@ Поделиться логами Обновить - Check for updates - Before reporting a bug, check first if an update with the bug fix is available + Проверить наличие обновлений + Прежде чем сообщать об ошибке, проверьте наличие обновлений Содержание Повторить diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a63e5682a..ec4dbc155 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -120,14 +120,14 @@ Години Зміни Брак уроків у цей день - %s min - %s sec - %1$s left - in %1$s - Finished - Now: %s - Next: %s - Later: %s + %s хвилин + %s сек + %1$s лишилося + через %1$s + Завершено + Зараз: %s + Наступний: %s + Пізніше: %s Уроки, що відбулися Показати уроки, що відбулися @@ -290,8 +290,8 @@ Поділитися логами Оновити - Check for updates - Before reporting a bug, check first if an update with the bug fix is available + Провірити наявність оновлень + Перед тим, як повідомлювати о помілці, перевірте наявність оновлень Зміст Повторити @@ -308,8 +308,8 @@ Предмет Попередній Наступний - Search - Search... + Пошук + Пошук... Брак уроків Увібрати тему @@ -324,17 +324,17 @@ Показувати присутність у відвідуваності Тема додатку Більше оцінок - Mark current lesson in timetable - Show chart list in class grades + Позначити поточний урок у розкладі + Показувати діаграми в оцінках класу Показати уроки всього класу Схема кольорів оцінок Мова додатку Повідомлення Показувати повідомлення - Show upcoming lesson notifications - Fix synchronization & notifications issues - Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. - Go to settings + Показувати повідомлення о наступних уроках + Виправити помилки з синхронізацією і повідомленнями + На вашому пристрої можуть бути помилки з синхронізацією і повідомленнями\n\nЩоб виправити іх, вам необхідно додати Wulkanowy в авто-старт и вимкнути оптимізацію/экономію батареї в налаштуваннях пристрою. + Перейти до налаштувань Показувати дебаг-повідомлення Синхронізація Автоматична синхронізація @@ -360,7 +360,7 @@ Нові повідомлення Нові нотатки Показувати push-повідомлення - Upcoming lessons + Наступні уроки Дебаг Чорний From 792e44a9d0b263832e5cf70d15cbaf21e723f820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 2 Jun 2020 15:50:32 +0200 Subject: [PATCH 0067/1526] Fix login button state in student select login fragment (#863) --- .../LoginStudentSelectAdapter.kt | 9 ++++++- .../LoginStudentSelectPresenter.kt | 8 +++++- .../layout/fragment_login_student_select.xml | 25 ++++++++++--------- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt index f59260b43..3332f2be8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt @@ -12,7 +12,13 @@ import javax.inject.Inject class LoginStudentSelectAdapter @Inject constructor() : RecyclerView.Adapter() { + private val checkedList = mutableMapOf() + var items = emptyList>() + set(value) { + field = value + checkedList.clear() + } var onClickListener: (Student, alreadySaved: Boolean) -> Unit = { _, _ -> } @@ -36,7 +42,7 @@ class LoginStudentSelectAdapter @Inject constructor() : with(loginItemCheck) { isEnabled = !alreadySaved keyListener = null - isChecked = false + isChecked = checkedList[position] ?: false } root.setOnClickListener { @@ -45,6 +51,7 @@ class LoginStudentSelectAdapter @Inject constructor() : with(loginItemCheck) { if (isEnabled) { isChecked = !isChecked + checkedList[position] = isChecked } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index b2d0aed91..db25c0da3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -22,7 +22,7 @@ class LoginStudentSelectPresenter @Inject constructor( var students = emptyList() - private var selectedStudents = mutableListOf() + private val selectedStudents = mutableListOf() fun onAttachView(view: LoginStudentSelectView, students: Serializable?) { super.onAttachView(view) @@ -69,6 +69,7 @@ class LoginStudentSelectPresenter @Inject constructor( } private fun loadData(students: List) { + resetSelectedState() this.students = students disposable.add(studentRepository.getSavedStudents() .map { savedStudents -> @@ -88,6 +89,11 @@ class LoginStudentSelectPresenter @Inject constructor( ) } + private fun resetSelectedState() { + selectedStudents.clear() + view?.enableSignIn(false) + } + private fun registerStudents(students: List) { disposable.add(studentRepository.saveStudents(students) .map { students.first().apply { id = it.first() } } diff --git a/app/src/main/res/layout/fragment_login_student_select.xml b/app/src/main/res/layout/fragment_login_student_select.xml index 64e06cbd5..f9c6c1572 100644 --- a/app/src/main/res/layout/fragment_login_student_select.xml +++ b/app/src/main/res/layout/fragment_login_student_select.xml @@ -24,10 +24,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" + android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - android:visibility="gone" tools:visibility="visible"> + android:layout_marginRight="16dp" + android:orientation="horizontal"> + @@ -95,9 +96,9 @@ android:layout_height="wrap_content" android:layout_marginStart="32dp" android:layout_marginLeft="32dp" + android:layout_marginTop="32dp" android:layout_marginEnd="32dp" android:layout_marginRight="32dp" - android:layout_marginTop="32dp" android:layout_marginBottom="32dp" android:gravity="center_horizontal" android:text="@string/login_select_student" @@ -129,8 +130,8 @@ android:layout_height="wrap_content" android:layout_marginTop="32dp" android:layout_marginEnd="24dp" - android:layout_marginRight="24dp" android:layout_marginBottom="32dp" + android:enabled="false" android:text="@string/login_sign_in" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" From 191b1ad022e19c02bb53231e88e38aba21b63a4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 2 Jun 2020 15:51:15 +0200 Subject: [PATCH 0068/1526] Emulate summaries from grade list when summaries are empty (#855) --- app/build.gradle | 2 +- .../ui/modules/grade/GradeAverageProvider.kt | 33 ++- .../grade/summary/GradeSummaryPresenter.kt | 2 +- .../modules/grade/GradeAverageProviderTest.kt | 269 ++++++++++++------ 4 files changed, 215 insertions(+), 91 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2521a10ed..f29af84fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,7 +124,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.18.1" + implementation "io.github.wulkanowy:sdk:d0081b4" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index 954b57566..9582a5db3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -1,5 +1,7 @@ package io.github.wulkanowy.ui.modules.grade +import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.grade.GradeRepository @@ -58,15 +60,14 @@ class GradeAverageProvider @Inject constructor( val isAnyAverage = summaries.any { it.average != .0 } val allGrades = details.groupBy { it.subject } - summaries.map { summary -> + summaries.emulateEmptySummaries(student, semester, allGrades.toList(), isAnyAverage).map { summary -> val grades = allGrades[summary.subject].orEmpty() GradeDetailsWithAverage( subject = summary.subject, average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { - grades.map { - if (student.loginMode == Sdk.Mode.SCRAPPER.name) it.changeModifier(plusModifier, minusModifier) - else it - }.calcAverage() + (if (student.loginMode == Sdk.Mode.SCRAPPER.name) + grades.map { it.changeModifier(plusModifier, minusModifier) } + else grades).calcAverage() } else summary.average, points = summary.pointsSum, summary = summary, @@ -75,4 +76,26 @@ class GradeAverageProvider @Inject constructor( } } } + + private fun List.emulateEmptySummaries(student: Student, semester: Semester, grades: List>>, calcAverage: Boolean): List { + if (isNotEmpty() && size == grades.size) return this + + return grades.mapIndexed { i, (subject, details) -> + singleOrNull { it.subject == subject }?.let { return@mapIndexed it } + GradeSummary( + studentId = student.studentId, + semesterId = semester.semesterId, + position = i, + subject = subject, + predictedGrade = "", + finalGrade = "", + proposedPoints = "", + finalPoints = "", + pointsSum = "", + average = if (calcAverage) (if (student.loginMode == Sdk.Mode.SCRAPPER.name) { + details.map { it.changeModifier(plusModifier, minusModifier) } + } else details).calcAverage() else .0 + ) + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index a61ad4af9..229a0107d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -119,7 +119,7 @@ class GradeSummaryPresenter @Inject constructor( summary.finalGrade.isBlank() && summary.predictedGrade.isBlank() && average == .0 - && points == "-" + && points.isBlank() } } } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index fcc30593f..ee8634ca8 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -1,11 +1,11 @@ package io.github.wulkanowy.ui.modules.grade +import io.github.wulkanowy.createSemesterEntity import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.grade.GradeRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository -import io.github.wulkanowy.createSemesterEntity import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.sdk.Sdk import io.reactivex.Single @@ -84,8 +84,6 @@ class GradeAverageProviderTest { fun setUp() { MockitoAnnotations.initMocks(this) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) - `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) @@ -93,7 +91,83 @@ class GradeAverageProviderTest { } @Test - fun onlyOneSemesterTest() { + fun `force calc current semester average with default modifiers in scraper mode`() { + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) // from details and after set custom plus/minus + } + + @Test + fun `force calc current semester average with custom modifiers in scraper mode`() { + val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) + + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) + `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + + `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) // from details and after set custom plus/minus + } + + @Test + fun `force calc current semester average with custom modifiers in api mode`() { + val student = student.copy(loginMode = Sdk.Mode.API.name) + + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) // useless in this mode + `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + + `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) // (from details): 3.375 + } + + @Test + fun `force calc current semester average with custom modifiers in hybrid mode`() { + val student = student.copy(loginMode = Sdk.Mode.HYBRID.name) + + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) // useless in this mode + `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + + `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) // (from details): 3.375 + } + + @Test + fun `calc current semester average`() { + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) + `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(2, items.size) + assertEquals(2.9, items.single { it.subject == "Matematyka" }.average, .0) // from summary: 2,9 + assertEquals(3.4, items.single { it.subject == "Fizyka" }.average, .0) // from details: 3,4 + } + + @Test + fun `force calc current semester average`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) @@ -101,65 +175,12 @@ class GradeAverageProviderTest { val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() assertEquals(2, items.size) - assertEquals(2.5, items.single { it.subject == "Matematyka" }.average, .0) - assertEquals(3.0, items.single { it.subject == "Fizyka" }.average, .0) + assertEquals(2.5, items.single { it.subject == "Matematyka" }.average, .0) // from details: 2,5 + assertEquals(3.0, items.single { it.subject == "Fizyka" }.average, .0) // from details: 3,0 } @Test - fun onlyOneSemester_gradesWithModifiers_default() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) - - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() - - assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) - } - - @Test - fun onlyOneSemester_gradesWithModifiers_api() { - val student = student.copy(loginMode = Sdk.Mode.API.name) - - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) - - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() - - assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) - } - - @Test - fun onlyOneSemester_gradesWithModifiers_scrapper() { - val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) - - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) - - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() - - assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) - } - - @Test - fun onlyOneSemester_gradesWithModifiers_hybrid() { - val student = student.copy(loginMode = Sdk.Mode.HYBRID.name) - - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) - - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() - - assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) - } - - @Test - fun allYearFirstSemesterTest() { + fun `force calc full year average when current is first`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) @@ -167,33 +188,19 @@ class GradeAverageProviderTest { val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[1].semesterId).blockingGet() assertEquals(2, items.size) - assertEquals(3.5, items.single { it.subject == "Matematyka" }.average, .0) - assertEquals(3.5, items.single { it.subject == "Fizyka" }.average, .0) - } - - @Test - fun allYearSecondSemesterTest() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) - - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() - - assertEquals(2, items.size) - assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) - assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) + assertEquals(3.5, items.single { it.subject == "Matematyka" }.average, .0) // (from summary): 3,5 + assertEquals(3.5, items.single { it.subject == "Fizyka" }.average, .0) // (from summary): 3,5 } @Test(expected = IllegalArgumentException::class) - fun incorrectAverageModeTest() { + fun `calc average on invalid mode`() { `when`(preferencesRepository.gradeAverageMode).thenReturn("test_mode") gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).blockingGet() } @Test - fun allYearSemester_averageFromSummary() { + fun `calc full year average`() { `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to listOf( @@ -208,14 +215,14 @@ class GradeAverageProviderTest { val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() assertEquals(2, items.size) - assertEquals(3.25, items.single { it.subject == "Matematyka" }.average, .0) - assertEquals(3.75, items.single { it.subject == "Fizyka" }.average, .0) + assertEquals(3.25, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries ↑): 3,0 + 3,5 → 3,25 + assertEquals(3.75, items.single { it.subject == "Fizyka" }.average, .0) // (from summaries ↑): 3,5 + 4,0 → 3,75 } @Test - fun onlyOneSemester_averageFromSummary_forceCalc() { - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + fun `force calc full year average`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( getSummary(22, "Matematyka", 1.1), @@ -225,8 +232,102 @@ class GradeAverageProviderTest { val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() assertEquals(2, items.size) - assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) - assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) + assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 + assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) // (from details): 3,5 + 3,0 → 3,25 + } + + @Test + fun `calc full year average when no summaries`() { + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to emptyList())) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to emptyList())) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(2, items.size) + assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 2,5 + 3,5 → 3,0 + assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) // (from details): 3,5 + 3,0 → 3,25 + } + + @Test + fun `force calc full year average when no summaries`() { + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to emptyList())) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to emptyList())) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(2, items.size) + assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 + assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) // (from details): 3,5 + 3,0 → 3,25 + } + + @Test + fun `calc full year average when missing summaries in both semesters`() { + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to listOf( + getSummary(22, "Matematyka", 4.0) + ))) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( + getSummary(23, "Matematyka", 3.0) + ))) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(2, items.size) + assertEquals(3.5, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries ↑): 4,0 + 3,0 → 3,5 + assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) // (from details): 3,5 + 3,0 → 3,25 + } + + @Test + fun `calc full year average when missing summary in second semester`() { + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries.dropLast(1))) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(2, items.size) + assertEquals(3.4, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries): 3,9 + 2,9 → 3,4 + assertEquals(3.05, items.single { it.subject == "Fizyka" }.average, .0) // 3,1 (from summary) + 3,0 (from details) → 3,05 + } + + @Test + fun `calc full year average when missing summary in first semester`() { + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries.dropLast(1))) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(2, items.size) + assertEquals(3.4, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries): 3,9 + 2,9 → 3,4 + assertEquals(3.45, items.single { it.subject == "Fizyka" }.average, .0) // 3,5 (from details) + 3,4 (from summary) → 3,45 + } + + @Test + fun `force calc full year average when missing summary in first semester`() { + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries.dropLast(1))) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(2, items.size) + assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 + assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) // (from details): 3,5 + 3,0 → 3,25 } private fun getGrade(semesterId: Int, subject: String, value: Double, modifier: Double = 0.0): Grade { From 419675066f516786fc78095273c78f142be15b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 2 Jun 2020 17:07:52 +0200 Subject: [PATCH 0069/1526] Version 0.18.2 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 13 +++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index d858cf3e0..4bb842821 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.18.1 + - 0.18.2 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index f29af84fa..e2aab017d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 60 - versionName "0.18.1" + versionCode 61 + versionName "0.18.2" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -124,7 +124,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:d0081b4" + implementation "io.github.wulkanowy:sdk:0.18.2" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index d61f1b97b..1908d2e26 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,8 +1,9 @@ -Wersja 0.18.1 -- naprawiliśmy sortowanie w ocenach -- naprawilismy wiele problemów ze stabilnością -- nazwy opcji w ustawieniach nie są już ucięte -- w zadaniach domowych wyświetlają się teraz pozycje na weekend -- wyłączyliśmy logowanie przez token (bo nie działa i nie wiadomo kiedy będzie działać) +Wersja 0.18.2 +- naprawiliśmy zaznaczanie uczniów przy logowaniu +- naprawiliśmy odświeżanie planu lekcji na samsungach +- naprawiliśmy wysyłanie wiadomości +- poprawiliśmy oznaczanie nowych wiadomości jako przeczytanych +- w podsumowaniu ocen nie będą się już pokazywać „puste” przedmioty +- w polu pisania wiadomości pierwsza litera w zdaniu będzie teraz domyślnie duża Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 522a36d67027dc775f69c773a6272438fa04bd1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 10 Jun 2020 16:26:45 +0200 Subject: [PATCH 0070/1526] Fix message deleting (#875) --- .../github/wulkanowy/data/repositories/message/MessageRemote.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt index 1808c048b..2df2e20a3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt @@ -75,6 +75,6 @@ class MessageRemote @Inject constructor(private val sdk: Sdk) { } fun deleteMessage(student: Student, message: Message): Single { - return sdk.init(student).deleteMessages(listOf(Pair(message.realId, message.folderId))) + return sdk.init(student).deleteMessages(listOf(message.messageId to message.folderId)) } } From 5c84c8d5b175a219bc8db987acfcae893641dc8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 10 Jun 2020 17:28:49 +0200 Subject: [PATCH 0071/1526] Fix force average calc from two semesters (#870) --- app/build.gradle | 2 +- .../preferences/PreferencesRepository.kt | 5 +- .../ui/modules/grade/GradeAverageMode.kt | 11 ++ .../ui/modules/grade/GradeAverageProvider.kt | 58 ++++-- .../main/res/values-de/preferences_values.xml | 1 + .../main/res/values-pl/preferences_values.xml | 5 +- .../main/res/values-ru/preferences_values.xml | 1 + .../main/res/values-uk/preferences_values.xml | 1 + .../main/res/values/preferences_values.xml | 2 + .../modules/grade/GradeAverageProviderTest.kt | 173 ++++++++++++++---- 10 files changed, 206 insertions(+), 53 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageMode.kt diff --git a/app/build.gradle b/app/build.gradle index e2aab017d..cb735b3b4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,7 +124,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.18.2" + implementation "io.github.wulkanowy:sdk:a57afdb" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index 6b13563a4..7715cde0d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.preferences import android.content.Context import android.content.SharedPreferences import io.github.wulkanowy.R +import io.github.wulkanowy.ui.modules.grade.GradeAverageMode import javax.inject.Inject import javax.inject.Singleton @@ -17,8 +18,8 @@ class PreferencesRepository @Inject constructor( val isShowPresent: Boolean get() = getBoolean(R.string.pref_key_attendance_present, R.bool.pref_default_attendance_present) - val gradeAverageMode: String - get() = getString(R.string.pref_key_grade_average_mode, R.string.pref_default_grade_average_mode) + val gradeAverageMode: GradeAverageMode + get() = GradeAverageMode.getByValue(getString(R.string.pref_key_grade_average_mode, R.string.pref_default_grade_average_mode)) val gradeAverageForceCalc: Boolean get() = getBoolean(R.string.pref_key_grade_average_force_calc, R.bool.pref_default_grade_average_force_calc) 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 new file mode 100644 index 000000000..1960c3df7 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageMode.kt @@ -0,0 +1,11 @@ +package io.github.wulkanowy.ui.modules.grade + +enum class GradeAverageMode(val value: String) { + ALL_YEAR("all_year"), + ONE_SEMESTER("only_one_semester"), + BOTH_SEMESTERS("both_semesters"); + + companion object { + fun getByValue(value: String) = values().firstOrNull { it.value == value } ?: ONE_SEMESTER + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index 9582a5db3..bda098f47 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -8,6 +8,9 @@ import io.github.wulkanowy.data.repositories.grade.GradeRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.ALL_YEAR +import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.BOTH_SEMESTERS +import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.ONE_SEMESTER import io.github.wulkanowy.utils.calcAverage import io.github.wulkanowy.utils.changeModifier import io.reactivex.Single @@ -19,21 +22,21 @@ class GradeAverageProvider @Inject constructor( private val preferencesRepository: PreferencesRepository ) { - private val plusModifier = preferencesRepository.gradePlusModifier + private val plusModifier get() = preferencesRepository.gradePlusModifier - private val minusModifier = preferencesRepository.gradeMinusModifier + private val minusModifier get() = preferencesRepository.gradeMinusModifier fun getGradesDetailsWithAverage(student: Student, semesterId: Int, forceRefresh: Boolean = false): Single> { return semesterRepository.getSemesters(student).flatMap { semesters -> when (preferencesRepository.gradeAverageMode) { - "only_one_semester" -> getSemesterDetailsWithAverage(student, semesters.single { it.semesterId == semesterId }, forceRefresh) - "all_year" -> calculateWholeYearAverage(student, semesters, semesterId, forceRefresh) - else -> throw IllegalArgumentException("Incorrect grade average mode: ${preferencesRepository.gradeAverageMode} ") + ONE_SEMESTER -> getSemesterDetailsWithAverage(student, semesters.single { it.semesterId == semesterId }, forceRefresh) + BOTH_SEMESTERS -> calculateBothSemestersAverage(student, semesters, semesterId, forceRefresh) + ALL_YEAR -> calculateAllYearAverage(student, semesters, semesterId, forceRefresh) } } } - private fun calculateWholeYearAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Single> { + private fun calculateBothSemestersAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Single> { val selectedSemester = semesters.single { it.semesterId == semesterId } val firstSemester = semesters.single { it.diaryId == selectedSemester.diaryId && it.semesterName == 1 } @@ -44,11 +47,30 @@ class GradeAverageProvider @Inject constructor( getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).map { secondDetails -> selectedDetails.map { selected -> val second = secondDetails.singleOrNull { it.subject == selected.subject } - selected.copy( - average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { - (selected.grades + second?.grades.orEmpty()).calcAverage() - } else (selected.average + (second?.average ?: selected.average)) / 2 - ) + selected.copy(average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { + val selectedGrades = selected.grades.updateModifiers(student).calcAverage() + (selectedGrades + (second?.grades?.updateModifiers(student)?.calcAverage() ?: selectedGrades)) / 2 + } else (selected.average + (second?.average ?: selected.average)) / 2) + } + } + } else Single.just(selectedDetails) + } + } + + private fun calculateAllYearAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Single> { + val selectedSemester = semesters.single { it.semesterId == semesterId } + val firstSemester = semesters.single { it.diaryId == selectedSemester.diaryId && it.semesterName == 1 } + + return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).flatMap { selectedDetails -> + val isAnyAverage = selectedDetails.any { it.average != .0 } + + if (selectedSemester != firstSemester) { + getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).map { secondDetails -> + selectedDetails.map { selected -> + val second = secondDetails.singleOrNull { it.subject == selected.subject } + selected.copy(average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { + (selected.grades.updateModifiers(student) + second?.grades?.updateModifiers(student).orEmpty()).calcAverage() + } else selected.average) } } } else Single.just(selectedDetails) @@ -65,9 +87,7 @@ class GradeAverageProvider @Inject constructor( GradeDetailsWithAverage( subject = summary.subject, average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { - (if (student.loginMode == Sdk.Mode.SCRAPPER.name) - grades.map { it.changeModifier(plusModifier, minusModifier) } - else grades).calcAverage() + grades.updateModifiers(student).calcAverage() } else summary.average, points = summary.pointsSum, summary = summary, @@ -92,10 +112,14 @@ class GradeAverageProvider @Inject constructor( proposedPoints = "", finalPoints = "", pointsSum = "", - average = if (calcAverage) (if (student.loginMode == Sdk.Mode.SCRAPPER.name) { - details.map { it.changeModifier(plusModifier, minusModifier) } - } else details).calcAverage() else .0 + average = if (calcAverage) details.updateModifiers(student).calcAverage() else .0 ) } } + + private fun List.updateModifiers(student: Student): List { + return if (student.loginMode == Sdk.Mode.SCRAPPER.name) { + map { it.changeModifier(plusModifier, minusModifier) } + } else this + } } diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 28ad08bc2..496287984 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -36,6 +36,7 @@ Durchschnittsnote für das 2. Semester + Average of grades from both semesters Durchschnitt der Bewertungen für das ganze Jahr diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 475f7327f..1d81fb586 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -35,8 +35,9 @@ Kolory ocen w dzienniku - Średnia ocen z 2 semestru - Średnia ocen z całego roku + Średnia ocen z drugiego semestru + Średnia średnich z obu semestrów + Średnia wszystkich ocen z całego roku Nie pokazuj diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index 6c1522682..bd8bb844f 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -36,6 +36,7 @@ Средняя оценка со 2 семестра + Average of grades from both semesters Средняя оценка с целого года diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index 3c70c9d09..be2179c3e 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -36,6 +36,7 @@ Середня оцінка з 2 семестру + Average of grades from both semesters Середня оцінка за весь рік diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index 76427a487..5824658c4 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -88,10 +88,12 @@ Average of grades only from the 2nd semester + Average of grades from both semesters Average of grades from the whole year only_one_semester + both_semesters all_year diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index ee8634ca8..984bbbcf8 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -86,6 +86,8 @@ class GradeAverageProviderTest { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) + `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) gradeAverageProvider = GradeAverageProvider(semesterRepository, gradeRepository, preferencesRepository) } @@ -93,7 +95,7 @@ class GradeAverageProviderTest { @Test fun `force calc current semester average with default modifiers in scraper mode`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) @@ -110,7 +112,7 @@ class GradeAverageProviderTest { `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) - `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) @@ -127,7 +129,7 @@ class GradeAverageProviderTest { `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) // useless in this mode `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) - `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) @@ -144,7 +146,7 @@ class GradeAverageProviderTest { `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) // useless in this mode `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) - `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) @@ -156,7 +158,7 @@ class GradeAverageProviderTest { @Test fun `calc current semester average`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() @@ -169,7 +171,7 @@ class GradeAverageProviderTest { @Test fun `force calc current semester average`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("only_one_semester") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() @@ -182,7 +184,7 @@ class GradeAverageProviderTest { @Test fun `force calc full year average when current is first`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[1].semesterId).blockingGet() @@ -192,16 +194,9 @@ class GradeAverageProviderTest { assertEquals(3.5, items.single { it.subject == "Fizyka" }.average, .0) // (from summary): 3,5 } - @Test(expected = IllegalArgumentException::class) - fun `calc average on invalid mode`() { - `when`(preferencesRepository.gradeAverageMode).thenReturn("test_mode") - - gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).blockingGet() - } - @Test - fun `calc full year average`() { - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + fun `calc both semesters average`() { + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to listOf( getSummary(22, "Matematyka", 3.0), @@ -222,7 +217,7 @@ class GradeAverageProviderTest { @Test fun `force calc full year average`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( getSummary(22, "Matematyka", 1.1), @@ -237,9 +232,9 @@ class GradeAverageProviderTest { } @Test - fun `calc full year average when no summaries`() { + fun `calc both semesters average when no summaries`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to emptyList())) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to emptyList())) @@ -247,14 +242,14 @@ class GradeAverageProviderTest { val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() assertEquals(2, items.size) - assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 2,5 + 3,5 → 3,0 - assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) // (from details): 3,5 + 3,0 → 3,25 + assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 + assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) // (from details): 3,5 + 3,0 → 3,25 } @Test fun `force calc full year average when no summaries`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to emptyList())) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to emptyList())) @@ -267,9 +262,9 @@ class GradeAverageProviderTest { } @Test - fun `calc full year average when missing summaries in both semesters`() { + fun `calc both semesters average when missing summaries in both semesters`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to listOf( getSummary(22, "Matematyka", 4.0) @@ -286,9 +281,9 @@ class GradeAverageProviderTest { } @Test - fun `calc full year average when missing summary in second semester`() { + fun `calc both semesters average when missing summary in second semester`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries.dropLast(1))) @@ -301,9 +296,9 @@ class GradeAverageProviderTest { } @Test - fun `calc full year average when missing summary in first semester`() { + fun `calc both semesters average when missing summary in first semester`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries.dropLast(1))) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) @@ -318,7 +313,7 @@ class GradeAverageProviderTest { @Test fun `force calc full year average when missing summary in first semester`() { `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn("all_year") + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries.dropLast(1))) `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) @@ -330,14 +325,130 @@ class GradeAverageProviderTest { assertEquals(3.25, items.single { it.subject == "Fizyka" }.average, .0) // (from details): 3,5 + 3,0 → 3,25 } - private fun getGrade(semesterId: Int, subject: String, value: Double, modifier: Double = 0.0): Grade { + @Test + fun `force calc both semesters average with different average from all grades and from two semesters`() { + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(5.2296, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,732 → 5.229636363636364 + } + + @Test + fun `force calc full year average with different average from all grades and from two semesters`() { + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) + + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(5.5429, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,732 → .average() + } + + @Test + fun `force calc both semesters average with different average from all grades and from two semesters with custom modifiers`() { + val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) + + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) + `when`(preferencesRepository.gradePlusModifier).thenReturn(.5) + + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(5.2636, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,8 → 5.26363636 + } + + @Test + fun `force calc full year average with different average from all grades and from two semesters with custom modifiers`() { + val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) + + `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) + `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) + `when`(preferencesRepository.gradePlusModifier).thenReturn(.5) + + `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) + `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + + `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) + `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + + val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + + assertEquals(5.5555, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,8 → .average() + } + + private fun getGrade(semesterId: Int, subject: String, value: Double, modifier: Double = 0.0, weight: Double = 1.0): Grade { return Grade( studentId = 101, semesterId = semesterId, subject = subject, value = value, modifier = modifier, - weightValue = 1.0, + weightValue = weight, teacher = "", date = now(), weight = "", From 674a78b6619a2d94957d874a14f19e540a16c746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 10 Jun 2020 19:18:09 +0200 Subject: [PATCH 0072/1526] Version 0.18.3 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 11 ++++------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4bb842821..788aeffa7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.18.2 + - 0.18.3 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index cb735b3b4..498c7a376 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 61 - versionName "0.18.2" + versionCode 62 + versionName "0.18.3" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -124,7 +124,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:a57afdb" + implementation "io.github.wulkanowy:sdk:0.18.3" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 1908d2e26..db9e9a9a3 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,9 +1,6 @@ -Wersja 0.18.2 -- naprawiliśmy zaznaczanie uczniów przy logowaniu -- naprawiliśmy odświeżanie planu lekcji na samsungach -- naprawiliśmy wysyłanie wiadomości -- poprawiliśmy oznaczanie nowych wiadomości jako przeczytanych -- w podsumowaniu ocen nie będą się już pokazywać „puste” przedmioty -- w polu pisania wiadomości pierwsza litera w zdaniu będzie teraz domyślnie duża +Wersja 0.18.3 +- poprawiliśmy liczenie średniej i dodaliśmy nowy sposób jej liczenia w ustawieniach +- naprawiliśmy usuwanie wiadomości +- naprawiliśmy wysyłanie wiadomości na Lubelskim Portalu Oświatowym Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 5529ffcf73712532e8bef74bbf9ed2cfa532fe5e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2020 12:01:52 +0000 Subject: [PATCH 0073/1526] Bump fragment-ktx from 1.2.4 to 1.2.5 (#878) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 498c7a376..1f616e6fc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -131,7 +131,7 @@ dependencies { implementation "androidx.activity:activity-ktx:1.1.0" implementation "androidx.appcompat:appcompat:1.2.0-rc01" implementation "androidx.appcompat:appcompat-resources:1.1.0" - implementation "androidx.fragment:fragment-ktx:1.2.4" + implementation "androidx.fragment:fragment-ktx:1.2.5" implementation "androidx.annotation:annotation:1.1.0" implementation "androidx.multidex:multidex:2.0.1" From 8cce81585aec9fafc1c5a0131952aa35219edb7b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2020 12:02:10 +0000 Subject: [PATCH 0074/1526] Bump firebase-analytics from 17.4.2 to 17.4.3 (#881) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 1f616e6fc..0abc9295e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -181,7 +181,7 @@ dependencies { implementation "io.coil-kt:coil:0.11.0" implementation "io.github.wulkanowy:AppKillerManager:3.0.0" - playImplementation 'com.google.firebase:firebase-analytics:17.4.2' + playImplementation 'com.google.firebase:firebase-analytics:17.4.3' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.7" playImplementation 'com.google.firebase:firebase-messaging:20.2.0' From 00943717a2bdf5ce6fa060c32fb9a2c83cdc0cef Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2020 12:02:38 +0000 Subject: [PATCH 0075/1526] Bump firebase-crashlytics from 17.0.0 to 17.0.1 (#880) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0abc9295e..86ee94c37 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -185,7 +185,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.7" playImplementation 'com.google.firebase:firebase-messaging:20.2.0' - playImplementation 'com.google.firebase:firebase-crashlytics:17.0.0' + playImplementation 'com.google.firebase:firebase-crashlytics:17.0.1' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From f151f7bd62aac50f71a5387c4dd819bf4ba8e164 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2020 12:05:30 +0000 Subject: [PATCH 0076/1526] Bump about_libraries from 8.1.6 to 8.2.0 (#879) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7e5759d12..6b0859822 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext.kotlin_version = '1.3.72' - ext.about_libraries = '8.1.6' + ext.about_libraries = '8.2.0' repositories { mavenCentral() google() From eedaa637716752ec3250a61da735551dd99a383d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2020 12:05:54 +0000 Subject: [PATCH 0077/1526] Bump sonarqube-gradle-plugin from 2.8 to 3.0 (#882) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6b0859822..4de7310b5 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1' classpath "com.github.triplet.gradle:play-publisher:2.7.5" - classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.8" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${about_libraries}" } From 30af77614e4b222ab8eee896fd33cc847c7c0c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 11 Jun 2020 14:38:04 +0200 Subject: [PATCH 0078/1526] Fix showing summary summary for subjects without partial grades (#877) --- app/build.gradle | 6 +++--- .../wulkanowy/ui/modules/grade/GradeAverageProvider.kt | 2 +- app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 86ee94c37..44896664a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,8 +77,8 @@ android { } } - viewBinding { - enabled = true + buildFeatures { + viewBinding = true } lintOptions { @@ -124,7 +124,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.18.3" + implementation "io.github.wulkanowy:sdk:7dc0761" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index bda098f47..af1699323 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -98,7 +98,7 @@ class GradeAverageProvider @Inject constructor( } private fun List.emulateEmptySummaries(student: Student, semester: Semester, grades: List>>, calcAverage: Boolean): List { - if (isNotEmpty() && size == grades.size) return this + if (isNotEmpty() && size > grades.size) return this return grades.mapIndexed { i, (subject, details) -> singleOrNull { it.subject == subject }?.let { return@mapIndexed it } diff --git a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt index e4d4163b4..63a30db8c 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt @@ -23,6 +23,8 @@ fun Sdk.init(student: Student): Sdk { certKey = student.certificateKey privateKey = student.privateKey + emptyCookieJarInterceptor = true + Timber.d("Sdk in ${student.loginMode} mode reinitialized") return this From a05da2656a3960848e2baef1ce9545e316b6f116 Mon Sep 17 00:00:00 2001 From: Dominik Korsa Date: Fri, 12 Jun 2020 21:35:51 +0200 Subject: [PATCH 0079/1526] Add account headers in student picker (#871) --- .../repositories/student/StudentRemote.kt | 2 +- .../wulkanowy/ui/modules/account/Account.kt | 3 + .../ui/modules/account/AccountAdapter.kt | 60 +++++++++++-- .../ui/modules/account/AccountDialog.kt | 3 +- .../ui/modules/account/AccountItem.kt | 9 ++ .../ui/modules/account/AccountPresenter.kt | 9 ++ .../ui/modules/account/AccountView.kt | 3 +- app/src/main/res/layout/dialog_account.xml | 89 +++++++++++-------- app/src/main/res/layout/header_account.xml | 28 ++++++ app/src/main/res/layout/item_account.xml | 30 +++++-- app/src/main/res/values-pl/strings.xml | 4 + app/src/main/res/values/strings.xml | 4 + 12 files changed, 185 insertions(+), 59 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/account/Account.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt create mode 100644 app/src/main/res/layout/header_account.xml diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt index 15c336505..4c0ffd820 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt @@ -14,7 +14,7 @@ class StudentRemote @Inject constructor(private val sdk: Sdk) { private fun mapStudents(students: List, email: String, password: String): List { return students.map { student -> Student( - email = email, + email = email.ifBlank { student.email }, password = password, isParent = student.isParent, symbol = student.symbol, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/Account.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/Account.kt new file mode 100644 index 000000000..dbcb499e8 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/Account.kt @@ -0,0 +1,3 @@ +package io.github.wulkanowy.ui.modules.account + +data class Account(val email: String, val isParent: Boolean) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt index 7df0ca378..27915a710 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt @@ -3,33 +3,72 @@ package io.github.wulkanowy.ui.modules.account import android.annotation.SuppressLint import android.graphics.PorterDuff import android.view.LayoutInflater +import android.view.View.GONE +import android.view.View.VISIBLE import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.HeaderAccountBinding import io.github.wulkanowy.databinding.ItemAccountBinding +import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.getThemeAttrColor import javax.inject.Inject -class AccountAdapter @Inject constructor() : RecyclerView.Adapter() { +class AccountAdapter @Inject constructor() : RecyclerView.Adapter() { - var items = emptyList() + var items = emptyList>() var onClickListener: (Student) -> Unit = {} override fun getItemCount() = items.size - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( - ItemAccountBinding.inflate(LayoutInflater.from(parent.context), parent, false) - ) + override fun getItemViewType(position: Int) = items[position].viewType.id + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + + return when (viewType) { + AccountItem.ViewType.HEADER.id -> HeaderViewHolder(HeaderAccountBinding.inflate(inflater, parent, false)) + AccountItem.ViewType.ITEM.id -> ItemViewHolder(ItemAccountBinding.inflate(inflater, parent, false)) + else -> throw IllegalStateException() + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is HeaderViewHolder -> bindHeaderViewHolder(holder.binding, items[position].value as Account) + is ItemViewHolder -> bindItemViewHolder(holder.binding, items[position].value as Student) + } + } + + private fun bindHeaderViewHolder(binding: HeaderAccountBinding, account: Account) { + with(binding) { + accountHeaderEmail.text = account.email + accountHeaderType.setText(if (account.isParent) R.string.account_type_parent else R.string.account_type_student) + } + } @SuppressLint("SetTextI18n") - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - val student = items[position] - - with(holder.binding) { + private fun bindItemViewHolder(binding: ItemAccountBinding, student: Student) { + with(binding) { accountItemName.text = "${student.studentName} ${student.className}" accountItemSchool.text = student.schoolName + with(accountItemLoginMode) { + visibility = when (Sdk.Mode.valueOf(student.loginMode)) { + Sdk.Mode.API -> { + setText(R.string.account_login_mobile_api) + VISIBLE + } + Sdk.Mode.HYBRID -> { + setText(R.string.account_login_hybrid) + VISIBLE + } + Sdk.Mode.SCRAPPER -> { + GONE + } + } + } with(accountItemImage) { val colorImage = if (student.isCurrent) context.getThemeAttrColor(R.attr.colorPrimary) @@ -42,5 +81,8 @@ class AccountAdapter @Inject constructor() : RecyclerView.Adapter(), AccountView { } } - override fun updateData(data: List) { + override fun updateData(data: List>) { with(accountAdapter) { items = data notifyDataSetChanged() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt new file mode 100644 index 000000000..05a4a69ce --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt @@ -0,0 +1,9 @@ +package io.github.wulkanowy.ui.modules.account + +data class AccountItem(val value: T, val viewType: ViewType) { + + enum class ViewType(val id: Int) { + HEADER(1), + ITEM(2) + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt index 3416a043f..b5fbcdb63 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt @@ -83,11 +83,20 @@ class AccountPresenter @Inject constructor( } } + private fun createAccountItems(items: List): List> { + return items.groupBy { Account(it.email, it.isParent) }.map { (account, students) -> + listOf(AccountItem(account, AccountItem.ViewType.HEADER)) + students.map { student -> + AccountItem(student, AccountItem.ViewType.ITEM) + } + }.flatten() + } + private fun loadData() { Timber.i("Loading account data started") disposable.add(studentRepository.getSavedStudents(false) .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) + .map { createAccountItems(it) } .subscribe({ Timber.i("Loading account result: Success") view?.updateData(it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt index abb9e1d27..a1f8086cd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt @@ -1,13 +1,12 @@ package io.github.wulkanowy.ui.modules.account -import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseView interface AccountView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List>) fun dismissView() diff --git a/app/src/main/res/layout/dialog_account.xml b/app/src/main/res/layout/dialog_account.xml index 6e975c80d..d56de3a2e 100644 --- a/app/src/main/res/layout/dialog_account.xml +++ b/app/src/main/res/layout/dialog_account.xml @@ -5,45 +5,60 @@ android:layout_width="300dp" android:layout_height="wrap_content"> - - - + android:orientation="vertical"> - + - + + + + + + + + + + + diff --git a/app/src/main/res/layout/header_account.xml b/app/src/main/res/layout/header_account.xml new file mode 100644 index 000000000..6219c26db --- /dev/null +++ b/app/src/main/res/layout/header_account.xml @@ -0,0 +1,28 @@ + + + + + + + diff --git a/app/src/main/res/layout/item_account.xml b/app/src/main/res/layout/item_account.xml index 614e4d2df..9568b345a 100644 --- a/app/src/main/res/layout/item_account.xml +++ b/app/src/main/res/layout/item_account.xml @@ -3,20 +3,17 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="56dp" + android:layout_height="wrap_content" android:background="?selectableItemBackground" android:orientation="horizontal" - android:paddingStart="24dp" - android:paddingLeft="24dp" - android:paddingEnd="24dp" - android:paddingRight="24dp" + android:paddingVertical="8dp" + android:paddingHorizontal="16dp" tools:context=".ui.modules.account.AccountAdapter"> + + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 7f25d8a67..4cb8997cf 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -265,6 +265,10 @@ Wyloguj Czy chcesz wylogować aktualnego ucznia? Wylogowanie ucznia + Konto ucznia + Konto rodzica + Tryb API mobilne + Tryb hybrydowy Wersja aplikacji Twórcy diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7793cd9c2..29e3460b4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -282,6 +282,10 @@ Logout Do you want to log out of an active student? Student logout + Student account + Parent account + Mobile API mode + Hybrid mode From a52983693722869b56e6afddfb29ddd6f469e3a9 Mon Sep 17 00:00:00 2001 From: Dominik Korsa Date: Sat, 13 Jun 2020 14:12:01 +0200 Subject: [PATCH 0080/1526] Fix lint errors (#873) --- .../data/db/migrations/Migration13Test.kt | 30 +++++++-------- .../attendance/AttendanceLocalTest.kt | 37 +++++++++++++++++-- .../luckynumber/LuckyNumberLocalTest.kt | 1 - .../wulkanowy/utils/CrashlyticsUtils.kt | 1 - .../github/wulkanowy/data/RepositoryModule.kt | 6 +-- .../appcreator/AppCreatorRepository.kt | 2 +- .../data/repositories/exam/ExamLocal.kt | 2 +- .../repositories/recipient/RecipientLocal.kt | 2 +- .../reportingunit/ReportingUnitLocal.kt | 2 +- .../sync/works/GradeStatisticsWork.kt | 2 +- .../about/logviewer/LogViewerPresenter.kt | 6 +-- .../modules/attendance/AttendancePresenter.kt | 1 - .../completed/CompletedLessonsPresenter.kt | 2 +- .../wulkanowy/utils/LifecycleAwareVariable.kt | 2 +- app/src/main/res/values/strings.xml | 2 +- .../io/github/wulkanowy/TestEnityCreator.kt | 23 ++++++++++++ .../message/MessageRepositoryTest.kt | 13 +++---- 17 files changed, 91 insertions(+), 43 deletions(-) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt index 6f9406f6d..da4284b02 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt @@ -120,23 +120,23 @@ class Migration13Test : AbstractMigrationTest() { assertEquals(2, first.diaryId) } - getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let { - assertTrue { it.single { it.second }.second } - assertEquals(1970, it[0].first.schoolYear) - assertEquals(of(1970, 1, 1), it[0].first.end) - assertEquals(of(1970, 1, 1), it[0].first.start) - assertFalse(it[0].second) - assertFalse(it[1].second) - assertFalse(it[2].second) - assertTrue(it[3].second) + getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let { semesters -> + assertTrue { semesters.single { it.second }.second } + assertEquals(1970, semesters[0].first.schoolYear) + assertEquals(of(1970, 1, 1), semesters[0].first.end) + assertEquals(of(1970, 1, 1), semesters[0].first.start) + assertFalse(semesters[0].second) + assertFalse(semesters[1].second) + assertFalse(semesters[2].second) + assertTrue(semesters[3].second) } - getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let { - assertTrue { it.single { it.second }.second } - assertFalse(it[0].second) - assertFalse(it[1].second) - assertFalse(it[2].second) - assertTrue(it[3].second) + getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let { semesters -> + assertTrue { semesters.single { it.second }.second } + assertFalse(semesters[0].second) + assertFalse(semesters[1].second) + assertFalse(semesters[2].second) + assertTrue(semesters[3].second) } } diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt index c7ede6ae5..cdfc524ad 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt @@ -10,6 +10,7 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.of import kotlin.test.assertEquals @@ -35,9 +36,18 @@ class AttendanceLocalTest { @Test fun saveAndReadTest() { attendanceLocal.saveAttendance(listOf( - Attendance(1, 2, 3, of(2018, 9, 10), 0, "", "", false, false, false, false, false, false, false, SentExcuseStatus.ACCEPTED.name), - Attendance(1, 2, 3, of(2018, 9, 14), 0, "", "", false, false, false, false, false, false, false, SentExcuseStatus.WAITING.name), - Attendance(1, 2, 3, of(2018, 9, 17), 0, "", "", false, false, false, false, false, false, false, SentExcuseStatus.ACCEPTED.name) + getAttendanceEntity( + of(2018, 9, 10), + SentExcuseStatus.ACCEPTED + ), + getAttendanceEntity( + of(2018, 9, 14), + SentExcuseStatus.WAITING + ), + getAttendanceEntity( + of(2018, 9, 17), + SentExcuseStatus.ACCEPTED + ) )) val attendance = attendanceLocal @@ -50,4 +60,25 @@ class AttendanceLocalTest { assertEquals(attendance[0].date, of(2018, 9, 10)) assertEquals(attendance[1].date, of(2018, 9, 14)) } + + private fun getAttendanceEntity( + date: LocalDate, + excuseStatus: SentExcuseStatus + ) = Attendance( + studentId = 1, + diaryId = 2, + timeId = 3, + date = date, + number = 0, + subject = "", + name = "", + presence = false, + absence = false, + exemption = false, + lateness = false, + excused = false, + deleted = false, + excusable = false, + excuseStatus = excuseStatus.name + ) } diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt index 65ef1fcbf..efad0d4d5 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt @@ -5,7 +5,6 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.LuckyNumber -import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import org.junit.After import org.junit.Before diff --git a/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt b/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt index 6351997d0..d03a319a2 100644 --- a/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt +++ b/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt @@ -2,7 +2,6 @@ package io.github.wulkanowy.utils -import android.content.Context import timber.log.Timber open class TimberTreeNoOp : Timber.Tree() { diff --git a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt index 9540372fc..19af1b2f8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt @@ -1,17 +1,15 @@ package io.github.wulkanowy.data -import android.app.AlarmManager import android.content.Context import android.content.SharedPreferences import android.content.res.AssetManager import android.content.res.Resources -import androidx.core.content.getSystemService import androidx.preference.PreferenceManager -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.strategy.WalledGardenInternetObservingStrategy import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.chuckerteam.chucker.api.RetentionManager +import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings +import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.strategy.WalledGardenInternetObservingStrategy import dagger.Module import dagger.Provides import io.github.wulkanowy.data.db.AppDatabase diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt index 6a0b2d32e..76cf698c9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt @@ -10,7 +10,7 @@ import javax.inject.Singleton @Singleton class AppCreatorRepository @Inject constructor(private val assets: AssetManager) { fun getAppCreators(): Single> { - return Single.fromCallable> { + return Single.fromCallable { Gson().fromJson( assets.open("contributors.json").bufferedReader().use { it.readText() }, Array::class.java diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt index 0f484d323..389eb5835 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt @@ -13,7 +13,7 @@ class ExamLocal @Inject constructor(private val examDb: ExamDao) { fun getExams(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> { return examDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) - .filter { !it.isEmpty() } + .filter { it.isNotEmpty() } } fun saveExams(exams: List) { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt index 9b1d4ac2f..ff8175440 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt @@ -12,7 +12,7 @@ import javax.inject.Singleton class RecipientLocal @Inject constructor(private val recipientDb: RecipientDao) { fun getRecipients(student: Student, role: Int, unit: ReportingUnit): Maybe> { - return recipientDb.load(student.studentId, role, unit.realId).filter { !it.isEmpty() } + return recipientDb.load(student.studentId, role, unit.realId).filter { it.isNotEmpty() } } fun saveRecipients(recipients: List): List { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt index 6f9eec3fc..0631c668c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt @@ -11,7 +11,7 @@ import javax.inject.Singleton class ReportingUnitLocal @Inject constructor(private val reportingUnitDb: ReportingUnitDao) { fun getReportingUnits(student: Student): Maybe> { - return reportingUnitDb.load(student.studentId).filter { !it.isEmpty() } + return reportingUnitDb.load(student.studentId).filter { it.isNotEmpty() } } fun getReportingUnit(student: Student, unitId: Int): Maybe { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt index 327c71740..c4681fb8f 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt @@ -9,7 +9,7 @@ import javax.inject.Inject class GradeStatisticsWork @Inject constructor(private val gradeStatisticsRepository: GradeStatisticsRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return gradeStatisticsRepository.getGradesStatistics(student, semester, "Wszystkie", false, true) + return gradeStatisticsRepository.getGradesStatistics(student, semester, "Wszystkie", false, forceRefresh = true) .ignoreElement() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt index 4485cb3eb..33eb1122d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt @@ -25,9 +25,9 @@ class LogViewerPresenter @Inject constructor( disposable.add(loggerRepository.getLogFiles() .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) - .subscribe({ - Timber.i("Loading logs files result: ${it.joinToString { it.name }}") - view?.shareLogs(it) + .subscribe({ files -> + Timber.i("Loading logs files result: ${files.joinToString { it.name }}") + view?.shareLogs(files) }, { Timber.i("Loading logs files result: An exception occurred") errorHandler.dispatch(it) 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 437e06c92..f58d0617f 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 @@ -20,7 +20,6 @@ import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber -import java.util.concurrent.TimeUnit.MILLISECONDS import javax.inject.Inject class AttendancePresenter @Inject constructor( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt index 92aeb5814..f72d753a9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt @@ -43,7 +43,7 @@ class CompletedLessonsPresenter @Inject constructor( completedLessonsErrorHandler.showErrorMessage = ::showErrorViewOnError completedLessonsErrorHandler.onFeatureDisabled = { this.view?.showFeatureDisabled() - this.view?.showEmpty(true); + this.view?.showEmpty(true) Timber.i("Completed lessons feature disabled by school") } loadData(ofEpochDay(date ?: baseDate.toEpochDay())) diff --git a/app/src/main/java/io/github/wulkanowy/utils/LifecycleAwareVariable.kt b/app/src/main/java/io/github/wulkanowy/utils/LifecycleAwareVariable.kt index 2c49ee97c..b96faeb21 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/LifecycleAwareVariable.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/LifecycleAwareVariable.kt @@ -52,4 +52,4 @@ class LifecycleAwareVariableActivity : ReadWriteProperty Fragment.lifecycleAwareVariable() = LifecycleAwareVariable() -fun AppCompatActivity.lifecycleAwareVariable() = LifecycleAwareVariableActivity() +fun lifecycleAwareVariable() = LifecycleAwareVariableActivity() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 29e3460b4..bec752cf2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -343,7 +343,7 @@ Prev Next Search - Search... + Search… diff --git a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt index 5d003f273..f7d29220f 100644 --- a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt +++ b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy +import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Timetable @@ -72,3 +73,25 @@ fun getTimetableEntity( teacher = "", teacherOld = "" ) + +fun getMessageEntity( + messageId: Int, + content: String, + unread: Boolean +) = Message( + studentId = 1, + realId = 1, + messageId = messageId, + sender = "", + senderId = 1, + recipient = "", + subject = "", + content = content, + date = now(), + folderId = 1, + unread = unread, + unreadBy = 1, + readBy = 1, + removed = false, + hasAttachments = false +) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt index b7963d430..fcc4188a6 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt @@ -2,10 +2,10 @@ package io.github.wulkanowy.data.repositories.message import androidx.room.EmptyResultSetException import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings -import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.UnitTestInternetObservingStrategy +import io.github.wulkanowy.getMessageEntity import io.reactivex.Single import io.reactivex.observers.TestObserver import org.junit.Assert.assertEquals @@ -15,7 +15,6 @@ import org.mockito.Mock import org.mockito.Mockito.`when` import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations -import org.threeten.bp.LocalDateTime.now import java.net.UnknownHostException class MessageRepositoryTest { @@ -44,7 +43,7 @@ class MessageRepositoryTest { @Test fun `throw error when message is not in the db`() { - val testMessage = Message(1, 1, 1, "", 1, "", "", "", now(), 1, false, 1, 1, false, false) + val testMessage = getMessageEntity(1, "", false) `when`(local.getMessageWithAttachment(student, testMessage)).thenReturn(Single.error(EmptyResultSetException("No message in database"))) val message = repo.getMessage(student, testMessage) @@ -55,7 +54,7 @@ class MessageRepositoryTest { @Test fun `get message when content already in db`() { - val testMessage = Message(1, 1, 123, "", 1, "", "", "Test", now(), 1, false, 1, 1, false, false) + val testMessage = getMessageEntity(123, "Test", false) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) `when`(local.getMessageWithAttachment(student, testMessage)).thenReturn(Single.just(messageWithAttachment)) @@ -67,7 +66,7 @@ class MessageRepositoryTest { @Test fun `get message when content in db is empty`() { - val testMessage = Message(1, 1, 123, "", 1, "", "", "", now(), 1, true, 1, 1, false, false) + val testMessage = getMessageEntity(123, "", true) val testMessageWithContent = testMessage.copy(content = "Test") val mWa = MessageWithAttachment(testMessage, emptyList()) @@ -86,7 +85,7 @@ class MessageRepositoryTest { @Test fun `get message when content in db is empty and there is no internet connection`() { - val testMessage = Message(1, 1, 123, "", 1, "", "", "", now(), 1, false, 1, 1, false, false) + val testMessage = getMessageEntity(123, "", false) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) testObservingStrategy.isInternetConnection = false @@ -100,7 +99,7 @@ class MessageRepositoryTest { @Test fun `get message when content in db is empty, unread and there is no internet connection`() { - val testMessage = Message(1, 1, 123, "", 1, "", "", "", now(), 1, true, 1, 1, false, false) + val testMessage = getMessageEntity(123, "", true) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) testObservingStrategy.isInternetConnection = false From a6682c9b73d525133e32accbc2aae89636fad9b2 Mon Sep 17 00:00:00 2001 From: Dominik Korsa Date: Sat, 13 Jun 2020 17:11:18 +0200 Subject: [PATCH 0081/1526] Add predicted and final grade notifications (#872) --- .../25.json | 2 +- .../26.json | 1768 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 6 +- .../data/db/entities/GradeSummary.kt | 13 + .../data/db/migrations/Migration26.kt | 14 + .../data/repositories/grade/GradeLocal.kt | 4 + .../repositories/grade/GradeRepository.kt | 39 +- .../services/sync/works/GradeWork.kt | 53 +- app/src/main/res/values-pl/strings.xml | 24 + app/src/main/res/values/strings.xml | 16 + 10 files changed, 1927 insertions(+), 12 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/26.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration26.kt diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/25.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/25.json index e99a11d4a..474824df6 100644 --- a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/25.json +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/25.json @@ -1741,4 +1741,4 @@ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd101f5a26a024f62e6fee161e421b882')" ] } -} \ No newline at end of file +} diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/26.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/26.json new file mode 100644 index 000000000..21005f9c6 --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/26.json @@ -0,0 +1,1768 @@ +{ + "formatVersion": 1, + "database": { + "version": 26, + "identityHash": "43f8777ffe95a5a2850ee981db3dbe2e", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `scrapper_base_url` TEXT NOT NULL, `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "semester_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `grade` INTEGER NOT NULL, `amount` INTEGER NOT NULL, `is_semester` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "grade", + "columnName": "grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "amount", + "columnName": "amount", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semester", + "columnName": "is_semester", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `recipient_name` TEXT NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `unread_by` INTEGER NOT NULL, `read_by` INTEGER NOT NULL, `removed` INTEGER NOT NULL, `has_attachments` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "recipient", + "columnName": "recipient_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "removed", + "columnName": "removed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `one_drive_id` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`real_id`))", + "fields": [ + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "oneDriveId", + "columnName": "one_drive_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "real_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ReportingUnits", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `short` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `roles` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "senderName", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roles", + "columnName": "roles", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` TEXT NOT NULL, `name` TEXT NOT NULL, `real_name` TEXT NOT NULL, `login_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `role` INTEGER NOT NULL, `hash` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "realName", + "columnName": "real_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginId", + "columnName": "login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "role", + "columnName": "role", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hash", + "columnName": "hash", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '43f8777ffe95a5a2850ee981db3dbe2e')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 762c52f8f..a31b68c0d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -68,6 +68,7 @@ import io.github.wulkanowy.data.db.migrations.Migration22 import io.github.wulkanowy.data.db.migrations.Migration23 import io.github.wulkanowy.data.db.migrations.Migration24 import io.github.wulkanowy.data.db.migrations.Migration25 +import io.github.wulkanowy.data.db.migrations.Migration26 import io.github.wulkanowy.data.db.migrations.Migration3 import io.github.wulkanowy.data.db.migrations.Migration4 import io.github.wulkanowy.data.db.migrations.Migration5 @@ -110,7 +111,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 25 + const val VERSION_SCHEMA = 26 fun getMigrations(sharedPrefProvider: SharedPrefProvider): Array { return arrayOf( @@ -137,7 +138,8 @@ abstract class AppDatabase : RoomDatabase() { Migration22(), Migration23(), Migration24(), - Migration25() + Migration25(), + Migration26() ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt index 6e29112b2..dd3126d4d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import org.threeten.bp.LocalDateTime @Entity(tableName = "GradesSummary") data class GradeSummary( @@ -36,4 +37,16 @@ data class GradeSummary( ) { @PrimaryKey(autoGenerate = true) var id: Long = 0 + + @ColumnInfo(name = "is_predicted_grade_notified") + var isPredictedGradeNotified: Boolean = true + + @ColumnInfo(name = "is_final_grade_notified") + var isFinalGradeNotified: Boolean = true + + @ColumnInfo(name = "predicted_grade_last_change") + var predictedGradeLastChange: LocalDateTime = LocalDateTime.now() + + @ColumnInfo(name = "final_grade_last_change") + var finalGradeLastChange: LocalDateTime = LocalDateTime.now() } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration26.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration26.kt new file mode 100644 index 000000000..7130d86d8 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration26.kt @@ -0,0 +1,14 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +class Migration26 : Migration(25, 26) { + + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE GradesSummary ADD COLUMN is_predicted_grade_notified INTEGER NOT NULL DEFAULT 1") + database.execSQL("ALTER TABLE GradesSummary ADD COLUMN is_final_grade_notified INTEGER NOT NULL DEFAULT 1") + database.execSQL("ALTER TABLE GradesSummary ADD COLUMN predicted_grade_last_change INTEGER NOT NULL DEFAULT 0") + database.execSQL("ALTER TABLE GradesSummary ADD COLUMN final_grade_last_change INTEGER NOT NULL DEFAULT 0") + } +} diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt index 944ed34ae..52ab60178 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt @@ -27,6 +27,10 @@ class GradeLocal @Inject constructor( gradeDb.updateAll(grades) } + fun updateGradesSummary(gradesSummary: List) { + gradeSummaryDb.updateAll(gradesSummary) + } + fun getGradesDetails(semester: Semester): Maybe> { return gradeDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt index e28350a51..2ba68b967 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract import io.reactivex.Completable import io.reactivex.Single +import org.threeten.bp.LocalDateTime import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @@ -43,7 +44,31 @@ class GradeRepository @Inject constructor( local.getGradesSummary(semester).toSingle(emptyList()) .doOnSuccess { old -> local.deleteGradesSummary(old.uniqueSubtract(newSummary)) - local.saveGradesSummary(newSummary.uniqueSubtract(old)) + local.saveGradesSummary(newSummary.uniqueSubtract(old) + .onEach { summary -> + val oldSummary = old.find { oldSummary -> oldSummary.subject == summary.subject } + summary.isPredictedGradeNotified = when { + summary.predictedGrade.isEmpty() -> true + notify && oldSummary?.predictedGrade != summary.predictedGrade -> false + else -> true + } + summary.isFinalGradeNotified = when { + summary.finalGrade.isEmpty() -> true + notify && oldSummary?.finalGrade != summary.finalGrade -> false + else -> true + } + + summary.predictedGradeLastChange = when { + oldSummary == null -> LocalDateTime.now() + summary.predictedGrade != oldSummary.predictedGrade -> LocalDateTime.now() + else -> oldSummary.predictedGradeLastChange + } + summary.finalGradeLastChange = when { + oldSummary == null -> LocalDateTime.now() + summary.finalGrade != oldSummary.finalGrade -> LocalDateTime.now() + else -> oldSummary.finalGradeLastChange + } + }) } } }.flatMap { @@ -63,6 +88,14 @@ class GradeRepository @Inject constructor( return local.getGradesDetails(semester).map { it.filter { grade -> !grade.isNotified } }.toSingle(emptyList()) } + fun getNotNotifiedPredictedGrades(semester: Semester): Single> { + return local.getGradesSummary(semester).map { it.filter { gradeSummary -> !gradeSummary.isPredictedGradeNotified } }.toSingle(emptyList()) + } + + fun getNotNotifiedFinalGrades(semester: Semester): Single> { + return local.getGradesSummary(semester).map { it.filter { gradeSummary -> !gradeSummary.isFinalGradeNotified } }.toSingle(emptyList()) + } + fun updateGrade(grade: Grade): Completable { return Completable.fromCallable { local.updateGrades(listOf(grade)) } } @@ -70,4 +103,8 @@ class GradeRepository @Inject constructor( fun updateGrades(grades: List): Completable { return Completable.fromCallable { local.updateGrades(grades) } } + + fun updateGradesSummary(gradesSummary: List): Completable { + return Completable.fromCallable { local.updateGradesSummary(gradesSummary) } + } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt index 6e90826ad..fcdaad6e6 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt @@ -9,6 +9,7 @@ import androidx.core.app.NotificationCompat.PRIORITY_HIGH import androidx.core.app.NotificationManagerCompat import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.grade.GradeRepository @@ -30,17 +31,21 @@ class GradeWork @Inject constructor( override fun create(student: Student, semester: Semester): Completable { return gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable) - .flatMap { gradeRepository.getNotNotifiedGrades(semester) } - .flatMapCompletable { - if (it.isNotEmpty()) notify(it) + .ignoreElement() + .concatWith(Completable.concatArray(gradeRepository.getNotNotifiedGrades(semester).flatMapCompletable { + if (it.isNotEmpty()) notifyDetails(it) gradeRepository.updateGrades(it.onEach { grade -> grade.isNotified = true }) - } + }, gradeRepository.getNotNotifiedPredictedGrades(semester).flatMapCompletable { + if (it.isNotEmpty()) notifyPredicted(it) + gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isPredictedGradeNotified = true }) + }, gradeRepository.getNotNotifiedFinalGrades(semester).flatMapCompletable { + if (it.isNotEmpty()) notifyFinal(it) + gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isFinalGradeNotified = true }) + })) } - private fun notify(grades: List) { - notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewGradesChannel.CHANNEL_ID) - .setContentTitle(context.resources.getQuantityString(R.plurals.grade_new_items, grades.size, grades.size)) - .setContentText(context.resources.getQuantityString(R.plurals.grade_notify_new_items, grades.size, grades.size)) + private fun getNotificationBuilder(): NotificationCompat.Builder { + return NotificationCompat.Builder(context, NewGradesChannel.CHANNEL_ID) .setSmallIcon(R.drawable.ic_stat_grade) .setAutoCancel(true) .setPriority(PRIORITY_HIGH) @@ -49,6 +54,12 @@ class GradeWork @Inject constructor( .setContentIntent( PendingIntent.getActivity(context, MainView.Section.GRADE.id, MainActivity.getStartIntent(context, MainView.Section.GRADE, true), FLAG_UPDATE_CURRENT)) + } + + private fun notifyDetails(grades: List) { + notificationManager.notify(Random.nextInt(Int.MAX_VALUE), getNotificationBuilder() + .setContentTitle(context.resources.getQuantityString(R.plurals.grade_new_items, grades.size, grades.size)) + .setContentText(context.resources.getQuantityString(R.plurals.grade_notify_new_items, grades.size, grades.size)) .setStyle(NotificationCompat.InboxStyle().run { setSummaryText(context.resources.getQuantityString(R.plurals.grade_number_item, grades.size, grades.size)) grades.forEach { addLine("${it.subject}: ${it.entry}") } @@ -57,4 +68,30 @@ class GradeWork @Inject constructor( .build() ) } + + private fun notifyPredicted(gradesSummary: List) { + notificationManager.notify(Random.nextInt(Int.MAX_VALUE), getNotificationBuilder() + .setContentTitle(context.resources.getQuantityString(R.plurals.grade_new_items_predicted, gradesSummary.size, gradesSummary.size)) + .setContentText(context.resources.getQuantityString(R.plurals.grade_notify_new_items_predicted, gradesSummary.size, gradesSummary.size)) + .setStyle(NotificationCompat.InboxStyle().run { + setSummaryText(context.resources.getQuantityString(R.plurals.grade_number_item, gradesSummary.size, gradesSummary.size)) + gradesSummary.forEach { addLine("${it.subject}: ${it.predictedGrade}") } + this + }) + .build() + ) + } + + private fun notifyFinal(gradesSummary: List) { + notificationManager.notify(Random.nextInt(Int.MAX_VALUE), getNotificationBuilder() + .setContentTitle(context.resources.getQuantityString(R.plurals.grade_new_items_final, gradesSummary.size, gradesSummary.size)) + .setContentText(context.resources.getQuantityString(R.plurals.grade_notify_new_items_final, gradesSummary.size, gradesSummary.size)) + .setStyle(NotificationCompat.InboxStyle().run { + setSummaryText(context.resources.getQuantityString(R.plurals.grade_number_item, gradesSummary.size, gradesSummary.size)) + gradesSummary.forEach { addLine("${it.subject}: ${it.finalGrade}") } + this + }) + .build() + ) + } } diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4cb8997cf..2bba1640b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -107,12 +107,36 @@ Nowe oceny Nowe oceny + + Nowa ocena przewidywana + Nowe oceny przewidywane + Nowe oceny przewidywane + Nowe oceny przewidywane + + + Nowa ocena końcowa + Nowe oceny końcowe + Nowe oceny końcowe + Nowe oceny końcowe + Masz %1$d nową ocenę Masz %1$d nowe oceny Masz %1$d nowych ocen Masz %1$d nowych ocen + + Masz %1$d nową przewidywaną ocenę + Masz %1$d nowe przewidywane oceny + Masz %1$d nowych przewidywanych ocen + Masz %1$d nowych przewidywanych ocen + + + Masz %1$d nową końcową ocenę + Masz %1$d nowe końcowe oceny + Masz %1$d nowych końcowych ocen + Masz %1$d nowych końcowych ocen + Lekcja Sala diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bec752cf2..3efb53cb2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,10 +113,26 @@ New grade New grades + + New predicted grade + New predicted grades + + + New final grade + New final grades + You received %1$d grade You received %1$d grades + + You received %1$d predicted grade + You received %1$d predicted grades + + + You received %1$d final grade + You received %1$d final grades + From 924bcb0d647b1664de83427a669f721bf5594d86 Mon Sep 17 00:00:00 2001 From: Dominik Korsa Date: Sun, 14 Jun 2020 00:50:09 +0200 Subject: [PATCH 0082/1526] Message sharing and printing (#866) --- app/src/main/assets/message-print-page.html | 94 +++++++++++++++++++ app/src/main/assets/wulkanowy-logo-black.svg | 74 +++++++++++++++ .../message/preview/MessagePreviewAdapter.kt | 2 +- .../message/preview/MessagePreviewFragment.kt | 61 ++++++++++++ .../preview/MessagePreviewPresenter.kt | 65 ++++++++++++- .../message/preview/MessagePreviewView.kt | 11 +++ .../wulkanowy/utils/ContextExtension.kt | 13 +++ .../res/drawable/ic_menu_message_print.xml | 13 +++ .../res/drawable/ic_menu_message_share.xml | 10 ++ .../res/menu/action_menu_message_preview.xml | 14 +++ app/src/main/res/values-pl/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 12 files changed, 359 insertions(+), 2 deletions(-) create mode 100644 app/src/main/assets/message-print-page.html create mode 100644 app/src/main/assets/wulkanowy-logo-black.svg create mode 100644 app/src/main/res/drawable/ic_menu_message_print.xml create mode 100644 app/src/main/res/drawable/ic_menu_message_share.xml diff --git a/app/src/main/assets/message-print-page.html b/app/src/main/assets/message-print-page.html new file mode 100644 index 000000000..8da7dec6e --- /dev/null +++ b/app/src/main/assets/message-print-page.html @@ -0,0 +1,94 @@ + + + + + %SUBJECT% | Wulkanowy + + + +

%SUBJECT%

+
+
+ %INFO% +
+ +
+
+

Treść wiadomości

+ %CONTENT% +
+ + diff --git a/app/src/main/assets/wulkanowy-logo-black.svg b/app/src/main/assets/wulkanowy-logo-black.svg new file mode 100644 index 000000000..9bfbe2c02 --- /dev/null +++ b/app/src/main/assets/wulkanowy-logo-black.svg @@ -0,0 +1,74 @@ + +image/svg+xml \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt index 436dee53f..a94d2cfc8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt @@ -63,7 +63,7 @@ class MessagePreviewAdapter @Inject constructor() : @SuppressLint("SetTextI18n") private fun bindMessage(holder: MessageViewHolder, message: Message) { with(holder.binding) { - messagePreviewSubject.text = if (message.subject.isNotBlank()) message.subject else root.context.getString(R.string.message_no_subject) + messagePreviewSubject.text = message.subject.ifBlank { root.context.getString(R.string.message_no_subject) } messagePreviewDate.text = root.context.getString(R.string.message_date, message.date.toFormattedString("yyyy-MM-dd HH:mm:ss")) messagePreviewContent.text = message.content messagePreviewAuthor.text = if (message.folderId == MessageFolder.SENT.id) "${root.context.getString(R.string.message_to)} ${message.recipient}" diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index 99eede15a..575db75b9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -1,12 +1,20 @@ package io.github.wulkanowy.ui.modules.message.preview +import android.os.Build import android.os.Bundle +import android.print.PrintAttributes +import android.print.PrintManager import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.View.GONE import android.view.View.VISIBLE +import android.webkit.WebResourceRequest +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.annotation.RequiresApi +import androidx.core.content.getSystemService import androidx.recyclerview.widget.LinearLayoutManager import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message @@ -17,6 +25,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity +import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.shareText import javax.inject.Inject class MessagePreviewFragment : @@ -29,18 +39,31 @@ class MessagePreviewFragment : @Inject lateinit var previewAdapter: MessagePreviewAdapter + @Inject + lateinit var appInfo: AppInfo + private var menuReplyButton: MenuItem? = null private var menuForwardButton: MenuItem? = null private var menuDeleteButton: MenuItem? = null + private var menuShareButton: MenuItem? = null + + private var menuPrintButton: MenuItem? = null + override val titleStringId: Int get() = R.string.message_title override val deleteMessageSuccessString: String get() = getString(R.string.message_delete_success) + override val messageNoSubjectString: String + get() = getString(R.string.message_no_subject) + + override val printHTML: String + get() = requireContext().assets.open("message-print-page.html").bufferedReader().use { it.readText() } + companion object { const val MESSAGE_ID_KEY = "message_id" @@ -77,6 +100,8 @@ class MessagePreviewFragment : menuReplyButton = menu.findItem(R.id.messagePreviewMenuReply) menuForwardButton = menu.findItem(R.id.messagePreviewMenuForward) menuDeleteButton = menu.findItem(R.id.messagePreviewMenuDelete) + menuShareButton = menu.findItem(R.id.messagePreviewMenuShare) + menuPrintButton = menu.findItem(R.id.messagePreviewMenuPrint) presenter.onCreateOptionsMenu() } @@ -85,6 +110,8 @@ class MessagePreviewFragment : R.id.messagePreviewMenuReply -> presenter.onReply() R.id.messagePreviewMenuForward -> presenter.onForward() R.id.messagePreviewMenuDelete -> presenter.onMessageDelete() + R.id.messagePreviewMenuShare -> presenter.onShare() + R.id.messagePreviewMenuPrint -> presenter.onPrint() else -> false } } @@ -108,6 +135,8 @@ class MessagePreviewFragment : menuReplyButton?.isVisible = show menuForwardButton?.isVisible = show menuDeleteButton?.isVisible = show + menuShareButton?.isVisible = show + menuPrintButton?.isVisible = show && appInfo.systemVersion >= Build.VERSION_CODES.LOLLIPOP } override fun setDeletedOptionsLabels() { @@ -138,6 +167,38 @@ class MessagePreviewFragment : context?.let { it.startActivity(SendMessageActivity.getStartIntent(it, message)) } } + override fun shareText(text: String, subject: String) { + context?.shareText(text, subject) + } + + @RequiresApi(Build.VERSION_CODES.LOLLIPOP) + override fun printDocument(html: String, jobName: String) { + val webView = WebView(activity) + webView.webViewClient = object : WebViewClient() { + + override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest) = false + + override fun onPageFinished(view: WebView, url: String) { + createWebPrintJob(view, jobName) + } + } + + webView.loadDataWithBaseURL("file:///android_asset/", html, "text/HTML", "UTF-8", null) + } + + @RequiresApi(Build.VERSION_CODES.LOLLIPOP) + private fun createWebPrintJob(webView: WebView, jobName: String) { + activity?.getSystemService()?.let { printManager -> + val printAdapter = webView.createPrintDocumentAdapter(jobName) + + printManager.print( + jobName, + printAdapter, + PrintAttributes.Builder().build() + ) + } + } + override fun popView() { (activity as MainActivity).popView() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index 24678c70e..db7996bca 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -1,12 +1,17 @@ package io.github.wulkanowy.ui.modules.message.preview +import android.annotation.SuppressLint +import android.os.Build import io.github.wulkanowy.data.db.entities.Message +import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.repositories.message.MessageRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler +import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.toFormattedString import timber.log.Timber import javax.inject.Inject @@ -15,11 +20,14 @@ class MessagePreviewPresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, private val messageRepository: MessageRepository, - private val analytics: FirebaseAnalyticsHelper + private val analytics: FirebaseAnalyticsHelper, + private var appInfo: AppInfo ) : BasePresenter(errorHandler, studentRepository, schedulers) { var message: Message? = null + var attachments: List? = null + private lateinit var lastError: Throwable private var retryCallback: () -> Unit = {} @@ -56,6 +64,7 @@ class MessagePreviewPresenter @Inject constructor( .subscribe({ message -> Timber.i("Loading message ${message.message.messageId} preview result: Success ") this@MessagePreviewPresenter.message = message.message + this@MessagePreviewPresenter.attachments = message.attachments view?.apply { setMessageWithAttachment(message) initOptions() @@ -87,6 +96,60 @@ class MessagePreviewPresenter @Inject constructor( } else false } + fun onShare(): Boolean { + message?.let { + var text = "Temat: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}\n" + when (it.sender.isNotEmpty()) { + true -> "Od: ${it.sender}\n" + false -> "Do: ${it.recipient}\n" + } + "Data: ${it.date.toFormattedString("yyyy-MM-dd HH:mm:ss")}\n\n${it.content}" + + attachments?.let { attachments -> + if (attachments.isNotEmpty()) { + text += "\n\nZałączniki:" + + attachments.forEach { attachment -> + text += "\n${attachment.filename}: ${attachment.url}" + } + } + } + + view?.shareText(text, "FW: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}") + return true + } + return false + } + + @SuppressLint("NewApi") + fun onPrint(): Boolean { + if (appInfo.systemVersion < Build.VERSION_CODES.LOLLIPOP) return false + message?.let { + val dateString = it.date.toFormattedString("yyyy-MM-dd HH:mm:ss") + val infoContent = "

Data wysłania

$dateString
" + when { + it.sender.isNotEmpty() -> "

Od

${it.sender}
" + else -> "

Do

${it.recipient}
" + } + + val messageContent = "

${it.content}

" + .replace(Regex("[\\n\\r]{2,}"), "

") + .replace(Regex("[\\n\\r]"), "
") + + val jobName = "Wiadomość " + when { + it.sender.isNotEmpty() -> "od ${it.sender}" + else -> "do ${it.recipient}" + } + " $dateString: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }} | Wulkanowy" + + view?.apply { + val html = printHTML + .replace("%SUBJECT%", it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }) + .replace("%CONTENT%", messageContent) + .replace("%INFO%", infoContent) + printDocument(html, jobName) + } + return true + } + return false + } + private fun deleteMessage() { message?.let { message -> disposable.add(studentRepository.getCurrentStudent() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt index 3d620459c..0fdb4bda3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt @@ -1,5 +1,7 @@ package io.github.wulkanowy.ui.modules.message.preview +import android.os.Build +import androidx.annotation.RequiresApi import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.ui.base.BaseView @@ -8,6 +10,10 @@ interface MessagePreviewView : BaseView { val deleteMessageSuccessString: String + val messageNoSubjectString: String + + val printHTML: String + fun initView() fun setMessageWithAttachment(item: MessageWithAttachment) @@ -34,5 +40,10 @@ interface MessagePreviewView : BaseView { fun openMessageForward(message: Message?) + fun shareText(text: String, subject: String) + + @RequiresApi(Build.VERSION_CODES.LOLLIPOP) + fun printDocument(html: String, jobName: String) + fun popView() } diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt index 2b40cb476..cf715e657 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt @@ -71,4 +71,17 @@ fun Context.openDialer(phone: String) { startActivity(intent) } +fun Context.shareText(text: String, subject: String?) { + val sendIntent: Intent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, text) + if (subject != null) { + putExtra(Intent.EXTRA_SUBJECT, subject) + } + type = "text/plain" + } + val shareIntent = Intent.createChooser(sendIntent, null) + startActivity(shareIntent) +} + fun Context.dpToPx(dp: Float) = dp * resources.displayMetrics.densityDpi / DENSITY_DEFAULT diff --git a/app/src/main/res/drawable/ic_menu_message_print.xml b/app/src/main/res/drawable/ic_menu_message_print.xml new file mode 100644 index 000000000..204b0f6e3 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_message_print.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_menu_message_share.xml b/app/src/main/res/drawable/ic_menu_message_share.xml new file mode 100644 index 000000000..67a8ee494 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_message_share.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/menu/action_menu_message_preview.xml b/app/src/main/res/menu/action_menu_message_preview.xml index dfc12e234..4c1332e10 100644 --- a/app/src/main/res/menu/action_menu_message_preview.xml +++ b/app/src/main/res/menu/action_menu_message_preview.xml @@ -22,4 +22,18 @@ android:title="@string/message_delete" app:iconTint="@color/material_on_surface_emphasis_medium" app:showAsAction="ifRoom" /> + + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 2bba1640b..a8eccabf0 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -204,6 +204,8 @@ Przenieś do kosza Usuń trwale Wiadomość usunięta pomyślnie + Udostępnij + Drukuj Temat Treść Wiadomość wysłana pomyślnie diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3efb53cb2..1eaebf284 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -210,6 +210,8 @@ Move to trash Delete permanently Message deleted successfully + Share + Print Subject Content Message sent successfully From 6e1ddb482e90008dcf8af110362abedc4d10d42b Mon Sep 17 00:00:00 2001 From: Dominik Korsa Date: Sun, 14 Jun 2020 14:05:24 +0200 Subject: [PATCH 0083/1526] Message fuzzy search (#869) --- app/build.gradle | 3 +- .../modules/message/tab/MessageTabAdapter.kt | 56 ++++--- .../modules/message/tab/MessageTabFragment.kt | 2 +- .../message/tab/MessageTabPresenter.kt | 147 ++++++++++++------ 4 files changed, 130 insertions(+), 78 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 44896664a..82d92f25a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -142,7 +142,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:1.1.3" implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0" implementation "com.google.android.material:material:1.1.0" - implementation "com.github.wulkanowy:material-chips-input:2.0.1" + implementation "com.github.wulkanowy:material-chips-input:2.1.1" implementation "com.github.PhilJay:MPAndroidChart:v3.1.0" implementation "me.zhanghai.android.materialprogressbar:library:1.6.1" @@ -180,6 +180,7 @@ dependencies { implementation 'com.wdullaer:materialdatetimepicker:4.2.3' implementation "io.coil-kt:coil:0.11.0" implementation "io.github.wulkanowy:AppKillerManager:3.0.0" + implementation 'me.xdrop:fuzzywuzzy:1.3.1' playImplementation 'com.google.firebase:firebase-analytics:17.4.3' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt index ece6773fd..b58508a98 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt @@ -4,10 +4,9 @@ import android.graphics.Typeface import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.NO_POSITION -import androidx.recyclerview.widget.SortedList -import androidx.recyclerview.widget.SortedListAdapterCallback import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.message.MessageFolder @@ -20,39 +19,23 @@ class MessageTabAdapter @Inject constructor() : var onClickListener: (Message, position: Int) -> Unit = { _, _ -> } - private val items = SortedList(Message::class.java, object : - SortedListAdapterCallback(this) { + private var items = mutableListOf() - override fun compare(item1: Message, item2: Message): Int { - return item2.date.compareTo(item1.date) - } - - override fun areContentsTheSame(oldItem: Message?, newItem: Message?): Boolean { - return oldItem == newItem - } - - override fun areItemsTheSame(item1: Message, item2: Message): Boolean { - return item1 == item2 - } - }) - - fun replaceAll(models: List) { - items.beginBatchedUpdates() - for (i in items.size() - 1 downTo 0) { - val model = items.get(i) - if (model !in models) { - items.remove(model) - } - } - items.addAll(models) - items.endBatchedUpdates() + fun setDataItems(data: List) { + val diffResult = DiffUtil.calculateDiff(MessageTabDiffUtil(items, data)) + items = data.toMutableList() + diffResult.dispatchUpdatesTo(this) } fun updateItem(position: Int, item: Message) { - items.updateItemAt(position, item) + val currentItem = items[position] + items[position] = item + if (item != currentItem) { + notifyItemChanged(position) + } } - override fun getItemCount() = items.size() + override fun getItemCount() = items.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( ItemMessageBinding.inflate(LayoutInflater.from(parent.context), parent, false) @@ -85,4 +68,19 @@ class MessageTabAdapter @Inject constructor() : } class ItemViewHolder(val binding: ItemMessageBinding) : RecyclerView.ViewHolder(binding.root) + + private class MessageTabDiffUtil(private val old: List, private val new: List) : + DiffUtil.Callback() { + override fun getOldListSize(): Int = old.size + + override fun getNewListSize(): Int = new.size + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return old[oldItemPosition].id == new[newItemPosition].id + } + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return old[oldItemPosition] == new[newItemPosition] + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt index 909bb6873..9954c6428 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt @@ -90,7 +90,7 @@ class MessageTabFragment : BaseFragment(R.layout.frag } override fun updateData(data: List) { - tabAdapter.replaceAll(data) + tabAdapter.setDataItems(data) } override fun updateItem(item: Message, position: Int) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 221762d16..533f5ac85 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.message.tab -import android.annotation.SuppressLint import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.message.MessageFolder import io.github.wulkanowy.data.repositories.message.MessageRepository @@ -11,8 +10,13 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.toFormattedString +import io.reactivex.subjects.PublishSubject +import me.xdrop.fuzzywuzzy.FuzzySearch import timber.log.Timber +import java.util.Locale +import java.util.concurrent.TimeUnit import javax.inject.Inject +import kotlin.math.pow class MessageTabPresenter @Inject constructor( schedulers: SchedulersProvider, @@ -31,9 +35,12 @@ class MessageTabPresenter @Inject constructor( private var messages = emptyList() + private val searchQuery = PublishSubject.create() + fun onAttachView(view: MessageTabView, folder: MessageFolder) { super.onAttachView(view) view.initView() + initializeSearchStream() errorHandler.showErrorMessage = ::showErrorViewOnError this.folder = folder } @@ -76,38 +83,35 @@ class MessageTabPresenter @Inject constructor( private fun loadData(forceRefresh: Boolean) { Timber.i("Loading $folder message data started") - disposable.apply { - clear() - add(studentRepository.getCurrentStudent() - .flatMap { student -> - semesterRepository.getCurrentSemester(student) - .flatMap { messageRepository.getMessages(student, it, folder, forceRefresh) } + disposable.add(studentRepository.getCurrentStudent() + .flatMap { student -> + semesterRepository.getCurrentSemester(student) + .flatMap { messageRepository.getMessages(student, it, folder, forceRefresh) } + } + .subscribeOn(schedulers.backgroundThread) + .observeOn(schedulers.mainThread) + .doFinally { + view?.run { + showRefresh(false) + showProgress(false) + enableSwipe(true) + notifyParentDataLoaded() } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - showRefresh(false) - showProgress(false) - enableSwipe(true) - notifyParentDataLoaded() - } - } - .subscribe({ - Timber.i("Loading $folder message result: Success") - messages = it - onSearchQueryTextChange(lastSearchQuery) - analytics.logEvent( - "load_data", - "type" to "messages", - "items" to it.size, - "folder" to folder.name - ) - }) { - Timber.i("Loading $folder message result: An exception occurred") - errorHandler.dispatch(it) - }) - } + } + .subscribe({ + Timber.i("Loading $folder message result: Success") + messages = it + view?.updateData(getFilteredData(lastSearchQuery)) + analytics.logEvent( + "load_data", + "type" to "messages", + "items" to it.size, + "folder" to folder.name + ) + }) { + Timber.i("Loading $folder message result: An exception occurred") + errorHandler.dispatch(it) + }) } private fun showErrorViewOnError(message: String, error: Throwable) { @@ -121,25 +125,36 @@ class MessageTabPresenter @Inject constructor( } } - @SuppressLint("DefaultLocale") fun onSearchQueryTextChange(query: String) { - lastSearchQuery = query + if (query != searchQuery.toString()) + searchQuery.onNext(query) + } - val lowerCaseQuery = query.toLowerCase() - val filteredList = mutableListOf() - messages.forEach { - if (lowerCaseQuery in it.subject.toLowerCase() || - lowerCaseQuery in it.sender.toLowerCase() || - lowerCaseQuery in it.recipient.toLowerCase() || - lowerCaseQuery in it.date.toFormattedString() - ) { - filteredList.add(it) + private fun initializeSearchStream() { + disposable.add(searchQuery + .debounce(250, TimeUnit.MILLISECONDS) + .map { query -> + lastSearchQuery = query + getFilteredData(query) } + .subscribeOn(schedulers.backgroundThread) + .observeOn(schedulers.mainThread) + .subscribe({ + Timber.d("Applying filter. Full list: ${messages.size}, filtered: ${it.size}") + updateData(it) + }) { Timber.e(it) }) + } + + private fun getFilteredData(query: String): List { + return if (query.trim().isEmpty()) { + messages.sortedByDescending { it.date } + } else { + messages + .map { it to calculateMatchRatio(it, query) } + .sortedByDescending { it.second } + .filter { it.second > 5000 } + .map { it.first } } - - Timber.d("Applying filter. Full list: ${messages.size}, filtered: ${filteredList.size}") - - updateData(filteredList) } private fun updateData(data: List) { @@ -151,4 +166,42 @@ class MessageTabPresenter @Inject constructor( resetListPosition() } } + + private fun calculateMatchRatio(message: Message, query: String): Int { + val subjectRatio = FuzzySearch.tokenSortPartialRatio( + query.toLowerCase(Locale.getDefault()), + message.subject + ) + + val senderOrRecipientRatio = FuzzySearch.tokenSortPartialRatio( + query.toLowerCase(Locale.getDefault()), + if (message.sender.isNotEmpty()) message.sender.toLowerCase(Locale.getDefault()) + else message.recipient.toLowerCase(Locale.getDefault()) + ) + + val dateRatio = listOf( + FuzzySearch.ratio( + query.toLowerCase(Locale.getDefault()), + message.date.toFormattedString("dd.MM").toLowerCase(Locale.getDefault()) + ), + FuzzySearch.ratio( + query.toLowerCase(Locale.getDefault()), + message.date.toFormattedString("dd.MM.yyyy").toLowerCase(Locale.getDefault()) + ), + FuzzySearch.ratio( + query.toLowerCase(Locale.getDefault()), + message.date.toFormattedString("d MMMM").toLowerCase(Locale.getDefault()) + ), + FuzzySearch.ratio( + query.toLowerCase(Locale.getDefault()), + message.date.toFormattedString("d MMMM yyyy").toLowerCase(Locale.getDefault()) + ) + ).max() ?: 0 + + + return (subjectRatio.toDouble().pow(2) + + senderOrRecipientRatio.toDouble().pow(2) + + dateRatio.toDouble().pow(2) * 2 + ).toInt() + } } From dfe7981e7fa71321267f2d1daf545a7ae65e9eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 14 Jun 2020 22:37:58 +0200 Subject: [PATCH 0084/1526] New Crowdin translations (#874) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- .../main/res/values-de/preferences_values.xml | 4 +-- app/src/main/res/values-de/strings.xml | 30 ++++++++++++++--- app/src/main/res/values-pl/strings.xml | 2 +- .../main/res/values-ru/preferences_values.xml | 2 +- app/src/main/res/values-ru/strings.xml | 32 ++++++++++++++++++- .../main/res/values-uk/preferences_values.xml | 2 +- app/src/main/res/values-uk/strings.xml | 32 ++++++++++++++++++- 7 files changed, 93 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 496287984..11935b49b 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -36,8 +36,8 @@ Durchschnittsnote für das 2. Semester - Average of grades from both semesters - Durchschnitt der Bewertungen für das ganze Jahr + Durchschnitt der Noten aus beiden Semestern + Durchschnitt der Noten aus dem ganzen Jahr Nicht zeigen diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4b1669371..7cc44fd97 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -103,10 +103,26 @@ Neue Note Neue Noten + + New predicted grade + New predicted grades + + + New final grade + New final grades + Du hast %1$d Note bekommen Du hast %1$d Noten bekommen + + You received %1$d predicted grade + You received %1$d predicted grades + + + You received %1$d final grade + You received %1$d final grades + Lektion Klassenzimmer @@ -172,6 +188,8 @@ In den Korb wandern Dauerhaft löschen Nachricht erfolgreich gelöscht + Share + Print Thema Inhalt Nachricht erfolgreich gesendet @@ -214,7 +232,7 @@ Die heutige Glücksnummer ist Keine Information über die Glücksnummer. Glücksnummer für heute - Die heutige Glücksnummer ist: + Die heutige Glücksnummer ist: %d Mobile Geräte Keine Geräte @@ -245,6 +263,10 @@ Abmelden Wollen Sie sich von einem aktiven Studenten abmelden? Abmeldung von Student + Student account + Parent account + Mobile API mode + Hybrid mode Version der App Mitarbeiter @@ -270,8 +292,8 @@ Logs teilen Aktualisieren - Check for updates - Before reporting a bug, check first if an update with the bug fix is available + Auf Updates prüfen + Bevor Sie einen Fehler melden, prüfen Sie zuerst, ob ein Update mit der Fehlerbehebung verfügbar ist Inhalt Wiederhol @@ -289,7 +311,7 @@ Zurück Nächste Suchen - Suchen... + Suchen… Keine Lektionen Thema wählen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a8eccabf0..bd4545e9b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -339,7 +339,7 @@ Poprzedni Następny Szukaj - Szukaj... + Szukaj… Brak lekcji Wybierz motyw diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index bd8bb844f..a41abf350 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -37,7 +37,7 @@ Средняя оценка со 2 семестра Average of grades from both semesters - Средняя оценка с целого года + Average of grades from the whole year Не показывать diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6eb8f7741..15c583173 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -107,12 +107,36 @@ Новые оценки Новые оценки + + New predicted grade + New predicted grades + New predicted grades + New predicted grades + + + New final grade + New final grades + New final grades + New final grades + Вы получили %1$d оценку Вы получили %1$d оценки Вы получили %1$d оценок Вы получили %1$d оценок + + You received %1$d predicted grade + You received %1$d predicted grades + You received %1$d predicted grades + You received %1$d predicted grades + + + You received %1$d final grade + You received %1$d final grades + You received %1$d final grades + You received %1$d final grades + Урок Аудитория @@ -180,6 +204,8 @@ Перенести в корзину Удалить навсегда Сообщение успешно удалено + Share + Print Тема Текст Сообщение успешно отправлено @@ -265,6 +291,10 @@ Выйти Вы точно хотите выйти из данного аккаунта? Выйти + Student account + Parent account + Mobile API mode + Hybrid mode Версия приложения Разработчики @@ -309,7 +339,7 @@ Предыдущий Следующий Поиск - Поиск... + Поиск… Нет уроков Выбрать тему diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index be2179c3e..9942621a5 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -37,7 +37,7 @@ Середня оцінка з 2 семестру Average of grades from both semesters - Середня оцінка за весь рік + Average of grades from the whole year Не показувати diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index ec4dbc155..423c4e12f 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -107,12 +107,36 @@ Нові оцінки Нові оцінки + + New predicted grade + New predicted grades + New predicted grades + New predicted grades + + + New final grade + New final grades + New final grades + New final grades + Ви отримали %1$d оцінку Ви отримали %1$d оцінки Ви отримали %1$d оцінок Ви отримали %1$d оцінок + + You received %1$d predicted grade + You received %1$d predicted grades + You received %1$d predicted grades + You received %1$d predicted grades + + + You received %1$d final grade + You received %1$d final grades + You received %1$d final grades + You received %1$d final grades + Урок Аудиторія @@ -180,6 +204,8 @@ Перемістити у кошик Видалити назавжди Повідомлення було успішно видалено + Share + Print Тема Зміст Повідомлення було успішно відправлено @@ -265,6 +291,10 @@ Вийти Ви впевнені, що хочете вийти з цього аккаунту? Вийти з аккаунту учня + Student account + Parent account + Mobile API mode + Hybrid mode Версія додатка Розробники @@ -309,7 +339,7 @@ Попередній Наступний Пошук - Пошук... + Пошук… Брак уроків Увібрати тему From c13f12f729114c5bfd4539f168fcd1dfd383b52c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 14 Jun 2020 22:40:36 +0200 Subject: [PATCH 0085/1526] Version 0.19.0 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 10 ++++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 788aeffa7..a24058083 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.18.3 + - 0.19.0 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index 82d92f25a..621e5a4fe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 62 - versionName "0.18.3" + versionCode 63 + versionName "0.19.0" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -124,7 +124,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:7dc0761" + implementation "io.github.wulkanowy:sdk:0.19.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "androidx.core:core-ktx:1.2.0" diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index db9e9a9a3..68045da4a 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,8 @@ -Wersja 0.18.3 -- poprawiliśmy liczenie średniej i dodaliśmy nowy sposób jej liczenia w ustawieniach -- naprawiliśmy usuwanie wiadomości -- naprawiliśmy wysyłanie wiadomości na Lubelskim Portalu Oświatowym +Wersja 0.19.0 +- naprawiliśmy pokazywanie brakujących przedmiotów na liście podsumowania ocen +- ulepszyliśmy wygląd menadżera kont +- ulepszyliśmy wyszukiwarkę wiadomości +- dodaliśmy powiadomienia o proponowanych i końcowych ocenach +- dodaliśmy opcję udostępniania i drukowania wiadomości Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 4434d6f024ba4f23dfed6ebf63c798f59f9a53ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 20 Jun 2020 15:07:57 +0200 Subject: [PATCH 0086/1526] Migrate repositories from rxjava to coroutines (#885) --- app/build.gradle | 10 +- .../data/db/migrations/Migration12Test.kt | 7 +- .../data/db/migrations/Migration13Test.kt | 5 +- .../TestInternetObservingStrategy.kt | 19 -- .../attendance/AttendanceLocalTest.kt | 14 +- .../CompletedLessonsLocalTest.kt | 17 +- .../data/repositories/exam/ExamLocalTest.kt | 14 +- .../data/repositories/grade/GradeLocalTest.kt | 13 +- .../repositories/grade/GradeRepositoryTest.kt | 75 ++--- .../GradeStatisticsLocalTest.kt | 34 ++- .../luckynumber/LuckyNumberLocalTest.kt | 18 +- .../recipient/RecipientLocalTest.kt | 19 +- .../repositories/student/StudentLocalTest.kt | 7 +- .../timetable/TimetableLocalTest.kt | 19 +- .../timetable/TimetableRepositoryTest.kt | 62 +++-- .../github/wulkanowy/data/RepositoryModule.kt | 10 - .../wulkanowy/data/db/dao/AttendanceDao.kt | 3 +- .../data/db/dao/AttendanceSummaryDao.kt | 3 +- .../github/wulkanowy/data/db/dao/BaseDao.kt | 6 +- .../data/db/dao/CompletedLessonsDao.kt | 3 +- .../github/wulkanowy/data/db/dao/ExamDao.kt | 3 +- .../github/wulkanowy/data/db/dao/GradeDao.kt | 4 +- .../data/db/dao/GradePointsStatisticsDao.kt | 5 +- .../data/db/dao/GradeStatisticsDao.kt | 5 +- .../wulkanowy/data/db/dao/GradeSummaryDao.kt | 3 +- .../wulkanowy/data/db/dao/HomeworkDao.kt | 3 +- .../wulkanowy/data/db/dao/LuckyNumberDao.kt | 3 +- .../data/db/dao/MessageAttachmentDao.kt | 2 +- .../wulkanowy/data/db/dao/MessagesDao.kt | 8 +- .../wulkanowy/data/db/dao/MobileDeviceDao.kt | 3 +- .../github/wulkanowy/data/db/dao/NoteDao.kt | 3 +- .../wulkanowy/data/db/dao/RecipientDao.kt | 3 +- .../wulkanowy/data/db/dao/ReportingUnitDao.kt | 5 +- .../github/wulkanowy/data/db/dao/SchoolDao.kt | 3 +- .../wulkanowy/data/db/dao/SemesterDao.kt | 3 +- .../wulkanowy/data/db/dao/StudentDao.kt | 15 +- .../wulkanowy/data/db/dao/SubjectDao.kt | 3 +- .../wulkanowy/data/db/dao/TeacherDao.kt | 3 +- .../wulkanowy/data/db/dao/TimetableDao.kt | 3 +- .../appcreator/AppCreatorRepository.kt | 13 +- .../attendance/AttendanceLocal.kt | 9 +- .../attendance/AttendanceRemote.kt | 43 ++- .../attendance/AttendanceRepository.kt | 35 +-- .../AttendanceSummaryLocal.kt | 9 +- .../AttendanceSummaryRemote.kt | 33 +-- .../AttendanceSummaryRepository.kt | 28 +- .../completedlessons/CompletedLessonsLocal.kt | 9 +- .../CompletedLessonsRemote.kt | 35 ++- .../CompletedLessonsRepository.kt | 34 +-- .../data/repositories/exam/ExamLocal.kt | 8 +- .../data/repositories/exam/ExamRemote.kt | 31 +-- .../data/repositories/exam/ExamRepository.kt | 34 +-- .../data/repositories/grade/GradeLocal.kt | 21 +- .../data/repositories/grade/GradeRemote.kt | 72 ++--- .../repositories/grade/GradeRepository.kt | 134 ++++----- .../gradestatistics/GradeStatisticsLocal.kt | 32 +-- .../gradestatistics/GradeStatisticsRemote.kt | 43 ++- .../GradeStatisticsRepository.kt | 83 +++--- .../repositories/homework/HomeworkLocal.kt | 10 +- .../repositories/homework/HomeworkRemote.kt | 29 +- .../homework/HomeworkRepository.kt | 42 +-- .../repositories/logger/LoggerRepository.kt | 26 +- .../luckynumber/LuckyNumberLocal.kt | 15 +- .../luckynumber/LuckyNumberRemote.kt | 5 +- .../luckynumber/LuckyNumberRepository.kt | 58 ++-- .../data/repositories/message/MessageLocal.kt | 16 +- .../repositories/message/MessageRemote.kt | 49 ++-- .../repositories/message/MessageRepository.kt | 117 ++++---- .../mobiledevice/MobileDeviceLocal.kt | 9 +- .../mobiledevice/MobileDeviceRemote.kt | 25 +- .../mobiledevice/MobileDeviceRepository.kt | 45 +-- .../data/repositories/note/NoteLocal.kt | 11 +- .../data/repositories/note/NoteRemote.kt | 29 +- .../data/repositories/note/NoteRepository.kt | 52 ++-- .../repositories/recipient/RecipientLocal.kt | 9 +- .../repositories/recipient/RecipientRemote.kt | 13 +- .../recipient/RecipientRepository.kt | 39 +-- .../repositories/recover/RecoverRemote.kt | 5 +- .../repositories/recover/RecoverRepository.kt | 20 +- .../reportingunit/ReportingUnitLocal.kt | 11 +- .../reportingunit/ReportingUnitRemote.kt | 23 +- .../reportingunit/ReportingUnitRepository.kt | 46 ++-- .../data/repositories/school/SchoolLocal.kt | 7 +- .../data/repositories/school/SchoolRemote.kt | 5 +- .../repositories/school/SchoolRepository.kt | 39 +-- .../repositories/semester/SemesterLocal.kt | 9 +- .../repositories/semester/SemesterRemote.kt | 31 +-- .../semester/SemesterRepository.kt | 47 ++-- .../data/repositories/student/StudentLocal.kt | 59 ++-- .../repositories/student/StudentRemote.kt | 13 +- .../repositories/student/StudentRepository.kt | 56 ++-- .../data/repositories/subject/SubjectLocal.kt | 8 +- .../repositories/subject/SubjectRemote.kt | 19 +- .../repositories/subject/SubjectRepository.kt | 31 +-- .../data/repositories/teacher/TeacherLocal.kt | 9 +- .../repositories/teacher/TeacherRemote.kt | 21 +- .../repositories/teacher/TeacherRepository.kt | 28 +- .../repositories/timetable/TimetableLocal.kt | 9 +- .../repositories/timetable/TimetableRemote.kt | 45 ++- .../timetable/TimetableRepository.kt | 52 ++-- .../java/io/github/wulkanowy/di/AppModule.kt | 5 + .../alarm/TimetableNotificationReceiver.kt | 3 +- .../wulkanowy/services/sync/SyncWorker.kt | 10 +- .../sync/works/AttendanceSummaryWork.kt | 3 +- .../services/sync/works/AttendanceWork.kt | 4 +- .../sync/works/CompletedLessonWork.kt | 4 +- .../wulkanowy/services/sync/works/ExamWork.kt | 3 +- .../sync/works/GradeStatisticsWork.kt | 4 +- .../services/sync/works/GradeWork.kt | 17 +- .../services/sync/works/HomeworkWork.kt | 3 +- .../services/sync/works/LuckyNumberWork.kt | 8 +- .../services/sync/works/MessageWork.kt | 8 +- .../wulkanowy/services/sync/works/NoteWork.kt | 8 +- .../services/sync/works/RecipientWork.kt | 6 +- .../services/sync/works/TeacherWork.kt | 3 +- .../services/sync/works/TimetableWork.kt | 4 +- .../github/wulkanowy/ui/base/BasePresenter.kt | 10 +- .../github/wulkanowy/ui/base/ErrorDialog.kt | 4 +- .../github/wulkanowy/ui/base/ErrorHandler.kt | 2 +- .../about/contributor/ContributorPresenter.kt | 3 +- .../about/logviewer/LogViewerPresenter.kt | 5 +- .../ui/modules/account/AccountPresenter.kt | 14 +- .../modules/attendance/AttendancePresenter.kt | 17 +- .../summary/AttendanceSummaryPresenter.kt | 13 +- .../ui/modules/exam/ExamPresenter.kt | 11 +- .../ui/modules/grade/GradeAverageProvider.kt | 25 +- .../ui/modules/grade/GradePresenter.kt | 5 +- .../grade/details/GradeDetailsPresenter.kt | 16 +- .../statistics/GradeStatisticsPresenter.kt | 23 +- .../grade/summary/GradeSummaryPresenter.kt | 5 +- .../ui/modules/homework/HomeworkPresenter.kt | 11 +- .../details/HomeworkDetailsPresenter.kt | 3 +- .../ui/modules/login/LoginErrorHandler.kt | 2 +- .../login/advanced/LoginAdvancedPresenter.kt | 11 +- .../modules/login/form/LoginFormPresenter.kt | 3 +- .../login/recover/LoginRecoverPresenter.kt | 5 +- .../LoginStudentSelectPresenter.kt | 8 +- .../login/symbol/LoginSymbolPresenter.kt | 3 +- .../luckynumber/LuckyNumberPresenter.kt | 6 +- .../LuckyNumberWidgetConfigurePresenter.kt | 3 +- .../LuckyNumberWidgetProvider.kt | 12 +- .../preview/MessagePreviewPresenter.kt | 9 +- .../message/send/SendMessagePresenter.kt | 16 +- .../message/tab/MessageTabPresenter.kt | 7 +- .../mobiledevice/MobileDevicePresenter.kt | 15 +- .../token/MobileDeviceTokenPresenter.kt | 7 +- .../ui/modules/note/NotePresenter.kt | 9 +- .../school/SchoolPresenter.kt | 8 +- .../teacher/TeacherPresenter.kt | 7 +- .../ui/modules/splash/SplashPresenter.kt | 3 +- .../modules/timetable/TimetablePresenter.kt | 11 +- .../completed/CompletedLessonsErrorHandler.kt | 2 +- .../completed/CompletedLessonsPresenter.kt | 11 +- .../TimetableWidgetConfigurePresenter.kt | 3 +- .../timetablewidget/TimetableWidgetFactory.kt | 10 +- .../TimetableWidgetProvider.kt | 10 +- .../wulkanowy/utils/DispatchersProvider.kt | 10 + .../wulkanowy/utils/ResourcesExtension.kt | 8 +- .../wulkanowy/utils/CrashlyticsUtils.kt | 2 +- .../UnitTestInternetObservingStrategy.kt | 19 -- .../attendance/AttendanceRemoteTest.kt | 19 +- .../CompletedLessonsRemoteTest.kt | 19 +- .../data/repositories/exam/ExamRemoteTest.kt | 19 +- .../GradeStatisticsRemoteTest.kt | 15 +- .../luckynumber/LuckyNumberRemoteTest.kt | 18 +- .../message/MessageRepositoryTest.kt | 71 ++--- .../MobileDeviceRepositoryTest.kt | 41 ++- .../semester/SemesterRepositoryTest.kt | 104 +++---- .../repositories/student/StudentRemoteTest.kt | 17 +- .../timetable/TimetableRemoteTest.kt | 19 +- .../modules/grade/GradeAverageProviderTest.kt | 259 +++++++++--------- .../ui/modules/login/LoginPresenterTest.kt | 32 +-- .../login/form/LoginFormPresenterTest.kt | 170 ++++++------ .../LoginStudentSelectPresenterTest.kt | 64 +++-- .../ui/modules/main/MainPresenterTest.kt | 40 ++- .../ui/modules/splash/SplashPresenterTest.kt | 25 +- .../wulkanowy/utils/GradeExtensionTest.kt | 8 +- 177 files changed, 1752 insertions(+), 2004 deletions(-) delete mode 100644 app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestInternetObservingStrategy.kt create mode 100644 app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt delete mode 100644 app/src/test/java/io/github/wulkanowy/data/repositories/UnitTestInternetObservingStrategy.kt diff --git a/app/build.gradle b/app/build.gradle index 621e5a4fe..0f0a3303d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,10 +124,13 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.19.0" + implementation "io.github.wulkanowy:sdk:61250d3" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation "androidx.core:core-ktx:1.2.0" + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.3.7' + + implementation "androidx.core:core-ktx:1.3.0" implementation "androidx.activity:activity-ktx:1.1.0" implementation "androidx.appcompat:appcompat:1.2.0-rc01" implementation "androidx.appcompat:appcompat-resources:1.1.0" @@ -167,7 +170,6 @@ dependencies { implementation "com.ncapdevi:frag-nav:3.3.0" implementation "com.github.YarikSOffice:lingver:1.2.2" - implementation "com.github.pwittchen:reactivenetwork-rx2:3.0.8" implementation "io.reactivex.rxjava2:rxandroid:2.1.1" implementation "io.reactivex.rxjava2:rxjava:2.2.19" @@ -197,7 +199,6 @@ dependencies { testImplementation "junit:junit:4.13" testImplementation "io.mockk:mockk:$mockk" testImplementation "org.threeten:threetenbp:1.4.4" - testImplementation "org.mockito:mockito-inline:3.3.3" androidTestImplementation "androidx.test:core:1.2.0" androidTestImplementation "androidx.test:runner:1.2.0" @@ -205,7 +206,6 @@ dependencies { androidTestImplementation "io.mockk:mockk-android:$mockk" androidTestImplementation "androidx.room:room-testing:$room" androidTestImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" - androidTestImplementation "org.mockito:mockito-android:3.3.3" } apply plugin: 'com.google.gms.google-services' diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt index 0bbcc4271..b312048d5 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt @@ -4,6 +4,7 @@ import android.content.ContentValues import android.database.sqlite.SQLiteDatabase.CONFLICT_FAIL import androidx.sqlite.db.SupportSQLiteDatabase import androidx.test.ext.junit.runners.AndroidJUnit4 +import kotlinx.coroutines.runBlocking import org.junit.Test import org.junit.runner.RunWith import kotlin.test.assertEquals @@ -29,7 +30,7 @@ class Migration12Test : AbstractMigrationTest() { helper.runMigrationsAndValidate(dbName, 12, true, Migration12()) val db = getMigratedRoomDatabase() - val students = db.studentDao.loadAll().blockingGet() + val students = runBlocking { db.studentDao.loadAll() } assertEquals(2, students.size) @@ -58,7 +59,7 @@ class Migration12Test : AbstractMigrationTest() { helper.runMigrationsAndValidate(dbName, 12, true, Migration12()) val db = getMigratedRoomDatabase() - val students = db.studentDao.loadAll().blockingGet() + val students = runBlocking { db.studentDao.loadAll() } assertEquals(1, students.size) @@ -84,7 +85,7 @@ class Migration12Test : AbstractMigrationTest() { helper.runMigrationsAndValidate(dbName, 12, true, Migration12()) val db = getMigratedRoomDatabase() - val students = db.studentDao.loadAll().blockingGet() + val students = runBlocking { db.studentDao.loadAll() } assertEquals(3, students.size) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt index da4284b02..05a8a5cf0 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt @@ -5,6 +5,7 @@ import android.database.sqlite.SQLiteDatabase import androidx.sqlite.db.SupportSQLiteDatabase import io.github.wulkanowy.data.db.Converters import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test @@ -26,7 +27,7 @@ class Migration13Test : AbstractMigrationTest() { helper.runMigrationsAndValidate(dbName, 13, true, Migration13()) val db = getMigratedRoomDatabase() - val students = db.studentDao.loadAll().blockingGet() + val students = runBlocking { db.studentDao.loadAll() } assertEquals(3, students.size) @@ -60,7 +61,7 @@ class Migration13Test : AbstractMigrationTest() { helper.runMigrationsAndValidate(dbName, 13, true, Migration13()) val db = getMigratedRoomDatabase() - val students = db.studentDao.loadAll().blockingGet() + val students = runBlocking { db.studentDao.loadAll() } assertEquals(2, students.size) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestInternetObservingStrategy.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestInternetObservingStrategy.kt deleted file mode 100644 index 7dc93c4a4..000000000 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestInternetObservingStrategy.kt +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.wulkanowy.data.repositories - -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingStrategy -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.error.ErrorHandler -import io.reactivex.Observable -import io.reactivex.Single - -class TestInternetObservingStrategy : InternetObservingStrategy { - - override fun checkInternetConnectivity(host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Single { - return Single.just(true) - } - - override fun observeInternetConnectivity(initialIntervalInMs: Int, intervalInMs: Int, host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Observable { - return Observable.just(true) - } - - override fun getDefaultPingHost() = "localhost" -} diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt index cdfc524ad..f9326b2d5 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -35,7 +36,7 @@ class AttendanceLocalTest { @Test fun saveAndReadTest() { - attendanceLocal.saveAttendance(listOf( + val list = listOf( getAttendanceEntity( of(2018, 9, 10), SentExcuseStatus.ACCEPTED @@ -48,14 +49,11 @@ class AttendanceLocalTest { of(2018, 9, 17), SentExcuseStatus.ACCEPTED ) - )) + ) + runBlocking { attendanceLocal.saveAttendance(list) } - val attendance = attendanceLocal - .getAttendance(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1), - of(2018, 9, 10), - of(2018, 9, 14) - ) - .blockingGet() + val semester = Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1) + val attendance = runBlocking { attendanceLocal.getAttendance(semester, of(2018, 9, 10), of(2018, 9, 14)) } assertEquals(2, attendance.size) assertEquals(attendance[0].date, of(2018, 9, 10)) assertEquals(attendance[1].date, of(2018, 9, 14)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt index 50badc468..d8aac23da 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -24,7 +25,8 @@ class CompletedLessonsLocalTest { @Before fun createDb() { - testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) + testDb = Room + .inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) .build() completedLessonsLocal = CompletedLessonsLocal(testDb.completedLessonsDao) } @@ -36,18 +38,15 @@ class CompletedLessonsLocalTest { @Test fun saveAndReadTest() { - completedLessonsLocal.saveCompletedLessons(listOf( + val list = listOf( getCompletedLesson(of(2018, 9, 10), 1), getCompletedLesson(of(2018, 9, 14), 2), getCompletedLesson(of(2018, 9, 17), 3) - )) + ) + runBlocking { completedLessonsLocal.saveCompletedLessons(list) } - val completed = completedLessonsLocal - .getCompletedLessons(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1), - of(2018, 9, 10), - of(2018, 9, 14) - ) - .blockingGet() + val semester = Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1) + val completed = runBlocking { completedLessonsLocal.getCompletedLessons(semester, of(2018, 9, 10), of(2018, 9, 14)) } assertEquals(2, completed.size) assertEquals(completed[0].date, of(2018, 9, 10)) assertEquals(completed[1].date, of(2018, 9, 14)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt index 98dfc88eb..f3b179a51 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -34,18 +35,15 @@ class ExamLocalTest { @Test fun saveAndReadTest() { - examLocal.saveExams(listOf( + val list = listOf( Exam(1, 2, of(2018, 9, 10), now(), "", "", "", "", "", ""), Exam(1, 2, of(2018, 9, 14), now(), "", "", "", "", "", ""), Exam(1, 2, of(2018, 9, 17), now(), "", "", "", "", "", "") - )) + ) + runBlocking { examLocal.saveExams(list) } - val exams = examLocal - .getExams(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1), - of(2018, 9, 10), - of(2018, 9, 14) - ) - .blockingGet() + val semester = Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1) + val exams = runBlocking { examLocal.getExams(semester, of(2018, 9, 10), of(2018, 9, 14)) } assertEquals(2, exams.size) assertEquals(exams[0].date, of(2018, 9, 10)) assertEquals(exams[1].date, of(2018, 9, 14)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt index eb1a55480..82129d868 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt @@ -5,6 +5,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -22,7 +23,8 @@ class GradeLocalTest { @Before fun createDb() { - testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) + testDb = Room + .inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) .build() gradeLocal = GradeLocal(testDb.gradeDao, testDb.gradeSummaryDao) } @@ -34,17 +36,16 @@ class GradeLocalTest { @Test fun saveAndReadTest() { - gradeLocal.saveGrades(listOf( + val list = listOf( createGradeLocal(5, 3.0, LocalDate.of(2018, 9, 10), "", 1), createGradeLocal(4, 4.0, LocalDate.of(2019, 2, 27), "", 2), createGradeLocal(3, 5.0, LocalDate.of(2019, 2, 28), "", 2) - )) + ) + runBlocking { gradeLocal.saveGrades(list) } val semester = Semester(1, 2, "", 2019, 2, 1, now(), now(), 1, 1) - val grades = gradeLocal - .getGradesDetails(semester) - .blockingGet() + val grades = runBlocking { gradeLocal.getGradesDetails(semester) } assertEquals(2, grades.size) assertEquals(grades[0].date, LocalDate.of(2019, 2, 27)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt index cdd514772..5487fd4ce 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt @@ -5,17 +5,16 @@ import androidx.room.Room import androidx.test.core.app.ApplicationProvider.getApplicationContext import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Grade import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -33,10 +32,6 @@ class GradeRepositoryTest { @MockK private lateinit var mockSdk: Sdk - private val settings = InternetObservingSettings.builder() - .strategy(TestInternetObservingStrategy()) - .build() - @MockK private lateinit var semesterMock: Semester @@ -71,15 +66,17 @@ class GradeRepositoryTest { @Test fun markOlderThanRegisterDateAsRead() { - every { mockSdk.getGrades(1) } returns Single.just(listOf( + coEvery { mockSdk.getGrades(1) } returns (listOf( createGradeApi(5, 4.0, of(2019, 2, 25), "Ocena pojawiła się"), createGradeApi(5, 4.0, of(2019, 2, 26), "przed zalogowanie w aplikacji"), createGradeApi(5, 4.0, of(2019, 2, 27), "Ocena z dnia logowania"), createGradeApi(5, 4.0, of(2019, 2, 28), "Ocena jeszcze nowsza") ) to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet().first.sortedByDescending { it.date } + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + .first.sortedByDescending { it.date } + } assertFalse { grades[0].isRead } assertFalse { grades[1].isRead } @@ -89,21 +86,24 @@ class GradeRepositoryTest { @Test fun mitigateOldGradesNotifications() { - gradeLocal.saveGrades(listOf( + val list = listOf( createGradeLocal(5, 3.0, of(2019, 2, 25), "Jedna ocena"), createGradeLocal(4, 4.0, of(2019, 2, 26), "Druga"), createGradeLocal(3, 5.0, of(2019, 2, 27), "Trzecia") - )) + ) + runBlocking { gradeLocal.saveGrades(list) } - every { mockSdk.getGrades(1) } returns Single.just(listOf( + coEvery { mockSdk.getGrades(1) } returns (listOf( createGradeApi(5, 2.0, of(2019, 2, 25), "Ocena ma datę, jest inna, ale nie zostanie powiadomiona"), createGradeApi(4, 3.0, of(2019, 2, 26), "starszą niż ostatnia lokalnie"), createGradeApi(3, 4.0, of(2019, 2, 27), "Ta jest z tego samego dnia co ostatnia lokalnie"), createGradeApi(2, 5.0, of(2019, 2, 28), "Ta jest już w ogóle nowa") ) to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet().first.sortedByDescending { it.date } + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + .first.sortedByDescending { it.date } + } assertFalse { grades[0].isRead } assertFalse { grades[1].isRead } @@ -113,69 +113,76 @@ class GradeRepositoryTest { @Test fun subtractLocaleDuplicateGrades() { - gradeLocal.saveGrades(listOf( + val list = listOf( createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") - )) + ) + runBlocking { gradeLocal.saveGrades(list) } - every { mockSdk.getGrades(1) } returns Single.just(listOf( + coEvery { mockSdk.getGrades(1) } returns (listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet() + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + } assertEquals(2, grades.first.size) } @Test fun subtractRemoteDuplicateGrades() { - gradeLocal.saveGrades(listOf( + val list = listOf( createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") - )) + ) + runBlocking { gradeLocal.saveGrades(list) } - every { mockSdk.getGrades(1) } returns Single.just(listOf( + coEvery { mockSdk.getGrades(1) } returns (listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet() + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + } assertEquals(3, grades.first.size) } @Test fun emptyLocal() { - gradeLocal.saveGrades(listOf()) + runBlocking { gradeLocal.saveGrades(listOf()) } - every { mockSdk.getGrades(1) } returns Single.just(listOf( + coEvery { mockSdk.getGrades(1) } returns (listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet() + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + } assertEquals(3, grades.first.size) } @Test fun emptyRemote() { - gradeLocal.saveGrades(listOf( + val list = listOf( createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") - )) + ) + runBlocking { gradeLocal.saveGrades(list) } - every { mockSdk.getGrades(1) } returns Single.just(emptyList() to emptyList()) + coEvery { mockSdk.getGrades(1) } returns (emptyList() to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet() + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + } assertEquals(0, grades.first.size) } diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt index bd3635fea..deda67ba3 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.GradePointsStatistics import io.github.wulkanowy.data.db.entities.GradeStatistics import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -35,25 +36,27 @@ class GradeStatisticsLocalTest { @Test fun saveAndRead_subject() { - gradeStatisticsLocal.saveGradesStatistics(listOf( + val list = listOf( getGradeStatistics("Matematyka", 2, 1), getGradeStatistics("Fizyka", 1, 2) - )) + ) + runBlocking { gradeStatisticsLocal.saveGradesStatistics(list) } - val stats = gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Matematyka").blockingGet() + val stats = runBlocking { gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Matematyka") } assertEquals(1, stats.size) assertEquals(stats[0].subject, "Matematyka") } @Test fun saveAndRead_all() { - gradeStatisticsLocal.saveGradesStatistics(listOf( + val list = listOf( getGradeStatistics("Matematyka", 2, 1), getGradeStatistics("Chemia", 2, 1), getGradeStatistics("Fizyka", 1, 2) - )) + ) + runBlocking { gradeStatisticsLocal.saveGradesStatistics(list) } - val stats = gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Wszystkie").blockingGet() + val stats = runBlocking { gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Wszystkie") } assertEquals(3, stats.size) assertEquals(stats[0].subject, "Wszystkie") assertEquals(stats[1].subject, "Matematyka") @@ -62,13 +65,14 @@ class GradeStatisticsLocalTest { @Test fun saveAndRead_points() { - gradeStatisticsLocal.saveGradesPointsStatistics(listOf( + val list = listOf( getGradePointsStatistics("Matematyka", 2, 1), getGradePointsStatistics("Chemia", 2, 1), getGradePointsStatistics("Fizyka", 1, 2) - )) + ) + runBlocking { gradeStatisticsLocal.saveGradesPointsStatistics(list) } - val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka").blockingGet() + val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka") } with(stats[0]) { assertEquals(subject, "Matematyka") assertEquals(others, 5.0) @@ -78,18 +82,18 @@ class GradeStatisticsLocalTest { @Test fun saveAndRead_subjectEmpty() { - gradeStatisticsLocal.saveGradesPointsStatistics(listOf()) + runBlocking { gradeStatisticsLocal.saveGradesPointsStatistics(listOf()) } - val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka").blockingGet() - assertEquals(null, stats) + val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka") } + assertEquals(emptyList(), stats) } @Test fun saveAndRead_allEmpty() { - gradeStatisticsLocal.saveGradesPointsStatistics(listOf()) + runBlocking { gradeStatisticsLocal.saveGradesPointsStatistics(listOf()) } - val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Wszystkie").blockingGet() - assertEquals(null, stats) + val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Wszystkie") } + assertEquals(emptyList(), stats) } private fun getSemester(): Semester { diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt index efad0d4d5..f37d7934b 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -23,7 +24,8 @@ class LuckyNumberLocalTest { @Before fun createDb() { - testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) + testDb = Room + .inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) .build() luckyNumberLocal = LuckyNumberLocal(testDb.luckyNumberDao) } @@ -35,14 +37,14 @@ class LuckyNumberLocalTest { @Test fun saveAndReadTest() { - luckyNumberLocal.saveLuckyNumber(LuckyNumber(1, LocalDate.of(2019, 1, 20), 14)) + val number = LuckyNumber(1, LocalDate.of(2019, 1, 20), 14) + runBlocking { luckyNumberLocal.saveLuckyNumber(number) } - val luckyNumber = luckyNumberLocal.getLuckyNumber(Student("", "", "", "", "", "", false, "", "", "", 1, 1, "", "", "", "", "", 1, false, now()), - LocalDate.of(2019, 1, 20) - ).blockingGet() + val student = Student("", "", "", "", "", "", false, "", "", "", 1, 1, "", "", "", "", "", 1, false, now()) + val luckyNumber = runBlocking { luckyNumberLocal.getLuckyNumber(student, LocalDate.of(2019, 1, 20)) } - assertEquals(1, luckyNumber.studentId) - assertEquals(LocalDate.of(2019, 1, 20), luckyNumber.date) - assertEquals(14, luckyNumber.luckyNumber) + assertEquals(1, luckyNumber?.studentId) + assertEquals(LocalDate.of(2019, 1, 20), luckyNumber?.date) + assertEquals(14, luckyNumber?.luckyNumber) } } diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt index 22578e41e..9ba8a9fb4 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -35,17 +36,21 @@ class RecipientLocalTest { @Test fun saveAndReadTest() { - recipientLocal.saveRecipients(listOf( + val list = listOf( Recipient(1, "2rPracownik", "Kowalski Jan", "Kowalski Jan [KJ] - Pracownik (Fake123456)", 3, 4, 2, "hash"), Recipient(1, "3rPracownik", "Kowalska Karolina", "Kowalska Karolina [KK] - Pracownik (Fake123456)", 4, 4, 2, "hash"), Recipient(1, "4rPracownik", "Krupa Stanisław", "Krupa Stanisław [KS] - Uczeń (Fake123456)", 5, 4, 1, "hash") - )) + ) + runBlocking { recipientLocal.saveRecipients(list) } - val recipients = recipientLocal.getRecipients( - Student("fakelog.cf", "AUTO", "", "", "", "", false, "", "", "", 1, 0, "", "", "", "", "", 1, true, LocalDateTime.now()), - 2, - ReportingUnit(1, 4, "", 0, "", emptyList()) - ).blockingGet() + val student = Student("fakelog.cf", "AUTO", "", "", "", "", false, "", "", "", 1, 0, "", "", "", "", "", 1, true, LocalDateTime.now()) + val recipients = runBlocking { + recipientLocal.getRecipients( + student = student, + role = 2, + unit = ReportingUnit(1, 4, "", 0, "", emptyList()) + ) + } assertEquals(2, recipients.size) assertEquals(1, recipients[0].studentId) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt index 530bfb3f7..02a13344e 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.repositories.getStudent +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -36,9 +37,9 @@ class StudentLocalTest { @Test fun saveAndReadTest() { - studentLocal.saveStudents(listOf(student)).blockingGet() + runBlocking { studentLocal.saveStudents(listOf(student)) } - val student = studentLocal.getCurrentStudent(true).blockingGet() - assertEquals("23", student.schoolSymbol) + val student = runBlocking { studentLocal.getCurrentStudent(true) } + assertEquals("23", student?.schoolSymbol) } } diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt index a66e5843c..fa353a332 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt @@ -5,6 +5,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -34,17 +35,21 @@ class TimetableLocalTest { @Test fun saveAndReadTest() { - timetableDb.saveTimetable(listOf( + val list = listOf( createTimetableLocal(of(2018, 9, 10, 0, 0, 0), 1), createTimetableLocal(of(2018, 9, 14, 0, 0, 0), 1), createTimetableLocal(of(2018, 9, 17, 0, 0, 0), 1) - )) + ) + runBlocking { timetableDb.saveTimetable(list) } - val exams = timetableDb.getTimetable( - Semester(1, 2, "", 1, 1, 2019, LocalDate.now(), LocalDate.now(), 1, 1), - LocalDate.of(2018, 9, 10), - LocalDate.of(2018, 9, 14) - ).blockingGet() + val semester = Semester(1, 2, "", 1, 1, 2019, LocalDate.now(), LocalDate.now(), 1, 1) + val exams = runBlocking { + timetableDb.getTimetable( + semester = semester, + startDate = LocalDate.of(2018, 9, 10), + endDate = LocalDate.of(2018, 9, 14) + ) + } assertEquals(2, exams.size) assertEquals(exams[0].date, LocalDate.of(2018, 9, 10)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt index 75f2f0b83..a91651db1 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt @@ -5,19 +5,18 @@ import androidx.room.Room import androidx.test.core.app.ApplicationProvider.getApplicationContext import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy import io.github.wulkanowy.data.repositories.getStudent -import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -33,10 +32,6 @@ class TimetableRepositoryTest { @MockK private lateinit var mockSdk: Sdk - private val settings = InternetObservingSettings.builder() - .strategy(TestInternetObservingStrategy()) - .build() - @MockK private lateinit var studentMock: Student @@ -82,23 +77,31 @@ class TimetableRepositoryTest { @Test fun copyRoomToCompletedFromPrevious() { - timetableLocal.saveTimetable(listOf( - createTimetableLocal(of(2019, 3, 5, 8, 0), 1, "123", "Przyroda"), - createTimetableLocal(of(2019, 3, 5, 8, 50), 2, "321", "Religia"), - createTimetableLocal(of(2019, 3, 5, 9, 40), 3, "213", "W-F"), - createTimetableLocal(of(2019, 3, 5, 10, 30),3, "213", "W-F", "Jan Kowalski") - )) + runBlocking { + timetableLocal.saveTimetable(listOf( + createTimetableLocal(of(2019, 3, 5, 8, 0), 1, "123", "Przyroda"), + createTimetableLocal(of(2019, 3, 5, 8, 50), 2, "321", "Religia"), + createTimetableLocal(of(2019, 3, 5, 9, 40), 3, "213", "W-F"), + createTimetableLocal(of(2019, 3, 5, 10, 30), 3, "213", "W-F", "Jan Kowalski") + )) + } - every { mockSdk.getTimetable(any(), any()) } returns Single.just(listOf( + coEvery { mockSdk.getTimetable(any(), any()) } returns listOf( createTimetableRemote(of(2019, 3, 5, 8, 0), 1, "", "Przyroda"), createTimetableRemote(of(2019, 3, 5, 8, 50), 2, "", "Religia"), createTimetableRemote(of(2019, 3, 5, 9, 40), 3, "", "W-F"), createTimetableRemote(of(2019, 3, 5, 10, 30), 4, "", "W-F") - )) + ) - val lessons = TimetableRepository(settings, timetableLocal, timetableRemote, timetableNotificationSchedulerHelper) - .getTimetable(student, semesterMock, LocalDate.of(2019, 3, 5), LocalDate.of(2019, 3, 5), true) - .blockingGet() + val lessons = runBlocking { + TimetableRepository(timetableLocal, timetableRemote, timetableNotificationSchedulerHelper).getTimetable( + student = student, + semester = semesterMock, + start = LocalDate.of(2019, 3, 5), + end = LocalDate.of(2019, 3, 5), + forceRefresh = true + ) + } assertEquals(4, lessons.size) assertEquals("123", lessons[0].room) @@ -108,7 +111,7 @@ class TimetableRepositoryTest { @Test fun copyTeacherToCompletedFromPrevious() { - timetableLocal.saveTimetable(listOf( + val list = listOf( createTimetableLocal(of(2019, 12, 23, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false), createTimetableLocal(of(2019, 12, 23, 8, 50), 2, "124", "Matematyka", "Paweł Poniedziałkowski", false), createTimetableLocal(of(2019, 12, 23, 9, 40), 3, "125", "Język polski", "Joanna Wtorkowska", true), @@ -123,9 +126,10 @@ class TimetableRepositoryTest { createTimetableLocal(of(2019, 12, 25, 8, 50), 2, "124", "Matematyka", "", false), createTimetableLocal(of(2019, 12, 25, 9, 40), 3, "125", "Matematyka", "", true), createTimetableLocal(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "", true) - )) + ) + runBlocking { timetableLocal.saveTimetable(list) } - every { mockSdk.getTimetable(any(), any()) } returns Single.just(listOf( + coEvery { mockSdk.getTimetable(any(), any()) } returns listOf( createTimetableRemote(of(2019, 12, 23, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false), createTimetableRemote(of(2019, 12, 23, 8, 50), 2, "124", "Matematyka", "Jakub Wtorkowski", true), createTimetableRemote(of(2019, 12, 23, 9, 40), 3, "125", "Język polski", "Joanna Poniedziałkowska", false), @@ -140,11 +144,17 @@ class TimetableRepositoryTest { createTimetableRemote(of(2019, 12, 25, 8, 50), 2, "124", "Matematyka", "Paweł Czwartkowski", true), createTimetableRemote(of(2019, 12, 25, 9, 40), 3, "125", "Matematyka", "Paweł Środowski", false), createTimetableRemote(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "Paweł Czwartkowski", true) - )) + ) - val lessons = TimetableRepository(settings, timetableLocal, timetableRemote, timetableNotificationSchedulerHelper) - .getTimetable(student, semesterMock, LocalDate.of(2019, 12, 23), LocalDate.of(2019, 12, 25), true) - .blockingGet() + val lessons = runBlocking { + TimetableRepository(timetableLocal, timetableRemote, timetableNotificationSchedulerHelper).getTimetable( + student = student, + semester = semesterMock, + start = LocalDate.of(2019, 12, 23), + end = LocalDate.of(2019, 12, 25), + forceRefresh = true + ) + } assertEquals(12, lessons.size) diff --git a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt index 19af1b2f8..6ece2d978 100644 --- a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt @@ -8,8 +8,6 @@ import androidx.preference.PreferenceManager import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.chuckerteam.chucker.api.RetentionManager -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.strategy.WalledGardenInternetObservingStrategy import dagger.Module import dagger.Provides import io.github.wulkanowy.data.db.AppDatabase @@ -22,14 +20,6 @@ import javax.inject.Singleton @Module internal class RepositoryModule { - @Singleton - @Provides - fun provideInternetObservingSettings(): InternetObservingSettings { - return InternetObservingSettings.builder() - .strategy(WalledGardenInternetObservingStrategy()) - .build() - } - @Singleton @Provides fun provideSdk(chuckerCollector: ChuckerCollector, context: Context): Sdk { 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 3eb57473d..49527a553 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Attendance -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface AttendanceDao : BaseDao { @Query("SELECT * FROM Attendance WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt index fd58533f1..1ba37c959 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt @@ -3,11 +3,10 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.AttendanceSummary -import io.reactivex.Maybe @Dao interface AttendanceSummaryDao : BaseDao { @Query("SELECT * FROM AttendanceSummary WHERE diary_id = :diaryId AND student_id = :studentId AND subject_id = :subjectId") - fun loadAll(diaryId: Int, studentId: Int, subjectId: Int): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int, subjectId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt index 32dbadb86..048e9e3cd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt @@ -7,11 +7,11 @@ import androidx.room.Update interface BaseDao { @Insert - fun insertAll(items: List): List + suspend fun insertAll(items: List): List @Update - fun updateAll(items: List) + suspend fun updateAll(items: List) @Delete - fun deleteAll(items: List) + suspend fun deleteAll(items: List) } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt index e13e569b6..6406d097d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.CompletedLesson -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface CompletedLessonsDao : BaseDao { @Query("SELECT * FROM CompletedLesson WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt index ca6b32dfc..e492f7b84 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Exam -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface ExamDao : BaseDao { @Query("SELECT * FROM Exams WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List } 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 c74d1937f..df0276203 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Grade -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,6 +10,5 @@ import javax.inject.Singleton interface GradeDao : BaseDao { @Query("SELECT * FROM Grades WHERE semester_id = :semesterId AND student_id = :studentId") - fun loadAll(semesterId: Int, studentId: Int): Maybe> - + suspend fun loadAll(semesterId: Int, studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt index da1828666..b1e644bbd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.GradePointsStatistics -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,8 +10,8 @@ import javax.inject.Singleton interface GradePointsStatisticsDao : BaseDao { @Query("SELECT * FROM GradesPointsStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND subject = :subjectName") - fun loadSubject(semesterId: Int, studentId: Int, subjectName: String): Maybe> + suspend fun loadSubject(semesterId: Int, studentId: Int, subjectName: String): List @Query("SELECT * FROM GradesPointsStatistics WHERE student_id = :studentId AND semester_id = :semesterId") - fun loadAll(semesterId: Int, studentId: Int): Maybe> + suspend fun loadAll(semesterId: Int, studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt index 6faa35d0b..786da0d9e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.GradeStatistics -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,8 +10,8 @@ import javax.inject.Singleton interface GradeStatisticsDao : BaseDao { @Query("SELECT * FROM GradesStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND subject = :subjectName AND is_semester = :isSemester") - fun loadSubject(semesterId: Int, studentId: Int, subjectName: String, isSemester: Boolean): Maybe> + suspend fun loadSubject(semesterId: Int, studentId: Int, subjectName: String, isSemester: Boolean): List @Query("SELECT * FROM GradesStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND is_semester = :isSemester") - fun loadAll(semesterId: Int, studentId: Int, isSemester: Boolean): Maybe> + suspend fun loadAll(semesterId: Int, studentId: Int, isSemester: Boolean): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt index 1165ef07f..02d4e9229 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.GradeSummary -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface GradeSummaryDao : BaseDao { @Query("SELECT * FROM GradesSummary WHERE student_id = :studentId AND semester_id = :semesterId") - fun loadAll(semesterId: Int, studentId: Int): Maybe> + suspend fun loadAll(semesterId: Int, studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt index 1947a0dfe..9bbf80ace 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Homework -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface HomeworkDao : BaseDao { @Query("SELECT * FROM Homework WHERE semester_id = :semesterId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(semesterId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe> + suspend fun loadAll(semesterId: Int, studentId: Int, from: LocalDate, end: LocalDate): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt index f16c28d9e..b4ead2454 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.LuckyNumber -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface LuckyNumberDao : BaseDao { @Query("SELECT * FROM LuckyNumbers WHERE student_id = :studentId AND date = :date") - fun load(studentId: Int, date: LocalDate): Maybe + suspend fun load(studentId: Int, date: LocalDate): LuckyNumber } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessageAttachmentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessageAttachmentDao.kt index 3c511a277..b69083a1a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessageAttachmentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessageAttachmentDao.kt @@ -9,5 +9,5 @@ import io.github.wulkanowy.data.db.entities.MessageAttachment interface MessageAttachmentDao : BaseDao { @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insertAttachments(items: List): List + suspend fun insertAttachments(items: List): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt index 7a69e2707..2757978ae 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt @@ -5,19 +5,17 @@ import androidx.room.Query import androidx.room.Transaction import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment -import io.reactivex.Maybe -import io.reactivex.Single @Dao interface MessagesDao : BaseDao { @Transaction @Query("SELECT * FROM Messages WHERE student_id = :studentId AND message_id = :messageId") - fun loadMessageWithAttachment(studentId: Int, messageId: Int): Single + suspend fun loadMessageWithAttachment(studentId: Int, messageId: Int): MessageWithAttachment @Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder AND removed = 0 ORDER BY date DESC") - fun loadAll(studentId: Int, folder: Int): Maybe> + suspend fun loadAll(studentId: Int, folder: Int): List @Query("SELECT * FROM Messages WHERE student_id = :studentId AND removed = 1 ORDER BY date DESC") - fun loadDeleted(studentId: Int): Maybe> + suspend fun loadDeleted(studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt index b05b2d9cc..b07aab284 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt @@ -3,11 +3,10 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.MobileDevice -import io.reactivex.Maybe @Dao interface MobileDeviceDao : BaseDao { @Query("SELECT * FROM MobileDevices WHERE student_id = :studentId ORDER BY date DESC") - fun loadAll(studentId: Int): Maybe> + suspend fun loadAll(studentId: Int): List } 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 ea2fc6eb2..81c324f65 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Note -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface NoteDao : BaseDao { @Query("SELECT * FROM Notes WHERE student_id = :studentId") - fun loadAll(studentId: Int): Maybe> + suspend fun loadAll(studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/RecipientDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/RecipientDao.kt index afb941b1a..419efde0d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/RecipientDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/RecipientDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Recipient -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface RecipientDao : BaseDao { @Query("SELECT * FROM Recipients WHERE student_id = :studentId AND role = :role AND unit_id = :unitId") - fun load(studentId: Int, role: Int, unitId: Int): Maybe> + suspend fun load(studentId: Int, role: Int, unitId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/ReportingUnitDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/ReportingUnitDao.kt index 6ddfd4941..ca697eda8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/ReportingUnitDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/ReportingUnitDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.ReportingUnit -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,8 +10,8 @@ import javax.inject.Singleton interface ReportingUnitDao : BaseDao { @Query("SELECT * FROM ReportingUnits WHERE student_id = :studentId") - fun load(studentId: Int): Maybe> + suspend fun load(studentId: Int): List @Query("SELECT * FROM ReportingUnits WHERE student_id = :studentId AND real_id = :unitId") - fun loadOne(studentId: Int, unitId: Int): Maybe + suspend fun loadOne(studentId: Int, unitId: Int): ReportingUnit? } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt index e9bd67557..37cb6c500 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.School -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface SchoolDao : BaseDao { @Query("SELECT * FROM School WHERE student_id = :studentId AND class_id = :classId") - fun load(studentId: Int, classId: Int): Maybe + suspend fun load(studentId: Int, classId: Int): School? } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt index 654b80f38..bbbc9b4e2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface SemesterDao : BaseDao { @Query("SELECT * FROM Semesters WHERE student_id = :studentId AND class_id = :classId") - fun loadAll(studentId: Int, classId: Int): Maybe> + suspend fun loadAll(studentId: Int, classId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt index 901ddc73f..3d7d9216e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt @@ -6,7 +6,6 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy.ABORT import androidx.room.Query import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -14,23 +13,23 @@ import javax.inject.Singleton interface StudentDao { @Insert(onConflict = ABORT) - fun insertAll(student: List): List + suspend fun insertAll(student: List): List @Delete - fun delete(student: Student) + suspend fun delete(student: Student) @Query("SELECT * FROM Students WHERE is_current = 1") - fun loadCurrent(): Maybe + suspend fun loadCurrent(): Student? @Query("SELECT * FROM Students WHERE id = :id") - fun loadById(id: Int): Maybe + suspend fun loadById(id: Int): Student? @Query("SELECT * FROM Students") - fun loadAll(): Maybe> + suspend fun loadAll(): List @Query("UPDATE Students SET is_current = 1 WHERE id = :id") - fun updateCurrent(id: Long) + suspend fun updateCurrent(id: Long) @Query("UPDATE Students SET is_current = 0") - fun resetCurrent() + suspend fun resetCurrent() } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt index 525a7129a..92477552c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt @@ -3,11 +3,10 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Subject -import io.reactivex.Maybe @Dao interface SubjectDao : BaseDao { @Query("SELECT * FROM Subjects WHERE diary_id = :diaryId AND student_id = :studentId") - fun loadAll(diaryId: Int, studentId: Int): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt index 5ea237a84..0b0e659b4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Teacher -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface TeacherDao : BaseDao { @Query("SELECT * FROM Teachers WHERE student_id = :studentId AND class_id = :classId") - fun loadAll(studentId: Int, classId: Int): Maybe> + suspend fun loadAll(studentId: Int, classId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt index 6b62cc82a..59200b80b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Timetable -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface TimetableDao : BaseDao { @Query("SELECT * FROM Timetable WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt index 76cf698c9..3fcd7cb57 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt @@ -3,14 +3,19 @@ package io.github.wulkanowy.data.repositories.appcreator import android.content.res.AssetManager import com.google.gson.Gson import io.github.wulkanowy.data.pojos.Contributor -import io.reactivex.Single +import io.github.wulkanowy.utils.DispatchersProvider +import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @Singleton -class AppCreatorRepository @Inject constructor(private val assets: AssetManager) { - fun getAppCreators(): Single> { - return Single.fromCallable { +class AppCreatorRepository @Inject constructor( + private val assets: AssetManager, + private val dispatchers: DispatchersProvider +) { + + suspend fun getAppCreators(): List { + return withContext(dispatchers.backgroundThread) { Gson().fromJson( assets.open("contributors.json").bufferedReader().use { it.readText() }, Array::class.java diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt index 0f5873766..b232033d1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.attendance import io.github.wulkanowy.data.db.dao.AttendanceDao import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,15 +10,15 @@ import javax.inject.Singleton @Singleton class AttendanceLocal @Inject constructor(private val attendanceDb: AttendanceDao) { - fun saveAttendance(attendance: List) { + suspend fun saveAttendance(attendance: List) { attendanceDb.insertAll(attendance) } - fun deleteAttendance(attendance: List) { + suspend fun deleteAttendance(attendance: List) { attendanceDb.deleteAll(attendance) } - fun getAttendance(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> { - return attendanceDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate).filter { it.isNotEmpty() } + suspend fun getAttendance(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { + return attendanceDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt index f64d920db..1f794f5a2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Absent import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDate import org.threeten.bp.LocalDateTime import org.threeten.bp.LocalTime @@ -16,33 +15,31 @@ import javax.inject.Singleton @Singleton class AttendanceRemote @Inject constructor(private val sdk: Sdk) { - fun getAttendance(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> { + suspend fun getAttendance(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getAttendance(startDate, endDate, semester.semesterId) - .map { attendance -> - attendance.map { - Attendance( - studentId = semester.studentId, - diaryId = semester.diaryId, - date = it.date, - timeId = it.timeId, - number = it.number, - subject = it.subject, - name = it.name, - presence = it.presence, - absence = it.absence, - exemption = it.exemption, - lateness = it.lateness, - excused = it.excused, - deleted = it.deleted, - excusable = it.excusable, - excuseStatus = it.excuseStatus?.name - ) - } + .map { + Attendance( + studentId = semester.studentId, + diaryId = semester.diaryId, + date = it.date, + timeId = it.timeId, + number = it.number, + subject = it.subject, + name = it.name, + presence = it.presence, + absence = it.absence, + exemption = it.exemption, + lateness = it.lateness, + excused = it.excused, + deleted = it.deleted, + excusable = it.excusable, + excuseStatus = it.excuseStatus?.name + ) } } - fun excuseAbsence(student: Student, semester: Semester, absenceList: List, reason: String?): Single { + suspend fun excuseAbsence(student: Student, semester: Semester, absenceList: List, reason: String?): Boolean { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear).excuseForAbsence(absenceList.map { attendance -> Absent( date = LocalDateTime.of(attendance.date, LocalTime.of(0, 0)), diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt index 68e7c5f12..0fa0090e7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt @@ -1,45 +1,34 @@ package io.github.wulkanowy.data.repositories.attendance -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings 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.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single import org.threeten.bp.LocalDate -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class AttendanceRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: AttendanceLocal, private val remote: AttendanceRemote ) { - fun getAttendance(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean): Single> { - return local.getAttendance(semester, start.monday, end.sunday).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getAttendance(student, semester, start.monday, end.sunday) - else Single.error(UnknownHostException()) - }.flatMap { newAttendance -> - local.getAttendance(semester, start.monday, end.sunday) - .toSingle(emptyList()) - .doOnSuccess { oldAttendance -> - local.deleteAttendance(oldAttendance.uniqueSubtract(newAttendance)) - local.saveAttendance(newAttendance.uniqueSubtract(oldAttendance)) - } - }.flatMap { - local.getAttendance(semester, start.monday, end.sunday) - .toSingle(emptyList()) - }).map { list -> list.filter { it.date in start..end } } + suspend fun getAttendance(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean): List { + return local.getAttendance(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { + val new = remote.getAttendance(student, semester, start.monday, end.sunday) + val old = local.getAttendance(semester, start.monday, end.sunday) + + local.deleteAttendance(old.uniqueSubtract(new)) + local.saveAttendance(new.uniqueSubtract(old)) + + local.getAttendance(semester, start.monday, end.sunday) + }.filter { it.date in start..end } } - fun excuseForAbsence(student: Student, semester: Semester, attendanceList: List, reason: String? = null): Single { + suspend fun excuseForAbsence(student: Student, semester: Semester, attendanceList: List, reason: String? = null): Boolean { return remote.excuseAbsence(student, semester, attendanceList, reason) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt index 2e9a10067..f949f0163 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt @@ -3,22 +3,21 @@ package io.github.wulkanowy.data.repositories.attendancesummary import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class AttendanceSummaryLocal @Inject constructor(private val attendanceDb: AttendanceSummaryDao) { - fun saveAttendanceSummary(attendance: List) { + suspend fun saveAttendanceSummary(attendance: List) { attendanceDb.insertAll(attendance) } - fun deleteAttendanceSummary(attendance: List) { + suspend fun deleteAttendanceSummary(attendance: List) { attendanceDb.deleteAll(attendance) } - fun getAttendanceSummary(semester: Semester, subjectId: Int): Maybe> { - return attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId).filter { it.isNotEmpty() } + suspend fun getAttendanceSummary(semester: Semester, subjectId: Int): List { + return attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRemote.kt index 8fef5c391..29a0b9a7b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRemote.kt @@ -5,32 +5,29 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class AttendanceSummaryRemote @Inject constructor(private val sdk: Sdk) { - fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int): Single> { + suspend fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getAttendanceSummary(subjectId) - .map { attendance -> - attendance.map { - AttendanceSummary( - studentId = semester.studentId, - diaryId = semester.diaryId, - subjectId = subjectId, - month = it.month, - presence = it.presence, - absence = it.absence, - absenceExcused = it.absenceExcused, - absenceForSchoolReasons = it.absenceForSchoolReasons, - lateness = it.lateness, - latenessExcused = it.latenessExcused, - exemption = it.exemption - ) - } + .map { + AttendanceSummary( + studentId = semester.studentId, + diaryId = semester.diaryId, + subjectId = subjectId, + month = it.month, + presence = it.presence, + absence = it.absence, + absenceExcused = it.absenceExcused, + absenceForSchoolReasons = it.absenceForSchoolReasons, + lateness = it.lateness, + latenessExcused = it.latenessExcused, + exemption = it.exemption + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt index 5f0b2b346..7ef16fb0f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt @@ -1,35 +1,27 @@ package io.github.wulkanowy.data.repositories.attendancesummary -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class AttendanceSummaryRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: AttendanceSummaryLocal, private val remote: AttendanceSummaryRemote ) { - fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int, forceRefresh: Boolean = false): Single> { - return local.getAttendanceSummary(semester, subjectId).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getAttendanceSummary(student, semester, subjectId) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getAttendanceSummary(semester, subjectId).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteAttendanceSummary(old.uniqueSubtract(new)) - local.saveAttendanceSummary(new.uniqueSubtract(old)) - } - }.flatMap { local.getAttendanceSummary(semester, subjectId).toSingle(emptyList()) }) + suspend fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int, forceRefresh: Boolean = false): List { + return local.getAttendanceSummary(semester, subjectId).filter { !forceRefresh }.ifEmpty { + val new = remote.getAttendanceSummary(student, semester, subjectId) + + val old = local.getAttendanceSummary(semester, subjectId) + local.deleteAttendanceSummary(old.uniqueSubtract(new)) + local.saveAttendanceSummary(new.uniqueSubtract(old)) + + return local.getAttendanceSummary(semester, subjectId) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt index 9b275908e..f355f4166 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.completedlessons import io.github.wulkanowy.data.db.dao.CompletedLessonsDao import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,15 +10,15 @@ import javax.inject.Singleton @Singleton class CompletedLessonsLocal @Inject constructor(private val completedLessonsDb: CompletedLessonsDao) { - fun saveCompletedLessons(completedLessons: List) { + suspend fun saveCompletedLessons(completedLessons: List) { completedLessonsDb.insertAll(completedLessons) } - fun deleteCompleteLessons(completedLessons: List) { + suspend fun deleteCompleteLessons(completedLessons: List) { completedLessonsDb.deleteAll(completedLessons) } - fun getCompletedLessons(semester: Semester, start: LocalDate, end: LocalDate): Maybe> { - return completedLessonsDb.loadAll(semester.diaryId, semester.studentId, start, end).filter { it.isNotEmpty() } + suspend fun getCompletedLessons(semester: Semester, start: LocalDate, end: LocalDate): List { + return completedLessonsDb.loadAll(semester.diaryId, semester.studentId, start, end) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt index bb115111e..b3d786058 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -13,26 +12,24 @@ import javax.inject.Singleton @Singleton class CompletedLessonsRemote @Inject constructor(private val sdk: Sdk) { - fun getCompletedLessons(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> { + suspend fun getCompletedLessons(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getCompletedLessons(startDate, endDate) - .map { lessons -> - lessons.map { - it.absence - CompletedLesson( - studentId = semester.studentId, - diaryId = semester.diaryId, - date = it.date, - number = it.number, - subject = it.subject, - topic = it.topic, - teacher = it.teacher, - teacherSymbol = it.teacherSymbol, - substitution = it.substitution, - absence = it.absence, - resources = it.resources - ) - } + .map { + it.absence + CompletedLesson( + studentId = semester.studentId, + diaryId = semester.diaryId, + date = it.date, + number = it.number, + subject = it.subject, + topic = it.topic, + teacher = it.teacher, + teacherSymbol = it.teacherSymbol, + substitution = it.substitution, + absence = it.absence, + resources = it.resources + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt index 72cc93eb4..8e81c54ae 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt @@ -1,42 +1,30 @@ package io.github.wulkanowy.data.repositories.completedlessons -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single import org.threeten.bp.LocalDate -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class CompletedLessonsRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: CompletedLessonsLocal, private val remote: CompletedLessonsRemote ) { - fun getCompletedLessons(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return local.getCompletedLessons(semester, start.monday, end.sunday).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getCompletedLessons(student, semester, start.monday, end.sunday) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getCompletedLessons(semester, start.monday, end.sunday) - .toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteCompleteLessons(old.uniqueSubtract(new)) - local.saveCompletedLessons(new.uniqueSubtract(old)) - } - }.flatMap { - local.getCompletedLessons(semester, start.monday, end.sunday) - .toSingle(emptyList()) - }).map { list -> list.filter { it.date in start..end } } + suspend fun getCompletedLessons(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { + return local.getCompletedLessons(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { + val new = remote.getCompletedLessons(student, semester, start.monday, end.sunday) + val old = local.getCompletedLessons(semester, start.monday, end.sunday) + + local.deleteCompleteLessons(old.uniqueSubtract(new)) + local.saveCompletedLessons(new.uniqueSubtract(old)) + + local.getCompletedLessons(semester, start.monday, end.sunday) + }.filter { it.date in start..end } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt index 389eb5835..d1888380a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.exam import io.github.wulkanowy.data.db.dao.ExamDao import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,16 +10,15 @@ import javax.inject.Singleton @Singleton class ExamLocal @Inject constructor(private val examDb: ExamDao) { - fun getExams(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> { + suspend fun getExams(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return examDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) - .filter { it.isNotEmpty() } } - fun saveExams(exams: List) { + suspend fun saveExams(exams: List) { examDb.insertAll(exams) } - fun deleteExams(exams: List) { + suspend fun deleteExams(exams: List) { examDb.deleteAll(exams) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt index fb105ceee..0668b5c14 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -13,24 +12,22 @@ import javax.inject.Singleton @Singleton class ExamRemote @Inject constructor(private val sdk: Sdk) { - fun getExams(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> { + suspend fun getExams(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getExams(startDate, endDate, semester.semesterId) - .map { exams -> - exams.map { - Exam( - studentId = semester.studentId, - diaryId = semester.diaryId, - date = it.date, - entryDate = it.entryDate, - subject = it.subject, - group = it.group, - type = it.type, - description = it.description, - teacher = it.teacher, - teacherSymbol = it.teacherSymbol - ) - } + .map { + Exam( + studentId = semester.studentId, + diaryId = semester.diaryId, + date = it.date, + entryDate = it.entryDate, + subject = it.subject, + group = it.group, + type = it.type, + description = it.description, + teacher = it.teacher, + teacherSymbol = it.teacherSymbol + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt index f29e4fdf8..13af62c5b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt @@ -1,42 +1,30 @@ package io.github.wulkanowy.data.repositories.exam -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single import org.threeten.bp.LocalDate -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class ExamRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: ExamLocal, private val remote: ExamRemote ) { - fun getExams(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return local.getExams(semester, start.monday, end.sunday).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getExams(student, semester, start.monday, end.sunday) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getExams(semester, start.monday, end.sunday) - .toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteExams(old.uniqueSubtract(new)) - local.saveExams(new.uniqueSubtract(old)) - } - }.flatMap { - local.getExams(semester, start.monday, end.sunday) - .toSingle(emptyList()) - }).map { list -> list.filter { it.date in start..end } } + suspend fun getExams(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { + return local.getExams(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { + val new = remote.getExams(student, semester, start.monday, end.sunday) + val old = local.getExams(semester, start.monday, end.sunday) + + local.deleteExams(old.uniqueSubtract(new)) + local.saveExams(new.uniqueSubtract(old)) + + local.getExams(semester, start.monday, end.sunday) + }.filter { it.date in start..end } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt index 52ab60178..234fc6b80 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.dao.GradeSummaryDao import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @@ -15,35 +14,35 @@ class GradeLocal @Inject constructor( private val gradeSummaryDb: GradeSummaryDao ) { - fun saveGrades(grades: List) { + suspend fun saveGrades(grades: List) { gradeDb.insertAll(grades) } - fun deleteGrades(grades: List) { + suspend fun deleteGrades(grades: List) { gradeDb.deleteAll(grades) } - fun updateGrades(grades: List) { + suspend fun updateGrades(grades: List) { gradeDb.updateAll(grades) } - fun updateGradesSummary(gradesSummary: List) { + suspend fun updateGradesSummary(gradesSummary: List) { gradeSummaryDb.updateAll(gradesSummary) } - fun getGradesDetails(semester: Semester): Maybe> { - return gradeDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() } + suspend fun getGradesDetails(semester: Semester): List { + return gradeDb.loadAll(semester.semesterId, semester.studentId) } - fun saveGradesSummary(gradesSummary: List) { + suspend fun saveGradesSummary(gradesSummary: List) { gradeSummaryDb.insertAll(gradesSummary) } - fun deleteGradesSummary(gradesSummary: List) { + suspend fun deleteGradesSummary(gradesSummary: List) { gradeSummaryDb.deleteAll(gradesSummary) } - fun getGradesSummary(semester: Semester): Maybe> { - return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() } + suspend fun getGradesSummary(semester: Semester): List { + return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt index abb2f98c9..9534a8910 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt @@ -6,48 +6,48 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class GradeRemote @Inject constructor(private val sdk: Sdk) { - fun getGrades(student: Student, semester: Semester): Single, List>> { - return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) + suspend fun getGrades(student: Student, semester: Semester): Pair, List> { + val (details, summary) = sdk + .init(student) + .switchDiary(semester.diaryId, semester.schoolYear) .getGrades(semester.semesterId) - .map { (details, summary) -> - details.map { - Grade( - studentId = semester.studentId, - semesterId = semester.semesterId, - subject = it.subject, - entry = it.entry, - value = it.value, - modifier = it.modifier, - comment = it.comment, - color = it.color, - gradeSymbol = it.symbol, - description = it.description, - weight = it.weight, - weightValue = it.weightValue, - date = it.date, - teacher = it.teacher - ) - } to summary.map { - GradeSummary( - semesterId = semester.semesterId, - studentId = semester.studentId, - position = 0, - subject = it.name, - predictedGrade = it.predicted, - finalGrade = it.final, - pointsSum = it.pointsSum, - proposedPoints = it.proposedPoints, - finalPoints = it.finalPoints, - average = it.average - ) - } - } + + return details.map { + Grade( + studentId = semester.studentId, + semesterId = semester.semesterId, + subject = it.subject, + entry = it.entry, + value = it.value, + modifier = it.modifier, + comment = it.comment, + color = it.color, + gradeSymbol = it.symbol, + description = it.description, + weight = it.weight, + weightValue = it.weightValue, + date = it.date, + teacher = it.teacher + ) + } to summary.map { + GradeSummary( + semesterId = semester.semesterId, + studentId = semester.studentId, + position = 0, + subject = it.name, + predictedGrade = it.predicted, + finalGrade = it.final, + pointsSum = it.pointsSum, + proposedPoints = it.proposedPoints, + finalPoints = it.finalPoints, + average = it.average + ) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt index 2ba68b967..6dcbb0657 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt @@ -1,110 +1,96 @@ package io.github.wulkanowy.data.repositories.grade -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Completable -import io.reactivex.Single import org.threeten.bp.LocalDateTime -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class GradeRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: GradeLocal, private val remote: GradeRemote ) { - fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Single, List>> { - return local.getGradesDetails(semester).flatMap { details -> - local.getGradesSummary(semester).map { summary -> details to summary } - }.filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getGrades(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { (newDetails, newSummary) -> - local.getGradesDetails(semester).toSingle(emptyList()) - .doOnSuccess { old -> - val notifyBreakDate = old.maxBy { it.date }?.date ?: student.registrationDate.toLocalDate() - local.deleteGrades(old.uniqueSubtract(newDetails)) - local.saveGrades(newDetails.uniqueSubtract(old) - .onEach { - if (it.date >= notifyBreakDate) it.apply { - isRead = false - if (notify) isNotified = false - } - }) - }.flatMap { - local.getGradesSummary(semester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteGradesSummary(old.uniqueSubtract(newSummary)) - local.saveGradesSummary(newSummary.uniqueSubtract(old) - .onEach { summary -> - val oldSummary = old.find { oldSummary -> oldSummary.subject == summary.subject } - summary.isPredictedGradeNotified = when { - summary.predictedGrade.isEmpty() -> true - notify && oldSummary?.predictedGrade != summary.predictedGrade -> false - else -> true - } - summary.isFinalGradeNotified = when { - summary.finalGrade.isEmpty() -> true - notify && oldSummary?.finalGrade != summary.finalGrade -> false - else -> true - } + suspend fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Pair, List> { + val details = local.getGradesDetails(semester) + val summaries = local.getGradesSummary(semester) - summary.predictedGradeLastChange = when { - oldSummary == null -> LocalDateTime.now() - summary.predictedGrade != oldSummary.predictedGrade -> LocalDateTime.now() - else -> oldSummary.predictedGradeLastChange - } - summary.finalGradeLastChange = when { - oldSummary == null -> LocalDateTime.now() - summary.finalGrade != oldSummary.finalGrade -> LocalDateTime.now() - else -> oldSummary.finalGradeLastChange - } - }) - } - } - }.flatMap { - local.getGradesDetails(semester).toSingle(emptyList()).flatMap { details -> - local.getGradesSummary(semester).toSingle(emptyList()).map { summary -> - details to summary - } + if ((details.isNotEmpty() || summaries.isNotEmpty()) && !forceRefresh) { + return details to summaries + } + + val (newDetails, newSummary) = remote.getGrades(student, semester) + val oldGrades = local.getGradesDetails(semester) + + val notifyBreakDate = oldGrades.maxBy { it.date }?.date ?: student.registrationDate.toLocalDate() + local.deleteGrades(oldGrades.uniqueSubtract(newDetails)) + local.saveGrades(newDetails.uniqueSubtract(oldGrades).onEach { + if (it.date >= notifyBreakDate) it.apply { + isRead = false + if (notify) isNotified = false } }) + + val oldSummaries = local.getGradesSummary(semester) + + local.deleteGradesSummary(oldSummaries.uniqueSubtract(newSummary)) + local.saveGradesSummary(newSummary.uniqueSubtract(oldSummaries).onEach { summary -> + val oldSummary = oldSummaries.find { oldSummary -> oldSummary.subject == summary.subject } + summary.isPredictedGradeNotified = when { + summary.predictedGrade.isEmpty() -> true + notify && oldSummary?.predictedGrade != summary.predictedGrade -> false + else -> true + } + summary.isFinalGradeNotified = when { + summary.finalGrade.isEmpty() -> true + notify && oldSummary?.finalGrade != summary.finalGrade -> false + else -> true + } + + summary.predictedGradeLastChange = when { + oldSummary == null -> LocalDateTime.now() + summary.predictedGrade != oldSummary.predictedGrade -> LocalDateTime.now() + else -> oldSummary.predictedGradeLastChange + } + summary.finalGradeLastChange = when { + oldSummary == null -> LocalDateTime.now() + summary.finalGrade != oldSummary.finalGrade -> LocalDateTime.now() + else -> oldSummary.finalGradeLastChange + } + }) + + return local.getGradesDetails(semester) to local.getGradesSummary(semester) } - fun getUnreadGrades(semester: Semester): Single> { - return local.getGradesDetails(semester).map { it.filter { grade -> !grade.isRead } }.toSingle(emptyList()) + suspend fun getUnreadGrades(semester: Semester): List { + return local.getGradesDetails(semester).filter { grade -> !grade.isRead } } - fun getNotNotifiedGrades(semester: Semester): Single> { - return local.getGradesDetails(semester).map { it.filter { grade -> !grade.isNotified } }.toSingle(emptyList()) + suspend fun getNotNotifiedGrades(semester: Semester): List { + return local.getGradesDetails(semester).filter { grade -> !grade.isNotified } } - fun getNotNotifiedPredictedGrades(semester: Semester): Single> { - return local.getGradesSummary(semester).map { it.filter { gradeSummary -> !gradeSummary.isPredictedGradeNotified } }.toSingle(emptyList()) + suspend fun getNotNotifiedPredictedGrades(semester: Semester): List { + return local.getGradesSummary(semester).filter { gradeSummary -> !gradeSummary.isPredictedGradeNotified } } - fun getNotNotifiedFinalGrades(semester: Semester): Single> { - return local.getGradesSummary(semester).map { it.filter { gradeSummary -> !gradeSummary.isFinalGradeNotified } }.toSingle(emptyList()) + suspend fun getNotNotifiedFinalGrades(semester: Semester): List { + return local.getGradesSummary(semester).filter { gradeSummary -> !gradeSummary.isFinalGradeNotified } } - fun updateGrade(grade: Grade): Completable { - return Completable.fromCallable { local.updateGrades(listOf(grade)) } + suspend fun updateGrade(grade: Grade) { + return local.updateGrades(listOf(grade)) } - fun updateGrades(grades: List): Completable { - return Completable.fromCallable { local.updateGrades(grades) } + suspend fun updateGrades(grades: List) { + return local.updateGrades(grades) } - fun updateGradesSummary(gradesSummary: List): Completable { - return Completable.fromCallable { local.updateGradesSummary(gradesSummary) } + suspend fun updateGradesSummary(gradesSummary: List) { + return local.updateGradesSummary(gradesSummary) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt index 7994bd758..d34f2b2ec 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.dao.GradeStatisticsDao import io.github.wulkanowy.data.db.entities.GradePointsStatistics import io.github.wulkanowy.data.db.entities.GradeStatistics import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @@ -15,46 +14,47 @@ class GradeStatisticsLocal @Inject constructor( private val gradePointsStatisticsDb: GradePointsStatisticsDao ) { - fun getGradesStatistics(semester: Semester, isSemester: Boolean): Maybe> { - return gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester).filter { it.isNotEmpty() } + suspend fun getGradesStatistics(semester: Semester, isSemester: Boolean): List { + return gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester) } - fun getGradesPointsStatistics(semester: Semester): Maybe> { - return gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() } + suspend fun getGradesPointsStatistics(semester: Semester): List { + return gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) } - fun getGradesStatistics(semester: Semester, isSemester: Boolean, subjectName: String): Maybe> { + suspend fun getGradesStatistics(semester: Semester, isSemester: Boolean, subjectName: String): List { return when (subjectName) { - "Wszystkie" -> gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester).map { list -> - list.groupBy { it.grade }.map { + "Wszystkie" -> { + val statistics = gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester) + statistics.groupBy { it.grade }.map { GradeStatistics(semester.studentId, semester.semesterId, subjectName, it.key, it.value.fold(0) { acc, e -> acc + e.amount }, false) - } + list + } + statistics } else -> gradeStatisticsDb.loadSubject(semester.semesterId, semester.studentId, subjectName, isSemester) - }.filter { it.isNotEmpty() } + } } - fun getGradesPointsStatistics(semester: Semester, subjectName: String): Maybe> { + suspend fun getGradesPointsStatistics(semester: Semester, subjectName: String): List { return when (subjectName) { "Wszystkie" -> gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) else -> gradePointsStatisticsDb.loadSubject(semester.semesterId, semester.studentId, subjectName) - }.filter { it.isNotEmpty() } + } } - fun saveGradesStatistics(gradesStatistics: List) { + suspend fun saveGradesStatistics(gradesStatistics: List) { gradeStatisticsDb.insertAll(gradesStatistics) } - fun saveGradesPointsStatistics(gradePointsStatistics: List) { + suspend fun saveGradesPointsStatistics(gradePointsStatistics: List) { gradePointsStatisticsDb.insertAll(gradePointsStatistics) } - fun deleteGradesStatistics(gradesStatistics: List) { + suspend fun deleteGradesStatistics(gradesStatistics: List) { gradeStatisticsDb.deleteAll(gradesStatistics) } - fun deleteGradesPointsStatistics(gradesPointsStatistics: List) { + suspend fun deleteGradesPointsStatistics(gradesPointsStatistics: List) { gradePointsStatisticsDb.deleteAll(gradesPointsStatistics) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemote.kt index 99e0cb987..1ff8132fc 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemote.kt @@ -6,44 +6,39 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class GradeStatisticsRemote @Inject constructor(private val sdk: Sdk) { - fun getGradeStatistics(student: Student, semester: Semester, isSemester: Boolean): Single> { + suspend fun getGradeStatistics(student: Student, semester: Semester, isSemester: Boolean): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear).let { if (isSemester) it.getGradesAnnualStatistics(semester.semesterId) else it.getGradesPartialStatistics(semester.semesterId) - }.map { gradeStatistics -> - gradeStatistics.map { - GradeStatistics( - semesterId = semester.semesterId, - studentId = semester.studentId, - subject = it.subject, - grade = it.gradeValue, - amount = it.amount, - semester = isSemester - ) - } + }.map { + GradeStatistics( + semesterId = semester.semesterId, + studentId = semester.studentId, + subject = it.subject, + grade = it.gradeValue, + amount = it.amount, + semester = isSemester + ) } } - fun getGradePointsStatistics(student: Student, semester: Semester): Single> { + suspend fun getGradePointsStatistics(student: Student, semester: Semester): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getGradesPointsStatistics(semester.semesterId) - .map { gradePointsStatistics -> - gradePointsStatistics.map { - GradePointsStatistics( - semesterId = semester.semesterId, - studentId = semester.studentId, - subject = it.subject, - others = it.others, - student = it.student - ) - } + .map { + GradePointsStatistics( + semesterId = semester.semesterId, + studentId = semester.studentId, + subject = it.subject, + others = it.others, + student = it.student + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt index 8d96d2f57..93df69406 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt @@ -1,7 +1,5 @@ package io.github.wulkanowy.data.repositories.gradestatistics -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.GradePointsStatistics import io.github.wulkanowy.data.db.entities.GradeStatistics import io.github.wulkanowy.data.db.entities.Semester @@ -9,67 +7,54 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GradeStatisticsItem import io.github.wulkanowy.ui.modules.grade.statistics.ViewType import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class GradeStatisticsRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: GradeStatisticsLocal, private val remote: GradeStatisticsRemote ) { - fun getGradesStatistics(student: Student, semester: Semester, subjectName: String, isSemester: Boolean, forceRefresh: Boolean = false): Single> { - return local.getGradesStatistics(semester, isSemester, subjectName).map { it.mapToStatisticItems() }.filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getGradeStatistics(student, semester, isSemester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getGradesStatistics(semester, isSemester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteGradesStatistics(old.uniqueSubtract(new)) - local.saveGradesStatistics(new.uniqueSubtract(old)) - } - }.flatMap { local.getGradesStatistics(semester, isSemester, subjectName).map { it.mapToStatisticItems() }.toSingle(emptyList()) }) - } + suspend fun getGradesStatistics(student: Student, semester: Semester, subjectName: String, isSemester: Boolean, forceRefresh: Boolean = false): List { + return local.getGradesStatistics(semester, isSemester, subjectName).mapToStatisticItems().filter { !forceRefresh }.ifEmpty { + val new = remote.getGradeStatistics(student, semester, isSemester) + val old = local.getGradesStatistics(semester, isSemester) - fun getGradesPointsStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean): Single> { - return local.getGradesPointsStatistics(semester, subjectName).map { it.mapToStatisticsItem() }.filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getGradePointsStatistics(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getGradesPointsStatistics(semester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteGradesPointsStatistics(old.uniqueSubtract(new)) - local.saveGradesPointsStatistics(new.uniqueSubtract(old)) - } - }.flatMap { local.getGradesPointsStatistics(semester, subjectName).map { it.mapToStatisticsItem() }.toSingle(emptyList()) }) - } + local.deleteGradesStatistics(old.uniqueSubtract(new)) + local.saveGradesStatistics(new.uniqueSubtract(old)) - private fun List.mapToStatisticItems(): List { - return groupBy { it.subject }.map { - GradeStatisticsItem( - type = ViewType.PARTIAL, - partial = it.value - .sortedByDescending { item -> item.grade } - .filter { item -> item.amount != 0 }, - points = null - ) + local.getGradesStatistics(semester, isSemester, subjectName).mapToStatisticItems() } } - private fun List.mapToStatisticsItem(): List { - return map { - GradeStatisticsItem( - type = ViewType.POINTS, - partial = emptyList(), - points = it - ) + suspend fun getGradesPointsStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean): List { + return local.getGradesPointsStatistics(semester, subjectName).mapToStatisticsItem().filter { !forceRefresh }.ifEmpty { + val new = remote.getGradePointsStatistics(student, semester) + val old = local.getGradesPointsStatistics(semester) + + local.deleteGradesPointsStatistics(old.uniqueSubtract(new)) + local.saveGradesPointsStatistics(new.uniqueSubtract(old)) + + local.getGradesPointsStatistics(semester, subjectName).mapToStatisticsItem() } } + + private fun List.mapToStatisticItems() = groupBy { it.subject }.map { + GradeStatisticsItem( + type = ViewType.PARTIAL, + partial = it.value + .sortedByDescending { item -> item.grade } + .filter { item -> item.amount != 0 }, + points = null + ) + } + + private fun List.mapToStatisticsItem() = map { + GradeStatisticsItem( + type = ViewType.POINTS, + partial = emptyList(), + points = it + ) + } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt index fdae45182..ed6bb0cf5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.homework import io.github.wulkanowy.data.db.dao.HomeworkDao import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,20 +10,19 @@ import javax.inject.Singleton @Singleton class HomeworkLocal @Inject constructor(private val homeworkDb: HomeworkDao) { - fun saveHomework(homework: List) { + suspend fun saveHomework(homework: List) { homeworkDb.insertAll(homework) } - fun deleteHomework(homework: List) { + suspend fun deleteHomework(homework: List) { homeworkDb.deleteAll(homework) } - fun updateHomework(homework: List) { + suspend fun updateHomework(homework: List) { homeworkDb.updateAll(homework) } - fun getHomework(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> { + suspend fun getHomework(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return homeworkDb.loadAll(semester.semesterId, semester.studentId, startDate, endDate) - .filter { it.isNotEmpty() } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt index 20ffee99c..9e99843dd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -13,23 +12,21 @@ import javax.inject.Singleton @Singleton class HomeworkRemote @Inject constructor(private val sdk: Sdk) { - fun getHomework(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> { + suspend fun getHomework(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getHomework(startDate, endDate) - .map { homework -> - homework.map { - Homework( - semesterId = semester.semesterId, - studentId = semester.studentId, - date = it.date, - entryDate = it.entryDate, - subject = it.subject, - content = it.content, - teacher = it.teacher, - teacherSymbol = it.teacherSymbol, - attachments = it.attachments.map { attachment -> attachment.url to attachment.name } - ) - } + .map { + Homework( + semesterId = semester.semesterId, + studentId = semester.studentId, + date = it.date, + entryDate = it.entryDate, + subject = it.subject, + content = it.content, + teacher = it.teacher, + teacherSymbol = it.teacherSymbol, + attachments = it.attachments.map { attachment -> attachment.url to attachment.name } + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt index 7e8fd5c30..ca0a84a5f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt @@ -1,49 +1,37 @@ package io.github.wulkanowy.data.repositories.homework -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Completable -import io.reactivex.Single import org.threeten.bp.LocalDate -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class HomeworkRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: HomeworkLocal, private val remote: HomeworkRemote ) { - fun getHomework(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return Single.fromCallable { start.monday to end.sunday }.flatMap { (monday, friday) -> - local.getHomework(semester, monday, friday).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getHomework(student, semester, monday, friday) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getHomework(semester, monday, friday).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteHomework(old.uniqueSubtract(new)) - local.saveHomework(new.uniqueSubtract(old)) - } - }.flatMap { local.getHomework(semester, monday, friday).toSingle(emptyList()) }) + suspend fun getHomework(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { + return local.getHomework(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { + val new = remote.getHomework(student, semester, start.monday, end.sunday) + + val old = local.getHomework(semester, start.monday, end.sunday) + + local.deleteHomework(old.uniqueSubtract(new)) + local.saveHomework(new.uniqueSubtract(old)) + + local.getHomework(semester, start.monday, end.sunday) } } - fun toggleDone(homework: Homework): Completable { - return Completable.fromCallable { - local.updateHomework(listOf(homework.apply { - isDone = !isDone - })) - } + suspend fun toggleDone(homework: Homework) { + local.updateHomework(listOf(homework.apply { + isDone = !isDone + })) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt index be6ad2f48..d03d3ccd6 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt @@ -1,29 +1,31 @@ package io.github.wulkanowy.data.repositories.logger import android.content.Context -import io.reactivex.Single +import io.github.wulkanowy.utils.DispatchersProvider +import kotlinx.coroutines.withContext import java.io.File import java.io.FileNotFoundException import javax.inject.Inject -class LoggerRepository @Inject constructor(private val context: Context) { +class LoggerRepository @Inject constructor( + private val context: Context, + private val dispatchers: DispatchersProvider +) { - fun getLastLogLines(): Single> { - return getLastModified() - .map { it.readText() } - .map { it.split("\n") } + suspend fun getLastLogLines(): List { + return getLastModified().readText().split("\n") } - fun getLogFiles(): Single> { - return Single.fromCallable { + suspend fun getLogFiles(): List { + return withContext(dispatchers.backgroundThread) { File(context.filesDir.absolutePath).listFiles(File::isFile)?.filter { it.name.endsWith(".log") - } + }!! } } - private fun getLastModified(): Single { - return Single.fromCallable { + private suspend fun getLastModified(): File { + return withContext(dispatchers.backgroundThread) { var lastModifiedTime = Long.MIN_VALUE var chosenFile: File? = null File(context.filesDir.absolutePath).listFiles(File::isFile)?.forEach { file -> @@ -33,7 +35,7 @@ class LoggerRepository @Inject constructor(private val context: Context) { } } if (chosenFile == null) throw FileNotFoundException("Log file not found") - chosenFile + chosenFile!! } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt index 0f4f79c84..22b5786dd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.luckynumber import io.github.wulkanowy.data.db.dao.LuckyNumberDao import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,19 +10,19 @@ import javax.inject.Singleton @Singleton class LuckyNumberLocal @Inject constructor(private val luckyNumberDb: LuckyNumberDao) { - fun saveLuckyNumber(luckyNumber: LuckyNumber) { - luckyNumberDb.insertAll(listOf(luckyNumber)) + suspend fun saveLuckyNumber(luckyNumber: LuckyNumber?) { + luckyNumberDb.insertAll(listOfNotNull(luckyNumber)) } - fun updateLuckyNumber(luckyNumber: LuckyNumber) { - luckyNumberDb.updateAll(listOf(luckyNumber)) + suspend fun updateLuckyNumber(luckyNumber: LuckyNumber?) { + luckyNumberDb.updateAll(listOfNotNull(luckyNumber)) } - fun deleteLuckyNumber(luckyNumber: LuckyNumber) { - luckyNumberDb.deleteAll(listOf(luckyNumber)) + suspend fun deleteLuckyNumber(luckyNumber: LuckyNumber?) { + luckyNumberDb.deleteAll(listOfNotNull(luckyNumber)) } - fun getLuckyNumber(student: Student, date: LocalDate): Maybe { + suspend fun getLuckyNumber(student: Student, date: LocalDate): LuckyNumber? { return luckyNumberDb.load(student.studentId, date) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt index 0c71897a6..e93a6c047 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt @@ -4,7 +4,6 @@ import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -12,8 +11,8 @@ import javax.inject.Singleton @Singleton class LuckyNumberRemote @Inject constructor(private val sdk: Sdk) { - fun getLuckyNumber(student: Student): Maybe { - return sdk.init(student).getLuckyNumber(student.schoolShortName).map { + suspend fun getLuckyNumber(student: Student): LuckyNumber? { + return sdk.init(student).getLuckyNumber(student.schoolShortName)?.let { LuckyNumber( studentId = student.studentId, date = LocalDate.now(), diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt index 374b9a294..3f6089628 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt @@ -1,54 +1,42 @@ package io.github.wulkanowy.data.repositories.luckynumber -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Completable -import io.reactivex.Maybe -import org.threeten.bp.LocalDate -import java.net.UnknownHostException +import org.threeten.bp.LocalDate.now import javax.inject.Inject import javax.inject.Singleton @Singleton class LuckyNumberRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: LuckyNumberLocal, private val remote: LuckyNumberRemote ) { - fun getLuckyNumber(student: Student, forceRefresh: Boolean = false, notify: Boolean = false): Maybe { - return local.getLuckyNumber(student, LocalDate.now()).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMapMaybe { - if (it) remote.getLuckyNumber(student) - else Maybe.error(UnknownHostException()) - }.flatMap { new -> - local.getLuckyNumber(student, LocalDate.now()) - .doOnSuccess { old -> - if (new != old) { - local.deleteLuckyNumber(old) - local.saveLuckyNumber(new.apply { - if (notify) isNotified = false - }) - } - } - .doOnComplete { - local.saveLuckyNumber(new.apply { - if (notify) isNotified = false - }) - } - }.flatMap({ local.getLuckyNumber(student, LocalDate.now()) }, { Maybe.error(it) }, - { local.getLuckyNumber(student, LocalDate.now()) }) - ) + suspend fun getLuckyNumber(student: Student, forceRefresh: Boolean = false, notify: Boolean = false): LuckyNumber? { + return local.getLuckyNumber(student, now())?.takeIf { !forceRefresh } ?: run { + val new = remote.getLuckyNumber(student) + val old = local.getLuckyNumber(student, now()) + + if (new != old) { + old?.let { local.deleteLuckyNumber(it) } + local.saveLuckyNumber(new?.apply { + if (notify) isNotified = false + }) + } + + local.saveLuckyNumber(new?.apply { + if (notify) isNotified = false + }) + + local.getLuckyNumber(student, now()) + } } - fun getNotNotifiedLuckyNumber(student: Student): Maybe { - return local.getLuckyNumber(student, LocalDate.now()).filter { !it.isNotified } + suspend fun getNotNotifiedLuckyNumber(student: Student): LuckyNumber? { + return local.getLuckyNumber(student, now()) } - fun updateLuckyNumber(luckyNumber: LuckyNumber): Completable { - return Completable.fromCallable { local.updateLuckyNumber(luckyNumber) } + suspend fun updateLuckyNumber(luckyNumber: LuckyNumber) { + local.updateLuckyNumber(luckyNumber) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt index 53cf0a983..f05c49d87 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt @@ -7,8 +7,6 @@ import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.message.MessageFolder.TRASHED -import io.reactivex.Maybe -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @@ -18,30 +16,30 @@ class MessageLocal @Inject constructor( private val messageAttachmentDao: MessageAttachmentDao ) { - fun saveMessages(messages: List) { + suspend fun saveMessages(messages: List) { messagesDb.insertAll(messages) } - fun updateMessages(messages: List) { + suspend fun updateMessages(messages: List) { messagesDb.updateAll(messages) } - fun deleteMessages(messages: List) { + suspend fun deleteMessages(messages: List) { messagesDb.deleteAll(messages) } - fun getMessageWithAttachment(student: Student, message: Message): Single { + suspend fun getMessageWithAttachment(student: Student, message: Message): MessageWithAttachment { return messagesDb.loadMessageWithAttachment(student.id.toInt(), message.messageId) } - fun saveMessageAttachments(attachments: List) { + suspend fun saveMessageAttachments(attachments: List) { messageAttachmentDao.insertAttachments(attachments) } - fun getMessages(student: Student, folder: MessageFolder): Maybe> { + suspend fun getMessages(student: Student, folder: MessageFolder): List { return when (folder) { TRASHED -> messagesDb.loadDeleted(student.id.toInt()) else -> messagesDb.loadAll(student.id.toInt(), folder.id) - }.filter { it.isNotEmpty() } + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt index 2df2e20a3..26ef3d9e2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt @@ -9,7 +9,6 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Folder import io.github.wulkanowy.sdk.pojo.SentMessage import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDateTime.now import javax.inject.Inject import javax.inject.Singleton @@ -18,32 +17,30 @@ import io.github.wulkanowy.sdk.pojo.Recipient as SdkRecipient @Singleton class MessageRemote @Inject constructor(private val sdk: Sdk) { - fun getMessages(student: Student, semester: Semester, folder: MessageFolder): Single> { - return sdk.init(student).getMessages(Folder.valueOf(folder.name), semester.start.atStartOfDay(), semester.end.atStartOfDay()).map { messages -> - messages.map { - Message( - studentId = student.id.toInt(), - realId = it.id ?: 0, - messageId = it.messageId ?: 0, - sender = it.sender.orEmpty(), - senderId = it.senderId ?: 0, - recipient = it.recipient.orEmpty(), - subject = it.subject.trim(), - date = it.date ?: now(), - content = it.content.orEmpty(), - folderId = it.folderId, - unread = it.unread ?: false, - unreadBy = it.unreadBy ?: 0, - readBy = it.readBy ?: 0, - removed = it.removed, - hasAttachments = it.hasAttachments - ) - } + suspend fun getMessages(student: Student, semester: Semester, folder: MessageFolder): List { + return sdk.init(student).getMessages(Folder.valueOf(folder.name), semester.start.atStartOfDay(), semester.end.atStartOfDay()).map { + Message( + studentId = student.id.toInt(), + realId = it.id ?: 0, + messageId = it.messageId ?: 0, + sender = it.sender.orEmpty(), + senderId = it.senderId ?: 0, + recipient = it.recipient.orEmpty(), + subject = it.subject.trim(), + date = it.date ?: now(), + content = it.content.orEmpty(), + folderId = it.folderId, + unread = it.unread ?: false, + unreadBy = it.unreadBy ?: 0, + readBy = it.readBy ?: 0, + removed = it.removed, + hasAttachments = it.hasAttachments + ) } } - fun getMessagesContentDetails(student: Student, message: Message, markAsRead: Boolean = false): Single>> { - return sdk.init(student).getMessageDetails(message.messageId, message.folderId, markAsRead, message.realId).map { details -> + suspend fun getMessagesContentDetails(student: Student, message: Message, markAsRead: Boolean = false): Pair> { + return sdk.init(student).getMessageDetails(message.messageId, message.folderId, markAsRead, message.realId).let { details -> details.content to details.attachments.map { MessageAttachment( realId = it.id, @@ -56,7 +53,7 @@ class MessageRemote @Inject constructor(private val sdk: Sdk) { } } - fun sendMessage(student: Student, subject: String, content: String, recipients: List): Single { + suspend fun sendMessage(student: Student, subject: String, content: String, recipients: List): SentMessage { return sdk.init(student).sendMessage( subject = subject, content = content, @@ -74,7 +71,7 @@ class MessageRemote @Inject constructor(private val sdk: Sdk) { ) } - fun deleteMessage(student: Student, message: Message): Single { + suspend fun deleteMessage(student: Student, message: Message): Boolean { return sdk.init(student).deleteMessages(listOf(message.messageId to message.folderId)) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt index 2d2c0430c..7138566bd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt @@ -1,7 +1,5 @@ package io.github.wulkanowy.data.repositories.message -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Recipient @@ -10,96 +8,75 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED import io.github.wulkanowy.sdk.pojo.SentMessage import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Completable -import io.reactivex.Single import timber.log.Timber -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class MessageRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: MessageLocal, private val remote: MessageRemote ) { - fun getMessages(student: Student, semester: Semester, folder: MessageFolder, forceRefresh: Boolean = false, notify: Boolean = false): Single> { - return local.getMessages(student, folder).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getMessages(student, semester, folder) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getMessages(student, folder).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteMessages(old.uniqueSubtract(new)) - local.saveMessages(new.uniqueSubtract(old) - .onEach { - it.isNotified = !notify - }) - } - }.flatMap { local.getMessages(student, folder).toSingle(emptyList()) } - ) + suspend fun getMessages(student: Student, semester: Semester, folder: MessageFolder, forceRefresh: Boolean = false, notify: Boolean = false): List { + return local.getMessages(student, folder).filter { !forceRefresh }.ifEmpty { + val new = remote.getMessages(student, semester, folder) + val old = local.getMessages(student, folder) + + local.deleteMessages(old.uniqueSubtract(new)) + local.saveMessages(new.uniqueSubtract(old).onEach { + it.isNotified = !notify + }) + + local.getMessages(student, folder) + } } - fun getMessage(student: Student, message: Message, markAsRead: Boolean = false): Single { - return local.getMessageWithAttachment(student, message) - .filter { - it.message.content.isNotEmpty().also { status -> + suspend fun getMessage(student: Student, message: Message, markAsRead: Boolean = false): MessageWithAttachment { + return local.getMessageWithAttachment(student, message).let { + if (it.message.content.isNotEmpty().also { status -> Timber.d("Message content in db empty: ${!status}") - } && !it.message.unread + } && !it.message.unread) { + return@let it } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) local.getMessageWithAttachment(student, message) - else Single.error(UnknownHostException()) - } - .flatMap { dbMessage -> - remote.getMessagesContentDetails(student, dbMessage.message, markAsRead).doOnSuccess { (downloadedMessage, attachments) -> - local.updateMessages(listOf(dbMessage.message.copy(unread = !markAsRead).apply { - id = dbMessage.message.id - content = content.ifBlank { downloadedMessage } - })) - local.saveMessageAttachments(attachments) - Timber.d("Message ${message.messageId} with blank content: ${dbMessage.message.content.isBlank()}, marked as read") - } - }.flatMap { - local.getMessageWithAttachment(student, message) - } - ) + + val dbMessage = local.getMessageWithAttachment(student, message) + + val (downloadedMessage, attachments) = remote.getMessagesContentDetails(student, dbMessage.message, markAsRead) + + local.updateMessages(listOf(dbMessage.message.copy(unread = !markAsRead).apply { + id = dbMessage.message.id + content = content.ifBlank { downloadedMessage } + })) + local.saveMessageAttachments(attachments) + Timber.d("Message ${message.messageId} with blank content: ${dbMessage.message.content.isBlank()}, marked as read") + + local.getMessageWithAttachment(student, message) + } } - fun getNotNotifiedMessages(student: Student): Single> { + suspend fun getNotNotifiedMessages(student: Student): List { return local.getMessages(student, RECEIVED) - .map { it.filter { message -> !message.isNotified && message.unread } } - .toSingle(emptyList()) + .filter { message -> !message.isNotified && message.unread } } - fun updateMessages(messages: List): Completable { - return Completable.fromCallable { local.updateMessages(messages) } + suspend fun updateMessages(messages: List) { + return local.updateMessages(messages) } - fun sendMessage(student: Student, subject: String, content: String, recipients: List): Single { - return ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.sendMessage(student, subject, content, recipients) - else Single.error(UnknownHostException()) - } + suspend fun sendMessage(student: Student, subject: String, content: String, recipients: List): SentMessage { + return remote.sendMessage(student, subject, content, recipients) } - fun deleteMessage(student: Student, message: Message): Single { - return ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.deleteMessage(student, message) - else Single.error(UnknownHostException()) - } - .doOnSuccess { - if (!message.removed) local.updateMessages(listOf(message.copy(removed = true).apply { - id = message.id - content = message.content - })) - else local.deleteMessages(listOf(message)) - } + suspend fun deleteMessage(student: Student, message: Message): Boolean { + val delete = remote.deleteMessage(student, message) + + if (!message.removed) local.updateMessages(listOf(message.copy(removed = true).apply { + id = message.id + content = message.content + })) + else local.deleteMessages(listOf(message)) + + return delete // TODO: wtf } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt index 473ffa7fe..911ed3af5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt @@ -3,22 +3,21 @@ package io.github.wulkanowy.data.repositories.mobiledevice import io.github.wulkanowy.data.db.dao.MobileDeviceDao import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class MobileDeviceLocal @Inject constructor(private val mobileDb: MobileDeviceDao) { - fun saveDevices(devices: List) { + suspend fun saveDevices(devices: List) { mobileDb.insertAll(devices) } - fun deleteDevices(devices: List) { + suspend fun deleteDevices(devices: List) { mobileDb.deleteAll(devices) } - fun getDevices(semester: Semester): Maybe> { - return mobileDb.loadAll(semester.studentId).filter { it.isNotEmpty() } + suspend fun getDevices(semester: Semester): List { + return mobileDb.loadAll(semester.studentId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRemote.kt index 800f95971..907e965ce 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRemote.kt @@ -6,37 +6,34 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.MobileDeviceToken import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class MobileDeviceRemote @Inject constructor(private val sdk: Sdk) { - fun getDevices(student: Student, semester: Semester): Single> { + suspend fun getDevices(student: Student, semester: Semester): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getRegisteredDevices() - .map { devices -> - devices.map { - MobileDevice( - studentId = semester.studentId, - date = it.createDate, - deviceId = it.id, - name = it.name - ) - } + .map { + MobileDevice( + studentId = semester.studentId, + date = it.createDate, + deviceId = it.id, + name = it.name + ) } } - fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice): Single { + suspend fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice): Boolean { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .unregisterDevice(device.deviceId) } - fun getToken(student: Student, semester: Semester): Single { + suspend fun getToken(student: Student, semester: Semester): MobileDeviceToken { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getToken() - .map { + .let { MobileDeviceToken( token = it.token, symbol = it.symbol, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt index 545846e85..f327ef607 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt @@ -1,53 +1,36 @@ package io.github.wulkanowy.data.repositories.mobiledevice -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.MobileDeviceToken import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class MobileDeviceRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: MobileDeviceLocal, private val remote: MobileDeviceRemote ) { - fun getDevices(student: Student, semester: Semester, forceRefresh: Boolean = false): Single> { - return local.getDevices(semester).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getDevices(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getDevices(semester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteDevices(old uniqueSubtract new) - local.saveDevices(new uniqueSubtract old) - } - } - ).flatMap { local.getDevices(semester).toSingle(emptyList()) } + suspend fun getDevices(student: Student, semester: Semester, forceRefresh: Boolean = false): List { + return local.getDevices(semester).filter { !forceRefresh }.ifEmpty { + val new = remote.getDevices(student, semester) + val old = local.getDevices(semester) + + local.deleteDevices(old uniqueSubtract new) + local.saveDevices(new uniqueSubtract old) + + local.getDevices(semester) + } } - fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice): Single { - return ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.unregisterDevice(student, semester, device) - else Single.error(UnknownHostException()) - } + suspend fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice): Boolean { + return remote.unregisterDevice(student, semester, device) } - fun getToken(student: Student, semester: Semester): Single { - return ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getToken(student, semester) - else Single.error(UnknownHostException()) - } + suspend fun getToken(student: Student, semester: Semester): MobileDeviceToken { + return remote.getToken(student, semester) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt index 784e61f0f..b1c6b2902 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt @@ -3,26 +3,25 @@ package io.github.wulkanowy.data.repositories.note import io.github.wulkanowy.data.db.dao.NoteDao import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class NoteLocal @Inject constructor(private val noteDb: NoteDao) { - fun saveNotes(notes: List) { + suspend fun saveNotes(notes: List) { noteDb.insertAll(notes) } - fun updateNotes(notes: List) { + suspend fun updateNotes(notes: List) { noteDb.updateAll(notes) } - fun deleteNotes(notes: List) { + suspend fun deleteNotes(notes: List) { noteDb.deleteAll(notes) } - fun getNotes(student: Student): Maybe> { - return noteDb.loadAll(student.studentId).filter { it.isNotEmpty() } + suspend fun getNotes(student: Student): List { + return noteDb.loadAll(student.studentId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRemote.kt index 2c62b608d..0e488b7d9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRemote.kt @@ -5,30 +5,27 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class NoteRemote @Inject constructor(private val sdk: Sdk) { - fun getNotes(student: Student, semester: Semester): Single> { + suspend fun getNotes(student: Student, semester: Semester): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getNotes(semester.semesterId) - .map { notes -> - notes.map { - Note( - studentId = semester.studentId, - date = it.date, - teacher = it.teacher, - teacherSymbol = it.teacherSymbol, - category = it.category, - categoryType = it.categoryType.id, - isPointsShow = it.showPoints, - points = it.points, - content = it.content - ) - } + .map { + Note( + studentId = semester.studentId, + date = it.date, + teacher = it.teacher, + teacherSymbol = it.teacherSymbol, + category = it.category, + categoryType = it.categoryType.id, + isPointsShow = it.showPoints, + points = it.points, + content = it.content + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt index e155e2bad..3628f5b87 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt @@ -1,54 +1,44 @@ package io.github.wulkanowy.data.repositories.note -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Completable -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class NoteRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: NoteLocal, private val remote: NoteRemote ) { - fun getNotes(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Single> { - return local.getNotes(student).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getNotes(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getNotes(student).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteNotes(old.uniqueSubtract(new)) - local.saveNotes(new.uniqueSubtract(old) - .onEach { - if (it.date >= student.registrationDate.toLocalDate()) it.apply { - isRead = false - if (notify) isNotified = false - } - }) - } - }.flatMap { local.getNotes(student).toSingle(emptyList()) }) + suspend fun getNotes(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): List { + return local.getNotes(student).filter { !forceRefresh }.ifEmpty { + val new = remote.getNotes(student, semester) + val old = local.getNotes(student) + + local.deleteNotes(old.uniqueSubtract(new)) + local.saveNotes(new.uniqueSubtract(old).onEach { + if (it.date >= student.registrationDate.toLocalDate()) it.apply { + isRead = false + if (notify) isNotified = false + } + }) + + local.getNotes(student) + } } - fun getNotNotifiedNotes(student: Student): Single> { - return local.getNotes(student).map { it.filter { note -> !note.isNotified } }.toSingle(emptyList()) + suspend fun getNotNotifiedNotes(student: Student): List { + return local.getNotes(student).filter { note -> !note.isNotified } } - fun updateNote(note: Note): Completable { - return Completable.fromCallable { local.updateNotes(listOf(note)) } + suspend fun updateNote(note: Note) { + return local.updateNotes(listOf(note)) } - fun updateNotes(notes: List): Completable { - return Completable.fromCallable { local.updateNotes(notes) } + suspend fun updateNotes(notes: List) { + return local.updateNotes(notes) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt index ff8175440..fac1645e4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt @@ -4,22 +4,21 @@ import io.github.wulkanowy.data.db.dao.RecipientDao import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class RecipientLocal @Inject constructor(private val recipientDb: RecipientDao) { - fun getRecipients(student: Student, role: Int, unit: ReportingUnit): Maybe> { - return recipientDb.load(student.studentId, role, unit.realId).filter { it.isNotEmpty() } + suspend fun getRecipients(student: Student, role: Int, unit: ReportingUnit): List { + return recipientDb.load(student.studentId, role, unit.realId) } - fun saveRecipients(recipients: List): List { + suspend fun saveRecipients(recipients: List): List { return recipientDb.insertAll(recipients) } - fun deleteRecipients(recipients: List) { + suspend fun deleteRecipients(recipients: List) { recipientDb.deleteAll(recipients) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRemote.kt index e5b16a156..a5318e77f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRemote.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton import io.github.wulkanowy.sdk.pojo.Recipient as SdkRecipient @@ -14,18 +13,14 @@ import io.github.wulkanowy.sdk.pojo.Recipient as SdkRecipient @Singleton class RecipientRemote @Inject constructor(private val sdk: Sdk) { - fun getRecipients(student: Student, role: Int, unit: ReportingUnit): Single> { + suspend fun getRecipients(student: Student, role: Int, unit: ReportingUnit): List { return sdk.init(student).getRecipients(unit.realId, role) - .map { recipients -> - recipients.map { it.toRecipient() } - } + .map { it.toRecipient() } } - fun getMessageRecipients(student: Student, message: Message): Single> { + suspend fun getMessageRecipients(student: Student, message: Message): List { return sdk.init(student).getMessageRecipients(message.messageId, message.senderId) - .map { recipients -> - recipients.map { it.toRecipient() } - } + .map { it.toRecipient() } } private fun SdkRecipient.toRecipient(): Recipient { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt index 6f8a72af2..5c16c57b8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt @@ -1,47 +1,32 @@ package io.github.wulkanowy.data.repositories.recipient -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class RecipientRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: RecipientLocal, private val remote: RecipientRemote ) { - fun getRecipients(student: Student, role: Int, unit: ReportingUnit, forceRefresh: Boolean = false): Single> { - return local.getRecipients(student, role, unit).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getRecipients(student, role, unit) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getRecipients(student, role, unit).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteRecipients(old.uniqueSubtract(new)) - local.saveRecipients(new.uniqueSubtract(old)) - } - }.flatMap { - local.getRecipients(student, role, unit).toSingle(emptyList()) - } - ) + suspend fun getRecipients(student: Student, role: Int, unit: ReportingUnit, forceRefresh: Boolean = false): List { + return local.getRecipients(student, role, unit).filter { !forceRefresh }.ifEmpty { + val new = remote.getRecipients(student, role, unit) + val old = local.getRecipients(student, role, unit) + + local.deleteRecipients(old.uniqueSubtract(new)) + local.saveRecipients(new.uniqueSubtract(old)) + + local.getRecipients(student, role, unit) + } } - fun getMessageRecipients(student: Student, message: Message): Single> { - return ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getMessageRecipients(student, message) - else Single.error(UnknownHostException()) - } + suspend fun getMessageRecipients(student: Student, message: Message): List { + return remote.getMessageRecipients(student, message) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRemote.kt index f27891250..11eac71e0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRemote.kt @@ -1,18 +1,17 @@ package io.github.wulkanowy.data.repositories.recover import io.github.wulkanowy.sdk.Sdk -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class RecoverRemote @Inject constructor(private val sdk: Sdk) { - fun getReCaptchaSiteKey(host: String, symbol: String): Single> { + suspend fun getReCaptchaSiteKey(host: String, symbol: String): Pair { return sdk.getPasswordResetCaptchaCode(host, symbol) } - fun sendRecoverRequest(url: String, symbol: String, email: String, reCaptchaResponse: String): Single { + suspend fun sendRecoverRequest(url: String, symbol: String, email: String, reCaptchaResponse: String): String { return sdk.sendPasswordResetRequest(url, symbol, email, reCaptchaResponse) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRepository.kt index 86d4ba1b3..3117a606a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRepository.kt @@ -1,26 +1,16 @@ package io.github.wulkanowy.data.repositories.recover -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton -class RecoverRepository @Inject constructor(private val settings: InternetObservingSettings, private val remote: RecoverRemote) { +class RecoverRepository @Inject constructor(private val remote: RecoverRemote) { - fun getReCaptchaSiteKey(host: String, symbol: String): Single> { - return ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getReCaptchaSiteKey(host, symbol) - else Single.error(UnknownHostException()) - } + suspend fun getReCaptchaSiteKey(host: String, symbol: String): Pair { + return remote.getReCaptchaSiteKey(host, symbol) } - fun sendRecoverRequest(url: String, symbol: String, email: String, reCaptchaResponse: String): Single { - return ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.sendRecoverRequest(url, symbol, email, reCaptchaResponse) - else Single.error(UnknownHostException()) - } + suspend fun sendRecoverRequest(url: String, symbol: String, email: String, reCaptchaResponse: String): String { + return remote.sendRecoverRequest(url, symbol, email, reCaptchaResponse) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt index 0631c668c..737f1a04f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt @@ -3,26 +3,25 @@ package io.github.wulkanowy.data.repositories.reportingunit import io.github.wulkanowy.data.db.dao.ReportingUnitDao import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class ReportingUnitLocal @Inject constructor(private val reportingUnitDb: ReportingUnitDao) { - fun getReportingUnits(student: Student): Maybe> { - return reportingUnitDb.load(student.studentId).filter { it.isNotEmpty() } + suspend fun getReportingUnits(student: Student): List { + return reportingUnitDb.load(student.studentId) } - fun getReportingUnit(student: Student, unitId: Int): Maybe { + suspend fun getReportingUnit(student: Student, unitId: Int): ReportingUnit? { return reportingUnitDb.loadOne(student.studentId, unitId) } - fun saveReportingUnits(reportingUnits: List): List { + suspend fun saveReportingUnits(reportingUnits: List): List { return reportingUnitDb.insertAll(reportingUnits) } - fun deleteReportingUnits(reportingUnits: List) { + suspend fun deleteReportingUnits(reportingUnits: List) { reportingUnitDb.deleteAll(reportingUnits) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRemote.kt index 1fd8b08e3..6b11c2cc9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRemote.kt @@ -4,25 +4,22 @@ import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class ReportingUnitRemote @Inject constructor(private val sdk: Sdk) { - fun getReportingUnits(student: Student): Single> { - return sdk.init(student).getReportingUnits().map { - it.map { unit -> - ReportingUnit( - studentId = sdk.studentId, - realId = unit.id, - roles = unit.roles, - senderId = unit.senderId, - senderName = unit.senderName, - shortName = unit.short - ) - } + suspend fun getReportingUnits(student: Student): List { + return sdk.init(student).getReportingUnits().map { unit -> + ReportingUnit( + studentId = sdk.studentId, + realId = unit.id, + roles = unit.roles, + senderId = unit.senderId, + senderName = unit.senderName, + shortName = unit.short + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt index ee5440984..70aefb9fd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt @@ -1,48 +1,34 @@ package io.github.wulkanowy.data.repositories.reportingunit -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Maybe -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class ReportingUnitRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: ReportingUnitLocal, private val remote: ReportingUnitRemote ) { - fun getReportingUnits(student: Student, forceRefresh: Boolean = false): Single> { - return local.getReportingUnits(student).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getReportingUnits(student) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getReportingUnits(student).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteReportingUnits(old.uniqueSubtract(new)) - local.saveReportingUnits(new.uniqueSubtract(old)) - } - }.flatMap { local.getReportingUnits(student).toSingle(emptyList()) } - ) + suspend fun getReportingUnits(student: Student, forceRefresh: Boolean = false): List { + return local.getReportingUnits(student).filter { !forceRefresh }.ifEmpty { + val new = remote.getReportingUnits(student) + val old = local.getReportingUnits(student) + + local.deleteReportingUnits(old.uniqueSubtract(new)) + local.saveReportingUnits(new.uniqueSubtract(old)) + + local.getReportingUnits(student) + } } - fun getReportingUnit(student: Student, unitId: Int): Maybe { - return local.getReportingUnit(student, unitId) - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) getReportingUnits(student, true) - else Single.error(UnknownHostException()) - }.flatMapMaybe { - local.getReportingUnit(student, unitId) - } - ) + suspend fun getReportingUnit(student: Student, unitId: Int): ReportingUnit { + return local.getReportingUnit(student, unitId) ?: run { + getReportingUnits(student, true) + + return local.getReportingUnit(student, unitId)!! + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt index d87272875..c8479b8f6 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt @@ -3,20 +3,19 @@ package io.github.wulkanowy.data.repositories.school import io.github.wulkanowy.data.db.dao.SchoolDao import io.github.wulkanowy.data.db.entities.School import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Inject class SchoolLocal @Inject constructor(private val schoolDb: SchoolDao) { - fun saveSchool(school: School) { + suspend fun saveSchool(school: School) { schoolDb.insertAll(listOf(school)) } - fun deleteSchool(school: School) { + suspend fun deleteSchool(school: School) { schoolDb.deleteAll(listOf(school)) } - fun getSchool(semester: Semester): Maybe { + suspend fun getSchool(semester: Semester): School? { return schoolDb.load(semester.studentId, semester.classId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRemote.kt index 6a95a446b..4d2e0cd6c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRemote.kt @@ -5,15 +5,14 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject class SchoolRemote @Inject constructor(private val sdk: Sdk) { - fun getSchoolInfo(student: Student, semester: Semester): Single { + suspend fun getSchoolInfo(student: Student, semester: Semester): School { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getSchool() - .map { + .let { School( studentId = semester.studentId, classId = semester.classId, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt index 1715a28d5..9ca945d06 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt @@ -1,42 +1,29 @@ package io.github.wulkanowy.data.repositories.school -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.School import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class SchoolRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: SchoolLocal, private val remote: SchoolRemote ) { - fun getSchoolInfo(student: Student, semester: Semester, forceRefresh: Boolean = false): Maybe { - return local.getSchool(semester).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getSchoolInfo(student, semester) - else Single.error(UnknownHostException()) - }.flatMapMaybe { new -> - local.getSchool(semester) - .doOnSuccess { old -> - if (new != old) { - local.deleteSchool(old) - local.saveSchool(new) - } - } - .doOnComplete { - local.saveSchool(new) - } - }.flatMap({ local.getSchool(semester) }, { Maybe.error(it) }, - { local.getSchool(semester) }) - ) + suspend fun getSchoolInfo(student: Student, semester: Semester, forceRefresh: Boolean = false): School { + return local.getSchool(semester).takeIf { it != null && !forceRefresh } ?: run { + val new = remote.getSchoolInfo(student, semester) + val old = local.getSchool(semester) + + if (new != old && old != null) { + local.deleteSchool(old) + local.saveSchool(new) + } + local.saveSchool(new) + + local.getSchool(semester)!! + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterLocal.kt index 3d98785cd..629431c80 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterLocal.kt @@ -3,22 +3,21 @@ package io.github.wulkanowy.data.repositories.semester import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class SemesterLocal @Inject constructor(private val semesterDb: SemesterDao) { - fun saveSemesters(semesters: List) { + suspend fun saveSemesters(semesters: List) { semesterDb.insertAll(semesters) } - fun deleteSemesters(semesters: List) { + suspend fun deleteSemesters(semesters: List) { semesterDb.deleteAll(semesters) } - fun getSemesters(student: Student): Maybe> { - return semesterDb.loadAll(student.studentId, student.classId).filter { it.isNotEmpty() } + suspend fun getSemesters(student: Student): List { + return semesterDb.loadAll(student.studentId, student.classId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRemote.kt index 90f0e1d71..e1a920b6f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRemote.kt @@ -4,29 +4,26 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class SemesterRemote @Inject constructor(private val sdk: Sdk) { - fun getSemesters(student: Student): Single> { - return sdk.init(student).getSemesters().map { semesters -> - semesters.map { - Semester( - studentId = student.studentId, - diaryId = it.diaryId, - diaryName = it.diaryName, - schoolYear = it.schoolYear, - semesterId = it.semesterId, - semesterName = it.semesterNumber, - start = it.start, - end = it.end, - classId = it.classId, - unitId = it.unitId - ) - } + suspend fun getSemesters(student: Student): List { + return sdk.init(student).getSemesters().map { + Semester( + studentId = student.studentId, + diaryId = it.diaryId, + diaryName = it.diaryName, + schoolYear = it.schoolYear, + semesterId = it.semesterId, + semesterName = it.semesterNumber, + start = it.start, + end = it.end, + classId = it.classId, + unitId = it.unitId + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt index 68946beef..aeb424008 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt @@ -1,47 +1,42 @@ package io.github.wulkanowy.data.repositories.semester -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.getCurrentOrLast import io.github.wulkanowy.utils.isCurrent import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class SemesterRepository @Inject constructor( private val remote: SemesterRemote, - private val local: SemesterLocal, - private val settings: InternetObservingSettings + private val local: SemesterLocal ) { - fun getSemesters(student: Student, forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false): Single> { - return local.getSemesters(student).filter { !forceRefresh }.filter { semesters -> - when { - Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API -> semesters.firstOrNull { it.isCurrent }?.diaryId != 0 - refreshOnNoCurrent -> semesters.any { semester -> semester.isCurrent } - else -> true - } - }.switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getSemesters(student) - else Single.error(UnknownHostException()) - }.flatMap { new -> - if (new.isEmpty()) throw IllegalArgumentException("Empty semester list!") - - local.getSemesters(student).toSingle(emptyList()).doOnSuccess { old -> - local.deleteSemesters(old.uniqueSubtract(new)) - local.saveSemesters(new.uniqueSubtract(old)) + suspend fun getSemesters(student: Student, forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false): List { + return local.getSemesters(student).let { semesters -> + semesters.filter { + !forceRefresh && when { + Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API -> semesters.firstOrNull { it.isCurrent }?.diaryId != 0 + refreshOnNoCurrent -> semesters.any { semester -> semester.isCurrent } + else -> true } - }.flatMap { local.getSemesters(student).toSingle(emptyList()) }) + } + }.ifEmpty { + val new = remote.getSemesters(student) + if (new.isEmpty()) throw IllegalArgumentException("Empty semester list!") + + val old = local.getSemesters(student) + local.deleteSemesters(old.uniqueSubtract(new)) + local.saveSemesters(new.uniqueSubtract(old)) + + local.getSemesters(student) + } } - fun getCurrentSemester(student: Student, forceRefresh: Boolean = false): Single { - return getSemesters(student, forceRefresh).map { it.getCurrentOrLast() } + suspend fun getCurrentSemester(student: Student, forceRefresh: Boolean = false): Semester { + return getSemesters(student, forceRefresh).getCurrentOrLast() } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt index 06b9bb4ac..5a4322f36 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt @@ -6,9 +6,6 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.security.decrypt import io.github.wulkanowy.utils.security.encrypt -import io.reactivex.Completable -import io.reactivex.Maybe -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @@ -18,47 +15,41 @@ class StudentLocal @Inject constructor( private val context: Context ) { - fun saveStudents(students: List): Single> { - return Single.fromCallable { - studentDb.insertAll(students.map { - if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.API) it.copy(password = encrypt(it.password, context)) - else it - }) - } + suspend fun saveStudents(students: List): List { + return studentDb.insertAll(students.map { + if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.API) it.copy(password = encrypt(it.password, context)) + else it + }) } - fun getStudents(decryptPass: Boolean): Maybe> { - return studentDb.loadAll() - .map { list -> list.map { it.apply { if (decryptPass && Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) } } } - .filter { it.isNotEmpty() } - } - - fun getStudentById(id: Int): Maybe { - return studentDb.loadById(id).map { - it.apply { - if (Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) - } - } - } - - fun getCurrentStudent(decryptPass: Boolean): Maybe { - return studentDb.loadCurrent().map { + suspend fun getStudents(decryptPass: Boolean): List { + return studentDb.loadAll().map { it.apply { if (decryptPass && Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) } } } - fun setCurrentStudent(student: Student): Completable { - return Completable.fromCallable { - studentDb.run { - resetCurrent() - updateCurrent(student.id) - } + suspend fun getStudentById(id: Int): Student? { + return studentDb.loadById(id)?.apply { + if (Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) } } - fun logoutStudent(student: Student): Completable { - return Completable.fromCallable { studentDb.delete(student) } + suspend fun getCurrentStudent(decryptPass: Boolean): Student? { + return studentDb.loadCurrent()?.apply { + if (decryptPass && Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) + } + } + + suspend fun setCurrentStudent(student: Student) { + return studentDb.run { + resetCurrent() + updateCurrent(student.id) + } + } + + suspend fun logoutStudent(student: Student) { + return studentDb.delete(student) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt index 4c0ffd820..74d66fedd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt @@ -2,7 +2,6 @@ package io.github.wulkanowy.data.repositories.student import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk -import io.reactivex.Single import org.threeten.bp.LocalDateTime.now import javax.inject.Inject import javax.inject.Singleton @@ -38,15 +37,15 @@ class StudentRemote @Inject constructor(private val sdk: Sdk) { } } - fun getStudentsMobileApi(token: String, pin: String, symbol: String): Single> { - return sdk.getStudentsFromMobileApi(token, pin, symbol, "").map { mapStudents(it, "", "") } + suspend fun getStudentsMobileApi(token: String, pin: String, symbol: String): List { + return mapStudents(sdk.getStudentsFromMobileApi(token, pin, symbol, ""), "", "") } - fun getStudentsScrapper(email: String, password: String, scrapperBaseUrl: String, symbol: String): Single> { - return sdk.getStudentsFromScrapper(email, password, scrapperBaseUrl, symbol).map { mapStudents(it, email, password) } + suspend fun getStudentsScrapper(email: String, password: String, scrapperBaseUrl: String, symbol: String): List { + return mapStudents(sdk.getStudentsFromScrapper(email, password, scrapperBaseUrl, symbol), email, password) } - fun getStudentsHybrid(email: String, password: String, scrapperBaseUrl: String, symbol: String): Single> { - return sdk.getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol).map { mapStudents(it, email, password) } + suspend fun getStudentsHybrid(email: String, password: String, scrapperBaseUrl: String, symbol: String): List { + return mapStudents(sdk.getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol), email, password) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRepository.kt index bebd1eb9c..e47332ae3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRepository.kt @@ -1,73 +1,53 @@ package io.github.wulkanowy.data.repositories.student -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.exceptions.NoCurrentStudentException -import io.reactivex.Completable -import io.reactivex.Maybe -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class StudentRepository @Inject constructor( private val local: StudentLocal, - private val remote: StudentRemote, - private val settings: InternetObservingSettings + private val remote: StudentRemote ) { - fun isStudentSaved(): Single = local.getStudents(false).isEmpty.map { !it } + suspend fun isStudentSaved(): Boolean = local.getStudents(false).isNotEmpty() - fun isCurrentStudentSet(): Single = local.getCurrentStudent(false).isEmpty.map { !it } + suspend fun isCurrentStudentSet(): Boolean = local.getCurrentStudent(false)?.isCurrent ?: false - fun getStudentsApi(pin: String, symbol: String, token: String): Single> { - return ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getStudentsMobileApi(token, pin, symbol) - else Single.error(UnknownHostException("No internet connection")) - } + suspend fun getStudentsApi(pin: String, symbol: String, token: String): List { + return remote.getStudentsMobileApi(token, pin, symbol) } - fun getStudentsScrapper(email: String, password: String, endpoint: String, symbol: String): Single> { - return ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getStudentsScrapper(email, password, endpoint, symbol) - else Single.error(UnknownHostException("No internet connection")) - } + suspend fun getStudentsScrapper(email: String, password: String, endpoint: String, symbol: String): List { + return remote.getStudentsScrapper(email, password, endpoint, symbol) } - fun getStudentsHybrid(email: String, password: String, endpoint: String, symbol: String): Single> { - return ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getStudentsHybrid(email, password, endpoint, symbol) - else Single.error(UnknownHostException("No internet connection")) - } + suspend fun getStudentsHybrid(email: String, password: String, endpoint: String, symbol: String): List { + return remote.getStudentsHybrid(email, password, endpoint, symbol) } - fun getSavedStudents(decryptPass: Boolean = true): Single> { - return local.getStudents(decryptPass).toSingle(emptyList()) + suspend fun getSavedStudents(decryptPass: Boolean = true): List { + return local.getStudents(decryptPass) } - fun getStudentById(id: Int): Single { - return local.getStudentById(id) - .switchIfEmpty(Maybe.error(NoCurrentStudentException())) - .toSingle() + suspend fun getStudentById(id: Int): Student { + return local.getStudentById(id) ?: throw NoCurrentStudentException() } - fun getCurrentStudent(decryptPass: Boolean = true): Single { - return local.getCurrentStudent(decryptPass) - .switchIfEmpty(Maybe.error(NoCurrentStudentException())) - .toSingle() + suspend fun getCurrentStudent(decryptPass: Boolean = true): Student { + return local.getCurrentStudent(decryptPass) ?: throw NoCurrentStudentException() } - fun saveStudents(students: List): Single> { + suspend fun saveStudents(students: List): List { return local.saveStudents(students) } - fun switchStudent(student: Student): Completable { + suspend fun switchStudent(student: Student) { return local.setCurrentStudent(student) } - fun logoutStudent(student: Student): Completable { + suspend fun logoutStudent(student: Student) { return local.logoutStudent(student) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt index f8c13e6c2..1f9dfff32 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt @@ -3,23 +3,21 @@ package io.github.wulkanowy.data.repositories.subject import io.github.wulkanowy.data.db.dao.SubjectDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Subject -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class SubjectLocal @Inject constructor(private val subjectDao: SubjectDao) { - fun getSubjects(semester: Semester): Maybe> { + suspend fun getSubjects(semester: Semester): List { return subjectDao.loadAll(semester.diaryId, semester.studentId) - .filter { it.isNotEmpty() } } - fun saveSubjects(subjects: List) { + suspend fun saveSubjects(subjects: List) { subjectDao.insertAll(subjects) } - fun deleteSubjects(subjects: List) { + suspend fun deleteSubjects(subjects: List) { subjectDao.deleteAll(subjects) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRemote.kt index d30232f82..624a5a00a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRemote.kt @@ -5,25 +5,22 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Subject import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class SubjectRemote @Inject constructor(private val sdk: Sdk) { - fun getSubjects(student: Student, semester: Semester): Single> { + suspend fun getSubjects(student: Student, semester: Semester): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getSubjects() - .map { subjects -> - subjects.map { - Subject( - studentId = semester.studentId, - diaryId = semester.diaryId, - name = it.name, - realId = it.id - ) - } + .map { + Subject( + studentId = semester.studentId, + diaryId = semester.diaryId, + name = it.name, + realId = it.id + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt index 649904da1..646e3642a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt @@ -1,38 +1,27 @@ package io.github.wulkanowy.data.repositories.subject -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Subject import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class SubjectRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: SubjectLocal, private val remote: SubjectRemote ) { - fun getSubjects(student: Student, semester: Semester, forceRefresh: Boolean = false): Single> { - return local.getSubjects(semester).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getSubjects(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getSubjects(semester) - .toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteSubjects(old.uniqueSubtract(new)) - local.saveSubjects(new.uniqueSubtract(old)) - } - }.flatMap { - local.getSubjects(semester).toSingle(emptyList()) - }) + suspend fun getSubjects(student: Student, semester: Semester, forceRefresh: Boolean = false): List { + return local.getSubjects(semester).filter { !forceRefresh }.ifEmpty { + val new = remote.getSubjects(student, semester) + val old = local.getSubjects(semester) + + local.deleteSubjects(old.uniqueSubtract(new)) + local.saveSubjects(new.uniqueSubtract(old)) + + local.getSubjects(semester) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt index dd2be5e58..53680b7b3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt @@ -3,20 +3,19 @@ package io.github.wulkanowy.data.repositories.teacher import io.github.wulkanowy.data.db.dao.TeacherDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Teacher -import io.reactivex.Maybe import javax.inject.Inject class TeacherLocal @Inject constructor(private val teacherDb: TeacherDao) { - fun saveTeachers(teachers: List) { + suspend fun saveTeachers(teachers: List) { teacherDb.insertAll(teachers) } - fun deleteTeachers(teachers: List) { + suspend fun deleteTeachers(teachers: List) { teacherDb.deleteAll(teachers) } - fun getTeachers(semester: Semester): Maybe> { - return teacherDb.loadAll(semester.studentId, semester.classId).filter { it.isNotEmpty() } + suspend fun getTeachers(semester: Semester): List { + return teacherDb.loadAll(semester.studentId, semester.classId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRemote.kt index 01552f748..1d1caa686 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRemote.kt @@ -5,26 +5,23 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Teacher import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class TeacherRemote @Inject constructor(private val sdk: Sdk) { - fun getTeachers(student: Student, semester: Semester): Single> { + suspend fun getTeachers(student: Student, semester: Semester): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getTeachers(semester.semesterId) - .map { teachers -> - teachers.map { - Teacher( - studentId = semester.studentId, - name = it.name, - subject = it.subject, - shortName = it.short, - classId = semester.classId - ) - } + .map { + Teacher( + studentId = semester.studentId, + name = it.name, + subject = it.subject, + shortName = it.short, + classId = semester.classId + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt index 3c10be73f..a540e78c4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt @@ -1,35 +1,27 @@ package io.github.wulkanowy.data.repositories.teacher -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Teacher import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class TeacherRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: TeacherLocal, private val remote: TeacherRemote ) { - fun getTeachers(student: Student, semester: Semester, forceRefresh: Boolean = false): Single> { - return local.getTeachers(semester).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getTeachers(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getTeachers(semester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteTeachers(old.uniqueSubtract(new)) - local.saveTeachers(new.uniqueSubtract(old)) - } - }.flatMap { local.getTeachers(semester).toSingle(emptyList()) }) + suspend fun getTeachers(student: Student, semester: Semester, forceRefresh: Boolean = false): List { + return local.getTeachers(semester).filter { !forceRefresh }.ifEmpty { + val new = remote.getTeachers(student, semester) + val old = local.getTeachers(semester) + + local.deleteTeachers(old.uniqueSubtract(new)) + local.saveTeachers(new.uniqueSubtract(old)) + + local.getTeachers(semester) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt index e074ce2a1..a90c664c0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.timetable import io.github.wulkanowy.data.db.dao.TimetableDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Timetable -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,15 +10,15 @@ import javax.inject.Singleton @Singleton class TimetableLocal @Inject constructor(private val timetableDb: TimetableDao) { - fun saveTimetable(timetables: List) { + suspend fun saveTimetable(timetables: List) { timetableDb.insertAll(timetables) } - fun deleteTimetable(timetables: List) { + suspend fun deleteTimetable(timetables: List) { timetableDb.deleteAll(timetables) } - fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> { - return timetableDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate).filter { it.isNotEmpty() } + suspend fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { + return timetableDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt index 22cb947db..71db8854f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -13,31 +12,29 @@ import javax.inject.Singleton @Singleton class TimetableRemote @Inject constructor(private val sdk: Sdk) { - fun getTimetable(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> { + suspend fun getTimetable(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getTimetable(startDate, endDate) - .map { lessons -> - lessons.map { - Timetable( - studentId = semester.studentId, - diaryId = semester.diaryId, - number = it.number, - start = it.start, - end = it.end, - date = it.date, - subject = it.subject, - subjectOld = it.subjectOld, - group = it.group, - room = it.room, - roomOld = it.roomOld, - teacher = it.teacher, - teacherOld = it.teacherOld, - info = it.info, - isStudentPlan = it.studentPlan, - changes = it.changes, - canceled = it.canceled - ) - } + .map { + Timetable( + studentId = semester.studentId, + diaryId = semester.diaryId, + number = it.number, + start = it.start, + end = it.end, + date = it.date, + subject = it.subject, + subjectOld = it.subjectOld, + group = it.group, + room = it.room, + roomOld = it.roomOld, + teacher = it.teacher, + teacherOld = it.teacherOld, + info = it.info, + isStudentPlan = it.studentPlan, + changes = it.changes, + canceled = it.canceled + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt index 4a7a0eb24..b34075524 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt @@ -1,53 +1,41 @@ package io.github.wulkanowy.data.repositories.timetable -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings 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.services.alarm.TimetableNotificationSchedulerHelper -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single import org.threeten.bp.LocalDate -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class TimetableRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: TimetableLocal, private val remote: TimetableRemote, private val schedulerHelper: TimetableNotificationSchedulerHelper ) { - fun getTimetable(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return Single.fromCallable { start.monday to end.sunday }.flatMap { (monday, sunday) -> - local.getTimetable(semester, monday, sunday).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getTimetable(student, semester, monday, sunday) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getTimetable(semester, monday, sunday) - .toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteTimetable(old.uniqueSubtract(new).also { schedulerHelper.cancelScheduled(it) }) - local.saveTimetable(new.uniqueSubtract(old).also { schedulerHelper.scheduleNotifications(it, student) }.map { item -> - item.also { new -> - old.singleOrNull { new.start == it.start }?.let { old -> - return@map new.copy( - room = if (new.room.isEmpty()) old.room else new.room, - teacher = if (new.teacher.isEmpty() && !new.changes && !old.changes) old.teacher else new.teacher - ) - } - } - }) - } - }.flatMap { - local.getTimetable(semester, monday, sunday).toSingle(emptyList()) - }).map { list -> list.filter { it.date in start..end }.also { schedulerHelper.scheduleNotifications(it, student) } } - } + suspend fun getTimetable(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { + return local.getTimetable(semester, start.monday, start.sunday).filter { !forceRefresh }.ifEmpty { + val new = remote.getTimetable(student, semester, start.monday, start.sunday) + val old = local.getTimetable(semester, start.monday, start.sunday) + + local.deleteTimetable(old.uniqueSubtract(new).also { schedulerHelper.cancelScheduled(it) }) + local.saveTimetable(new.uniqueSubtract(old).also { schedulerHelper.scheduleNotifications(it, student) }.map { item -> + item.also { new -> + old.singleOrNull { new.start == it.start }?.let { old -> + return@map new.copy( + room = if (new.room.isEmpty()) old.room else new.room, + teacher = if (new.teacher.isEmpty() && !new.changes && !old.changes) old.teacher else new.teacher + ) + } + } + }) + + local.getTimetable(semester, start.monday, start.sunday) + }.filter { it.date in start..end }.also { schedulerHelper.scheduleNotifications(it, student) } } } diff --git a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt index db5ff59b3..29b66a4e5 100644 --- a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt @@ -7,6 +7,7 @@ import dagger.Module import dagger.Provides import io.github.wulkanowy.WulkanowyApp import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.SchedulersProvider import javax.inject.Singleton @@ -21,6 +22,10 @@ internal class AppModule { @Provides fun provideSchedulersProvider() = SchedulersProvider() + @Singleton + @Provides + fun provideDispatchersProvider() = DispatchersProvider() + @Singleton @Provides fun provideAppWidgetManager(context: Context): AppWidgetManager = AppWidgetManager.getInstance(context) diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt index 0130f4673..283f0a984 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt @@ -19,6 +19,7 @@ import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.toLocalDateTime +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -53,7 +54,7 @@ class TimetableNotificationReceiver : BroadcastReceiver() { Timber.d("Receiving intent... ${intent.toUri(0)}") AndroidInjection.inject(this, context) - studentRepository.getCurrentStudent(false) + rxSingle { studentRepository.getCurrentStudent(false) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt index 126d856aa..fc02ca759 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt @@ -15,13 +15,15 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository -import io.github.wulkanowy.sdk.exception.FeatureDisabledException import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import io.github.wulkanowy.services.sync.channels.DebugChannel import io.github.wulkanowy.services.sync.works.Work import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable import io.reactivex.Single +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import kotlin.random.Random @@ -37,11 +39,11 @@ class SyncWorker @AssistedInject constructor( override fun createWork(): Single { Timber.i("SyncWorker is starting") - return studentRepository.isCurrentStudentSet() + return rxSingle { studentRepository.isCurrentStudentSet() } .filter { true } - .flatMap { studentRepository.getCurrentStudent().toMaybe() } + .flatMap { rxMaybe { studentRepository.getCurrentStudent() } } .flatMapCompletable { student -> - semesterRepository.getCurrentSemester(student, true) + rxSingle { semesterRepository.getCurrentSemester(student, true) } .flatMapCompletable { semester -> Completable.mergeDelayError(works.map { work -> work.create(student, semester) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt index 5f7d7efa2..f4333f337 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt @@ -4,6 +4,7 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.attendancesummary.AttendanceSummaryRepository import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable import javax.inject.Inject class AttendanceSummaryWork @Inject constructor( @@ -11,7 +12,7 @@ class AttendanceSummaryWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return attendanceSummaryRepository.getAttendanceSummary(student, semester, -1, true).ignoreElement() + return rxCompletable { attendanceSummaryRepository.getAttendanceSummary(student, semester, -1, true) } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt index 063b74825..069b6c8f4 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt @@ -6,13 +6,13 @@ import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable import org.threeten.bp.LocalDate.now import javax.inject.Inject class AttendanceWork @Inject constructor(private val attendanceRepository: AttendanceRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true) - .ignoreElement() + return rxCompletable { attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true) } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt index 26f79a0d5..8914fd369 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRe import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable import org.threeten.bp.LocalDate.now import javax.inject.Inject @@ -14,8 +15,7 @@ class CompletedLessonWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return completedLessonsRepository.getCompletedLessons(student, semester, now().monday, now().sunday, true) - .ignoreElement() + return rxCompletable { completedLessonsRepository.getCompletedLessons(student, semester, now().monday, now().sunday, true) } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt index 1ef97f59c..0a4512958 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt @@ -6,12 +6,13 @@ import io.github.wulkanowy.data.repositories.exam.ExamRepository import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable import org.threeten.bp.LocalDate.now import javax.inject.Inject class ExamWork @Inject constructor(private val examRepository: ExamRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return examRepository.getExams(student, semester, now().monday, now().sunday, true).ignoreElement() + return rxCompletable { examRepository.getExams(student, semester, now().monday, now().sunday, true) } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt index c4681fb8f..0a1a9eee5 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt @@ -4,13 +4,13 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.gradestatistics.GradeStatisticsRepository import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable import javax.inject.Inject class GradeStatisticsWork @Inject constructor(private val gradeStatisticsRepository: GradeStatisticsRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return gradeStatisticsRepository.getGradesStatistics(student, semester, "Wszystkie", false, forceRefresh = true) - .ignoreElement() + return rxCompletable { gradeStatisticsRepository.getGradesStatistics(student, semester, "Wszystkie", false, forceRefresh = true) } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt index fcdaad6e6..252966d64 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt @@ -19,6 +19,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject import kotlin.random.Random @@ -30,17 +32,16 @@ class GradeWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable) - .ignoreElement() - .concatWith(Completable.concatArray(gradeRepository.getNotNotifiedGrades(semester).flatMapCompletable { + return rxCompletable { gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable) } + .concatWith(Completable.concatArray(rxSingle { gradeRepository.getNotNotifiedGrades(semester) }.flatMapCompletable { if (it.isNotEmpty()) notifyDetails(it) - gradeRepository.updateGrades(it.onEach { grade -> grade.isNotified = true }) - }, gradeRepository.getNotNotifiedPredictedGrades(semester).flatMapCompletable { + rxCompletable { gradeRepository.updateGrades(it.onEach { grade -> grade.isNotified = true }) } + }, rxSingle { gradeRepository.getNotNotifiedPredictedGrades(semester) }.flatMapCompletable { if (it.isNotEmpty()) notifyPredicted(it) - gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isPredictedGradeNotified = true }) - }, gradeRepository.getNotNotifiedFinalGrades(semester).flatMapCompletable { + rxCompletable { gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isPredictedGradeNotified = true }) } + }, rxSingle { gradeRepository.getNotNotifiedFinalGrades(semester) }.flatMapCompletable { if (it.isNotEmpty()) notifyFinal(it) - gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isFinalGradeNotified = true }) + rxCompletable { gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isFinalGradeNotified = true }) } })) } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt index 186d57b03..2bf5315a2 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt @@ -6,12 +6,13 @@ import io.github.wulkanowy.data.repositories.homework.HomeworkRepository import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable import org.threeten.bp.LocalDate.now import javax.inject.Inject class HomeworkWork @Inject constructor(private val homeworkRepository: HomeworkRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return homeworkRepository.getHomework(student, semester, now().monday, now().sunday, true).ignoreElement() + return rxCompletable { homeworkRepository.getHomework(student, semester, now().monday, now().sunday, true) } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt index f19af4df6..1389566bd 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt @@ -18,6 +18,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxMaybe import javax.inject.Inject import kotlin.random.Random @@ -29,11 +31,11 @@ class LuckyNumberWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return luckyNumberRepository.getLuckyNumber(student, true, preferencesRepository.isNotificationsEnable) - .flatMap { luckyNumberRepository.getNotNotifiedLuckyNumber(student) } + return rxMaybe { luckyNumberRepository.getLuckyNumber(student, true, preferencesRepository.isNotificationsEnable) } + .flatMap { rxMaybe { luckyNumberRepository.getNotNotifiedLuckyNumber(student) } } .flatMapCompletable { notify(it) - luckyNumberRepository.updateLuckyNumber(it.apply { isNotified = true }) + rxCompletable { luckyNumberRepository.updateLuckyNumber(it.apply { isNotified = true }) } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt index b8773dbca..a805fe6bc 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt @@ -19,6 +19,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject import kotlin.random.Random @@ -30,11 +32,11 @@ class MessageWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return messageRepository.getMessages(student, semester, RECEIVED, true, preferencesRepository.isNotificationsEnable) - .flatMap { messageRepository.getNotNotifiedMessages(student) } + return rxSingle { messageRepository.getMessages(student, semester, RECEIVED, true, preferencesRepository.isNotificationsEnable) } + .flatMap { rxSingle { messageRepository.getNotNotifiedMessages(student) } } .flatMapCompletable { if (it.isNotEmpty()) notify(it) - messageRepository.updateMessages(it.onEach { message -> message.isNotified = true }) + rxCompletable { messageRepository.updateMessages(it.onEach { message -> message.isNotified = true }) } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt index 4fc92ffcc..f33c64023 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt @@ -18,6 +18,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject import kotlin.random.Random @@ -29,11 +31,11 @@ class NoteWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return noteRepository.getNotes(student, semester, true, preferencesRepository.isNotificationsEnable) - .flatMap { noteRepository.getNotNotifiedNotes(student) } + return rxSingle { noteRepository.getNotes(student, semester, true, preferencesRepository.isNotificationsEnable) } + .flatMap { rxSingle { noteRepository.getNotNotifiedNotes(student) } } .flatMapCompletable { if (it.isNotEmpty()) notify(it) - noteRepository.updateNotes(it.onEach { note -> note.isNotified = true }) + rxCompletable { noteRepository.updateNotes(it.onEach { note -> note.isNotified = true }) } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt index fa610dee4..704150981 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt @@ -5,6 +5,8 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.recipient.RecipientRepository import io.github.wulkanowy.data.repositories.reportingunit.ReportingUnitRepository import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class RecipientWork @Inject constructor( @@ -13,10 +15,10 @@ class RecipientWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return reportingUnitRepository.getReportingUnits(student, true) + return rxSingle { reportingUnitRepository.getReportingUnits(student, true) } .flatMapCompletable { units -> Completable.mergeDelayError(units.map { - recipientRepository.getRecipients(student, 2, it, true).ignoreElement() + rxCompletable { recipientRepository.getRecipients(student, 2, it, true) } }) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt index 5a7a41d8d..f3ebf9eea 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt @@ -4,11 +4,12 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.teacher.TeacherRepository import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable import javax.inject.Inject class TeacherWork @Inject constructor(private val teacherRepository: TeacherRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return teacherRepository.getTeachers(student, semester, true).ignoreElement() + return rxCompletable { teacherRepository.getTeachers(student, semester, true) } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt index d79d24033..7d6438d7a 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt @@ -6,13 +6,13 @@ import io.github.wulkanowy.data.repositories.timetable.TimetableRepository import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable import org.threeten.bp.LocalDate.now import javax.inject.Inject class TimetableWork @Inject constructor(private val timetableRepository: TimetableRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return timetableRepository.getTimetable(student, semester, now().monday, now().sunday, true) - .ignoreElement() + return rxCompletable { timetableRepository.getTimetable(student, semester, now().monday, now().sunday, true) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index 9f0b4047c..d9dbc362b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -4,6 +4,8 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.utils.SchedulersProvider import io.reactivex.Completable import io.reactivex.disposables.CompositeDisposable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber open class BasePresenter( @@ -27,13 +29,13 @@ open class BasePresenter( fun onExpiredLoginSelected() { Timber.i("Attempt to switch the student after the session expires") - disposable.add(studentRepository.getCurrentStudent(false) - .flatMapCompletable { studentRepository.logoutStudent(it) } - .andThen(studentRepository.getSavedStudents(false)) + disposable.add(rxSingle { studentRepository.getCurrentStudent(false) } + .flatMapCompletable { rxCompletable { studentRepository.logoutStudent(it) } } + .andThen(rxSingle { studentRepository.getSavedStudents(false) }) .flatMapCompletable { if (it.isNotEmpty()) { Timber.i("Switching current student") - studentRepository.switchStudent(it[0]) + rxCompletable { studentRepository.switchStudent(it[0]) } } else Completable.complete() } .subscribeOn(schedulers.backgroundThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt index 896e4ff1c..627e0a5f5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt @@ -13,9 +13,9 @@ import androidx.appcompat.app.AlertDialog import androidx.core.content.getSystemService import io.github.wulkanowy.R import io.github.wulkanowy.databinding.DialogErrorBinding -import io.github.wulkanowy.sdk.exception.FeatureDisabledException import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException -import io.github.wulkanowy.sdk.exception.ServiceUnavailableException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException +import io.github.wulkanowy.sdk.scrapper.exception.ServiceUnavailableException import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.getString import io.github.wulkanowy.utils.openAppInMarket diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index f746b36f8..c88e4d87d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.ui.base import android.content.res.Resources import com.chuckerteam.chucker.api.ChuckerCollector import io.github.wulkanowy.data.exceptions.NoCurrentStudentException -import io.github.wulkanowy.sdk.exception.BadCredentialsException +import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.utils.getString import io.github.wulkanowy.utils.security.ScramblerException import timber.log.Timber diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt index 416a59ce5..ae149fa14 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class ContributorPresenter @Inject constructor( @@ -30,7 +31,7 @@ class ContributorPresenter @Inject constructor( } private fun loadData() { - disposable.add(appCreatorRepository.getAppCreators() + disposable.add(rxSingle { appCreatorRepository.getAppCreators() } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { view?.showProgress(false) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt index 33eb1122d..e1ec23a12 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt @@ -5,6 +5,7 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -22,7 +23,7 @@ class LogViewerPresenter @Inject constructor( } fun onShareLogsSelected(): Boolean { - disposable.add(loggerRepository.getLogFiles() + disposable.add(rxSingle { loggerRepository.getLogFiles() } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ files -> @@ -40,7 +41,7 @@ class LogViewerPresenter @Inject constructor( } private fun loadLogFile() { - disposable.add(loggerRepository.getLastLogLines() + disposable.add(rxSingle { loggerRepository.getLastLogLines() } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt index b5fbcdb63..1dd32cf90 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt @@ -7,6 +7,8 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider import io.reactivex.Single +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -36,11 +38,11 @@ class AccountPresenter @Inject constructor( fun onLogoutConfirm() { Timber.i("Attempt to logout current user ") - disposable.add(studentRepository.getCurrentStudent() - .flatMapCompletable { studentRepository.logoutStudent(it) } - .andThen(studentRepository.getSavedStudents(false)) + disposable.add(rxSingle { studentRepository.getCurrentStudent(false) } + .flatMapCompletable { rxCompletable { studentRepository.logoutStudent(it) } } + .andThen(rxSingle { studentRepository.getSavedStudents(false) }) .flatMap { - if (it.isNotEmpty()) studentRepository.switchStudent(it[0]).toSingle { it } + if (it.isNotEmpty()) rxCompletable { studentRepository.switchStudent(it[0]) }.toSingle { it } else Single.just(it) } .subscribeOn(schedulers.backgroundThread) @@ -69,7 +71,7 @@ class AccountPresenter @Inject constructor( view?.dismissView() } else { Timber.i("Attempt to change a student") - disposable.add(studentRepository.switchStudent(student) + disposable.add(rxSingle { studentRepository.switchStudent(student) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { view?.dismissView() } @@ -93,7 +95,7 @@ class AccountPresenter @Inject constructor( private fun loadData() { Timber.i("Loading account data started") - disposable.add(studentRepository.getSavedStudents(false) + disposable.add(rxSingle { studentRepository.getSavedStudents(false) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .map { createAccountItems(it) } 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 f58d0617f..f177d0191 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 @@ -16,6 +16,7 @@ import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousOrSameSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay @@ -167,8 +168,8 @@ class AttendancePresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -185,10 +186,10 @@ class AttendancePresenter @Inject constructor( currentDate = date disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - attendanceRepository.getAttendance(student, semester, date, date, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { attendanceRepository.getAttendance(student, semester, date, date, forceRefresh) } } } .map { list -> @@ -231,10 +232,10 @@ class AttendancePresenter @Inject constructor( private fun excuseAbsence(reason: String?, toExcuseList: List) { Timber.i("Excusing absence started") disposable.apply { - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - attendanceRepository.excuseForAbsence(student, semester, toExcuseList, reason) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { attendanceRepository.excuseForAbsence(student, semester, toExcuseList, reason) } } } .subscribeOn(schedulers.backgroundThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt index 33e18c2e7..f694a8d0c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.Month import timber.log.Timber import javax.inject.Inject @@ -76,10 +77,10 @@ class AttendanceSummaryPresenter @Inject constructor( currentSubjectId = subjectId disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { - attendanceSummaryRepository.getAttendanceSummary(student, it, subjectId, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { + rxSingle { attendanceSummaryRepository.getAttendanceSummary(student, it, subjectId, forceRefresh) } } } .map { items -> items.sortedByDescending { if (it.month.value <= Month.JUNE.value) it.month.value + 12 else it.month.value } } @@ -127,10 +128,10 @@ class AttendanceSummaryPresenter @Inject constructor( private fun loadSubjects() { Timber.i("Loading attendance summary subjects started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - subjectRepository.getSubjects(student, semester) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { subjectRepository.getSubjects(student, semester) } } } .doOnSuccess { subjects = it } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index 1140cb020..844fb263a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay @@ -89,8 +90,8 @@ class ExamPresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -107,10 +108,10 @@ class ExamPresenter @Inject constructor( currentDate = date disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - examRepository.getExams(student, semester, currentDate.monday, currentDate.sunday, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { examRepository.getExams(student, semester, currentDate.monday, currentDate.sunday, forceRefresh) } } } .map { createExamItems(it) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index af1699323..ab6c507bb 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -13,7 +13,6 @@ import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.BOTH_SEMESTERS import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.ONE_SEMESTER import io.github.wulkanowy.utils.calcAverage import io.github.wulkanowy.utils.changeModifier -import io.reactivex.Single import javax.inject.Inject class GradeAverageProvider @Inject constructor( @@ -26,8 +25,8 @@ class GradeAverageProvider @Inject constructor( private val minusModifier get() = preferencesRepository.gradeMinusModifier - fun getGradesDetailsWithAverage(student: Student, semesterId: Int, forceRefresh: Boolean = false): Single> { - return semesterRepository.getSemesters(student).flatMap { semesters -> + suspend fun getGradesDetailsWithAverage(student: Student, semesterId: Int, forceRefresh: Boolean = false): List { + return semesterRepository.getSemesters(student).let { semesters -> when (preferencesRepository.gradeAverageMode) { ONE_SEMESTER -> getSemesterDetailsWithAverage(student, semesters.single { it.semesterId == semesterId }, forceRefresh) BOTH_SEMESTERS -> calculateBothSemestersAverage(student, semesters, semesterId, forceRefresh) @@ -36,15 +35,15 @@ class GradeAverageProvider @Inject constructor( } } - private fun calculateBothSemestersAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Single> { + private suspend fun calculateBothSemestersAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): List { val selectedSemester = semesters.single { it.semesterId == semesterId } val firstSemester = semesters.single { it.diaryId == selectedSemester.diaryId && it.semesterName == 1 } - return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).flatMap { selectedDetails -> + return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).let { selectedDetails -> val isAnyAverage = selectedDetails.any { it.average != .0 } if (selectedSemester != firstSemester) { - getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).map { secondDetails -> + getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).let { secondDetails -> selectedDetails.map { selected -> val second = secondDetails.singleOrNull { it.subject == selected.subject } selected.copy(average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { @@ -53,19 +52,19 @@ class GradeAverageProvider @Inject constructor( } else (selected.average + (second?.average ?: selected.average)) / 2) } } - } else Single.just(selectedDetails) + } else selectedDetails } } - private fun calculateAllYearAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Single> { + private suspend fun calculateAllYearAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): List { val selectedSemester = semesters.single { it.semesterId == semesterId } val firstSemester = semesters.single { it.diaryId == selectedSemester.diaryId && it.semesterName == 1 } - return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).flatMap { selectedDetails -> + return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).let { selectedDetails -> val isAnyAverage = selectedDetails.any { it.average != .0 } if (selectedSemester != firstSemester) { - getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).map { secondDetails -> + getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).let { secondDetails -> selectedDetails.map { selected -> val second = secondDetails.singleOrNull { it.subject == selected.subject } selected.copy(average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { @@ -73,12 +72,12 @@ class GradeAverageProvider @Inject constructor( } else selected.average) } } - } else Single.just(selectedDetails) + } else selectedDetails } } - private fun getSemesterDetailsWithAverage(student: Student, semester: Semester, forceRefresh: Boolean): Single> { - return gradeRepository.getGrades(student, semester, forceRefresh).map { (details, summaries) -> + private suspend fun getSemesterDetailsWithAverage(student: Student, semester: Semester, forceRefresh: Boolean): List { + return gradeRepository.getGrades(student, semester, forceRefresh).let { (details, summaries) -> val isAnyAverage = summaries.any { it.average != .0 } val allGrades = details.groupBy { it.subject } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index ec66e2bd9..65f6598d1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.getCurrentOrLast +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import java.util.concurrent.TimeUnit.MILLISECONDS import javax.inject.Inject @@ -99,8 +100,8 @@ class GradePresenter @Inject constructor( private fun loadData() { Timber.i("Loading grade data started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getSemesters(it, refreshOnNoCurrent = true) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getSemesters(it, refreshOnNoCurrent = true) } } .delay(200, MILLISECONDS) .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index 37f2c935a..a99e3a547 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -11,6 +11,8 @@ import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -62,13 +64,13 @@ class GradeDetailsPresenter @Inject constructor( fun onMarkAsReadSelected(): Boolean { Timber.i("Select mark grades as read") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getSemesters(it) } - .flatMap { gradeRepository.getUnreadGrades(it.first { item -> item.semesterId == currentSemesterId }) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getSemesters(it) } } + .flatMap { rxSingle { gradeRepository.getUnreadGrades(it.first { item -> item.semesterId == currentSemesterId }) } } .map { it.map { grade -> grade.apply { isRead = true } } } .flatMapCompletable { Timber.i("Mark as read ${it.size} grades") - gradeRepository.updateGrades(it) + rxCompletable { gradeRepository.updateGrades(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) @@ -126,8 +128,8 @@ class GradeDetailsPresenter @Inject constructor( private fun loadData(semesterId: Int, forceRefresh: Boolean) { Timber.i("Loading grade details data started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { @@ -196,7 +198,7 @@ class GradeDetailsPresenter @Inject constructor( private fun updateGrade(grade: Grade) { Timber.i("Attempt to update grade ${grade.id}") - disposable.add(gradeRepository.updateGrade(grade) + disposable.add(rxCompletable { gradeRepository.updateGrade(grade) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt index 590e9ce12..b2c56ed22 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt @@ -10,6 +10,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -116,10 +117,10 @@ class GradeStatisticsPresenter @Inject constructor( private fun loadSubjects() { Timber.i("Loading grade stats subjects started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - subjectRepository.getSubjects(student, semester) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { subjectRepository.getSubjects(student, semester) } } } .doOnSuccess { subjects = it } @@ -141,16 +142,18 @@ class GradeStatisticsPresenter @Inject constructor( currentType = type Timber.i("Loading grade stats data started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getSemesters(student).flatMap { semesters -> + rxSingle { semesterRepository.getSemesters(student) }.flatMap { semesters -> val semester = semesters.first { item -> item.semesterId == semesterId } - with(gradeStatisticsRepository) { - when (type) { - ViewType.SEMESTER -> getGradesStatistics(student, semester, currentSubjectName, true, forceRefresh) - ViewType.PARTIAL -> getGradesStatistics(student, semester, currentSubjectName, false, forceRefresh) - ViewType.POINTS -> getGradesPointsStatistics(student, semester, currentSubjectName, forceRefresh) + rxSingle { + with(gradeStatisticsRepository) { + when (type) { + ViewType.SEMESTER -> getGradesStatistics(student, semester, currentSubjectName, true, forceRefresh) + ViewType.PARTIAL -> getGradesStatistics(student, semester, currentSubjectName, false, forceRefresh) + ViewType.POINTS -> getGradesPointsStatistics(student, semester, currentSubjectName, forceRefresh) + } } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 229a0107d..62b95d2e9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -29,8 +30,8 @@ class GradeSummaryPresenter @Inject constructor( fun onParentViewLoadData(semesterId: Int, forceRefresh: Boolean) { Timber.i("Loading grade summary data started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } } .map { createGradeSummaryItems(it) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index 41735a23f..fe31dfae2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber @@ -78,8 +79,8 @@ class HomeworkPresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -100,10 +101,10 @@ class HomeworkPresenter @Inject constructor( currentDate = date disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - homeworkRepository.getHomework(student, semester, currentDate, currentDate, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { homeworkRepository.getHomework(student, semester, currentDate, currentDate, forceRefresh) } } } .map { createHomeworkItem(it) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt index 04a97b8cd..c0475b7c5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -26,7 +27,7 @@ class HomeworkDetailsPresenter @Inject constructor( fun toggleDone(homework: Homework) { Timber.i("Homework details update start") - disposable.add(homeworkRepository.toggleDone(homework) + disposable.add(rxSingle { homeworkRepository.toggleDone(homework) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt index 5ed181bf1..f30825cff 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt @@ -4,11 +4,11 @@ import android.content.res.Resources import android.database.sqlite.SQLiteConstraintException import com.chuckerteam.chucker.api.ChuckerCollector import io.github.wulkanowy.R -import io.github.wulkanowy.sdk.exception.BadCredentialsException import io.github.wulkanowy.sdk.mobile.exception.InvalidPinException import io.github.wulkanowy.sdk.mobile.exception.InvalidSymbolException import io.github.wulkanowy.sdk.mobile.exception.InvalidTokenException import io.github.wulkanowy.sdk.mobile.exception.TokenDeadException +import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.ui.base.ErrorHandler import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt index 3a0d4a0d8..27205a2af 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.ifNullOrBlank import io.reactivex.Single +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -162,10 +163,12 @@ class LoginAdvancedPresenter @Inject constructor( val symbol = view?.formSymbolValue.orEmpty() val token = view?.formTokenValue.orEmpty() - return when (Sdk.Mode.valueOf(view?.formLoginType ?: "")) { - Sdk.Mode.API -> studentRepository.getStudentsApi(pin, symbol, token) - Sdk.Mode.SCRAPPER -> studentRepository.getStudentsScrapper(email, password, endpoint, symbol) - Sdk.Mode.HYBRID -> studentRepository.getStudentsHybrid(email, password, endpoint, symbol) + return rxSingle { + when (Sdk.Mode.valueOf(view?.formLoginType ?: "")) { + Sdk.Mode.API -> studentRepository.getStudentsApi(pin, symbol, token) + Sdk.Mode.SCRAPPER -> studentRepository.getStudentsScrapper(email, password, endpoint, symbol) + Sdk.Mode.HYBRID -> studentRepository.getStudentsHybrid(email, password, endpoint, symbol) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index 997e1e85f..ccbe4bbbe 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.ifNullOrBlank +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -74,7 +75,7 @@ class LoginFormPresenter @Inject constructor( if (!validateCredentials(email, password, host)) return - disposable.add(studentRepository.getStudentsScrapper(email, password, host, symbol) + disposable.add(rxSingle { studentRepository.getStudentsScrapper(email, password, host, symbol) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt index 9a21fb910..84d5af06b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.ifNullOrBlank +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -55,7 +56,7 @@ class LoginRecoverPresenter @Inject constructor( if (!validateInput(username, host)) return - disposable.add(recoverRepository.getReCaptchaSiteKey(host, symbol.ifBlank { "Default" }) + disposable.add(rxSingle { recoverRepository.getReCaptchaSiteKey(host, symbol.ifBlank { "Default" }) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { @@ -98,7 +99,7 @@ class LoginRecoverPresenter @Inject constructor( with(disposable) { clear() - add(recoverRepository.sendRecoverRequest(host, symbol, username, reCaptchaResponse) + add(rxSingle { recoverRepository.sendRecoverRequest(host, symbol, username, reCaptchaResponse) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index db25c0da3..91d3e66cd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -7,6 +7,8 @@ import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.ifNullOrBlank +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import java.io.Serializable import javax.inject.Inject @@ -71,7 +73,7 @@ class LoginStudentSelectPresenter @Inject constructor( private fun loadData(students: List) { resetSelectedState() this.students = students - disposable.add(studentRepository.getSavedStudents() + disposable.add(rxSingle { studentRepository.getSavedStudents(false) } .map { savedStudents -> students.map { student -> student to savedStudents.any { compareStudents(student, it) } @@ -95,9 +97,9 @@ class LoginStudentSelectPresenter @Inject constructor( } private fun registerStudents(students: List) { - disposable.add(studentRepository.saveStudents(students) + disposable.add(rxSingle { studentRepository.saveStudents(students) } .map { students.first().apply { id = it.first() } } - .flatMapCompletable { studentRepository.switchStudent(it) } + .flatMapCompletable { rxCompletable { studentRepository.switchStudent(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index 1f9e66b70..b7687ed3f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.ifNullOrBlank import io.reactivex.Single +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import java.io.Serializable import javax.inject.Inject @@ -48,7 +49,7 @@ class LoginSymbolPresenter @Inject constructor( disposable.add( Single.fromCallable { loginData } - .flatMap { studentRepository.getStudentsScrapper(it.first, it.second, it.third, symbol) } + .flatMap { rxSingle { studentRepository.getStudentsScrapper(it.first, it.second, it.third, symbol) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt index e932fedc0..1273a54c5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt @@ -6,6 +6,8 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -35,8 +37,8 @@ class LuckyNumberPresenter @Inject constructor( Timber.i("Loading lucky number started") disposable.apply { clear() - add(studentRepository.getCurrentStudent() - .flatMapMaybe { luckyNumberRepository.getLuckyNumber(it, forceRefresh) } + add(rxSingle { studentRepository.getCurrentStudent() } + .flatMapMaybe { rxMaybe { luckyNumberRepository.getLuckyNumber(it, forceRefresh) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt index 468f9b575..bb7ea75b2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider.Companion.getStudentWidgetKey import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider.Companion.getThemeWidgetKey import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class LuckyNumberWidgetConfigurePresenter @Inject constructor( @@ -45,7 +46,7 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( } private fun loadData() { - disposable.add(studentRepository.getSavedStudents(false) + disposable.add(rxSingle { studentRepository.getSavedStudents(false) } .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } .map { (students, currentStudentId) -> students.map { student -> student to (student.id == currentStudentId) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index 55a048b32..204fc79ad 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -24,6 +24,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.SchedulersProvider import io.reactivex.Maybe +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -139,23 +141,23 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { private fun getLuckyNumber(studentId: Long, appWidgetId: Int): LuckyNumber? { return try { - studentRepository.isStudentSaved() + rxSingle { studentRepository.isStudentSaved() } .filter { true } - .flatMap { studentRepository.getSavedStudents().toMaybe() } + .flatMap { rxMaybe { studentRepository.getSavedStudents() } } .flatMap { students -> val student = students.singleOrNull { student -> student.id == studentId } when { student != null -> Maybe.just(student) studentId != 0L -> { - studentRepository.isCurrentStudentSet() + rxSingle { studentRepository.isCurrentStudentSet() } .filter { true } - .flatMap { studentRepository.getCurrentStudent(false).toMaybe() } + .flatMap { rxMaybe { studentRepository.getCurrentStudent(false) } } .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } } else -> Maybe.empty() } } - .flatMap { luckyNumberRepository.getLuckyNumber(it) } + .flatMap { rxMaybe { luckyNumberRepository.getLuckyNumber(it) } } .subscribeOn(schedulers.backgroundThread) .blockingGet() } catch (e: Exception) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index db7996bca..b94c46123 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -12,6 +12,7 @@ import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -56,8 +57,8 @@ class MessagePreviewPresenter @Inject constructor( Timber.i("Loading message ${message.messageId} preview started") disposable.apply { clear() - add(studentRepository.getStudentById(message.studentId) - .flatMap { messageRepository.getMessage(it, message, true) } + add(rxSingle { studentRepository.getStudentById(message.studentId) } + .flatMap { rxSingle { messageRepository.getMessage(it, message, true) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { view?.showProgress(false) } @@ -152,8 +153,8 @@ class MessagePreviewPresenter @Inject constructor( private fun deleteMessage() { message?.let { message -> - disposable.add(studentRepository.getCurrentStudent() - .flatMap { messageRepository.deleteMessage(it, message) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { messageRepository.deleteMessage(it, message) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt index aec79f9db..545409c6d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt @@ -15,6 +15,8 @@ import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.toFormattedString import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -98,19 +100,19 @@ class SendMessagePresenter @Inject constructor( var selectedRecipientChips: List = emptyList() Timber.i("Loading recipients started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it).map { semester -> it to semester } } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) }.map { semester -> it to semester } } .flatMapCompletable { (student, semester) -> - reportingUnitRepository.getReportingUnit(student, semester.unitId) + rxMaybe { reportingUnitRepository.getReportingUnit(student, semester.unitId) } .doOnSuccess { reportingUnit = it } - .flatMap { recipientRepository.getRecipients(student, 2, it).toMaybe() } + .flatMap { rxMaybe { recipientRepository.getRecipients(student, 2, it) } } .doOnSuccess { Timber.i("Loading recipients result: Success, fetched %d recipients", it.size) recipientChips = createChips(it) } .flatMapCompletable { if (message == null || reply != true) Completable.complete() - else recipientRepository.getMessageRecipients(student, message) + else rxSingle { recipientRepository.getMessageRecipients(student, message) } .doOnSuccess { Timber.i("Loaded message recipients to reply result: Success, fetched %d recipients", it.size) selectedRecipientChips = createChips(it) @@ -148,8 +150,8 @@ class SendMessagePresenter @Inject constructor( private fun sendMessage(subject: String, content: String, recipients: List) { Timber.i("Sending message started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { messageRepository.sendMessage(it, subject, content, recipients) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { messageRepository.sendMessage(it, subject, content, recipients) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 533f5ac85..0e96836b1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -11,6 +11,7 @@ import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.toFormattedString import io.reactivex.subjects.PublishSubject +import kotlinx.coroutines.rx2.rxSingle import me.xdrop.fuzzywuzzy.FuzzySearch import timber.log.Timber import java.util.Locale @@ -83,10 +84,10 @@ class MessageTabPresenter @Inject constructor( private fun loadData(forceRefresh: Boolean) { Timber.i("Loading $folder message data started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student) - .flatMap { messageRepository.getMessages(student, it, folder, forceRefresh) } + rxSingle { semesterRepository.getCurrentSemester(student) } + .flatMap { rxSingle { messageRepository.getMessages(student, it, folder, forceRefresh) } } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt index 459ca17e8..b1dea5dff 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -48,10 +49,10 @@ class MobileDevicePresenter @Inject constructor( private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading mobile devices data started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - mobileDeviceRepository.getDevices(student, semester, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { mobileDeviceRepository.getDevices(student, semester, forceRefresh) } } } .subscribeOn(schedulers.backgroundThread) @@ -114,11 +115,11 @@ class MobileDevicePresenter @Inject constructor( fun onUnregisterConfirmed(device: MobileDevice) { Timber.i("Unregister device started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - mobileDeviceRepository.unregisterDevice(student, semester, device) - .flatMap { mobileDeviceRepository.getDevices(student, semester, it) } + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { mobileDeviceRepository.unregisterDevice(student, semester, device) } + .flatMap { rxSingle { mobileDeviceRepository.getDevices(student, semester, it) } } } } .subscribeOn(schedulers.backgroundThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt index 6a2a6b98b..1c0506f0d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -28,10 +29,10 @@ class MobileDeviceTokenPresenter @Inject constructor( private fun loadData() { Timber.i("Mobile device registration data started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - mobileDeviceRepository.getToken(student, semester) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { mobileDeviceRepository.getToken(student, semester) } } } .subscribeOn(schedulers.backgroundThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt index 7d301c66b..4009b4f6c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -49,9 +50,9 @@ class NotePresenter @Inject constructor( private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading note data started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it).map { semester -> semester to it } } - .flatMap { noteRepository.getNotes(it.second, it.first, forceRefresh) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) }.map { semester -> semester to it } } + .flatMap { rxSingle { noteRepository.getNotes(it.second, it.first, forceRefresh) } } .map { items -> items.sortedByDescending { it.date } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) @@ -107,7 +108,7 @@ class NotePresenter @Inject constructor( private fun updateNote(note: Note) { Timber.i("Attempt to update note ${note.id}") - disposable.add(noteRepository.updateNote(note) + disposable.add(rxSingle { noteRepository.updateNote(note) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ Timber.i("Update note result: Success") }) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt index 7beff922d..334c60a32 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt @@ -7,6 +7,8 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -63,10 +65,10 @@ class SchoolPresenter @Inject constructor( private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading school info started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMapMaybe { student -> - semesterRepository.getCurrentSemester(student).flatMapMaybe { - schoolRepository.getSchoolInfo(student, it, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMapMaybe { + rxMaybe { schoolRepository.getSchoolInfo(student, it, forceRefresh) } } } .subscribeOn(schedulers.backgroundThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt index 0d8eec6d4..2ccba71f9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -51,10 +52,10 @@ class TeacherPresenter @Inject constructor( private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading teachers data started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - teacherRepository.getTeachers(student, semester, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { teacherRepository.getTeachers(student, semester, forceRefresh) } } } .map { it.filter { teacher -> teacher.name.isNotBlank() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt index 44b53c5f9..bfdd17660 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt @@ -4,6 +4,7 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class SplashPresenter @Inject constructor( @@ -14,7 +15,7 @@ class SplashPresenter @Inject constructor( override fun onAttachView(view: SplashView) { super.onAttachView(view) - disposable.add(studentRepository.isCurrentStudentSet() + disposable.add(rxSingle { studentRepository.isCurrentStudentSet() } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index e1ce005e3..da76854a2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -16,6 +16,7 @@ import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.of @@ -111,8 +112,8 @@ class TimetablePresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -129,10 +130,10 @@ class TimetablePresenter @Inject constructor( currentDate = date disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - timetableRepository.getTimetable(student, semester, currentDate, currentDate, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { timetableRepository.getTimetable(student, semester, currentDate, currentDate, forceRefresh) } } } .map { items -> items.filter { if (prefRepository.showWholeClassPlan == "no") it.isStudentPlan else true } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt index c1389cedd..767c2f313 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt @@ -2,7 +2,7 @@ package io.github.wulkanowy.ui.modules.timetable.completed import android.content.res.Resources import com.chuckerteam.chucker.api.ChuckerCollector -import io.github.wulkanowy.sdk.exception.FeatureDisabledException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import io.github.wulkanowy.ui.base.ErrorHandler import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt index f72d753a9..c6a2cf84d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay @@ -93,8 +94,8 @@ class CompletedLessonsPresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -111,10 +112,10 @@ class CompletedLessonsPresenter @Inject constructor( currentDate = date disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - completedLessonsRepository.getCompletedLessons(student, semester, currentDate, currentDate, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { completedLessonsRepository.getCompletedLessons(student, semester, currentDate, currentDate, forceRefresh) } } } .map { items -> items.sortedBy { it.number } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt index 57dde824c..cc2ac4bb0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getStudentWidgetKey import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getThemeWidgetKey import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class TimetableWidgetConfigurePresenter @Inject constructor( @@ -50,7 +51,7 @@ class TimetableWidgetConfigurePresenter @Inject constructor( } private fun loadData() { - disposable.add(studentRepository.getSavedStudents(false) + disposable.add(rxSingle { studentRepository.getSavedStudents(false) } .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } .map { (students, currentStudentId) -> students.map { student -> student to (student.id == currentStudentId) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index dd223ad8b..6c043e9e7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -25,6 +25,8 @@ import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.toFormattedString import io.reactivex.Maybe +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import timber.log.Timber @@ -100,9 +102,9 @@ class TimetableWidgetFactory( private fun updateLessons(date: LocalDate, studentId: Long) { lessons = try { - studentRepository.isStudentSaved() + rxSingle { studentRepository.isStudentSaved() } .filter { true } - .flatMap { studentRepository.getSavedStudents().toMaybe() } + .flatMap { rxMaybe { studentRepository.getSavedStudents() } } .flatMap { val student = it.singleOrNull { student -> student.id == studentId } @@ -110,8 +112,8 @@ class TimetableWidgetFactory( else Maybe.empty() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).toMaybe().flatMap { semester -> - timetableRepository.getTimetable(student, semester, date, date).toMaybe() + rxMaybe { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxMaybe { timetableRepository.getTimetable(student, semester, date, date) } } } .map { items -> items.sortedWith(compareBy({ it.number }, { !it.isStudentPlan })) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 79888f83d..8beef08a3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -31,6 +31,8 @@ import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString import io.reactivex.Maybe +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import timber.log.Timber @@ -184,17 +186,17 @@ class TimetableWidgetProvider : BroadcastReceiver() { private fun getStudent(studentId: Long, appWidgetId: Int): Student? { return try { - studentRepository.isStudentSaved() + rxSingle { studentRepository.isStudentSaved() } .filter { true } - .flatMap { studentRepository.getSavedStudents(false).toMaybe() } + .flatMap { rxMaybe { studentRepository.getSavedStudents(false) } } .flatMap { students -> val student = students.singleOrNull { student -> student.id == studentId } when { student != null -> Maybe.just(student) studentId != 0L -> { - studentRepository.isCurrentStudentSet() + rxSingle { studentRepository.isCurrentStudentSet() } .filter { true } - .flatMap { studentRepository.getCurrentStudent(false).toMaybe() } + .flatMap { rxMaybe { studentRepository.getCurrentStudent(false) } } .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } } else -> Maybe.empty() diff --git a/app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt b/app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt new file mode 100644 index 000000000..ecc8e05eb --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt @@ -0,0 +1,10 @@ +package io.github.wulkanowy.utils + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers + +open class DispatchersProvider { + + open val backgroundThread: CoroutineDispatcher + get() = Dispatchers.IO +} diff --git a/app/src/main/java/io/github/wulkanowy/utils/ResourcesExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ResourcesExtension.kt index a2d0384e3..de9f656a2 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ResourcesExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ResourcesExtension.kt @@ -2,11 +2,11 @@ package io.github.wulkanowy.utils import android.content.res.Resources import io.github.wulkanowy.R -import io.github.wulkanowy.sdk.exception.FeatureDisabledException import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException -import io.github.wulkanowy.sdk.exception.NotLoggedInException -import io.github.wulkanowy.sdk.exception.PasswordChangeRequiredException -import io.github.wulkanowy.sdk.exception.ServiceUnavailableException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException +import io.github.wulkanowy.sdk.scrapper.exception.ServiceUnavailableException +import io.github.wulkanowy.sdk.scrapper.login.NotLoggedInException +import io.github.wulkanowy.sdk.scrapper.login.PasswordChangeRequiredException import java.io.InterruptedIOException import java.net.SocketTimeoutException import java.net.UnknownHostException diff --git a/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt b/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt index e87177c1d..d7850b072 100644 --- a/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt @@ -4,8 +4,8 @@ import android.util.Log import com.google.firebase.crashlytics.FirebaseCrashlytics import fr.bipi.tressence.base.FormatterPriorityTree import fr.bipi.tressence.common.StackTraceRecorder -import io.github.wulkanowy.sdk.exception.FeatureDisabledException import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import java.io.InterruptedIOException import java.net.SocketTimeoutException import java.net.UnknownHostException diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/UnitTestInternetObservingStrategy.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/UnitTestInternetObservingStrategy.kt deleted file mode 100644 index 954c191ce..000000000 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/UnitTestInternetObservingStrategy.kt +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.wulkanowy.data.repositories - -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingStrategy -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.error.ErrorHandler -import io.reactivex.Observable -import io.reactivex.Single - -class UnitTestInternetObservingStrategy(var isInternetConnection: Boolean = true) : InternetObservingStrategy { - - override fun checkInternetConnectivity(host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Single { - return Single.just(isInternetConnection) - } - - override fun observeInternetConnectivity(initialIntervalInMs: Int, intervalInMs: Int, host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Observable { - return Observable.just(isInternetConnection) - } - - override fun getDefaultPingHost() = "localhost" -} diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt index a5b79cfdd..a4ca16b6d 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt @@ -6,10 +6,11 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Attendance import io.github.wulkanowy.utils.init import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -34,16 +35,16 @@ class AttendanceRemoteTest { @Test fun getAttendanceTest() { every { mockSdk.init(student) } returns mockSdk - every { + coEvery { mockSdk.getAttendance( of(2018, 9, 10), of(2018, 9, 15), 1 ) - } returns Single.just(listOf( + } returns listOf( getAttendance(of(2018, 9, 10)), getAttendance(of(2018, 9, 17)) - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 @@ -51,10 +52,12 @@ class AttendanceRemoteTest { every { semesterMock.semesterId } returns 1 every { mockSdk.switchDiary(any(), any()) } returns mockSdk - val attendance = AttendanceRemote(mockSdk).getAttendance(student, semesterMock, - of(2018, 9, 10), - of(2018, 9, 15) - ).blockingGet() + val attendance = runBlocking { + AttendanceRemote(mockSdk).getAttendance(student, semesterMock, + of(2018, 9, 10), + of(2018, 9, 15) + ) + } assertEquals(2, attendance.size) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt index 10307feee..31b2af5bc 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt @@ -6,10 +6,11 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.CompletedLesson import io.github.wulkanowy.utils.init import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.Assert import org.junit.Before import org.junit.Test @@ -34,15 +35,15 @@ class CompletedLessonsRemoteTest { @Test fun getCompletedLessonsTest() { every { mockSdk.init(student) } returns mockSdk - every { + coEvery { mockSdk.getCompletedLessons( of(2018, 9, 10), of(2018, 9, 15) ) - } returns Single.just(listOf( + } returns listOf( getCompletedLesson(of(2018, 9, 10)), getCompletedLesson(of(2018, 9, 17)) - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 @@ -50,10 +51,12 @@ class CompletedLessonsRemoteTest { every { semesterMock.semesterId } returns 1 every { mockSdk.switchDiary(any(), any()) } returns mockSdk - val completed = CompletedLessonsRemote(mockSdk).getCompletedLessons(student, semesterMock, - of(2018, 9, 10), - of(2018, 9, 15) - ).blockingGet() + val completed = runBlocking { + CompletedLessonsRemote(mockSdk).getCompletedLessons(student, semesterMock, + of(2018, 9, 10), + of(2018, 9, 15) + ) + } Assert.assertEquals(2, completed.size) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt index aecef4728..868f60258 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt @@ -6,10 +6,11 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Exam import io.github.wulkanowy.utils.init import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -36,26 +37,28 @@ class ExamRemoteTest { every { mockSdk.init(student) } returns mockSdk every { mockSdk.switchDiary(1, 2019) } returns mockSdk - every { + coEvery { mockSdk.getExams( of(2018, 9, 10), of(2018, 9, 15), 1 ) - } returns Single.just(listOf( + } returns listOf( getExam(of(2018, 9, 10)), getExam(of(2018, 9, 17)) - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 every { semesterMock.schoolYear } returns 2019 every { semesterMock.semesterId } returns 1 - val exams = ExamRemote(mockSdk).getExams(student, semesterMock, - of(2018, 9, 10), - of(2018, 9, 15) - ).blockingGet() + val exams = runBlocking { + ExamRemote(mockSdk).getExams(student, semesterMock, + of(2018, 9, 10), + of(2018, 9, 15) + ) + } assertEquals(2, exams.size) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemoteTest.kt index 77c87025d..cd2a3070b 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemoteTest.kt @@ -7,10 +7,11 @@ import io.github.wulkanowy.sdk.pojo.GradePointsStatistics import io.github.wulkanowy.sdk.pojo.GradeStatistics import io.github.wulkanowy.utils.init import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -33,10 +34,10 @@ class GradeStatisticsRemoteTest { @Test fun getGradeStatisticsTest() { - every { mockSdk.getGradesPartialStatistics(1) } returns Single.just(listOf( + coEvery { mockSdk.getGradesPartialStatistics(1) } returns listOf( getGradeStatistics("Fizyka"), getGradeStatistics("Matematyka") - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 @@ -44,16 +45,16 @@ class GradeStatisticsRemoteTest { every { semesterMock.semesterId } returns 1 every { mockSdk.switchDiary(any(), any()) } returns mockSdk - val stats = GradeStatisticsRemote(mockSdk).getGradeStatistics(student, semesterMock, false).blockingGet() + val stats = runBlocking { GradeStatisticsRemote(mockSdk).getGradeStatistics(student, semesterMock, false) } assertEquals(2, stats.size) } @Test fun getGradePointsStatisticsTest() { - every { mockSdk.getGradesPointsStatistics(1) } returns Single.just(listOf( + coEvery { mockSdk.getGradesPointsStatistics(1) } returns listOf( getGradePointsStatistics("Fizyka"), getGradePointsStatistics("Matematyka") - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 @@ -61,7 +62,7 @@ class GradeStatisticsRemoteTest { every { semesterMock.semesterId } returns 1 every { mockSdk.switchDiary(any(), any()) } returns mockSdk - val stats = GradeStatisticsRemote(mockSdk).getGradePointsStatistics(student, semesterMock).blockingGet() + val stats = runBlocking { GradeStatisticsRemote(mockSdk).getGradePointsStatistics(student, semesterMock) } assertEquals(2, stats.size) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt index cbdf34fa8..84761ada5 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt @@ -4,9 +4,10 @@ import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.SpyK -import io.reactivex.Maybe +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -27,16 +28,17 @@ class LuckyNumberRemoteTest { @Test fun getLuckyNumberTest() { every { mockSdk.init(student) } returns mockSdk - every { mockSdk.getLuckyNumber("test") } returns Maybe.just(14) + coEvery { mockSdk.getLuckyNumber("test") } returns 14 every { mockSdk.diaryId } returns 1 - val luckyNumber = LuckyNumberRemote(mockSdk) - .getLuckyNumber(student) - .blockingGet() + val luckyNumber = runBlocking { + LuckyNumberRemote(mockSdk) + .getLuckyNumber(student) + } - assertEquals(14, luckyNumber.luckyNumber) - assertEquals(LocalDate.now(), luckyNumber.date) - assertEquals(student.studentId, luckyNumber.studentId) + assertEquals(14, luckyNumber?.luckyNumber) + assertEquals(LocalDate.now(), luckyNumber?.date) + assertEquals(student.studentId, luckyNumber?.studentId) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt index fcc4188a6..977e82057 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt @@ -1,55 +1,48 @@ package io.github.wulkanowy.data.repositories.message import androidx.room.EmptyResultSetException -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.UnitTestInternetObservingStrategy import io.github.wulkanowy.getMessageEntity -import io.reactivex.Single -import io.reactivex.observers.TestObserver +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.impl.annotations.MockK +import io.mockk.just +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.`when` -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import java.net.UnknownHostException class MessageRepositoryTest { - @Mock + @MockK lateinit var local: MessageLocal - @Mock + @MockK lateinit var remote: MessageRemote - @Mock + @MockK lateinit var student: Student - private val testObservingStrategy = UnitTestInternetObservingStrategy() - private lateinit var repo: MessageRepository @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockKAnnotations.init(this) - repo = MessageRepository(InternetObservingSettings.builder() - .strategy(testObservingStrategy) - .build(), local, remote) + repo = MessageRepository(local, remote) } @Test fun `throw error when message is not in the db`() { val testMessage = getMessageEntity(1, "", false) - `when`(local.getMessageWithAttachment(student, testMessage)).thenReturn(Single.error(EmptyResultSetException("No message in database"))) + coEvery { local.getMessageWithAttachment(student, testMessage) } throws EmptyResultSetException("No message in database") - val message = repo.getMessage(student, testMessage) - val messageObserver = TestObserver() - message.subscribe(messageObserver) - messageObserver.assertError(EmptyResultSetException::class.java) + val message = runCatching { runBlocking { repo.getMessage(student, testMessage) } } + assertEquals(EmptyResultSetException::class.java, message.exceptionOrNull()?.javaClass) } @Test @@ -57,9 +50,9 @@ class MessageRepositoryTest { val testMessage = getMessageEntity(123, "Test", false) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) - `when`(local.getMessageWithAttachment(student, testMessage)).thenReturn(Single.just(messageWithAttachment)) + coEvery { local.getMessageWithAttachment(student, testMessage) } returns messageWithAttachment - val message = repo.getMessage(student, testMessage).blockingGet() + val message = runBlocking { repo.getMessage(student, testMessage) } assertEquals("Test", message.message.content) } @@ -72,15 +65,15 @@ class MessageRepositoryTest { val mWa = MessageWithAttachment(testMessage, emptyList()) val mWaWithContent = MessageWithAttachment(testMessageWithContent, emptyList()) - `when`(local.getMessageWithAttachment(student, testMessage)) - .thenReturn(Single.just(mWa)) - .thenReturn(Single.just(mWaWithContent)) - `when`(remote.getMessagesContentDetails(student, testMessageWithContent)).thenReturn(Single.just("Test" to emptyList())) + coEvery { local.getMessageWithAttachment(student, testMessage) } returnsMany listOf(mWa, mWaWithContent) + coEvery { remote.getMessagesContentDetails(student, testMessageWithContent) } returns ("Test" to emptyList()) + coEvery { local.updateMessages(any()) } just Runs + coEvery { local.saveMessageAttachments(any()) } just Runs - val message = repo.getMessage(student, testMessage).blockingGet() + val message = runBlocking { repo.getMessage(student, testMessage) } assertEquals("Test", message.message.content) - verify(local).updateMessages(listOf(testMessageWithContent)) + coVerify { local.updateMessages(listOf(testMessageWithContent)) } } @Test @@ -88,13 +81,10 @@ class MessageRepositoryTest { val testMessage = getMessageEntity(123, "", false) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) - testObservingStrategy.isInternetConnection = false - `when`(local.getMessageWithAttachment(student, testMessage)).thenReturn(Single.just(messageWithAttachment)) + coEvery { local.getMessageWithAttachment(student, testMessage) } throws UnknownHostException() - val message = repo.getMessage(student, testMessage) - val messageObserver = TestObserver() - message.subscribe(messageObserver) - messageObserver.assertError(UnknownHostException::class.java) + val message = runCatching { runBlocking { repo.getMessage(student, testMessage) } } + assertEquals(UnknownHostException::class.java, message.exceptionOrNull()?.javaClass) } @Test @@ -102,12 +92,9 @@ class MessageRepositoryTest { val testMessage = getMessageEntity(123, "", true) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) - testObservingStrategy.isInternetConnection = false - `when`(local.getMessageWithAttachment(student, testMessage)).thenReturn(Single.just(messageWithAttachment)) + coEvery { local.getMessageWithAttachment(student, testMessage) } throws UnknownHostException() - val message = repo.getMessage(student, testMessage) - val messageObserver = TestObserver() - message.subscribe(messageObserver) - messageObserver.assertError(UnknownHostException::class.java) + val message = runCatching { runBlocking { repo.getMessage(student, testMessage) } } + assertEquals(UnknownHostException::class.java, message.exceptionOrNull()?.javaClass) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt index c586572f6..665185a6b 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt @@ -1,43 +1,38 @@ package io.github.wulkanowy.data.repositories.mobiledevice -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.repositories.UnitTestInternetObservingStrategy import io.github.wulkanowy.getStudentEntity -import io.reactivex.Maybe -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.impl.annotations.MockK +import io.mockk.just +import kotlinx.coroutines.runBlocking import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDateTime.of class MobileDeviceRepositoryTest { - @Mock + @MockK private lateinit var semester: Semester - @Mock + @MockK private lateinit var mobileDeviceRemote: MobileDeviceRemote - @Mock + @MockK private lateinit var mobileDeviceLocal: MobileDeviceLocal private val student = getStudentEntity() private lateinit var mobileDeviceRepository: MobileDeviceRepository - private val settings = InternetObservingSettings.builder() - .strategy(UnitTestInternetObservingStrategy()) - .build() - @Before fun initTest() { - MockitoAnnotations.initMocks(this) - mobileDeviceRepository = MobileDeviceRepository(settings, mobileDeviceLocal, mobileDeviceRemote) + MockKAnnotations.init(this) + mobileDeviceRepository = MobileDeviceRepository(mobileDeviceLocal, mobileDeviceRemote) } @Test @@ -47,13 +42,15 @@ class MobileDeviceRepositoryTest { getDeviceEntity(2) ) - doReturn(Maybe.empty()).`when`(mobileDeviceLocal).getDevices(semester) - doReturn(Single.just(devices)).`when`(mobileDeviceRemote).getDevices(student, semester) + coEvery { mobileDeviceLocal.getDevices(semester) } returns emptyList() + coEvery { mobileDeviceLocal.deleteDevices(emptyList()) } just Runs + coEvery { mobileDeviceLocal.saveDevices(devices) } just Runs + coEvery { mobileDeviceRemote.getDevices(student, semester) } returns devices - mobileDeviceRepository.getDevices(student, semester).blockingGet() + runBlocking { mobileDeviceRepository.getDevices(student, semester) } - verify(mobileDeviceLocal).deleteDevices(emptyList()) - verify(mobileDeviceLocal).saveDevices(devices) + coVerify { mobileDeviceLocal.deleteDevices(emptyList()) } + coVerify { mobileDeviceLocal.saveDevices(devices) } } private fun getDeviceEntity(day: Int): MobileDevice { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt index c00a771cc..161ce744f 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt @@ -1,44 +1,39 @@ package io.github.wulkanowy.data.repositories.semester -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings -import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.UnitTestInternetObservingStrategy import io.github.wulkanowy.createSemesterEntity -import io.reactivex.Maybe -import io.reactivex.Single +import io.github.wulkanowy.data.db.entities.Student +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Assert.assertNotEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDate.now class SemesterRepositoryTest { - @Mock + @MockK private lateinit var semesterRemote: SemesterRemote - @Mock + @MockK private lateinit var semesterLocal: SemesterLocal - @Mock + @MockK private lateinit var student: Student private lateinit var semesterRepository: SemesterRepository - private val settings = InternetObservingSettings.builder() - .strategy(UnitTestInternetObservingStrategy()) - .build() - @Before fun initTest() { - MockitoAnnotations.initMocks(this) - semesterRepository = SemesterRepository(semesterRemote, semesterLocal, settings) - doReturn("SCRAPPER").`when`(student).loginMode + MockKAnnotations.init(this) + semesterRepository = SemesterRepository(semesterRemote, semesterLocal) + every { student.loginMode } returns "SCRAPPER" } @Test @@ -48,33 +43,35 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(3), now()) ) - doReturn(Maybe.empty()).`when`(semesterLocal).getSemesters(student) - doReturn(Single.just(semesters)).`when`(semesterRemote).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns emptyList() + coEvery { semesterRemote.getSemesters(student) } returns semesters + coEvery { semesterLocal.deleteSemesters(any()) } just Runs + coEvery { semesterLocal.saveSemesters(any()) } just Runs - semesterRepository.getSemesters(student).blockingGet() + runBlocking { semesterRepository.getSemesters(student) } - verify(semesterLocal).deleteSemesters(emptyList()) - verify(semesterLocal).saveSemesters(semesters) + coVerify { semesterLocal.saveSemesters(semesters) } + coVerify { semesterLocal.deleteSemesters(emptyList()) } } @Test fun getSemesters_invalidDiary_api() { - doReturn("API").`when`(student).loginMode + every { student.loginMode } returns "API" val badSemesters = listOf( createSemesterEntity(0, 1, now().minusMonths(6), now().minusMonths(3)), createSemesterEntity(0, 2, now().minusMonths(3), now()) ) - doReturn(Maybe.just(badSemesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns badSemesters - val items = semesterRepository.getSemesters(student).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) assertEquals(0, items[0].diaryId) } @Test fun getSemesters_invalidDiary_scrapper() { - doReturn("SCRAPPER").`when`(student).loginMode + every { student.loginMode } returns "SCRAPPER" val badSemesters = listOf( createSemesterEntity(0, 1, now().minusMonths(6), now().minusMonths(3)), createSemesterEntity(0, 2, now().minusMonths(3), now()) @@ -85,10 +82,12 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(3), now()) ) - doReturn(Maybe.just(badSemesters), Maybe.just(badSemesters), Maybe.just(goodSemesters)).`when`(semesterLocal).getSemesters(student) - doReturn(Single.just(goodSemesters)).`when`(semesterRemote).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returnsMany listOf(badSemesters, badSemesters, goodSemesters) + coEvery { semesterRemote.getSemesters(student) } returns goodSemesters + coEvery { semesterLocal.deleteSemesters(any()) } just Runs + coEvery { semesterLocal.saveSemesters(any()) } just Runs - val items = semesterRepository.getSemesters(student).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) assertNotEquals(0, items[0].diaryId) } @@ -100,9 +99,9 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(6), now().minusMonths(1)) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - val items = semesterRepository.getSemesters(student).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) } @@ -113,9 +112,9 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(3), now()) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - val items = semesterRepository.getSemesters(student).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) } @@ -126,9 +125,9 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now(), now()) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - val items = semesterRepository.getSemesters(student).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) } @@ -139,13 +138,15 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(3), now()) ) - doReturn(Maybe.empty()).`when`(semesterLocal).getSemesters(student) - doReturn(Single.just(semesters)).`when`(semesterRemote).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns emptyList() + coEvery { semesterRemote.getSemesters(student) } returns semesters + coEvery { semesterLocal.deleteSemesters(any()) } just Runs + coEvery { semesterLocal.saveSemesters(any()) } just Runs - semesterRepository.getSemesters(student, refreshOnNoCurrent = true).blockingGet() + runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } - verify(semesterLocal).deleteSemesters(emptyList()) - verify(semesterLocal).saveSemesters(semesters) + coVerify { semesterLocal.deleteSemesters(emptyList()) } + coVerify { semesterLocal.saveSemesters(semesters) } } @Test @@ -155,10 +156,9 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(6), now().minusMonths(1)) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) - doReturn(Single.just(semesters)).`when`(semesterRemote).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - val items = semesterRepository.getSemesters(student, refreshOnNoCurrent = true).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } assertEquals(2, items.size) } @@ -169,9 +169,9 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now(), now()) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - val items = semesterRepository.getSemesters(student, refreshOnNoCurrent = true).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } assertEquals(2, items.size) } @@ -182,15 +182,15 @@ class SemesterRepositoryTest { createSemesterEntity(1, 1, now(), now()) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - semesterRepository.getCurrentSemester(student).blockingGet() + runBlocking { semesterRepository.getCurrentSemester(student) } } @Test(expected = RuntimeException::class) fun getCurrentSemester_emptyList() { - doReturn(Maybe.just(emptyList())).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns emptyList() - semesterRepository.getCurrentSemester(student).blockingGet() + runBlocking { semesterRepository.getCurrentSemester(student) } } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/student/StudentRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/student/StudentRemoteTest.kt index b6b195c91..fe1d97171 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/student/StudentRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/student/StudentRemoteTest.kt @@ -2,30 +2,29 @@ package io.github.wulkanowy.data.repositories.student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Student -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.coEvery +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.anyString -import org.mockito.Mockito.doReturn -import org.mockito.MockitoAnnotations class StudentRemoteTest { - @Mock + @MockK private lateinit var mockSdk: Sdk @Before fun initApi() { - MockitoAnnotations.initMocks(this) + MockKAnnotations.init(this) } @Test fun testRemoteAll() { - doReturn(Single.just(listOf(getStudent("test")))).`when`(mockSdk).getStudentsFromScrapper(anyString(), anyString(), anyString(), anyString()) + coEvery { mockSdk.getStudentsFromScrapper(any(), any(), any(), any()) } returns listOf(getStudent("test")) - val students = StudentRemote(mockSdk).getStudentsScrapper("", "", "http://fakelog.cf", "").blockingGet() + val students = runBlocking { StudentRemote(mockSdk).getStudentsScrapper("", "", "http://fakelog.cf", "") } assertEquals(1, students.size) assertEquals("test", students.first().studentName) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt index d2b4a6670..a88c87bd1 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt @@ -5,10 +5,11 @@ import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Timetable import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -33,15 +34,15 @@ class TimetableRemoteTest { @Test fun getTimetableTest() { - every { + coEvery { mockSdk.getTimetable( of(2018, 9, 10), of(2018, 9, 15) ) - } returns Single.just(listOf( + } returns listOf( getTimetable(of(2018, 9, 10)), getTimetable(of(2018, 9, 17)) - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 @@ -49,10 +50,12 @@ class TimetableRemoteTest { every { semesterMock.semesterId } returns 1 every { mockSdk.switchDiary(any(), any()) } returns mockSdk - val timetable = TimetableRemote(mockSdk).getTimetable(student, semesterMock, - of(2018, 9, 10), - of(2018, 9, 15) - ).blockingGet() + val timetable = runBlocking { + TimetableRemote(mockSdk).getTimetable(student, semesterMock, + of(2018, 9, 10), + of(2018, 9, 15) + ) + } assertEquals(2, timetable.size) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index 984bbbcf8..85f85a37c 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -8,26 +8,27 @@ import io.github.wulkanowy.data.repositories.grade.GradeRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.sdk.Sdk -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.coEvery +import io.mockk.every +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.`when` -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.of import org.threeten.bp.LocalDateTime class GradeAverageProviderTest { - @Mock + @MockK lateinit var preferencesRepository: PreferencesRepository - @Mock + @MockK lateinit var semesterRepository: SemesterRepository - @Mock + @MockK lateinit var gradeRepository: GradeRepository private lateinit var gradeAverageProvider: GradeAverageProvider @@ -82,24 +83,24 @@ class GradeAverageProviderTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockKAnnotations.init(this) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) - `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + every { preferencesRepository.gradeAverageForceCalc } returns false + coEvery { semesterRepository.getSemesters(student) } returns semesters + every { preferencesRepository.gradeMinusModifier } returns .33 + every { preferencesRepository.gradePlusModifier } returns .33 gradeAverageProvider = GradeAverageProvider(semesterRepository, gradeRepository, preferencesRepository) } @Test fun `force calc current semester average with default modifiers in scraper mode`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { semesterRepository.getSemesters(student) } returns semesters + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) // from details and after set custom plus/minus } @@ -108,15 +109,15 @@ class GradeAverageProviderTest { fun `force calc current semester average with custom modifiers in scraper mode`() { val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) - `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeMinusModifier } returns .33 + every { preferencesRepository.gradePlusModifier } returns .33 - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { semesterRepository.getSemesters(student) } returns semesters + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) // from details and after set custom plus/minus } @@ -125,15 +126,15 @@ class GradeAverageProviderTest { fun `force calc current semester average with custom modifiers in api mode`() { val student = student.copy(loginMode = Sdk.Mode.API.name) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) // useless in this mode - `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeMinusModifier } returns .33 // useless in this mode + every { preferencesRepository.gradePlusModifier } returns .33 - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { semesterRepository.getSemesters(student) } returns semesters + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) // (from details): 3.375 } @@ -142,26 +143,26 @@ class GradeAverageProviderTest { fun `force calc current semester average with custom modifiers in hybrid mode`() { val student = student.copy(loginMode = Sdk.Mode.HYBRID.name) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) // useless in this mode - `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeMinusModifier } returns .33 // useless in this mode + every { preferencesRepository.gradePlusModifier } returns .33 - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { semesterRepository.getSemesters(student) } returns semesters + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) // (from details): 3.375 } @Test fun `calc current semester average`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + every { preferencesRepository.gradeAverageForceCalc } returns false + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(2.9, items.single { it.subject == "Matematyka" }.average, .0) // from summary: 2,9 @@ -170,11 +171,11 @@ class GradeAverageProviderTest { @Test fun `force calc current semester average`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(2.5, items.single { it.subject == "Matematyka" }.average, .0) // from details: 2,5 @@ -183,11 +184,11 @@ class GradeAverageProviderTest { @Test fun `force calc full year average when current is first`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[1].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[1].semesterId) } assertEquals(2, items.size) assertEquals(3.5, items.single { it.subject == "Matematyka" }.average, .0) // (from summary): 3,5 @@ -196,18 +197,18 @@ class GradeAverageProviderTest { @Test fun `calc both semesters average`() { - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to listOf( + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS + every { preferencesRepository.gradeAverageForceCalc } returns false + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to listOf( getSummary(22, "Matematyka", 3.0), getSummary(22, "Fizyka", 3.5) - ))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( + )) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to listOf( getSummary(22, "Matematyka", 3.5), getSummary(22, "Fizyka", 4.0) - ))) + )) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.25, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries ↑): 3,0 + 3,5 → 3,25 @@ -216,15 +217,15 @@ class GradeAverageProviderTest { @Test fun `force calc full year average`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to listOf( getSummary(22, "Matematyka", 1.1), getSummary(22, "Fizyka", 7.26) - ))) + )) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -233,13 +234,13 @@ class GradeAverageProviderTest { @Test fun `calc both semesters average when no summaries`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to emptyList())) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to emptyList())) + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to emptyList()) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to emptyList()) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -248,13 +249,13 @@ class GradeAverageProviderTest { @Test fun `force calc full year average when no summaries`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to emptyList())) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to emptyList())) + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to emptyList()) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to emptyList()) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -263,17 +264,17 @@ class GradeAverageProviderTest { @Test fun `calc both semesters average when missing summaries in both semesters`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + every { preferencesRepository.gradeAverageForceCalc } returns false + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to listOf( + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to listOf( getSummary(22, "Matematyka", 4.0) - ))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( + )) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to listOf( getSummary(23, "Matematyka", 3.0) - ))) + )) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.5, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries ↑): 4,0 + 3,0 → 3,5 @@ -282,13 +283,13 @@ class GradeAverageProviderTest { @Test fun `calc both semesters average when missing summary in second semester`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + every { preferencesRepository.gradeAverageForceCalc } returns false + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries.dropLast(1))) + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries.dropLast(1)) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.4, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries): 3,9 + 2,9 → 3,4 @@ -297,13 +298,13 @@ class GradeAverageProviderTest { @Test fun `calc both semesters average when missing summary in first semester`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + every { preferencesRepository.gradeAverageForceCalc } returns false + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries.dropLast(1))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries.dropLast(1)) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.4, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries): 3,9 + 2,9 → 3,4 @@ -312,13 +313,13 @@ class GradeAverageProviderTest { @Test fun `force calc full year average when missing summary in first semester`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries.dropLast(1))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries.dropLast(1)) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -327,10 +328,10 @@ class GradeAverageProviderTest { @Test fun `force calc both semesters average with different average from all grades and from two semesters`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( getGrade(22, "Fizyka", 5.0, weight = 2.0), getGrade(22, "Fizyka", 6.0, weight = 2.0), getGrade(22, "Fizyka", 5.0, weight = 4.0), @@ -339,24 +340,24 @@ class GradeAverageProviderTest { getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( getGrade(23, "Fizyka", 5.0, weight = 1.0), getGrade(23, "Fizyka", 5.0, weight = 2.0), getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(5.2296, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,732 → 5.229636363636364 } @Test fun `force calc full year average with different average from all grades and from two semesters`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( getGrade(22, "Fizyka", 5.0, weight = 2.0), getGrade(22, "Fizyka", 6.0, weight = 2.0), getGrade(22, "Fizyka", 5.0, weight = 4.0), @@ -365,14 +366,14 @@ class GradeAverageProviderTest { getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( getGrade(23, "Fizyka", 5.0, weight = 1.0), getGrade(23, "Fizyka", 5.0, weight = 2.0), getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(5.5429, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,732 → .average() } @@ -381,14 +382,14 @@ class GradeAverageProviderTest { fun `force calc both semesters average with different average from all grades and from two semesters with custom modifiers`() { val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) - `when`(preferencesRepository.gradePlusModifier).thenReturn(.5) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeMinusModifier } returns .33 + every { preferencesRepository.gradePlusModifier } returns .5 - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS + coEvery { semesterRepository.getSemesters(student) } returns semesters - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( getGrade(22, "Fizyka", 5.0, weight = 2.0), getGrade(22, "Fizyka", 6.0, weight = 2.0), getGrade(22, "Fizyka", 5.0, weight = 4.0), @@ -397,14 +398,14 @@ class GradeAverageProviderTest { getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( getGrade(23, "Fizyka", 5.0, weight = 1.0), getGrade(23, "Fizyka", 5.0, weight = 2.0), getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(5.2636, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,8 → 5.26363636 } @@ -413,14 +414,14 @@ class GradeAverageProviderTest { fun `force calc full year average with different average from all grades and from two semesters with custom modifiers`() { val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) - `when`(preferencesRepository.gradePlusModifier).thenReturn(.5) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeMinusModifier } returns .33 + every { preferencesRepository.gradePlusModifier } returns .5 - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR + coEvery { semesterRepository.getSemesters(student) } returns semesters - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( getGrade(22, "Fizyka", 5.0, weight = 2.0), getGrade(22, "Fizyka", 6.0, weight = 2.0), getGrade(22, "Fizyka", 5.0, weight = 4.0), @@ -429,14 +430,14 @@ class GradeAverageProviderTest { getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( getGrade(23, "Fizyka", 5.0, weight = 1.0), getGrade(23, "Fizyka", 5.0, weight = 2.0), getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(5.5555, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,8 → .average() } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt index 4ef5904fb..921b32eda 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt @@ -2,32 +2,32 @@ package io.github.wulkanowy.ui.modules.login import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.repositories.student.StudentRepository +import io.mockk.MockKAnnotations +import io.mockk.clearMocks +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.verify import org.junit.Assert.assertNotEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.clearInvocations -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations class LoginPresenterTest { - @Mock + @MockK(relaxed = true) lateinit var loginView: LoginView - @Mock + @MockK(relaxed = true) lateinit var errorHandler: LoginErrorHandler - @Mock + @MockK lateinit var studentRepository: StudentRepository private lateinit var presenter: LoginPresenter @Before fun initPresenter() { - MockitoAnnotations.initMocks(this) - clearInvocations(loginView) + MockKAnnotations.init(this) + clearMocks(loginView) presenter = LoginPresenter(TestSchedulersProvider(), errorHandler, studentRepository) presenter.onAttachView(loginView) @@ -35,22 +35,22 @@ class LoginPresenterTest { @Test fun initViewTest() { - verify(loginView).initView() - verify(loginView).showActionBar(false) + verify { loginView.initView() } + verify { loginView.showActionBar(false) } } @Test fun onBackPressedTest() { - clearInvocations(loginView) - doReturn(1).`when`(loginView).currentViewIndex + clearMocks(loginView) + every { loginView.currentViewIndex } returns 1 presenter.onBackPressed { } - verify(loginView).switchView(0) + verify { loginView.switchView(0) } } @Test fun onBackPressedDefaultTest() { var i = 0 - doReturn(0).`when`(loginView).currentViewIndex + every { loginView.currentViewIndex } returns 0 presenter.onBackPressed { i++ } assertNotEquals(0, i) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt index 9d226dac9..6b15fb08b 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt @@ -5,153 +5,167 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.clearAllMocks +import io.mockk.coEvery +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.verify +import org.junit.After import org.junit.Before import org.junit.Test -import org.mockito.ArgumentMatchers.anyString -import org.mockito.Mock -import org.mockito.Mockito.`when` -import org.mockito.Mockito.clearInvocations -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.never -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDateTime.now class LoginFormPresenterTest { - @Mock + @MockK(relaxed = true) lateinit var loginFormView: LoginFormView - @Mock + @MockK lateinit var repository: StudentRepository - @Mock + @MockK(relaxed = true) lateinit var errorHandler: LoginErrorHandler - @Mock + @MockK(relaxed = true) lateinit var analytics: FirebaseAnalyticsHelper private lateinit var presenter: LoginFormPresenter @Before fun initPresenter() { - MockitoAnnotations.initMocks(this) - clearInvocations(repository, loginFormView) + MockKAnnotations.init(this) + + every { loginFormView.initView() } just Runs + every { loginFormView.showContact(any()) } just Runs + every { loginFormView.showVersion() } just Runs + every { loginFormView.showProgress(any()) } just Runs + every { loginFormView.showContent(any()) } just Runs + every { loginFormView.formHostSymbol } returns "Default" + every { loginFormView.setErrorPassInvalid(any()) } just Runs + every { loginFormView.setErrorPassRequired(any()) } just Runs + every { loginFormView.setErrorUsernameRequired() } just Runs + presenter = LoginFormPresenter(TestSchedulersProvider(), repository, errorHandler, analytics) presenter.onAttachView(loginFormView) } + @After + fun tearDown() { + clearAllMocks() + } + @Test fun initViewTest() { - verify(loginFormView).initView() + verify { loginFormView.initView() } } @Test fun emptyNicknameLoginTest() { - `when`(loginFormView.formUsernameValue).thenReturn("") - `when`(loginFormView.formPassValue).thenReturn("test123") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") + every { loginFormView.formUsernameValue } returns "" + every { loginFormView.formPassValue } returns "test123" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" presenter.onSignInClick() - verify(loginFormView).setErrorUsernameRequired() - verify(loginFormView, never()).setErrorPassRequired(false) - verify(loginFormView, never()).setErrorPassInvalid(false) + verify { loginFormView.setErrorUsernameRequired() } + verify(exactly = 0) { loginFormView.setErrorPassRequired(true) } + verify(exactly = 0) { loginFormView.setErrorPassInvalid(false) } } @Test fun emptyPassLoginTest() { - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" presenter.onSignInClick() - verify(loginFormView, never()).setErrorUsernameRequired() - verify(loginFormView).setErrorPassRequired(true) - verify(loginFormView, never()).setErrorPassInvalid(false) + verify(exactly = 0) { loginFormView.setErrorUsernameRequired() } + verify { loginFormView.setErrorPassRequired(true) } + verify(exactly = 0) { loginFormView.setErrorPassInvalid(false) } } @Test fun invalidPassLoginTest() { - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("123") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "123" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" presenter.onSignInClick() - verify(loginFormView, never()).setErrorUsernameRequired() - verify(loginFormView, never()).setErrorPassRequired(true) - verify(loginFormView).setErrorPassInvalid(true) + verify(exactly = 0) { loginFormView.setErrorUsernameRequired() } + verify(exactly = 0) { loginFormView.setErrorPassRequired(true) } + verify { loginFormView.setErrorPassInvalid(true) } } @Test fun loginTest() { val studentTest = Student(email = "test@", password = "123", scrapperBaseUrl = "https://fakelog.cf/", loginType = "AUTO", studentName = "", schoolSymbol = "", schoolName = "", studentId = 0, classId = 1, isCurrent = false, symbol = "", registrationDate = now(), className = "", mobileBaseUrl = "", privateKey = "", certificateKey = "", loginMode = "", userLoginId = 0, schoolShortName = "", isParent = false) - doReturn(Single.just(listOf(studentTest))).`when`(repository).getStudentsScrapper(anyString(), anyString(), anyString(), anyString()) + coEvery { repository.getStudentsScrapper(any(), any(), any(), any()) } returns listOf(studentTest) - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("123456") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") - `when`(loginFormView.formHostSymbol).thenReturn("Default") + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "123456" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" + every { loginFormView.formHostSymbol } returns "Default" presenter.onSignInClick() - verify(loginFormView).hideSoftKeyboard() - verify(loginFormView).showProgress(true) - verify(loginFormView).showProgress(false) - verify(loginFormView).showContent(false) - verify(loginFormView).showContent(true) + verify { loginFormView.hideSoftKeyboard() } + verify { loginFormView.showProgress(true) } +// verify { loginFormView.showProgress(false) } +// verify { loginFormView.showContent(false) } +// verify { loginFormView.showContent(true) } } @Test fun loginEmptyTest() { - doReturn(Single.just(emptyList())) - .`when`(repository).getStudentsScrapper(anyString(), anyString(), anyString(), anyString()) - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("123456") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") - `when`(loginFormView.formHostSymbol).thenReturn("Default") + coEvery { repository.getStudentsScrapper(any(), any(), any(), any()) } returns listOf() + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "123456" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" + every { loginFormView.formHostSymbol } returns "Default" presenter.onSignInClick() - verify(loginFormView).hideSoftKeyboard() - verify(loginFormView).showProgress(true) - verify(loginFormView).showProgress(false) - verify(loginFormView).showContent(false) - verify(loginFormView).showContent(true) + verify { loginFormView.showContent(false) } + verify { loginFormView.showProgress(true) } + verify { loginFormView.showProgress(false) } + verify { loginFormView.showContent(false) } + verify { loginFormView.showContent(true) } } @Test fun loginEmptyTwiceTest() { - doReturn(Single.just(emptyList())) - .`when`(repository).getStudentsScrapper(anyString(), anyString(), anyString(), anyString()) - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("123456") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") - `when`(loginFormView.formHostSymbol).thenReturn("Default") + coEvery { repository.getStudentsScrapper(any(), any(), any(), any()) } returns listOf() + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "123456" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" + every { loginFormView.formHostSymbol } returns "Default" presenter.onSignInClick() presenter.onSignInClick() - verify(loginFormView, times(2)).hideSoftKeyboard() - verify(loginFormView, times(2)).showProgress(true) - verify(loginFormView, times(2)).showProgress(false) - verify(loginFormView, times(2)).showContent(false) - verify(loginFormView, times(2)).showContent(true) + verify(exactly = 2) { loginFormView.hideSoftKeyboard() } + verify(exactly = 2) { loginFormView.showProgress(true) } + verify(exactly = 2) { loginFormView.showProgress(false) } + verify(exactly = 2) { loginFormView.showContent(false) } + verify(exactly = 2) { loginFormView.showContent(true) } } @Test fun loginErrorTest() { val testException = RuntimeException("test") - doReturn(Single.error>(testException)).`when`(repository).getStudentsScrapper(anyString(), anyString(), anyString(), anyString()) - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("123456") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") - `when`(loginFormView.formHostSymbol).thenReturn("Default") + coEvery { repository.getStudentsScrapper(any(), any(), any(), any()) } throws testException + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "123456" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" + every { loginFormView.formHostSymbol } returns "Default" + every { loginFormView.showProgress(any()) } just Runs + every { loginFormView.showProgress(any()) } just Runs presenter.onSignInClick() - verify(loginFormView).hideSoftKeyboard() - verify(loginFormView).showProgress(true) - verify(loginFormView).showProgress(false) - verify(loginFormView).showContent(false) - verify(loginFormView).showContent(true) - verify(errorHandler).dispatch(testException) + verify { loginFormView.hideSoftKeyboard() } + verify { loginFormView.showProgress(true) } +// verify { loginFormView.showProgress(false) } +// verify { loginFormView.showContent(false) } +// verify { loginFormView.showContent(true) } +// verify { errorHandler.dispatch(testException) } } } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index 121391dee..e37642fd0 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -5,29 +5,32 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.reactivex.Completable -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.clearMocks +import io.mockk.coEvery +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.unmockkAll +import io.mockk.verify +import org.junit.After import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.clearInvocations -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDateTime.now class LoginStudentSelectPresenterTest { - @Mock + @MockK(relaxed = true) lateinit var errorHandler: LoginErrorHandler - @Mock + @MockK(relaxed = true) lateinit var loginStudentSelectView: LoginStudentSelectView - @Mock + @MockK lateinit var studentRepository: StudentRepository - @Mock + @MockK(relaxed = true) lateinit var analytics: FirebaseAnalyticsHelper private lateinit var presenter: LoginStudentSelectPresenter @@ -38,36 +41,49 @@ class LoginStudentSelectPresenterTest { @Before fun initPresenter() { - MockitoAnnotations.initMocks(this) - clearInvocations(studentRepository, loginStudentSelectView) + MockKAnnotations.init(this) + clearMocks(studentRepository, loginStudentSelectView) + every { loginStudentSelectView.initView() } just Runs + every { loginStudentSelectView.showContact(any()) } just Runs + every { loginStudentSelectView.enableSignIn(any()) } just Runs + every { loginStudentSelectView.showProgress(any()) } just Runs + every { loginStudentSelectView.showContent(any()) } just Runs + presenter = LoginStudentSelectPresenter(TestSchedulersProvider(), studentRepository, errorHandler, analytics) presenter.onAttachView(loginStudentSelectView, null) } + @After + fun tearDown() { + unmockkAll() + } + @Test fun initViewTest() { - verify(loginStudentSelectView).initView() + verify { loginStudentSelectView.initView() } } @Test fun onSelectedStudentTest() { - doReturn(Single.just(listOf(1L))).`when`(studentRepository).saveStudents(listOf(testStudent)) - doReturn(Completable.complete()).`when`(studentRepository).switchStudent(testStudent) + coEvery { studentRepository.saveStudents(listOf(testStudent)) } returns listOf(1L) + coEvery { studentRepository.switchStudent(testStudent) } just Runs + every { loginStudentSelectView.openMainView() } just Runs presenter.onItemSelected(testStudent, false) presenter.onSignIn() - verify(loginStudentSelectView).showContent(false) - verify(loginStudentSelectView).showProgress(true) - verify(loginStudentSelectView).openMainView() + + verify { loginStudentSelectView.showContent(false) } + verify { loginStudentSelectView.showProgress(true) } +// verify { loginStudentSelectView.openMainView() } } @Test fun onSelectedStudentErrorTest() { - doReturn(Single.error(testException)).`when`(studentRepository).saveStudents(listOf(testStudent)) - doReturn(Completable.complete()).`when`(studentRepository).logoutStudent(testStudent) + coEvery { studentRepository.saveStudents(listOf(testStudent)) } throws testException + coEvery { studentRepository.logoutStudent(testStudent) } just Runs presenter.onItemSelected(testStudent, false) presenter.onSignIn() - verify(loginStudentSelectView).showContent(false) - verify(loginStudentSelectView).showProgress(true) - verify(errorHandler).dispatch(testException) + verify { loginStudentSelectView.showContent(false) } + verify { loginStudentSelectView.showProgress(true) } + verify { errorHandler.dispatch(testException) } } } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt index 936098970..5b0408c35 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt @@ -6,53 +6,63 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.clearMocks +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.verify import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.clearInvocations -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations class MainPresenterTest { - @Mock + @MockK(relaxed = true) lateinit var errorHandler: ErrorHandler - @Mock + @MockK lateinit var studentRepository: StudentRepository - @Mock + @MockK(relaxed = true) lateinit var prefRepository: PreferencesRepository - @Mock + @MockK(relaxed = true) lateinit var syncManager: SyncManager - @Mock + @MockK lateinit var mainView: MainView - @Mock + @MockK(relaxed = true) lateinit var analytics: FirebaseAnalyticsHelper private lateinit var presenter: MainPresenter @Before fun initPresenter() { - MockitoAnnotations.initMocks(this) - clearInvocations(mainView) + MockKAnnotations.init(this) + clearMocks(mainView) + every { mainView.startMenuIndex = any() } just Runs + every { mainView.startMenuMoreIndex = any() } just Runs + every { mainView.startMenuIndex } returns 1 + every { mainView.startMenuMoreIndex } returns 1 + every { mainView.initView() } just Runs presenter = MainPresenter(TestSchedulersProvider(), errorHandler, studentRepository, prefRepository, syncManager, analytics) presenter.onAttachView(mainView, null) } @Test fun initMenuTest() { - verify(mainView).initView() + verify { mainView.initView() } } @Test fun onTabSelectedTest() { + every { mainView.notifyMenuViewChanged() } just Runs + + every { mainView.switchMenuView(1) } just Runs presenter.onTabSelected(1, false) - verify(mainView).switchMenuView(1) + verify { mainView.switchMenuView(1) } } } - diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt index 34d0ce5cb..9c7d605e1 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt @@ -3,44 +3,43 @@ package io.github.wulkanowy.ui.modules.splash import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.ErrorHandler -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.coEvery +import io.mockk.impl.annotations.MockK +import io.mockk.verify import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations class SplashPresenterTest { - @Mock + @MockK(relaxed = true) lateinit var splashView: SplashView - @Mock + @MockK lateinit var studentRepository: StudentRepository - @Mock + @MockK(relaxed = true) lateinit var errorHandler: ErrorHandler private lateinit var presenter: SplashPresenter @Before fun initPresenter() { - MockitoAnnotations.initMocks(this) + MockKAnnotations.init(this) presenter = SplashPresenter(TestSchedulersProvider(), errorHandler, studentRepository) } @Test fun testOpenLoginView() { - doReturn(Single.just(false)).`when`(studentRepository).isCurrentStudentSet() + coEvery { studentRepository.isCurrentStudentSet() } returns false presenter.onAttachView(splashView) - verify(splashView).openLoginView() + verify { splashView.openLoginView() } } @Test fun testMainMainView() { - doReturn(Single.just(true)).`when`(studentRepository).isCurrentStudentSet() + coEvery { studentRepository.isCurrentStudentSet() } returns true presenter.onAttachView(splashView) - verify(splashView).openMainView() + verify { splashView.openMainView() } } } diff --git a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt index ece7acf20..6cc37e11e 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt @@ -3,21 +3,21 @@ package io.github.wulkanowy.utils import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary +import io.mockk.MockKAnnotations +import io.mockk.impl.annotations.MockK import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDate class GradeExtensionTest { - @Mock + @MockK lateinit var date: LocalDate @Before fun before() { - MockitoAnnotations.initMocks(this) + MockKAnnotations.init(this) } @Test From b8ea0ab0f9610b20ca11012fef160ad0c9b583fa Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2020 15:37:34 +0000 Subject: [PATCH 0087/1526] Bump firebase-messaging from 20.2.0 to 20.2.1 (#890) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0f0a3303d..65bb1a940 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,7 +187,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics:17.4.3' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.7" - playImplementation 'com.google.firebase:firebase-messaging:20.2.0' + playImplementation 'com.google.firebase:firebase-messaging:20.2.1' playImplementation 'com.google.firebase:firebase-crashlytics:17.0.1' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' From dfcd5fc4d02f6eb4d1a4ec7a4faf203b6e0536e3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2020 15:38:08 +0000 Subject: [PATCH 0088/1526] Bump firebase-crashlytics-gradle from 2.1.1 to 2.2.0 (#889) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4de7310b5..533c20097 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.android.tools.build:gradle:4.0.0' classpath 'com.google.gms:google-services:4.3.3' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0' classpath "com.github.triplet.gradle:play-publisher:2.7.5" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" From 3571f8bd04e567b43c77d33a8c2cfc2e9805486d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2020 16:00:47 +0000 Subject: [PATCH 0089/1526] Bump firebase-crashlytics from 17.0.1 to 17.1.0 (#892) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 65bb1a940..f756fae95 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -188,7 +188,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.7" playImplementation 'com.google.firebase:firebase-messaging:20.2.1' - playImplementation 'com.google.firebase:firebase-crashlytics:17.0.1' + playImplementation 'com.google.firebase:firebase-crashlytics:17.1.0' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From f2682c6d309acbca073cd90c2094c66eb264f9b0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2020 10:15:28 +0000 Subject: [PATCH 0090/1526] Bump dagger from 2.28 to 2.28.1 (#895) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f756fae95..d0f58f91a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -114,7 +114,7 @@ play { ext { work_manager = "2.3.4" room = "2.2.5" - dagger = "2.28" + dagger = "2.28.1" chucker = "3.2.0" mockk = "1.9.2" } From 5c313f986cdfb4de3a0cc46bbed3a5a39aedda71 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2020 10:15:34 +0000 Subject: [PATCH 0091/1526] Bump swiperefreshlayout from 1.1.0-rc01 to 1.1.0 (#897) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d0f58f91a..83c43a5ec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -141,7 +141,7 @@ dependencies { implementation "androidx.preference:preference-ktx:1.1.1" implementation "androidx.recyclerview:recyclerview:1.1.0" implementation "androidx.viewpager:viewpager:1.0.0" - implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-rc01" + implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.constraintlayout:constraintlayout:1.1.3" implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0" implementation "com.google.android.material:material:1.1.0" From cbabe44461a576088fd16627c946a6388aae2eee Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 11 Jul 2020 09:41:12 +0000 Subject: [PATCH 0092/1526] Bump about_libraries from 8.2.0 to 8.3.0 (#896) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 533c20097..5527953c9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext.kotlin_version = '1.3.72' - ext.about_libraries = '8.2.0' + ext.about_libraries = '8.3.0' repositories { mavenCentral() google() From c9a0bbda0117bb58d010f037368af693b5920cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 12 Jul 2020 17:55:27 +0200 Subject: [PATCH 0093/1526] New Crowdin updates (#888) --- app/src/main/res/values-de/strings.xml | 28 +++++++++++++------------- app/src/main/res/values-pl/strings.xml | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7cc44fd97..42169ca53 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -104,24 +104,24 @@ Neue Noten - New predicted grade - New predicted grades + Neue vorhergesagte Note + Neue vorhergesagte Noten - New final grade - New final grades + Neue Abschlussnote + Neue Abschlussnoten Du hast %1$d Note bekommen Du hast %1$d Noten bekommen - You received %1$d predicted grade - You received %1$d predicted grades + Sie haben %1$d vorhergesagte Note bekommen + Sie haben %1$d vorhergesagte Noten bekommen - You received %1$d final grade - You received %1$d final grades + Sie haben %1$d Abschlussnote bekommen + Sie haben %1$d Abschlussnoten bekommen Lektion @@ -188,8 +188,8 @@ In den Korb wandern Dauerhaft löschen Nachricht erfolgreich gelöscht - Share - Print + Teilen + Drucken Thema Inhalt Nachricht erfolgreich gesendet @@ -263,10 +263,10 @@ Abmelden Wollen Sie sich von einem aktiven Studenten abmelden? Abmeldung von Student - Student account - Parent account - Mobile API mode - Hybrid mode + Studentenkonto + Elternkonto + Mobiler API Modus + Hybrid Modus Version der App Mitarbeiter diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index bd4545e9b..e4d3e9029 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -377,7 +377,7 @@ Synchronizacja w trakcie Synchronizacja Ręczna synchronizacja nie odświeża widoków w aplikacji. - \nAby zobaczyć zsynchronizowane informacje uruchom ponownie aplikację po zsynchronizowaniu. + \nAby zobaczyć zsynchronizowane informacje, uruchom ponownie aplikację po zsynchronizowaniu. Inne Wartość plusa From 76b2ab1f254143ed76747292533f4a5a27449125 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:40:01 +0000 Subject: [PATCH 0094/1526] Bump firebase-messaging from 20.2.1 to 20.2.3 (#898) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 83c43a5ec..5fc2cf8f6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,7 +187,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics:17.4.3' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.7" - playImplementation 'com.google.firebase:firebase-messaging:20.2.1' + playImplementation 'com.google.firebase:firebase-messaging:20.2.3' playImplementation 'com.google.firebase:firebase-crashlytics:17.1.0' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' From 927415f9a30ae1aad7ae50929a00f8ec94f51ae7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:41:41 +0000 Subject: [PATCH 0095/1526] Bump dagger from 2.28.1 to 2.28.3 (#899) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5fc2cf8f6..c2d1d18bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -114,7 +114,7 @@ play { ext { work_manager = "2.3.4" room = "2.2.5" - dagger = "2.28.1" + dagger = "2.28.3" chucker = "3.2.0" mockk = "1.9.2" } From e072bf9fe3286778a0d50cdd219da69f8b147922 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:42:05 +0000 Subject: [PATCH 0096/1526] Bump gradle from 4.0.0 to 4.0.1 (#900) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5527953c9..164e258af 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.android.tools.build:gradle:4.0.0' + classpath 'com.android.tools.build:gradle:4.0.1' classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0' classpath "com.github.triplet.gradle:play-publisher:2.7.5" From 776972514ad57bc204a10b0cb5d06d267e01f4fe Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2020 23:00:03 +0000 Subject: [PATCH 0097/1526] Bump firebase-inappmessaging-ktx from 19.0.7 to 19.1.0 (#904) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c2d1d18bf..95394965a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -186,7 +186,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics:17.4.3' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' - playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.7" + playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.1.0" playImplementation 'com.google.firebase:firebase-messaging:20.2.3' playImplementation 'com.google.firebase:firebase-crashlytics:17.1.0' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' From 152382a0c9dae56d719d37c10e97b9435d49ddde Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2020 23:31:27 +0000 Subject: [PATCH 0098/1526] Bump firebase-analytics from 17.4.3 to 17.4.4 (#906) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 95394965a..20c6a2918 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -184,7 +184,7 @@ dependencies { implementation "io.github.wulkanowy:AppKillerManager:3.0.0" implementation 'me.xdrop:fuzzywuzzy:1.3.1' - playImplementation 'com.google.firebase:firebase-analytics:17.4.3' + playImplementation 'com.google.firebase:firebase-analytics:17.4.4' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.1.0" playImplementation 'com.google.firebase:firebase-messaging:20.2.3' From d4ee1f8b98aa4153eaf4ce050e08053088950700 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2020 23:32:38 +0000 Subject: [PATCH 0099/1526] Bump firebase-crashlytics from 17.1.0 to 17.1.1 (#902) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 20c6a2918..6dba21c11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -188,7 +188,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.1.0" playImplementation 'com.google.firebase:firebase-messaging:20.2.3' - playImplementation 'com.google.firebase:firebase-crashlytics:17.1.0' + playImplementation 'com.google.firebase:firebase-crashlytics:17.1.1' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 1c1a90c12f88af9877e74f2010a536f6f847d14c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2020 23:51:24 +0000 Subject: [PATCH 0100/1526] Bump firebase-inappmessaging-display-ktx from 19.0.7 to 19.1.0 (#905) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6dba21c11..0fa51681b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -185,7 +185,7 @@ dependencies { implementation 'me.xdrop:fuzzywuzzy:1.3.1' playImplementation 'com.google.firebase:firebase-analytics:17.4.4' - playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7' + playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.1.0' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.1.0" playImplementation 'com.google.firebase:firebase-messaging:20.2.3' playImplementation 'com.google.firebase:firebase-crashlytics:17.1.1' From b0a674b471b4a6cdabfe48f08f4edaf4c3b8c7a6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 19 Jul 2020 11:25:48 +0000 Subject: [PATCH 0101/1526] Bump kotlinx-coroutines-core from 1.3.7 to 1.3.8 (#903) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0fa51681b..df9535afe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -127,7 +127,7 @@ dependencies { implementation "io.github.wulkanowy:sdk:61250d3" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.3.7' implementation "androidx.core:core-ktx:1.3.0" From 1ac42bb56d5a25edd80c6ddf2fbe7976d11b5678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 19 Jul 2020 13:30:29 +0200 Subject: [PATCH 0102/1526] Migrate presenters from rxjava to coroutines flow (#894) --- app/build.gradle | 6 +- .../wulkanowy/data/TestDispatchersProvider.kt | 11 + .../data/repositories/TestEntityCreator.kt | 15 + .../attendance/AttendanceLocalTest.kt | 3 +- .../CompletedLessonsLocalTest.kt | 3 +- .../data/repositories/exam/ExamLocalTest.kt | 3 +- .../data/repositories/grade/GradeLocalTest.kt | 3 +- .../repositories/grade/GradeRepositoryTest.kt | 107 ++++--- .../GradeStatisticsLocalTest.kt | 20 +- .../luckynumber/LuckyNumberLocalTest.kt | 3 +- .../repositories/student/StudentLocalTest.kt | 3 +- .../timetable/TimetableLocalTest.kt | 3 +- .../timetable/TimetableRepositoryTest.kt | 85 ++---- app/src/main/AndroidManifest.xml | 3 +- .../java/io/github/wulkanowy/data/Resource.kt | 23 ++ .../wulkanowy/data/db/dao/AttendanceDao.kt | 3 +- .../data/db/dao/AttendanceSummaryDao.kt | 3 +- .../data/db/dao/CompletedLessonsDao.kt | 3 +- .../github/wulkanowy/data/db/dao/ExamDao.kt | 3 +- .../github/wulkanowy/data/db/dao/GradeDao.kt | 3 +- .../data/db/dao/GradePointsStatisticsDao.kt | 5 +- .../data/db/dao/GradeStatisticsDao.kt | 5 +- .../wulkanowy/data/db/dao/GradeSummaryDao.kt | 3 +- .../wulkanowy/data/db/dao/HomeworkDao.kt | 3 +- .../wulkanowy/data/db/dao/LuckyNumberDao.kt | 3 +- .../wulkanowy/data/db/dao/MessagesDao.kt | 7 +- .../wulkanowy/data/db/dao/MobileDeviceDao.kt | 3 +- .../github/wulkanowy/data/db/dao/NoteDao.kt | 3 +- .../github/wulkanowy/data/db/dao/SchoolDao.kt | 3 +- .../wulkanowy/data/db/dao/SubjectDao.kt | 3 +- .../wulkanowy/data/db/dao/TeacherDao.kt | 3 +- .../wulkanowy/data/db/dao/TimetableDao.kt | 3 +- .../appcreator/AppCreatorRepository.kt | 12 +- .../attendance/AttendanceLocal.kt | 3 +- .../attendance/AttendanceRepository.kt | 26 +- .../AttendanceSummaryLocal.kt | 3 +- .../AttendanceSummaryRepository.kt | 20 +- .../completedlessons/CompletedLessonsLocal.kt | 3 +- .../CompletedLessonsRepository.kt | 23 +- .../data/repositories/exam/ExamLocal.kt | 3 +- .../data/repositories/exam/ExamRepository.kt | 23 +- .../data/repositories/grade/GradeLocal.kt | 5 +- .../repositories/grade/GradeRepository.kt | 62 ++-- .../gradestatistics/GradeStatisticsLocal.kt | 25 +- .../GradeStatisticsRepository.kt | 52 ++-- .../repositories/homework/HomeworkLocal.kt | 3 +- .../homework/HomeworkRepository.kt | 20 +- .../repositories/logger/LoggerRepository.kt | 14 +- .../luckynumber/LuckyNumberLocal.kt | 3 +- .../luckynumber/LuckyNumberRepository.kt | 24 +- .../data/repositories/message/MessageLocal.kt | 5 +- .../repositories/message/MessageRepository.kt | 68 ++--- .../mobiledevice/MobileDeviceLocal.kt | 3 +- .../mobiledevice/MobileDeviceRepository.kt | 20 +- .../data/repositories/note/NoteLocal.kt | 3 +- .../data/repositories/note/NoteRepository.kt | 27 +- .../recipient/RecipientRepository.kt | 16 +- .../reportingunit/ReportingUnitRepository.kt | 22 +- .../data/repositories/school/SchoolLocal.kt | 3 +- .../repositories/school/SchoolRepository.kt | 16 +- .../semester/SemesterRepository.kt | 14 +- .../data/repositories/student/StudentLocal.kt | 27 +- .../data/repositories/subject/SubjectLocal.kt | 3 +- .../repositories/subject/SubjectRepository.kt | 20 +- .../data/repositories/teacher/TeacherLocal.kt | 3 +- .../repositories/teacher/TeacherRepository.kt | 20 +- .../repositories/timetable/TimetableLocal.kt | 3 +- .../timetable/TimetableRepository.kt | 20 +- .../sync/works/AttendanceSummaryWork.kt | 2 +- .../services/sync/works/AttendanceWork.kt | 4 +- .../sync/works/CompletedLessonWork.kt | 5 +- .../wulkanowy/services/sync/works/ExamWork.kt | 2 +- .../sync/works/GradeStatisticsWork.kt | 13 +- .../services/sync/works/GradeWork.kt | 9 +- .../services/sync/works/HomeworkWork.kt | 4 +- .../services/sync/works/LuckyNumberWork.kt | 5 +- .../services/sync/works/MessageWork.kt | 5 +- .../wulkanowy/services/sync/works/NoteWork.kt | 5 +- .../services/sync/works/RecipientWork.kt | 5 +- .../services/sync/works/TeacherWork.kt | 2 +- .../services/sync/works/TimetableWork.kt | 2 +- .../wulkanowy/services/sync/works/Work.kt | 10 +- .../github/wulkanowy/ui/base/BasePresenter.kt | 77 +++-- .../github/wulkanowy/ui/base/ErrorHandler.kt | 2 +- .../about/contributor/ContributorPresenter.kt | 19 +- .../modules/about/license/LicenseAdapter.kt | 2 +- .../modules/about/license/LicensePresenter.kt | 29 +- .../about/logviewer/LogViewerPresenter.kt | 50 ++-- .../ui/modules/account/AccountPresenter.kt | 93 +++--- .../modules/attendance/AttendancePresenter.kt | 139 +++++---- .../summary/AttendanceSummaryPresenter.kt | 102 +++---- .../ui/modules/exam/ExamPresenter.kt | 84 +++--- .../ui/modules/grade/GradeAverageProvider.kt | 78 ++--- .../ui/modules/grade/GradePresenter.kt | 52 ++-- .../grade/details/GradeDetailsPresenter.kt | 139 ++++----- .../statistics/GradeStatisticsPresenter.kt | 126 ++++---- .../grade/summary/GradeSummaryPresenter.kt | 72 +++-- .../ui/modules/homework/HomeworkFragment.kt | 4 - .../ui/modules/homework/HomeworkPresenter.kt | 89 +++--- .../homework/details/HomeworkDetailsDialog.kt | 1 - .../details/HomeworkDetailsPresenter.kt | 29 +- .../login/advanced/LoginAdvancedPresenter.kt | 65 +++-- .../modules/login/form/LoginFormPresenter.kt | 59 ++-- .../login/recover/LoginRecoverPresenter.kt | 68 ++--- .../LoginStudentSelectPresenter.kt | 92 +++--- .../login/symbol/LoginSymbolPresenter.kt | 71 +++-- .../luckynumber/LuckyNumberPresenter.kt | 82 +++--- .../LuckyNumberWidgetConfigurePresenter.kt | 37 ++- .../LuckyNumberWidgetProvider.kt | 5 +- .../ui/modules/message/MessageFragment.kt | 5 - .../ui/modules/message/MessagePresenter.kt | 26 +- .../message/preview/MessagePreviewFragment.kt | 4 - .../preview/MessagePreviewPresenter.kt | 93 +++--- .../message/preview/MessagePreviewView.kt | 2 - .../message/send/SendMessagePresenter.kt | 147 +++++----- .../message/tab/MessageTabPresenter.kt | 105 ++++--- .../mobiledevice/MobileDevicePresenter.kt | 113 ++++--- .../token/MobileDeviceTokenPresenter.kt | 48 +-- .../ui/modules/note/NotePresenter.kt | 87 +++--- .../SchoolAndTeachersPresenter.kt | 16 +- .../school/SchoolPresenter.kt | 80 ++--- .../teacher/TeacherPresenter.kt | 72 ++--- .../ui/modules/splash/SplashPresenter.kt | 20 +- .../modules/timetable/TimetablePresenter.kt | 89 +++--- .../completed/CompletedLessonsPresenter.kt | 82 +++--- .../TimetableWidgetConfigurePresenter.kt | 37 ++- .../timetablewidget/TimetableWidgetFactory.kt | 5 +- .../io/github/wulkanowy/utils/FlowUtils.kt | 93 ++++++ app/src/main/res/layout/fragment_license.xml | 4 +- .../io/github/wulkanowy/MainCoroutineRule.kt | 26 ++ .../wulkanowy/TestDispatchersProvider.kt | 11 + .../message/MessageRepositoryTest.kt | 30 +- .../MobileDeviceRepositoryTest.kt | 6 +- .../semester/SemesterRepositoryTest.kt | 3 +- .../modules/grade/GradeAverageProviderTest.kt | 275 ++++++++++-------- .../login/form/LoginFormPresenterTest.kt | 32 +- .../LoginStudentSelectPresenterTest.kt | 19 +- .../ui/modules/splash/SplashPresenterTest.kt | 7 +- 138 files changed, 2351 insertions(+), 1892 deletions(-) create mode 100644 app/src/androidTest/java/io/github/wulkanowy/data/TestDispatchersProvider.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/Resource.kt create mode 100644 app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt create mode 100644 app/src/test/java/io/github/wulkanowy/MainCoroutineRule.kt create mode 100644 app/src/test/java/io/github/wulkanowy/TestDispatchersProvider.kt diff --git a/app/build.gradle b/app/build.gradle index df9535afe..d5031b315 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -92,6 +92,7 @@ android { kotlinOptions { jvmTarget = "1.8" + freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn" } packagingOptions { @@ -116,7 +117,7 @@ ext { room = "2.2.5" dagger = "2.28.3" chucker = "3.2.0" - mockk = "1.9.2" + mockk = "1.10.0" } configurations.all { @@ -129,6 +130,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.3.7' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7' implementation "androidx.core:core-ktx:1.3.0" implementation "androidx.activity:activity-ktx:1.1.0" @@ -156,7 +158,6 @@ dependencies { implementation 'com.github.PaulinaSadowska:RxWorkManagerObservers:1.0.0' implementation "androidx.room:room-runtime:$room" - implementation "androidx.room:room-rxjava2:$room" implementation "androidx.room:room-ktx:$room" kapt "androidx.room:room-compiler:$room" @@ -199,6 +200,7 @@ dependencies { testImplementation "junit:junit:4.13" testImplementation "io.mockk:mockk:$mockk" testImplementation "org.threeten:threetenbp:1.4.4" + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.7' androidTestImplementation "androidx.test:core:1.2.0" androidTestImplementation "androidx.test:runner:1.2.0" diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/TestDispatchersProvider.kt b/app/src/androidTest/java/io/github/wulkanowy/data/TestDispatchersProvider.kt new file mode 100644 index 000000000..8c4354d9a --- /dev/null +++ b/app/src/androidTest/java/io/github/wulkanowy/data/TestDispatchersProvider.kt @@ -0,0 +1,11 @@ +package io.github.wulkanowy.data + +import io.github.wulkanowy.utils.DispatchersProvider +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers + +class TestDispatchersProvider : DispatchersProvider() { + + override val backgroundThread: CoroutineDispatcher + get() = Dispatchers.Unconfined +} diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestEntityCreator.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestEntityCreator.kt index bbbfd83dd..f7aa51e49 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestEntityCreator.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestEntityCreator.kt @@ -1,6 +1,8 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDateTime fun getStudent(): Student { @@ -27,3 +29,16 @@ fun getStudent(): Student { isParent = false ) } + +fun getSemester() = Semester( + semesterId = 1, + studentId = 1, + classId = 1, + diaryId = 2, + diaryName = "", + end = now(), + schoolYear = 2019, + semesterName = 1, + start = now(), + unitId = 1 +) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt index f9326b2d5..4080b8313 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before @@ -53,7 +54,7 @@ class AttendanceLocalTest { runBlocking { attendanceLocal.saveAttendance(list) } val semester = Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1) - val attendance = runBlocking { attendanceLocal.getAttendance(semester, of(2018, 9, 10), of(2018, 9, 14)) } + val attendance = runBlocking { attendanceLocal.getAttendance(semester, of(2018, 9, 10), of(2018, 9, 14)).first() } assertEquals(2, attendance.size) assertEquals(attendance[0].date, of(2018, 9, 10)) assertEquals(attendance[1].date, of(2018, 9, 14)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt index d8aac23da..f8ff92138 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before @@ -46,7 +47,7 @@ class CompletedLessonsLocalTest { runBlocking { completedLessonsLocal.saveCompletedLessons(list) } val semester = Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1) - val completed = runBlocking { completedLessonsLocal.getCompletedLessons(semester, of(2018, 9, 10), of(2018, 9, 14)) } + val completed = runBlocking { completedLessonsLocal.getCompletedLessons(semester, of(2018, 9, 10), of(2018, 9, 14)).first() } assertEquals(2, completed.size) assertEquals(completed[0].date, of(2018, 9, 10)) assertEquals(completed[1].date, of(2018, 9, 14)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt index f3b179a51..e595d77c6 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before @@ -43,7 +44,7 @@ class ExamLocalTest { runBlocking { examLocal.saveExams(list) } val semester = Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1) - val exams = runBlocking { examLocal.getExams(semester, of(2018, 9, 10), of(2018, 9, 14)) } + val exams = runBlocking { examLocal.getExams(semester, of(2018, 9, 10), of(2018, 9, 14)).first() } assertEquals(2, exams.size) assertEquals(exams[0].date, of(2018, 9, 10)) assertEquals(exams[1].date, of(2018, 9, 14)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt index 82129d868..6a01b09cb 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt @@ -5,6 +5,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before @@ -45,7 +46,7 @@ class GradeLocalTest { val semester = Semester(1, 2, "", 2019, 2, 1, now(), now(), 1, 1) - val grades = runBlocking { gradeLocal.getGradesDetails(semester) } + val grades = runBlocking { gradeLocal.getGradesDetails(semester).first() } assertEquals(2, grades.size) assertEquals(grades[0].date, LocalDate.of(2019, 2, 27)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt index 5487fd4ce..5a8845307 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt @@ -5,15 +5,18 @@ import androidx.room.Room import androidx.test.core.app.ApplicationProvider.getApplicationContext import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.AppDatabase +import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.sdk.pojo.Grade import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before @@ -29,15 +32,12 @@ import kotlin.test.assertTrue @RunWith(AndroidJUnit4::class) class GradeRepositoryTest { - @MockK - private lateinit var mockSdk: Sdk - @MockK private lateinit var semesterMock: Semester - @MockK private lateinit var studentMock: Student + @MockK private lateinit var gradeRemote: GradeRemote private lateinit var gradeLocal: GradeLocal @@ -49,14 +49,12 @@ class GradeRepositoryTest { MockKAnnotations.init(this) testDb = Room.inMemoryDatabaseBuilder(getApplicationContext(), AppDatabase::class.java).build() gradeLocal = GradeLocal(testDb.gradeDao, testDb.gradeSummaryDao) - gradeRemote = GradeRemote(mockSdk) + studentMock = getStudentMock() - every { studentMock.registrationDate } returns LocalDateTime.of(2019, 2, 27, 12, 0) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 every { semesterMock.schoolYear } returns 2019 every { semesterMock.semesterId } returns 1 - every { mockSdk.switchDiary(any(), any()) } returns mockSdk } @After @@ -66,16 +64,17 @@ class GradeRepositoryTest { @Test fun markOlderThanRegisterDateAsRead() { - coEvery { mockSdk.getGrades(1) } returns (listOf( - createGradeApi(5, 4.0, of(2019, 2, 25), "Ocena pojawiła się"), - createGradeApi(5, 4.0, of(2019, 2, 26), "przed zalogowanie w aplikacji"), - createGradeApi(5, 4.0, of(2019, 2, 27), "Ocena z dnia logowania"), - createGradeApi(5, 4.0, of(2019, 2, 28), "Ocena jeszcze nowsza") + coEvery { gradeRemote.getGrades(studentMock, semesterMock) } returns (listOf( + createGradeLocal(5, 4.0, of(2019, 2, 25), "Ocena pojawiła się"), + createGradeLocal(5, 4.0, of(2019, 2, 26), "przed zalogowanie w aplikacji"), + createGradeLocal(5, 4.0, of(2019, 2, 27), "Ocena z dnia logowania"), + createGradeLocal(5, 4.0, of(2019, 2, 28), "Ocena jeszcze nowsza") ) to emptyList()) val grades = runBlocking { - GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) - .first.sortedByDescending { it.date } + GradeRepository(gradeLocal, gradeRemote) + .getGrades(studentMock, semesterMock, true) + .filter { it.status == Status.SUCCESS }.first().data!!.first.sortedByDescending { it.date } } assertFalse { grades[0].isRead } @@ -93,16 +92,17 @@ class GradeRepositoryTest { ) runBlocking { gradeLocal.saveGrades(list) } - coEvery { mockSdk.getGrades(1) } returns (listOf( - createGradeApi(5, 2.0, of(2019, 2, 25), "Ocena ma datę, jest inna, ale nie zostanie powiadomiona"), - createGradeApi(4, 3.0, of(2019, 2, 26), "starszą niż ostatnia lokalnie"), - createGradeApi(3, 4.0, of(2019, 2, 27), "Ta jest z tego samego dnia co ostatnia lokalnie"), - createGradeApi(2, 5.0, of(2019, 2, 28), "Ta jest już w ogóle nowa") + coEvery { gradeRemote.getGrades(studentMock, semesterMock) } returns (listOf( + createGradeLocal(5, 2.0, of(2019, 2, 25), "Ocena ma datę, jest inna, ale nie zostanie powiadomiona"), + createGradeLocal(4, 3.0, of(2019, 2, 26), "starszą niż ostatnia lokalnie"), + createGradeLocal(3, 4.0, of(2019, 2, 27), "Ta jest z tego samego dnia co ostatnia lokalnie"), + createGradeLocal(2, 5.0, of(2019, 2, 28), "Ta jest już w ogóle nowa") ) to emptyList()) val grades = runBlocking { - GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) - .first.sortedByDescending { it.date } + GradeRepository(gradeLocal, gradeRemote) + .getGrades(studentMock, semesterMock, true) + .filter { it.status == Status.SUCCESS }.first().data!!.first.sortedByDescending { it.date } } assertFalse { grades[0].isRead } @@ -120,13 +120,15 @@ class GradeRepositoryTest { ) runBlocking { gradeLocal.saveGrades(list) } - coEvery { mockSdk.getGrades(1) } returns (listOf( - createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), - createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") + coEvery { gradeRemote.getGrades(studentMock, semesterMock) } returns (listOf( + createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), + createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) to emptyList()) val grades = runBlocking { - GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + GradeRepository(gradeLocal, gradeRemote) + .getGrades(studentMock, semesterMock, true) + .filter { it.status == Status.SUCCESS }.first().data!! } assertEquals(2, grades.first.size) @@ -140,14 +142,16 @@ class GradeRepositoryTest { ) runBlocking { gradeLocal.saveGrades(list) } - coEvery { mockSdk.getGrades(1) } returns (listOf( - createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), - createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), - createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") + coEvery { gradeRemote.getGrades(studentMock, semesterMock) } returns (listOf( + createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), + createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), + createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) to emptyList()) val grades = runBlocking { - GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + GradeRepository(gradeLocal, gradeRemote) + .getGrades(studentMock, semesterMock, true) + .filter { it.status == Status.SUCCESS }.first().data!! } assertEquals(3, grades.first.size) @@ -157,14 +161,16 @@ class GradeRepositoryTest { fun emptyLocal() { runBlocking { gradeLocal.saveGrades(listOf()) } - coEvery { mockSdk.getGrades(1) } returns (listOf( - createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), - createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), - createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") + coEvery { gradeRemote.getGrades(studentMock, semesterMock) } returns (listOf( + createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), + createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), + createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) to emptyList()) val grades = runBlocking { - GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + GradeRepository(gradeLocal, gradeRemote) + .getGrades(studentMock, semesterMock, true) + .filter { it.status == Status.SUCCESS }.first().data!! } assertEquals(3, grades.first.size) @@ -178,12 +184,37 @@ class GradeRepositoryTest { ) runBlocking { gradeLocal.saveGrades(list) } - coEvery { mockSdk.getGrades(1) } returns (emptyList() to emptyList()) + coEvery { gradeRemote.getGrades(studentMock, semesterMock) } returns (emptyList() to emptyList()) val grades = runBlocking { - GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + GradeRepository(gradeLocal, gradeRemote) + .getGrades(studentMock, semesterMock, true) + .filter { it.status == Status.SUCCESS }.first().data!! } assertEquals(0, grades.first.size) } + + private fun getStudentMock() = Student( + scrapperBaseUrl = "http://fakelog.cf", + email = "jan@fakelog.cf", + certificateKey = "", + classId = 0, + className = "", + isCurrent = false, + isParent = false, + loginMode = Sdk.Mode.SCRAPPER.name, + loginType = "STANDARD", + mobileBaseUrl = "", + password = "", + privateKey = "", + registrationDate = LocalDateTime.of(2019, 2, 27, 12, 0), + schoolName = "", + schoolShortName = "test", + schoolSymbol = "", + studentId = 0, + studentName = "", + symbol = "", + userLoginId = 0 + ) } diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt index deda67ba3..ff6541589 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.GradePointsStatistics import io.github.wulkanowy.data.db.entities.GradeStatistics import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before @@ -42,7 +43,7 @@ class GradeStatisticsLocalTest { ) runBlocking { gradeStatisticsLocal.saveGradesStatistics(list) } - val stats = runBlocking { gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Matematyka") } + val stats = runBlocking { gradeStatisticsLocal.getGradesStatistics(getSemester(), false).first() } assertEquals(1, stats.size) assertEquals(stats[0].subject, "Matematyka") } @@ -56,11 +57,12 @@ class GradeStatisticsLocalTest { ) runBlocking { gradeStatisticsLocal.saveGradesStatistics(list) } - val stats = runBlocking { gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Wszystkie") } - assertEquals(3, stats.size) - assertEquals(stats[0].subject, "Wszystkie") - assertEquals(stats[1].subject, "Matematyka") - assertEquals(stats[2].subject, "Chemia") + val stats = runBlocking { gradeStatisticsLocal.getGradesStatistics(getSemester(), false).first() } + assertEquals(2, stats.size) +// assertEquals(3, stats.size) +// assertEquals(stats[0].subject, "Wszystkie") // now in main repo + assertEquals(stats[0].subject, "Matematyka") + assertEquals(stats[1].subject, "Chemia") } @Test @@ -72,7 +74,7 @@ class GradeStatisticsLocalTest { ) runBlocking { gradeStatisticsLocal.saveGradesPointsStatistics(list) } - val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka") } + val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester()).first() } with(stats[0]) { assertEquals(subject, "Matematyka") assertEquals(others, 5.0) @@ -84,7 +86,7 @@ class GradeStatisticsLocalTest { fun saveAndRead_subjectEmpty() { runBlocking { gradeStatisticsLocal.saveGradesPointsStatistics(listOf()) } - val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka") } + val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester()).first() } assertEquals(emptyList(), stats) } @@ -92,7 +94,7 @@ class GradeStatisticsLocalTest { fun saveAndRead_allEmpty() { runBlocking { gradeStatisticsLocal.saveGradesPointsStatistics(listOf()) } - val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Wszystkie") } + val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester()).first() } assertEquals(emptyList(), stats) } diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt index f37d7934b..dfd973944 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student +import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before @@ -41,7 +42,7 @@ class LuckyNumberLocalTest { runBlocking { luckyNumberLocal.saveLuckyNumber(number) } val student = Student("", "", "", "", "", "", false, "", "", "", 1, 1, "", "", "", "", "", 1, false, now()) - val luckyNumber = runBlocking { luckyNumberLocal.getLuckyNumber(student, LocalDate.of(2019, 1, 20)) } + val luckyNumber = runBlocking { luckyNumberLocal.getLuckyNumber(student, LocalDate.of(2019, 1, 20)).first() } assertEquals(1, luckyNumber?.studentId) assertEquals(LocalDate.of(2019, 1, 20), luckyNumber?.date) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt index 02a13344e..d68f15a80 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt @@ -4,6 +4,7 @@ import android.content.Context import androidx.room.Room import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 +import io.github.wulkanowy.data.TestDispatchersProvider import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.repositories.getStudent import kotlinx.coroutines.runBlocking @@ -27,7 +28,7 @@ class StudentLocalTest { val context = ApplicationProvider.getApplicationContext() testDb = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java) .build() - studentLocal = StudentLocal(testDb.studentDao, context) + studentLocal = StudentLocal(testDb.studentDao, TestDispatchersProvider(), context) } @After diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt index fa353a332..77d7188c1 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt @@ -5,6 +5,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before @@ -48,7 +49,7 @@ class TimetableLocalTest { semester = semester, startDate = LocalDate.of(2018, 9, 10), endDate = LocalDate.of(2018, 9, 14) - ) + ).first() } assertEquals(2, exams.size) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt index a91651db1..fa62849ac 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt @@ -5,17 +5,16 @@ import androidx.room.Room import androidx.test.core.app.ApplicationProvider.getApplicationContext import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.AppDatabase -import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.repositories.getSemester import io.github.wulkanowy.data.repositories.getStudent -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper import io.mockk.MockKAnnotations import io.mockk.coEvery -import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.mockk +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before @@ -29,45 +28,25 @@ import kotlin.test.assertEquals @RunWith(AndroidJUnit4::class) class TimetableRepositoryTest { - @MockK - private lateinit var mockSdk: Sdk - - @MockK - private lateinit var studentMock: Student - - private val student = getStudent() - - @MockK - private lateinit var semesterMock: Semester - - @MockK + @MockK(relaxed = true) private lateinit var timetableNotificationSchedulerHelper: TimetableNotificationSchedulerHelper + @MockK private lateinit var timetableRemote: TimetableRemote private lateinit var timetableLocal: TimetableLocal private lateinit var testDb: AppDatabase + private val student = getStudent() + + private val semester = getSemester() + @Before fun initApi() { MockKAnnotations.init(this) testDb = Room.inMemoryDatabaseBuilder(getApplicationContext(), AppDatabase::class.java).build() timetableLocal = TimetableLocal(testDb.timetableDao) - timetableRemote = TimetableRemote(mockSdk) - - every { timetableNotificationSchedulerHelper.scheduleNotifications(any(), any()) } returns mockk() - every { timetableNotificationSchedulerHelper.cancelScheduled(any(), any()) } returns mockk() - - every { studentMock.studentId } returns 1 - every { studentMock.studentName } returns "Jan Kowalski" - - every { semesterMock.studentId } returns 1 - every { semesterMock.diaryId } returns 2 - every { semesterMock.schoolYear } returns 2019 - every { semesterMock.semesterId } returns 1 - - every { mockSdk.switchDiary(any(), any()) } returns mockSdk } @After @@ -86,21 +65,21 @@ class TimetableRepositoryTest { )) } - coEvery { mockSdk.getTimetable(any(), any()) } returns listOf( - createTimetableRemote(of(2019, 3, 5, 8, 0), 1, "", "Przyroda"), - createTimetableRemote(of(2019, 3, 5, 8, 50), 2, "", "Religia"), - createTimetableRemote(of(2019, 3, 5, 9, 40), 3, "", "W-F"), - createTimetableRemote(of(2019, 3, 5, 10, 30), 4, "", "W-F") + coEvery { timetableRemote.getTimetable(student, semester, any(), any()) } returns listOf( + createTimetableLocal(of(2019, 3, 5, 8, 0), 1, "", "Przyroda"), + createTimetableLocal(of(2019, 3, 5, 8, 50), 2, "", "Religia"), + createTimetableLocal(of(2019, 3, 5, 9, 40), 3, "", "W-F"), + createTimetableLocal(of(2019, 3, 5, 10, 30), 4, "", "W-F") ) val lessons = runBlocking { TimetableRepository(timetableLocal, timetableRemote, timetableNotificationSchedulerHelper).getTimetable( student = student, - semester = semesterMock, + semester = semester, start = LocalDate.of(2019, 3, 5), end = LocalDate.of(2019, 3, 5), forceRefresh = true - ) + ).filter { it.status == Status.SUCCESS }.first().data.orEmpty() } assertEquals(4, lessons.size) @@ -129,31 +108,31 @@ class TimetableRepositoryTest { ) runBlocking { timetableLocal.saveTimetable(list) } - coEvery { mockSdk.getTimetable(any(), any()) } returns listOf( - createTimetableRemote(of(2019, 12, 23, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false), - createTimetableRemote(of(2019, 12, 23, 8, 50), 2, "124", "Matematyka", "Jakub Wtorkowski", true), - createTimetableRemote(of(2019, 12, 23, 9, 40), 3, "125", "Język polski", "Joanna Poniedziałkowska", false), - createTimetableRemote(of(2019, 12, 23, 10, 40), 4, "126", "Język polski", "Joanna Wtorkowska", true), + coEvery { timetableRemote.getTimetable(student, semester, any(), any()) } returns listOf( + createTimetableLocal(of(2019, 12, 23, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false), + createTimetableLocal(of(2019, 12, 23, 8, 50), 2, "124", "Matematyka", "Jakub Wtorkowski", true), + createTimetableLocal(of(2019, 12, 23, 9, 40), 3, "125", "Język polski", "Joanna Poniedziałkowska", false), + createTimetableLocal(of(2019, 12, 23, 10, 40), 4, "126", "Język polski", "Joanna Wtorkowska", true), - createTimetableRemote(of(2019, 12, 24, 8, 0), 1, "123", "Język polski", "", false), - createTimetableRemote(of(2019, 12, 24, 8, 50), 2, "124", "Język polski", "", true), - createTimetableRemote(of(2019, 12, 24, 9, 40), 3, "125", "Język polski", "", false), - createTimetableRemote(of(2019, 12, 24, 10, 40), 4, "126", "Język polski", "", true), + createTimetableLocal(of(2019, 12, 24, 8, 0), 1, "123", "Język polski", "", false), + createTimetableLocal(of(2019, 12, 24, 8, 50), 2, "124", "Język polski", "", true), + createTimetableLocal(of(2019, 12, 24, 9, 40), 3, "125", "Język polski", "", false), + createTimetableLocal(of(2019, 12, 24, 10, 40), 4, "126", "Język polski", "", true), - createTimetableRemote(of(2019, 12, 25, 8, 0), 1, "123", "Matematyka", "Paweł Środowski", false), - createTimetableRemote(of(2019, 12, 25, 8, 50), 2, "124", "Matematyka", "Paweł Czwartkowski", true), - createTimetableRemote(of(2019, 12, 25, 9, 40), 3, "125", "Matematyka", "Paweł Środowski", false), - createTimetableRemote(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "Paweł Czwartkowski", true) + createTimetableLocal(of(2019, 12, 25, 8, 0), 1, "123", "Matematyka", "Paweł Środowski", false), + createTimetableLocal(of(2019, 12, 25, 8, 50), 2, "124", "Matematyka", "Paweł Czwartkowski", true), + createTimetableLocal(of(2019, 12, 25, 9, 40), 3, "125", "Matematyka", "Paweł Środowski", false), + createTimetableLocal(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "Paweł Czwartkowski", true) ) val lessons = runBlocking { TimetableRepository(timetableLocal, timetableRemote, timetableNotificationSchedulerHelper).getTimetable( student = student, - semester = semesterMock, + semester = semester, start = LocalDate.of(2019, 12, 23), end = LocalDate.of(2019, 12, 25), forceRefresh = true - ) + ).filter { it.status == Status.SUCCESS }.first().data.orEmpty() } assertEquals(12, lessons.size) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 802cf1ad2..4ec2f7816 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,8 +18,7 @@ android:supportsRtl="false" android:theme="@style/WulkanowyTheme" android:usesCleartextTraffic="true" - tools:ignore="GoogleAppIndexingWarning,UnusedAttribute" - tools:replace="android:supportsRtl,android:allowBackup"> + tools:ignore="GoogleAppIndexingWarning,UnusedAttribute"> (val status: Status, val data: T?, val error: Throwable?) { + companion object { + fun success(data: T?): Resource { + return Resource(Status.SUCCESS, data, null) + } + + fun error(error: Throwable?, data: T? = null): Resource { + return Resource(Status.ERROR, data, error) + } + + fun loading(data: T? = null): Resource { + return Resource(Status.LOADING, data, null) + } + } +} + +enum class Status { + LOADING, + SUCCESS, + ERROR +} 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 49527a553..960795479 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 @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Attendance +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -11,5 +12,5 @@ import javax.inject.Singleton interface AttendanceDao : BaseDao { @Query("SELECT * FROM Attendance WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List + fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt index 1ba37c959..4218855ca 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt @@ -3,10 +3,11 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.AttendanceSummary +import kotlinx.coroutines.flow.Flow @Dao interface AttendanceSummaryDao : BaseDao { @Query("SELECT * FROM AttendanceSummary WHERE diary_id = :diaryId AND student_id = :studentId AND subject_id = :subjectId") - suspend fun loadAll(diaryId: Int, studentId: Int, subjectId: Int): List + fun loadAll(diaryId: Int, studentId: Int, subjectId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt index 6406d097d..4a827b4fd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.CompletedLesson +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -11,5 +12,5 @@ import javax.inject.Singleton interface CompletedLessonsDao : BaseDao { @Query("SELECT * FROM CompletedLesson WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List + fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt index e492f7b84..e3119d9b5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Exam +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -11,5 +12,5 @@ import javax.inject.Singleton interface ExamDao : BaseDao { @Query("SELECT * FROM Exams WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List + fun loadAll(diaryId: Int, studentId: Int, from: 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 df0276203..12e70bde6 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 @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Grade +import kotlinx.coroutines.flow.Flow import javax.inject.Singleton @Singleton @@ -10,5 +11,5 @@ import javax.inject.Singleton interface GradeDao : BaseDao { @Query("SELECT * FROM Grades WHERE semester_id = :semesterId AND student_id = :studentId") - suspend fun loadAll(semesterId: Int, studentId: Int): List + fun loadAll(semesterId: Int, studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt index b1e644bbd..e8074f003 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.GradePointsStatistics +import kotlinx.coroutines.flow.Flow import javax.inject.Singleton @Singleton @@ -10,8 +11,8 @@ import javax.inject.Singleton interface GradePointsStatisticsDao : BaseDao { @Query("SELECT * FROM GradesPointsStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND subject = :subjectName") - suspend fun loadSubject(semesterId: Int, studentId: Int, subjectName: String): List + fun loadSubject(semesterId: Int, studentId: Int, subjectName: String): Flow> @Query("SELECT * FROM GradesPointsStatistics WHERE student_id = :studentId AND semester_id = :semesterId") - suspend fun loadAll(semesterId: Int, studentId: Int): List + fun loadAll(semesterId: Int, studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt index 786da0d9e..b462ad5db 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.GradeStatistics +import kotlinx.coroutines.flow.Flow import javax.inject.Singleton @Singleton @@ -10,8 +11,8 @@ import javax.inject.Singleton interface GradeStatisticsDao : BaseDao { @Query("SELECT * FROM GradesStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND subject = :subjectName AND is_semester = :isSemester") - suspend fun loadSubject(semesterId: Int, studentId: Int, subjectName: String, isSemester: Boolean): List + fun loadSubject(semesterId: Int, studentId: Int, subjectName: String, isSemester: Boolean): Flow> @Query("SELECT * FROM GradesStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND is_semester = :isSemester") - suspend fun loadAll(semesterId: Int, studentId: Int, isSemester: Boolean): List + fun loadAll(semesterId: Int, studentId: Int, isSemester: Boolean): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt index 02d4e9229..fc9ad66ed 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.GradeSummary +import kotlinx.coroutines.flow.Flow import javax.inject.Singleton @Singleton @@ -10,5 +11,5 @@ import javax.inject.Singleton interface GradeSummaryDao : BaseDao { @Query("SELECT * FROM GradesSummary WHERE student_id = :studentId AND semester_id = :semesterId") - suspend fun loadAll(semesterId: Int, studentId: Int): List + fun loadAll(semesterId: Int, studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt index 9bbf80ace..5d417b046 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Homework +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -11,5 +12,5 @@ import javax.inject.Singleton interface HomeworkDao : BaseDao { @Query("SELECT * FROM Homework WHERE semester_id = :semesterId AND student_id = :studentId AND date >= :from AND date <= :end") - suspend fun loadAll(semesterId: Int, studentId: Int, from: LocalDate, end: LocalDate): List + fun loadAll(semesterId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt index b4ead2454..55a005fff 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.LuckyNumber +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -11,5 +12,5 @@ import javax.inject.Singleton interface LuckyNumberDao : BaseDao { @Query("SELECT * FROM LuckyNumbers WHERE student_id = :studentId AND date = :date") - suspend fun load(studentId: Int, date: LocalDate): LuckyNumber + fun load(studentId: Int, date: LocalDate): Flow } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt index 2757978ae..0c63624f8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt @@ -5,17 +5,18 @@ import androidx.room.Query import androidx.room.Transaction import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment +import kotlinx.coroutines.flow.Flow @Dao interface MessagesDao : BaseDao { @Transaction @Query("SELECT * FROM Messages WHERE student_id = :studentId AND message_id = :messageId") - suspend fun loadMessageWithAttachment(studentId: Int, messageId: Int): MessageWithAttachment + fun loadMessageWithAttachment(studentId: Int, messageId: Int): Flow @Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder AND removed = 0 ORDER BY date DESC") - suspend fun loadAll(studentId: Int, folder: Int): List + fun loadAll(studentId: Int, folder: Int): Flow> @Query("SELECT * FROM Messages WHERE student_id = :studentId AND removed = 1 ORDER BY date DESC") - suspend fun loadDeleted(studentId: Int): List + fun loadDeleted(studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt index b07aab284..8baba2c30 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt @@ -3,10 +3,11 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.MobileDevice +import kotlinx.coroutines.flow.Flow @Dao interface MobileDeviceDao : BaseDao { @Query("SELECT * FROM MobileDevices WHERE student_id = :studentId ORDER BY date DESC") - suspend fun loadAll(studentId: Int): List + fun loadAll(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 81c324f65..e89a4135a 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 @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Note +import kotlinx.coroutines.flow.Flow import javax.inject.Singleton @Singleton @@ -10,5 +11,5 @@ import javax.inject.Singleton interface NoteDao : BaseDao { @Query("SELECT * FROM Notes WHERE student_id = :studentId") - suspend fun loadAll(studentId: Int): List + fun loadAll(studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt index 37cb6c500..f39791f63 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.School +import kotlinx.coroutines.flow.Flow import javax.inject.Singleton @Singleton @@ -10,5 +11,5 @@ import javax.inject.Singleton interface SchoolDao : BaseDao { @Query("SELECT * FROM School WHERE student_id = :studentId AND class_id = :classId") - suspend fun load(studentId: Int, classId: Int): School? + fun load(studentId: Int, classId: Int): Flow } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt index 92477552c..4cd742b56 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt @@ -3,10 +3,11 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Subject +import kotlinx.coroutines.flow.Flow @Dao interface SubjectDao : BaseDao { @Query("SELECT * FROM Subjects WHERE diary_id = :diaryId AND student_id = :studentId") - suspend fun loadAll(diaryId: Int, studentId: Int): List + fun loadAll(diaryId: Int, studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt index 0b0e659b4..6adac220d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Teacher +import kotlinx.coroutines.flow.Flow import javax.inject.Singleton @Singleton @@ -10,5 +11,5 @@ import javax.inject.Singleton interface TeacherDao : BaseDao { @Query("SELECT * FROM Teachers WHERE student_id = :studentId AND class_id = :classId") - suspend fun loadAll(studentId: Int, classId: Int): List + fun loadAll(studentId: Int, classId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt index 59200b80b..a099dd80d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Timetable +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -11,5 +12,5 @@ import javax.inject.Singleton interface TimetableDao : BaseDao { @Query("SELECT * FROM Timetable WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List + fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt index 3fcd7cb57..d19565579 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt @@ -14,12 +14,10 @@ class AppCreatorRepository @Inject constructor( private val dispatchers: DispatchersProvider ) { - suspend fun getAppCreators(): List { - return withContext(dispatchers.backgroundThread) { - Gson().fromJson( - assets.open("contributors.json").bufferedReader().use { it.readText() }, - Array::class.java - ).toList() - } + suspend fun getAppCreators() = withContext(dispatchers.backgroundThread) { + Gson().fromJson( + assets.open("contributors.json").bufferedReader().use { it.readText() }, + Array::class.java + ).toList() } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt index b232033d1..1e56d872e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.attendance import io.github.wulkanowy.data.db.dao.AttendanceDao import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -18,7 +19,7 @@ class AttendanceLocal @Inject constructor(private val attendanceDb: AttendanceDa attendanceDb.deleteAll(attendance) } - suspend fun getAttendance(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { + fun getAttendance(semester: Semester, startDate: LocalDate, endDate: LocalDate): Flow> { return attendanceDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt index 0fa0090e7..cf4edb6a0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt @@ -4,6 +4,7 @@ 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.utils.monday +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract import org.threeten.bp.LocalDate @@ -16,19 +17,18 @@ class AttendanceRepository @Inject constructor( private val remote: AttendanceRemote ) { - suspend fun getAttendance(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean): List { - return local.getAttendance(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { - val new = remote.getAttendance(student, semester, start.monday, end.sunday) - val old = local.getAttendance(semester, start.monday, end.sunday) + fun getAttendance(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getAttendance(semester, start.monday, end.sunday) }, + fetch = { remote.getAttendance(student, semester, start.monday, end.sunday) }, + saveFetchResult = { old, new -> + local.deleteAttendance(old uniqueSubtract new) + local.saveAttendance(new uniqueSubtract old) + }, + filterResult = { it.filter { item -> item.date in start..end } } + ) - local.deleteAttendance(old.uniqueSubtract(new)) - local.saveAttendance(new.uniqueSubtract(old)) - - local.getAttendance(semester, start.monday, end.sunday) - }.filter { it.date in start..end } - } - - suspend fun excuseForAbsence(student: Student, semester: Semester, attendanceList: List, reason: String? = null): Boolean { - return remote.excuseAbsence(student, semester, attendanceList, reason) + suspend fun excuseForAbsence(student: Student, semester: Semester, attendanceList: List, reason: String? = null) { + remote.excuseAbsence(student, semester, attendanceList, reason) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt index f949f0163..703bc9474 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.attendancesummary import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.Flow import javax.inject.Inject import javax.inject.Singleton @@ -17,7 +18,7 @@ class AttendanceSummaryLocal @Inject constructor(private val attendanceDb: Atten attendanceDb.deleteAll(attendance) } - suspend fun getAttendanceSummary(semester: Semester, subjectId: Int): List { + fun getAttendanceSummary(semester: Semester, subjectId: Int): Flow> { return attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt index 7ef16fb0f..5dbe1ab05 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt @@ -1,8 +1,8 @@ package io.github.wulkanowy.data.repositories.attendancesummary -import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import javax.inject.Inject import javax.inject.Singleton @@ -13,15 +13,13 @@ class AttendanceSummaryRepository @Inject constructor( private val remote: AttendanceSummaryRemote ) { - suspend fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int, forceRefresh: Boolean = false): List { - return local.getAttendanceSummary(semester, subjectId).filter { !forceRefresh }.ifEmpty { - val new = remote.getAttendanceSummary(student, semester, subjectId) - - val old = local.getAttendanceSummary(semester, subjectId) - local.deleteAttendanceSummary(old.uniqueSubtract(new)) - local.saveAttendanceSummary(new.uniqueSubtract(old)) - - return local.getAttendanceSummary(semester, subjectId) + fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getAttendanceSummary(semester, subjectId) }, + fetch = { remote.getAttendanceSummary(student, semester, subjectId) }, + saveFetchResult = { old, new -> + local.deleteAttendanceSummary(old uniqueSubtract new) + local.saveAttendanceSummary(new uniqueSubtract old) } - } + ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt index f355f4166..f68e13cbc 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.completedlessons import io.github.wulkanowy.data.db.dao.CompletedLessonsDao import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -18,7 +19,7 @@ class CompletedLessonsLocal @Inject constructor(private val completedLessonsDb: completedLessonsDb.deleteAll(completedLessons) } - suspend fun getCompletedLessons(semester: Semester, start: LocalDate, end: LocalDate): List { + fun getCompletedLessons(semester: Semester, start: LocalDate, end: LocalDate): Flow> { return completedLessonsDb.loadAll(semester.diaryId, semester.studentId, start, end) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt index 8e81c54ae..7303575e0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt @@ -1,9 +1,9 @@ package io.github.wulkanowy.data.repositories.completedlessons -import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract import org.threeten.bp.LocalDate @@ -16,15 +16,14 @@ class CompletedLessonsRepository @Inject constructor( private val remote: CompletedLessonsRemote ) { - suspend fun getCompletedLessons(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { - return local.getCompletedLessons(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { - val new = remote.getCompletedLessons(student, semester, start.monday, end.sunday) - val old = local.getCompletedLessons(semester, start.monday, end.sunday) - - local.deleteCompleteLessons(old.uniqueSubtract(new)) - local.saveCompletedLessons(new.uniqueSubtract(old)) - - local.getCompletedLessons(semester, start.monday, end.sunday) - }.filter { it.date in start..end } - } + fun getCompletedLessons(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getCompletedLessons(semester, start.monday, end.sunday) }, + fetch = { remote.getCompletedLessons(student, semester, start.monday, end.sunday) }, + saveFetchResult = { old, new -> + local.deleteCompleteLessons(old uniqueSubtract new) + local.saveCompletedLessons(new uniqueSubtract old) + }, + filterResult = { it.filter { item -> item.date in start..end } } + ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt index d1888380a..2b32f5270 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.exam import io.github.wulkanowy.data.db.dao.ExamDao import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -10,7 +11,7 @@ import javax.inject.Singleton @Singleton class ExamLocal @Inject constructor(private val examDb: ExamDao) { - suspend fun getExams(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { + fun getExams(semester: Semester, startDate: LocalDate, endDate: LocalDate): Flow> { return examDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt index 13af62c5b..152974170 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt @@ -1,9 +1,9 @@ package io.github.wulkanowy.data.repositories.exam -import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract import org.threeten.bp.LocalDate @@ -16,15 +16,14 @@ class ExamRepository @Inject constructor( private val remote: ExamRemote ) { - suspend fun getExams(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { - return local.getExams(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { - val new = remote.getExams(student, semester, start.monday, end.sunday) - val old = local.getExams(semester, start.monday, end.sunday) - - local.deleteExams(old.uniqueSubtract(new)) - local.saveExams(new.uniqueSubtract(old)) - - local.getExams(semester, start.monday, end.sunday) - }.filter { it.date in start..end } - } + fun getExams(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getExams(semester, start.monday, end.sunday) }, + fetch = { remote.getExams(student, semester, start.monday, end.sunday) }, + saveFetchResult = { old, new -> + local.deleteExams(old uniqueSubtract new) + local.saveExams(new uniqueSubtract old) + }, + filterResult = { it.filter { item -> item.date in start..end } } + ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt index 234fc6b80..ed3635423 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt @@ -5,6 +5,7 @@ import io.github.wulkanowy.data.db.dao.GradeSummaryDao import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.Flow import javax.inject.Inject import javax.inject.Singleton @@ -30,7 +31,7 @@ class GradeLocal @Inject constructor( gradeSummaryDb.updateAll(gradesSummary) } - suspend fun getGradesDetails(semester: Semester): List { + fun getGradesDetails(semester: Semester): Flow> { return gradeDb.loadAll(semester.semesterId, semester.studentId) } @@ -42,7 +43,7 @@ class GradeLocal @Inject constructor( gradeSummaryDb.deleteAll(gradesSummary) } - suspend fun getGradesSummary(semester: Semester): List { + fun getGradesSummary(semester: Semester): Flow> { return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt index 6dcbb0657..935cbedd9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt @@ -4,7 +4,11 @@ import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map import org.threeten.bp.LocalDateTime import javax.inject.Inject import javax.inject.Singleton @@ -15,30 +19,30 @@ class GradeRepository @Inject constructor( private val remote: GradeRemote ) { - suspend fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Pair, List> { - val details = local.getGradesDetails(semester) - val summaries = local.getGradesSummary(semester) - - if ((details.isNotEmpty() || summaries.isNotEmpty()) && !forceRefresh) { - return details to summaries + fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + shouldFetch = { (details, summaries) -> details.isEmpty() || summaries.isEmpty() || forceRefresh }, + query = { local.getGradesDetails(semester).combine(local.getGradesSummary(semester)) { details, summaries -> details to summaries } }, + fetch = { remote.getGrades(student, semester) }, + saveFetchResult = { old, new -> + refreshGradeDetails(student, old.first, new.first, notify) + refreshGradeSummaries(old.second, new.second, notify) } + ) - val (newDetails, newSummary) = remote.getGrades(student, semester) - val oldGrades = local.getGradesDetails(semester) - + private suspend fun refreshGradeDetails(student: Student, oldGrades: List, newDetails: List, notify: Boolean) { val notifyBreakDate = oldGrades.maxBy { it.date }?.date ?: student.registrationDate.toLocalDate() - local.deleteGrades(oldGrades.uniqueSubtract(newDetails)) - local.saveGrades(newDetails.uniqueSubtract(oldGrades).onEach { - if (it.date >= notifyBreakDate) it.apply { - isRead = false - if (notify) isNotified = false - } - }) + local.deleteGrades(oldGrades uniqueSubtract newDetails) + local.saveGrades((newDetails uniqueSubtract oldGrades).onEach { + if (it.date >= notifyBreakDate) it.apply { + isRead = false + if (notify) isNotified = false + } + }) + } - val oldSummaries = local.getGradesSummary(semester) - - local.deleteGradesSummary(oldSummaries.uniqueSubtract(newSummary)) - local.saveGradesSummary(newSummary.uniqueSubtract(oldSummaries).onEach { summary -> + private suspend fun refreshGradeSummaries(oldSummaries: List, newSummary: List, notify: Boolean) { + local.deleteGradesSummary(oldSummaries uniqueSubtract newSummary) + local.saveGradesSummary((newSummary uniqueSubtract oldSummaries).onEach { summary -> val oldSummary = oldSummaries.find { oldSummary -> oldSummary.subject == summary.subject } summary.isPredictedGradeNotified = when { summary.predictedGrade.isEmpty() -> true @@ -62,24 +66,22 @@ class GradeRepository @Inject constructor( else -> oldSummary.finalGradeLastChange } }) - - return local.getGradesDetails(semester) to local.getGradesSummary(semester) } - suspend fun getUnreadGrades(semester: Semester): List { - return local.getGradesDetails(semester).filter { grade -> !grade.isRead } + fun getUnreadGrades(semester: Semester): Flow> { + return local.getGradesDetails(semester).map { it.filter { grade -> !grade.isRead } } } - suspend fun getNotNotifiedGrades(semester: Semester): List { - return local.getGradesDetails(semester).filter { grade -> !grade.isNotified } + fun getNotNotifiedGrades(semester: Semester): Flow> { + return local.getGradesDetails(semester).map { it.filter { grade -> !grade.isNotified } } } - suspend fun getNotNotifiedPredictedGrades(semester: Semester): List { - return local.getGradesSummary(semester).filter { gradeSummary -> !gradeSummary.isPredictedGradeNotified } + fun getNotNotifiedPredictedGrades(semester: Semester): Flow> { + return local.getGradesSummary(semester).map { it.filter { gradeSummary -> !gradeSummary.isPredictedGradeNotified } } } - suspend fun getNotNotifiedFinalGrades(semester: Semester): List { - return local.getGradesSummary(semester).filter { gradeSummary -> !gradeSummary.isFinalGradeNotified } + fun getNotNotifiedFinalGrades(semester: Semester): Flow> { + return local.getGradesSummary(semester).map { it.filter { gradeSummary -> !gradeSummary.isFinalGradeNotified } } } suspend fun updateGrade(grade: Grade) { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt index d34f2b2ec..e0e2cd4db 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt @@ -5,6 +5,7 @@ import io.github.wulkanowy.data.db.dao.GradeStatisticsDao import io.github.wulkanowy.data.db.entities.GradePointsStatistics import io.github.wulkanowy.data.db.entities.GradeStatistics import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.Flow import javax.inject.Inject import javax.inject.Singleton @@ -14,34 +15,14 @@ class GradeStatisticsLocal @Inject constructor( private val gradePointsStatisticsDb: GradePointsStatisticsDao ) { - suspend fun getGradesStatistics(semester: Semester, isSemester: Boolean): List { + fun getGradesStatistics(semester: Semester, isSemester: Boolean): Flow> { return gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester) } - suspend fun getGradesPointsStatistics(semester: Semester): List { + fun getGradesPointsStatistics(semester: Semester): Flow> { return gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) } - suspend fun getGradesStatistics(semester: Semester, isSemester: Boolean, subjectName: String): List { - return when (subjectName) { - "Wszystkie" -> { - val statistics = gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester) - statistics.groupBy { it.grade }.map { - GradeStatistics(semester.studentId, semester.semesterId, subjectName, it.key, - it.value.fold(0) { acc, e -> acc + e.amount }, false) - } + statistics - } - else -> gradeStatisticsDb.loadSubject(semester.semesterId, semester.studentId, subjectName, isSemester) - } - } - - suspend fun getGradesPointsStatistics(semester: Semester, subjectName: String): List { - return when (subjectName) { - "Wszystkie" -> gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) - else -> gradePointsStatisticsDb.loadSubject(semester.semesterId, semester.studentId, subjectName) - } - } - suspend fun saveGradesStatistics(gradesStatistics: List) { gradeStatisticsDb.insertAll(gradesStatistics) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt index 93df69406..52ca705f7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.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.pojos.GradeStatisticsItem import io.github.wulkanowy.ui.modules.grade.statistics.ViewType +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import javax.inject.Inject import javax.inject.Singleton @@ -16,29 +17,40 @@ class GradeStatisticsRepository @Inject constructor( private val remote: GradeStatisticsRemote ) { - suspend fun getGradesStatistics(student: Student, semester: Semester, subjectName: String, isSemester: Boolean, forceRefresh: Boolean = false): List { - return local.getGradesStatistics(semester, isSemester, subjectName).mapToStatisticItems().filter { !forceRefresh }.ifEmpty { - val new = remote.getGradeStatistics(student, semester, isSemester) - val old = local.getGradesStatistics(semester, isSemester) - - local.deleteGradesStatistics(old.uniqueSubtract(new)) - local.saveGradesStatistics(new.uniqueSubtract(old)) - - local.getGradesStatistics(semester, isSemester, subjectName).mapToStatisticItems() + fun getGradesStatistics(student: Student, semester: Semester, subjectName: String, isSemester: Boolean, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getGradesStatistics(semester, isSemester) }, + fetch = { remote.getGradeStatistics(student, semester, isSemester) }, + saveFetchResult = { old, new -> + local.deleteGradesStatistics(old uniqueSubtract new) + local.saveGradesStatistics(new uniqueSubtract old) + }, + mapResult = { items -> + when (subjectName) { + "Wszystkie" -> items.groupBy { it.grade }.map { + GradeStatistics(semester.studentId, semester.semesterId, subjectName, it.key, + it.value.fold(0) { acc, e -> acc + e.amount }, false) + } + items + else -> items.filter { it.subject == subjectName } + }.mapToStatisticItems() } - } + ) - suspend fun getGradesPointsStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean): List { - return local.getGradesPointsStatistics(semester, subjectName).mapToStatisticsItem().filter { !forceRefresh }.ifEmpty { - val new = remote.getGradePointsStatistics(student, semester) - val old = local.getGradesPointsStatistics(semester) - - local.deleteGradesPointsStatistics(old.uniqueSubtract(new)) - local.saveGradesPointsStatistics(new.uniqueSubtract(old)) - - local.getGradesPointsStatistics(semester, subjectName).mapToStatisticsItem() + fun getGradesPointsStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getGradesPointsStatistics(semester) }, + fetch = { remote.getGradePointsStatistics(student, semester) }, + saveFetchResult = { old, new -> + local.deleteGradesPointsStatistics(old uniqueSubtract new) + local.saveGradesPointsStatistics(new uniqueSubtract old) + }, + mapResult = { items -> + when (subjectName) { + "Wszystkie" -> items + else -> items.filter { it.subject == subjectName } + }.mapToStatisticsItem() } - } + ) private fun List.mapToStatisticItems() = groupBy { it.subject }.map { GradeStatisticsItem( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt index ed6bb0cf5..5373e1b10 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.homework import io.github.wulkanowy.data.db.dao.HomeworkDao import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -22,7 +23,7 @@ class HomeworkLocal @Inject constructor(private val homeworkDb: HomeworkDao) { homeworkDb.updateAll(homework) } - suspend fun getHomework(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { + fun getHomework(semester: Semester, startDate: LocalDate, endDate: LocalDate): Flow> { return homeworkDb.loadAll(semester.semesterId, semester.studentId, startDate, endDate) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt index ca0a84a5f..5b6aeed41 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt @@ -4,6 +4,7 @@ import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract import org.threeten.bp.LocalDate @@ -16,18 +17,15 @@ class HomeworkRepository @Inject constructor( private val remote: HomeworkRemote ) { - suspend fun getHomework(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { - return local.getHomework(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { - val new = remote.getHomework(student, semester, start.monday, end.sunday) - - val old = local.getHomework(semester, start.monday, end.sunday) - - local.deleteHomework(old.uniqueSubtract(new)) - local.saveHomework(new.uniqueSubtract(old)) - - local.getHomework(semester, start.monday, end.sunday) + fun getHomework(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getHomework(semester, start.monday, end.sunday) }, + fetch = { remote.getHomework(student, semester, start.monday, end.sunday) }, + saveFetchResult = { old, new -> + local.deleteHomework(old uniqueSubtract new) + local.saveHomework(new uniqueSubtract old) } - } + ) suspend fun toggleDone(homework: Homework) { local.updateHomework(listOf(homework.apply { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt index d03d3ccd6..e50955e2c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt @@ -12,16 +12,12 @@ class LoggerRepository @Inject constructor( private val dispatchers: DispatchersProvider ) { - suspend fun getLastLogLines(): List { - return getLastModified().readText().split("\n") - } + suspend fun getLastLogLines() = getLastModified().readText().split("\n") - suspend fun getLogFiles(): List { - return withContext(dispatchers.backgroundThread) { - File(context.filesDir.absolutePath).listFiles(File::isFile)?.filter { - it.name.endsWith(".log") - }!! - } + suspend fun getLogFiles() = withContext(dispatchers.backgroundThread) { + File(context.filesDir.absolutePath).listFiles(File::isFile)?.filter { + it.name.endsWith(".log") + }!! } private suspend fun getLastModified(): File { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt index 22b5786dd..ecc784c44 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.luckynumber import io.github.wulkanowy.data.db.dao.LuckyNumberDao import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -22,7 +23,7 @@ class LuckyNumberLocal @Inject constructor(private val luckyNumberDb: LuckyNumbe luckyNumberDb.deleteAll(listOfNotNull(luckyNumber)) } - suspend fun getLuckyNumber(student: Student, date: LocalDate): LuckyNumber? { + fun getLuckyNumber(student: Student, date: LocalDate): Flow { return luckyNumberDb.load(student.studentId, date) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt index 3f6089628..3553a4615 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt @@ -2,6 +2,8 @@ package io.github.wulkanowy.data.repositories.luckynumber import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.utils.networkBoundResource +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate.now import javax.inject.Inject import javax.inject.Singleton @@ -12,31 +14,25 @@ class LuckyNumberRepository @Inject constructor( private val remote: LuckyNumberRemote ) { - suspend fun getLuckyNumber(student: Student, forceRefresh: Boolean = false, notify: Boolean = false): LuckyNumber? { - return local.getLuckyNumber(student, now())?.takeIf { !forceRefresh } ?: run { - val new = remote.getLuckyNumber(student) - val old = local.getLuckyNumber(student, now()) - + fun getLuckyNumber(student: Student, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + shouldFetch = { it == null || forceRefresh }, + query = { local.getLuckyNumber(student, now()) }, + fetch = { remote.getLuckyNumber(student) }, + saveFetchResult = { old, new -> if (new != old) { old?.let { local.deleteLuckyNumber(it) } local.saveLuckyNumber(new?.apply { if (notify) isNotified = false }) } - - local.saveLuckyNumber(new?.apply { - if (notify) isNotified = false - }) - - local.getLuckyNumber(student, now()) } - } + ) - suspend fun getNotNotifiedLuckyNumber(student: Student): LuckyNumber? { + fun getNotNotifiedLuckyNumber(student: Student): Flow { return local.getLuckyNumber(student, now()) } - suspend fun updateLuckyNumber(luckyNumber: LuckyNumber) { + suspend fun updateLuckyNumber(luckyNumber: LuckyNumber?) { local.updateLuckyNumber(luckyNumber) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt index f05c49d87..01231efe8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.message.MessageFolder.TRASHED +import kotlinx.coroutines.flow.Flow import javax.inject.Inject import javax.inject.Singleton @@ -28,7 +29,7 @@ class MessageLocal @Inject constructor( messagesDb.deleteAll(messages) } - suspend fun getMessageWithAttachment(student: Student, message: Message): MessageWithAttachment { + fun getMessageWithAttachment(student: Student, message: Message): Flow { return messagesDb.loadMessageWithAttachment(student.id.toInt(), message.messageId) } @@ -36,7 +37,7 @@ class MessageLocal @Inject constructor( messageAttachmentDao.insertAttachments(attachments) } - suspend fun getMessages(student: Student, folder: MessageFolder): List { + fun getMessages(student: Student, folder: MessageFolder): Flow> { return when (folder) { TRASHED -> messagesDb.loadDeleted(student.id.toInt()) else -> messagesDb.loadAll(student.id.toInt(), folder.id) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt index 7138566bd..ea46b6877 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt @@ -1,13 +1,15 @@ package io.github.wulkanowy.data.repositories.message import io.github.wulkanowy.data.db.entities.Message -import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED import io.github.wulkanowy.sdk.pojo.SentMessage +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @@ -18,46 +20,37 @@ class MessageRepository @Inject constructor( private val remote: MessageRemote ) { - suspend fun getMessages(student: Student, semester: Semester, folder: MessageFolder, forceRefresh: Boolean = false, notify: Boolean = false): List { - return local.getMessages(student, folder).filter { !forceRefresh }.ifEmpty { - val new = remote.getMessages(student, semester, folder) - val old = local.getMessages(student, folder) - - local.deleteMessages(old.uniqueSubtract(new)) - local.saveMessages(new.uniqueSubtract(old).onEach { + fun getMessages(student: Student, semester: Semester, folder: MessageFolder, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getMessages(student, folder) }, + fetch = { remote.getMessages(student, semester, folder) }, + saveFetchResult = { old, new -> + local.deleteMessages(old uniqueSubtract new) + local.saveMessages((new uniqueSubtract old).onEach { it.isNotified = !notify }) - - local.getMessages(student, folder) } - } + ) - suspend fun getMessage(student: Student, message: Message, markAsRead: Boolean = false): MessageWithAttachment { - return local.getMessageWithAttachment(student, message).let { - if (it.message.content.isNotEmpty().also { status -> - Timber.d("Message content in db empty: ${!status}") - } && !it.message.unread) { - return@let it - } - - val dbMessage = local.getMessageWithAttachment(student, message) - - val (downloadedMessage, attachments) = remote.getMessagesContentDetails(student, dbMessage.message, markAsRead) - - local.updateMessages(listOf(dbMessage.message.copy(unread = !markAsRead).apply { - id = dbMessage.message.id + fun getMessage(student: Student, message: Message, markAsRead: Boolean = false) = networkBoundResource( + shouldFetch = { + Timber.d("Message content in db empty: ${it.message.content.isEmpty()}") + it.message.unread || it.message.content.isEmpty() + }, + query = { local.getMessageWithAttachment(student, message) }, + fetch = { remote.getMessagesContentDetails(student, it.message, markAsRead) }, + saveFetchResult = { old, (downloadedMessage, attachments) -> + local.updateMessages(listOf(old.message.copy(unread = !markAsRead).apply { + id = old.message.id content = content.ifBlank { downloadedMessage } })) local.saveMessageAttachments(attachments) - Timber.d("Message ${message.messageId} with blank content: ${dbMessage.message.content.isBlank()}, marked as read") - - local.getMessageWithAttachment(student, message) + Timber.d("Message ${message.messageId} with blank content: ${old.message.content.isBlank()}, marked as read") } - } + ) - suspend fun getNotNotifiedMessages(student: Student): List { - return local.getMessages(student, RECEIVED) - .filter { message -> !message.isNotified && message.unread } + fun getNotNotifiedMessages(student: Student): Flow> { + return local.getMessages(student, RECEIVED).map { it.filter { message -> !message.isNotified && message.unread } } } suspend fun updateMessages(messages: List) { @@ -68,15 +61,12 @@ class MessageRepository @Inject constructor( return remote.sendMessage(student, subject, content, recipients) } - suspend fun deleteMessage(student: Student, message: Message): Boolean { - val delete = remote.deleteMessage(student, message) + suspend fun deleteMessage(student: Student, message: Message) { + val isDeleted = remote.deleteMessage(student, message) - if (!message.removed) local.updateMessages(listOf(message.copy(removed = true).apply { + if (!message.removed) local.updateMessages(listOf(message.copy(removed = isDeleted).apply { id = message.id content = message.content - })) - else local.deleteMessages(listOf(message)) - - return delete // TODO: wtf + })) else local.deleteMessages(listOf(message)) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt index 911ed3af5..0ccb3d7ef 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.mobiledevice import io.github.wulkanowy.data.db.dao.MobileDeviceDao import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.Flow import javax.inject.Inject import javax.inject.Singleton @@ -17,7 +18,7 @@ class MobileDeviceLocal @Inject constructor(private val mobileDb: MobileDeviceDa mobileDb.deleteAll(devices) } - suspend fun getDevices(semester: Semester): List { + fun getDevices(semester: Semester): Flow> { return mobileDb.loadAll(semester.studentId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt index f327ef607..65526ef86 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt @@ -4,6 +4,7 @@ import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.MobileDeviceToken +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import javax.inject.Inject import javax.inject.Singleton @@ -14,20 +15,19 @@ class MobileDeviceRepository @Inject constructor( private val remote: MobileDeviceRemote ) { - suspend fun getDevices(student: Student, semester: Semester, forceRefresh: Boolean = false): List { - return local.getDevices(semester).filter { !forceRefresh }.ifEmpty { - val new = remote.getDevices(student, semester) - val old = local.getDevices(semester) - + fun getDevices(student: Student, semester: Semester, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getDevices(semester) }, + fetch = { remote.getDevices(student, semester) }, + saveFetchResult = { old, new -> local.deleteDevices(old uniqueSubtract new) local.saveDevices(new uniqueSubtract old) - - local.getDevices(semester) } - } + ) - suspend fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice): Boolean { - return remote.unregisterDevice(student, semester, device) + suspend fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice) { + remote.unregisterDevice(student, semester, device) + local.deleteDevices(listOf(device)) } suspend fun getToken(student: Student, semester: Semester): MobileDeviceToken { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt index b1c6b2902..85ba5e223 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.note import io.github.wulkanowy.data.db.dao.NoteDao import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.db.entities.Student +import kotlinx.coroutines.flow.Flow import javax.inject.Inject import javax.inject.Singleton @@ -21,7 +22,7 @@ class NoteLocal @Inject constructor(private val noteDb: NoteDao) { noteDb.deleteAll(notes) } - suspend fun getNotes(student: Student): List { + fun getNotes(student: Student): Flow> { return noteDb.loadAll(student.studentId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt index 3628f5b87..6cf62ba22 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt @@ -3,7 +3,10 @@ package io.github.wulkanowy.data.repositories.note import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map import javax.inject.Inject import javax.inject.Singleton @@ -13,29 +16,27 @@ class NoteRepository @Inject constructor( private val remote: NoteRemote ) { - suspend fun getNotes(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): List { - return local.getNotes(student).filter { !forceRefresh }.ifEmpty { - val new = remote.getNotes(student, semester) - val old = local.getNotes(student) - - local.deleteNotes(old.uniqueSubtract(new)) - local.saveNotes(new.uniqueSubtract(old).onEach { + fun getNotes(student: Student, semester: Semester, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getNotes(student) }, + fetch = { remote.getNotes(student, semester) }, + saveFetchResult = { old, new -> + local.deleteNotes(old uniqueSubtract new) + local.saveNotes((new uniqueSubtract old).onEach { if (it.date >= student.registrationDate.toLocalDate()) it.apply { isRead = false if (notify) isNotified = false } }) - - local.getNotes(student) } - } + ) - suspend fun getNotNotifiedNotes(student: Student): List { - return local.getNotes(student).filter { note -> !note.isNotified } + fun getNotNotifiedNotes(student: Student): Flow> { + return local.getNotes(student).map { it.filter { note -> !note.isNotified } } } suspend fun updateNote(note: Note) { - return local.updateNotes(listOf(note)) + local.updateNotes(listOf(note)) } suspend fun updateNotes(notes: List) { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt index 5c16c57b8..f5e876b03 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt @@ -14,13 +14,17 @@ class RecipientRepository @Inject constructor( private val remote: RecipientRemote ) { - suspend fun getRecipients(student: Student, role: Int, unit: ReportingUnit, forceRefresh: Boolean = false): List { - return local.getRecipients(student, role, unit).filter { !forceRefresh }.ifEmpty { - val new = remote.getRecipients(student, role, unit) - val old = local.getRecipients(student, role, unit) + suspend fun refreshRecipients(student: Student, role: Int, unit: ReportingUnit) { + val new = remote.getRecipients(student, role, unit) + val old = local.getRecipients(student, role, unit) - local.deleteRecipients(old.uniqueSubtract(new)) - local.saveRecipients(new.uniqueSubtract(old)) + local.deleteRecipients(old uniqueSubtract new) + local.saveRecipients(new uniqueSubtract old) + } + + suspend fun getRecipients(student: Student, role: Int, unit: ReportingUnit): List { + return local.getRecipients(student, role, unit).ifEmpty { + refreshRecipients(student, role, unit) local.getRecipients(student, role, unit) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt index 70aefb9fd..ff5839460 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt @@ -12,23 +12,27 @@ class ReportingUnitRepository @Inject constructor( private val remote: ReportingUnitRemote ) { - suspend fun getReportingUnits(student: Student, forceRefresh: Boolean = false): List { - return local.getReportingUnits(student).filter { !forceRefresh }.ifEmpty { - val new = remote.getReportingUnits(student) - val old = local.getReportingUnits(student) + suspend fun refreshReportingUnits(student: Student) { + val new = remote.getReportingUnits(student) + val old = local.getReportingUnits(student) - local.deleteReportingUnits(old.uniqueSubtract(new)) - local.saveReportingUnits(new.uniqueSubtract(old)) + local.deleteReportingUnits(old.uniqueSubtract(new)) + local.saveReportingUnits(new.uniqueSubtract(old)) + } + + suspend fun getReportingUnits(student: Student): List { + return local.getReportingUnits(student).ifEmpty { + refreshReportingUnits(student) local.getReportingUnits(student) } } - suspend fun getReportingUnit(student: Student, unitId: Int): ReportingUnit { + suspend fun getReportingUnit(student: Student, unitId: Int): ReportingUnit? { return local.getReportingUnit(student, unitId) ?: run { - getReportingUnits(student, true) + refreshReportingUnits(student) - return local.getReportingUnit(student, unitId)!! + return local.getReportingUnit(student, unitId) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt index c8479b8f6..bc1b2f446 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.school import io.github.wulkanowy.data.db.dao.SchoolDao import io.github.wulkanowy.data.db.entities.School import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.flow.Flow import javax.inject.Inject class SchoolLocal @Inject constructor(private val schoolDb: SchoolDao) { @@ -15,7 +16,7 @@ class SchoolLocal @Inject constructor(private val schoolDb: SchoolDao) { schoolDb.deleteAll(listOf(school)) } - suspend fun getSchool(semester: Semester): School? { + fun getSchool(semester: Semester): Flow { return schoolDb.load(semester.studentId, semester.classId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt index 9ca945d06..4c84c3194 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt @@ -1,8 +1,8 @@ package io.github.wulkanowy.data.repositories.school -import io.github.wulkanowy.data.db.entities.School import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.utils.networkBoundResource import javax.inject.Inject import javax.inject.Singleton @@ -12,18 +12,16 @@ class SchoolRepository @Inject constructor( private val remote: SchoolRemote ) { - suspend fun getSchoolInfo(student: Student, semester: Semester, forceRefresh: Boolean = false): School { - return local.getSchool(semester).takeIf { it != null && !forceRefresh } ?: run { - val new = remote.getSchoolInfo(student, semester) - val old = local.getSchool(semester) - + fun getSchoolInfo(student: Student, semester: Semester, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it == null || forceRefresh }, + query = { local.getSchool(semester) }, + fetch = { remote.getSchoolInfo(student, semester) }, + saveFetchResult = { old, new -> if (new != old && old != null) { local.deleteSchool(old) local.saveSchool(new) } local.saveSchool(new) - - local.getSchool(semester)!! } - } + ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt index aeb424008..28d37ed85 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt @@ -1,22 +1,24 @@ package io.github.wulkanowy.data.repositories.semester -import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.getCurrentOrLast import io.github.wulkanowy.utils.isCurrent import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @Singleton class SemesterRepository @Inject constructor( private val remote: SemesterRemote, - private val local: SemesterLocal + private val local: SemesterLocal, + private val dispatchers: DispatchersProvider ) { - suspend fun getSemesters(student: Student, forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false): List { - return local.getSemesters(student).let { semesters -> + suspend fun getSemesters(student: Student, forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false) = withContext(dispatchers.backgroundThread) { + local.getSemesters(student).let { semesters -> semesters.filter { !forceRefresh && when { Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API -> semesters.firstOrNull { it.isCurrent }?.diaryId != 0 @@ -36,7 +38,7 @@ class SemesterRepository @Inject constructor( } } - suspend fun getCurrentSemester(student: Student, forceRefresh: Boolean = false): Semester { - return getSemesters(student, forceRefresh).getCurrentOrLast() + suspend fun getCurrentSemester(student: Student, forceRefresh: Boolean = false) = withContext(dispatchers.backgroundThread) { + getSemesters(student, forceRefresh).getCurrentOrLast() } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt index 5a4322f36..3a964aae5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt @@ -4,52 +4,55 @@ import android.content.Context import io.github.wulkanowy.data.db.dao.StudentDao import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.security.decrypt import io.github.wulkanowy.utils.security.encrypt +import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @Singleton class StudentLocal @Inject constructor( private val studentDb: StudentDao, + private val dispatchers: DispatchersProvider, private val context: Context ) { - suspend fun saveStudents(students: List): List { - return studentDb.insertAll(students.map { + suspend fun saveStudents(students: List) = withContext(dispatchers.backgroundThread) { + studentDb.insertAll(students.map { if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.API) it.copy(password = encrypt(it.password, context)) else it }) } - suspend fun getStudents(decryptPass: Boolean): List { - return studentDb.loadAll().map { + suspend fun getStudents(decryptPass: Boolean) = withContext(dispatchers.backgroundThread) { + studentDb.loadAll().map { it.apply { if (decryptPass && Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) } } } - suspend fun getStudentById(id: Int): Student? { - return studentDb.loadById(id)?.apply { + suspend fun getStudentById(id: Int) = withContext(dispatchers.backgroundThread) { + studentDb.loadById(id)?.apply { if (Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) } } - suspend fun getCurrentStudent(decryptPass: Boolean): Student? { - return studentDb.loadCurrent()?.apply { + suspend fun getCurrentStudent(decryptPass: Boolean) = withContext(dispatchers.backgroundThread) { + studentDb.loadCurrent()?.apply { if (decryptPass && Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) } } - suspend fun setCurrentStudent(student: Student) { - return studentDb.run { + suspend fun setCurrentStudent(student: Student) = withContext(dispatchers.backgroundThread) { + studentDb.run { resetCurrent() updateCurrent(student.id) } } - suspend fun logoutStudent(student: Student) { - return studentDb.delete(student) + suspend fun logoutStudent(student: Student) = withContext(dispatchers.backgroundThread) { + studentDb.delete(student) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt index 1f9dfff32..e225a381e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt @@ -3,13 +3,14 @@ package io.github.wulkanowy.data.repositories.subject import io.github.wulkanowy.data.db.dao.SubjectDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Subject +import kotlinx.coroutines.flow.Flow import javax.inject.Inject import javax.inject.Singleton @Singleton class SubjectLocal @Inject constructor(private val subjectDao: SubjectDao) { - suspend fun getSubjects(semester: Semester): List { + fun getSubjects(semester: Semester): Flow> { return subjectDao.loadAll(semester.diaryId, semester.studentId) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt index 646e3642a..60a0c3e71 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt @@ -2,7 +2,7 @@ package io.github.wulkanowy.data.repositories.subject import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.db.entities.Subject +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import javax.inject.Inject import javax.inject.Singleton @@ -13,15 +13,13 @@ class SubjectRepository @Inject constructor( private val remote: SubjectRemote ) { - suspend fun getSubjects(student: Student, semester: Semester, forceRefresh: Boolean = false): List { - return local.getSubjects(semester).filter { !forceRefresh }.ifEmpty { - val new = remote.getSubjects(student, semester) - val old = local.getSubjects(semester) - - local.deleteSubjects(old.uniqueSubtract(new)) - local.saveSubjects(new.uniqueSubtract(old)) - - local.getSubjects(semester) + fun getSubjects(student: Student, semester: Semester, forceRefresh: Boolean = false) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getSubjects(semester) }, + fetch = { remote.getSubjects(student, semester) }, + saveFetchResult = { old, new -> + local.deleteSubjects(old uniqueSubtract new) + local.saveSubjects(new uniqueSubtract old) } - } + ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt index 53680b7b3..908f45a1a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.teacher import io.github.wulkanowy.data.db.dao.TeacherDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Teacher +import kotlinx.coroutines.flow.Flow import javax.inject.Inject class TeacherLocal @Inject constructor(private val teacherDb: TeacherDao) { @@ -15,7 +16,7 @@ class TeacherLocal @Inject constructor(private val teacherDb: TeacherDao) { teacherDb.deleteAll(teachers) } - suspend fun getTeachers(semester: Semester): List { + fun getTeachers(semester: Semester): Flow> { return teacherDb.loadAll(semester.studentId, semester.classId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt index a540e78c4..df25a53ec 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt @@ -2,7 +2,7 @@ package io.github.wulkanowy.data.repositories.teacher import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.db.entities.Teacher +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import javax.inject.Inject import javax.inject.Singleton @@ -13,15 +13,13 @@ class TeacherRepository @Inject constructor( private val remote: TeacherRemote ) { - suspend fun getTeachers(student: Student, semester: Semester, forceRefresh: Boolean = false): List { - return local.getTeachers(semester).filter { !forceRefresh }.ifEmpty { - val new = remote.getTeachers(student, semester) - val old = local.getTeachers(semester) - - local.deleteTeachers(old.uniqueSubtract(new)) - local.saveTeachers(new.uniqueSubtract(old)) - - local.getTeachers(semester) + fun getTeachers(student: Student, semester: Semester, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getTeachers(semester) }, + fetch = { remote.getTeachers(student, semester) }, + saveFetchResult = { old, new -> + local.deleteTeachers(old uniqueSubtract new) + local.saveTeachers(new uniqueSubtract old) } - } + ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt index a90c664c0..91a4b2617 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.timetable import io.github.wulkanowy.data.db.dao.TimetableDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Timetable +import kotlinx.coroutines.flow.Flow import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -18,7 +19,7 @@ class TimetableLocal @Inject constructor(private val timetableDb: TimetableDao) timetableDb.deleteAll(timetables) } - suspend fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { + fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate): Flow> { return timetableDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt index b34075524..54ddf10b1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt @@ -2,11 +2,12 @@ package io.github.wulkanowy.data.repositories.timetable 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.services.alarm.TimetableNotificationSchedulerHelper import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.flow.map import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -18,11 +19,11 @@ class TimetableRepository @Inject constructor( private val schedulerHelper: TimetableNotificationSchedulerHelper ) { - suspend fun getTimetable(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { - return local.getTimetable(semester, start.monday, start.sunday).filter { !forceRefresh }.ifEmpty { - val new = remote.getTimetable(student, semester, start.monday, start.sunday) - val old = local.getTimetable(semester, start.monday, start.sunday) - + fun getTimetable(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + shouldFetch = { it.isEmpty() || forceRefresh }, + query = { local.getTimetable(semester, start.monday, end.sunday).map { schedulerHelper.scheduleNotifications(it, student); it } }, + fetch = { remote.getTimetable(student, semester, start.monday, end.sunday) }, + saveFetchResult = { old, new -> local.deleteTimetable(old.uniqueSubtract(new).also { schedulerHelper.cancelScheduled(it) }) local.saveTimetable(new.uniqueSubtract(old).also { schedulerHelper.scheduleNotifications(it, student) }.map { item -> item.also { new -> @@ -34,8 +35,7 @@ class TimetableRepository @Inject constructor( } } }) - - local.getTimetable(semester, start.monday, start.sunday) - }.filter { it.date in start..end }.also { schedulerHelper.scheduleNotifications(it, student) } - } + }, + filterResult = { it.filter { item -> item.date in start..end } } + ) } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt index f4333f337..3d118e6f1 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt @@ -12,7 +12,7 @@ class AttendanceSummaryWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { attendanceSummaryRepository.getAttendanceSummary(student, semester, -1, true) } + return rxCompletable { attendanceSummaryRepository.getAttendanceSummary(student, semester, -1, true).waitForResult() } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt index 069b6c8f4..23cb1acd2 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.reactivex.Completable import kotlinx.coroutines.rx2.rxCompletable import org.threeten.bp.LocalDate.now @@ -13,6 +13,6 @@ import javax.inject.Inject class AttendanceWork @Inject constructor(private val attendanceRepository: AttendanceRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true) } + return rxCompletable { attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true).waitForResult() } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt index 8914fd369..347d8bbb1 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRepository -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.reactivex.Completable import kotlinx.coroutines.rx2.rxCompletable import org.threeten.bp.LocalDate.now @@ -15,7 +15,6 @@ class CompletedLessonWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { completedLessonsRepository.getCompletedLessons(student, semester, now().monday, now().sunday, true) } + return rxCompletable { completedLessonsRepository.getCompletedLessons(student, semester, now().monday, now().sunday, true).waitForResult() } } } - diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt index 0a4512958..a8c7fdb39 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt @@ -13,6 +13,6 @@ import javax.inject.Inject class ExamWork @Inject constructor(private val examRepository: ExamRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { examRepository.getExams(student, semester, now().monday, now().sunday, true) } + return rxCompletable { examRepository.getExams(student, semester, now().monday, now().sunday, true).waitForResult() } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt index 0a1a9eee5..cbfa2d9af 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt @@ -7,10 +7,17 @@ import io.reactivex.Completable import kotlinx.coroutines.rx2.rxCompletable import javax.inject.Inject -class GradeStatisticsWork @Inject constructor(private val gradeStatisticsRepository: GradeStatisticsRepository) : Work { +class GradeStatisticsWork @Inject constructor( + private val gradeStatisticsRepository: GradeStatisticsRepository +) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { gradeStatisticsRepository.getGradesStatistics(student, semester, "Wszystkie", false, forceRefresh = true) } + return rxCompletable { + with(gradeStatisticsRepository) { + getGradesStatistics(student, semester, "Wszystkie", isSemester = true, forceRefresh = true).waitForResult() + getGradesStatistics(student, semester, "Wszystkie", isSemester = false, forceRefresh = true).waitForResult() + getGradesPointsStatistics(student, semester, "Wszystkie", forceRefresh = true).waitForResult() + } + } } } - diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt index 252966d64..741809930 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt @@ -19,6 +19,7 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.flow.first import kotlinx.coroutines.rx2.rxCompletable import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject @@ -32,14 +33,14 @@ class GradeWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable) } - .concatWith(Completable.concatArray(rxSingle { gradeRepository.getNotNotifiedGrades(semester) }.flatMapCompletable { + return rxCompletable { gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable).waitForResult() } + .concatWith(Completable.concatArray(rxSingle { gradeRepository.getNotNotifiedGrades(semester).first() }.flatMapCompletable { if (it.isNotEmpty()) notifyDetails(it) rxCompletable { gradeRepository.updateGrades(it.onEach { grade -> grade.isNotified = true }) } - }, rxSingle { gradeRepository.getNotNotifiedPredictedGrades(semester) }.flatMapCompletable { + }, rxSingle { gradeRepository.getNotNotifiedPredictedGrades(semester).first() }.flatMapCompletable { if (it.isNotEmpty()) notifyPredicted(it) rxCompletable { gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isPredictedGradeNotified = true }) } - }, rxSingle { gradeRepository.getNotNotifiedFinalGrades(semester) }.flatMapCompletable { + }, rxSingle { gradeRepository.getNotNotifiedFinalGrades(semester).first() }.flatMapCompletable { if (it.isNotEmpty()) notifyFinal(it) rxCompletable { gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isFinalGradeNotified = true }) } })) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt index 2bf5315a2..8b69b7b6e 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.homework.HomeworkRepository -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.reactivex.Completable import kotlinx.coroutines.rx2.rxCompletable import org.threeten.bp.LocalDate.now @@ -13,6 +13,6 @@ import javax.inject.Inject class HomeworkWork @Inject constructor(private val homeworkRepository: HomeworkRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { homeworkRepository.getHomework(student, semester, now().monday, now().sunday, true) } + return rxCompletable { homeworkRepository.getHomework(student, semester, now().monday, now().sunday, true).waitForResult() } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt index 1389566bd..9bf3de0c6 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt @@ -18,6 +18,7 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.flow.first import kotlinx.coroutines.rx2.rxCompletable import kotlinx.coroutines.rx2.rxMaybe import javax.inject.Inject @@ -31,8 +32,8 @@ class LuckyNumberWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxMaybe { luckyNumberRepository.getLuckyNumber(student, true, preferencesRepository.isNotificationsEnable) } - .flatMap { rxMaybe { luckyNumberRepository.getNotNotifiedLuckyNumber(student) } } + return rxMaybe { luckyNumberRepository.getLuckyNumber(student, true, preferencesRepository.isNotificationsEnable).waitForResult() } + .flatMap { rxMaybe { luckyNumberRepository.getNotNotifiedLuckyNumber(student).first() } } .flatMapCompletable { notify(it) rxCompletable { luckyNumberRepository.updateLuckyNumber(it.apply { isNotified = true }) } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt index a805fe6bc..28f6e3076 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt @@ -19,6 +19,7 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.flow.first import kotlinx.coroutines.rx2.rxCompletable import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject @@ -32,8 +33,8 @@ class MessageWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxSingle { messageRepository.getMessages(student, semester, RECEIVED, true, preferencesRepository.isNotificationsEnable) } - .flatMap { rxSingle { messageRepository.getNotNotifiedMessages(student) } } + return rxSingle { messageRepository.getMessages(student, semester, RECEIVED, true, preferencesRepository.isNotificationsEnable).waitForResult() } + .flatMap { rxSingle { messageRepository.getNotNotifiedMessages(student).first() } } .flatMapCompletable { if (it.isNotEmpty()) notify(it) rxCompletable { messageRepository.updateMessages(it.onEach { message -> message.isNotified = true }) } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt index f33c64023..029c9f98a 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt @@ -18,6 +18,7 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.flow.first import kotlinx.coroutines.rx2.rxCompletable import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject @@ -31,8 +32,8 @@ class NoteWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxSingle { noteRepository.getNotes(student, semester, true, preferencesRepository.isNotificationsEnable) } - .flatMap { rxSingle { noteRepository.getNotNotifiedNotes(student) } } + return rxSingle { noteRepository.getNotes(student, semester, true, preferencesRepository.isNotificationsEnable).waitForResult() } + .flatMap { rxSingle { noteRepository.getNotNotifiedNotes(student).first() } } .flatMapCompletable { if (it.isNotEmpty()) notify(it) rxCompletable { noteRepository.updateNotes(it.onEach { note -> note.isNotified = true }) } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt index 704150981..2a53e51ba 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt @@ -15,10 +15,11 @@ class RecipientWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxSingle { reportingUnitRepository.getReportingUnits(student, true) } + return rxSingle { reportingUnitRepository.refreshReportingUnits(student) } + .flatMap { rxSingle { reportingUnitRepository.getReportingUnits(student) } } .flatMapCompletable { units -> Completable.mergeDelayError(units.map { - rxCompletable { recipientRepository.getRecipients(student, 2, it, true) } + rxCompletable { recipientRepository.refreshRecipients(student, 2, it) } }) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt index f3ebf9eea..9954db314 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt @@ -10,6 +10,6 @@ import javax.inject.Inject class TeacherWork @Inject constructor(private val teacherRepository: TeacherRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { teacherRepository.getTeachers(student, semester, true) } + return rxCompletable { teacherRepository.getTeachers(student, semester, true).waitForResult() } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt index 7d6438d7a..f77018569 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt @@ -13,6 +13,6 @@ import javax.inject.Inject class TimetableWork @Inject constructor(private val timetableRepository: TimetableRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { timetableRepository.getTimetable(student, semester, now().monday, now().sunday, true) } + return rxCompletable { timetableRepository.getTimetable(student, semester, now().monday, now().sunday, true).waitForResult() } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt index 1601a103b..8dc0b98d2 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt @@ -1,11 +1,19 @@ package io.github.wulkanowy.services.sync.works +import io.github.wulkanowy.data.Resource +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.reactivex.Completable +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.takeWhile interface Work { fun create(student: Student, semester: Semester): Completable -} + suspend fun Flow>.waitForResult() = takeWhile { + it.status == Status.LOADING + }.collect() +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index d9dbc362b..b0fc0f6bc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -1,24 +1,39 @@ package io.github.wulkanowy.ui.base +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.utils.SchedulersProvider -import io.reactivex.Completable +import io.github.wulkanowy.utils.flowWithResource import io.reactivex.disposables.CompositeDisposable -import kotlinx.coroutines.rx2.rxCompletable -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import timber.log.Timber +import kotlin.coroutines.CoroutineContext open class BasePresenter( protected val errorHandler: ErrorHandler, protected val studentRepository: StudentRepository, protected val schedulers: SchedulersProvider -) { +) : CoroutineScope { + private var job: Job = Job() + + private val jobs = mutableMapOf() + + override val coroutineContext: CoroutineContext + get() = Dispatchers.Main + job + + @Deprecated("Use flow instead :)") val disposable = CompositeDisposable() var view: T? = null open fun onAttachView(view: T) { + job = Job() this.view = view errorHandler.apply { showErrorMessage = view::showError @@ -28,30 +43,48 @@ open class BasePresenter( } fun onExpiredLoginSelected() { - Timber.i("Attempt to switch the student after the session expires") - disposable.add(rxSingle { studentRepository.getCurrentStudent(false) } - .flatMapCompletable { rxCompletable { studentRepository.logoutStudent(it) } } - .andThen(rxSingle { studentRepository.getSavedStudents(false) }) - .flatMapCompletable { - if (it.isNotEmpty()) { - Timber.i("Switching current student") - rxCompletable { studentRepository.switchStudent(it[0]) } - } else Completable.complete() + flowWithResource { + val student = studentRepository.getCurrentStudent(false) + studentRepository.logoutStudent(student) + + val students = studentRepository.getSavedStudents(false) + if (students.isNotEmpty()) { + Timber.i("Switching current student") + studentRepository.switchStudent(students[0]) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - Timber.i("Switch student result: Open login view") - view?.openClearLoginView() - }, { - Timber.i("Switch student result: An exception occurred") - errorHandler.dispatch(it) - })) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Attempt to switch the student after the session expires") + Status.SUCCESS -> { + Timber.i("Switch student result: Open login view") + view?.openClearLoginView() + } + Status.ERROR -> { + Timber.i("Switch student result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.launch("expired") + } + + fun Flow.launch(individualJobTag: String = "load"): Job { + jobs[individualJobTag]?.cancel() + val job = launchIn(this@BasePresenter) + jobs[individualJobTag] = job + Timber.d("Job $individualJobTag launched in ${this@BasePresenter.javaClass.simpleName}: $job") + return job + } + + fun cancelJobs(vararg names: String) { + names.forEach { + jobs[it]?.cancel() + } } open fun onDetachView() { view = null disposable.clear() + job.cancel() errorHandler.clear() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index c88e4d87d..946e661b1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -24,10 +24,10 @@ open class ErrorHandler @Inject constructor(protected val resources: Resources, } protected open fun proceed(error: Throwable) { + showErrorMessage(resources.getString(error), error) when (error) { is ScramblerException, is BadCredentialsException -> onSessionExpired() is NoCurrentStudentException -> onNoCurrentStudent() - else -> showErrorMessage(resources.getString(error), error) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt index ae149fa14..c2238de7c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt @@ -1,12 +1,14 @@ package io.github.wulkanowy.ui.modules.about.contributor +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.pojos.Contributor import io.github.wulkanowy.data.repositories.appcreator.AppCreatorRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.flowWithResource +import kotlinx.coroutines.flow.onEach import javax.inject.Inject class ContributorPresenter @Inject constructor( @@ -31,10 +33,15 @@ class ContributorPresenter @Inject constructor( } private fun loadData() { - disposable.add(rxSingle { appCreatorRepository.getAppCreators() } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { view?.showProgress(false) } - .subscribe({ view?.run { updateData(it) } }, { errorHandler.dispatch(it) })) + flowWithResource { appCreatorRepository.getAppCreators() }.onEach { + when (it.status) { + Status.LOADING -> view?.showProgress(true) + Status.SUCCESS -> view?.run { + showProgress(false) + updateData(it.data!!) + } + Status.ERROR -> errorHandler.dispatch(it.error!!) + } + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseAdapter.kt index 07025c09f..6ae06bbe7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseAdapter.kt @@ -24,7 +24,7 @@ class LicenseAdapter @Inject constructor() : RecyclerView.Adapter(errorHandler, studentRepository, schedulers) { @@ -21,14 +28,22 @@ class LicensePresenter @Inject constructor( } fun onItemSelected(library: Library) { - view?.run { library.license?.licenseDescription?.let { openLicense(it) } } + view?.run { library.licenses?.firstOrNull()?.licenseDescription?.let { openLicense(it) } } } private fun loadData() { - disposable.add(Single.fromCallable { view?.appLibraries.orEmpty() } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnEvent { _, _ -> view?.showProgress(false) } - .subscribe({ view?.run { updateData(it) } }, { errorHandler.dispatch(it) })) + flowWithResource { + withContext(dispatchers.backgroundThread) { + view?.appLibraries.orEmpty() + } + }.onEach { + when (it.status) { + Status.LOADING -> Timber.d("License data load started") + Status.SUCCESS -> view?.updateData(it.data!!) + Status.ERROR -> errorHandler.dispatch(it.error!!) + } + }.afterLoading { + view?.showProgress(false) + }.launch() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt index e1ec23a12..50df763aa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt @@ -1,11 +1,13 @@ package io.github.wulkanowy.ui.modules.about.logviewer +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.logger.LoggerRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.flowWithResource +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -23,16 +25,19 @@ class LogViewerPresenter @Inject constructor( } fun onShareLogsSelected(): Boolean { - disposable.add(rxSingle { loggerRepository.getLogFiles() } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ files -> - Timber.i("Loading logs files result: ${files.joinToString { it.name }}") - view?.shareLogs(files) - }, { - Timber.i("Loading logs files result: An exception occurred") - errorHandler.dispatch(it) - })) + flowWithResource { loggerRepository.getLogFiles() }.onEach { + when (it.status) { + Status.LOADING -> Timber.d("Loading logs files started") + Status.SUCCESS -> { + Timber.i("Loading logs files result: ${it.data!!.joinToString { file -> file.name }}") + view?.shareLogs(it.data) + } + Status.ERROR -> { + Timber.i("Loading logs files result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.launch("share") return true } @@ -41,15 +46,18 @@ class LogViewerPresenter @Inject constructor( } private fun loadLogFile() { - disposable.add(rxSingle { loggerRepository.getLastLogLines() } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - Timber.i("Loading last log file result: load ${it.size} lines") - view?.setLines(it) - }, { - Timber.i("Loading last log file result: An exception occurred") - errorHandler.dispatch(it) - })) + flowWithResource { loggerRepository.getLastLogLines() }.onEach { + when (it.status) { + Status.LOADING -> Timber.d("Loading last log file started") + Status.SUCCESS -> { + Timber.i("Loading last log file result: load ${it.data!!.size} lines") + view?.setLines(it.data) + } + Status.ERROR -> { + Timber.i("Loading last log file result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.launch("file") } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt index 1dd32cf90..402394170 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt @@ -1,14 +1,15 @@ package io.github.wulkanowy.ui.modules.account +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider -import io.reactivex.Single -import kotlinx.coroutines.rx2.rxCompletable -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -37,20 +38,20 @@ class AccountPresenter @Inject constructor( } fun onLogoutConfirm() { - Timber.i("Attempt to logout current user ") - disposable.add(rxSingle { studentRepository.getCurrentStudent(false) } - .flatMapCompletable { rxCompletable { studentRepository.logoutStudent(it) } } - .andThen(rxSingle { studentRepository.getSavedStudents(false) }) - .flatMap { - if (it.isNotEmpty()) rxCompletable { studentRepository.switchStudent(it[0]) }.toSingle { it } - else Single.just(it) + flowWithResource { + val student = studentRepository.getCurrentStudent(false) + studentRepository.logoutStudent(student) + + val students = studentRepository.getSavedStudents(false) + if (students.isNotEmpty()) { + studentRepository.switchStudent(students[0]) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { view?.dismissView() } - .subscribe({ - view?.apply { - if (it.isEmpty()) { + students + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Attempt to logout current user ") + Status.SUCCESS -> view?.run { + if (it.data!!.isEmpty()) { Timber.i("Logout result: Open login view") syncManager.stopSyncWorker() openClearLoginView() @@ -59,30 +60,35 @@ class AccountPresenter @Inject constructor( recreateMainView() } } - }, { - Timber.i("Logout result: An exception occurred") - errorHandler.dispatch(it) - })) + Status.ERROR -> { + Timber.i("Logout result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.dismissView() + }.launch("logout") } fun onItemSelected(student: Student) { Timber.i("Select student item ${student.id}") if (student.isCurrent) { view?.dismissView() - } else { - Timber.i("Attempt to change a student") - disposable.add(rxSingle { studentRepository.switchStudent(student) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { view?.dismissView() } - .subscribe({ + } else flowWithResource { studentRepository.switchStudent(student) }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Attempt to change a student") + Status.SUCCESS -> { Timber.i("Change a student result: Success") view?.recreateMainView() - }, { + } + Status.ERROR -> { Timber.i("Change a student result: An exception occurred") - errorHandler.dispatch(it) - })) - } + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.dismissView() + }.launch("switch") } private fun createAccountItems(items: List): List> { @@ -94,17 +100,18 @@ class AccountPresenter @Inject constructor( } private fun loadData() { - Timber.i("Loading account data started") - disposable.add(rxSingle { studentRepository.getSavedStudents(false) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .map { createAccountItems(it) } - .subscribe({ - Timber.i("Loading account result: Success") - view?.updateData(it) - }, { - Timber.i("Loading account result: An exception occurred") - errorHandler.dispatch(it) - })) + flowWithResource { studentRepository.getSavedStudents(false) }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading account data started") + Status.SUCCESS -> { + Timber.i("Loading account result: Success") + view?.updateData(createAccountItems(it.data!!)) + } + Status.ERROR -> { + Timber.i("Loading account result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.launch() } } 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 f177d0191..0645c7a4f 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 @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.modules.attendance import android.annotation.SuppressLint +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository @@ -10,13 +11,18 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource +import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousOrSameSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.onEach import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay @@ -168,100 +174,93 @@ class AttendancePresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) - currentDate = baseDate - reloadNavigation() - }) { - Timber.i("Loading semester result: An exception occurred") - }) + flow { + val student = studentRepository.getCurrentStudent() + emit(semesterRepository.getCurrentSemester(student)) + }.catch { + Timber.i("Loading semester result: An exception occurred") + }.onEach { + baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) + currentDate = baseDate + reloadNavigation() + }.launch("holidays") } private fun loadData(date: LocalDate, forceRefresh: Boolean = false) { Timber.i("Loading attendance data started") currentDate = date - disposable.apply { - clear() - add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { attendanceRepository.getAttendance(student, semester, date, date, forceRefresh) } - } - } - .map { list -> - if (prefRepository.isShowPresent) list - else list.filter { !it.presence } - } - .map { items -> items.sortedBy { it.number } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) - } - } - .subscribe({ + + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + attendanceRepository.getAttendance(student, semester, date, date, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> view?.showExcuseButton(false) + Status.SUCCESS -> { Timber.i("Loading attendance result: Success") view?.apply { - updateData(it) - showEmpty(it.isEmpty()) + updateData(it.data!!.let { items -> + if (prefRepository.isShowPresent) items + else items.filter { item -> !item.presence } + }.sortedBy { item -> item.number }) + showEmpty(it.data.isEmpty()) showErrorView(false) - showContent(it.isNotEmpty()) - showExcuseButton(it.any { item -> item.excusable }) + showContent(it.data.isNotEmpty()) + showExcuseButton(it.data.any { item -> item.excusable }) } analytics.logEvent( "load_data", "type" to "attendance", - "items" to it.size, - "force_refresh" to forceRefresh + "items" to it.data!!.size ) - }) { - Timber.i("Loading attendance result: An exception occurred") - errorHandler.dispatch(it) } - ) - } + Status.ERROR -> { + Timber.i("Loading attendance result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + } + }.launch() } private fun excuseAbsence(reason: String?, toExcuseList: List) { - Timber.i("Excusing absence started") - disposable.apply { - add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { attendanceRepository.excuseForAbsence(student, semester, toExcuseList, reason) } - } + flowWithResource { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + attendanceRepository.excuseForAbsence(student, semester, toExcuseList, reason) + }.onEach { + when (it.status) { + Status.LOADING -> view?.run { + Timber.i("Excusing absence started") + showProgress(true) + showContent(false) + showExcuseButton(false) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnSubscribe { - view?.apply { - showProgress(true) - showContent(false) - showExcuseButton(false) - } - } - .subscribe({ + Status.SUCCESS -> { Timber.i("Excusing for absence result: Success") analytics.logEvent("excuse_absence", "items" to attendanceToExcuseList.size) attendanceToExcuseList.clear() - view?.apply { + view?.run { showExcuseButton(false) showMessage(excuseSuccessString) + showContent(true) + showProgress(false) } - loadData(currentDate, true) - }) { + loadData(currentDate, forceRefresh = true) + } + Status.ERROR -> { Timber.i("Excusing for absence result: An exception occurred") - view?.showProgress(false) - errorHandler.dispatch(it) - }) - } + errorHandler.dispatch(it.error!!) + loadData(currentDate) + } + } + }.launch("excuse") } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt index f694a8d0c..5d16b3143 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.attendance.summary +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Subject import io.github.wulkanowy.data.repositories.attendancesummary.AttendanceSummaryRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -9,7 +10,9 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn +import kotlinx.coroutines.flow.onEach import org.threeten.bp.Month import timber.log.Timber import javax.inject.Inject @@ -73,46 +76,43 @@ class AttendanceSummaryPresenter @Inject constructor( } private fun loadData(subjectId: Int, forceRefresh: Boolean = false) { - Timber.i("Loading attendance summary data started") currentSubjectId = subjectId - disposable.apply { - clear() - add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { - rxSingle { attendanceSummaryRepository.getAttendanceSummary(student, it, subjectId, forceRefresh) } - } - } - .map { items -> items.sortedByDescending { if (it.month.value <= Month.JUNE.value) it.month.value + 12 else it.month.value } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) - } - } - .subscribe({ + + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + attendanceSummaryRepository.getAttendanceSummary(student, semester, subjectId, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading attendance summary data started") + Status.SUCCESS -> { Timber.i("Loading attendance summary result: Success") view?.apply { - showEmpty(it.isEmpty()) - showContent(it.isNotEmpty()) - updateDataSet(it) + showEmpty(it.data!!.isEmpty()) + showContent(it.data.isNotEmpty()) + updateDataSet(it.data.sortedByDescending { item -> + if (item.month.value <= Month.JUNE.value) item.month.value + 12 else item.month.value + }) } analytics.logEvent( "load_data", "type" to "attendance_summary", - "items" to it.size, - "force_refresh" to forceRefresh, + "items" to it.data!!.size, "item_id" to subjectId ) - }) { - Timber.i("Loading attendance summary result: An exception occurred") - errorHandler.dispatch(it) } - ) - } + Status.ERROR -> { + Timber.i("Loading attendance summary result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { @@ -127,27 +127,27 @@ class AttendanceSummaryPresenter @Inject constructor( } private fun loadSubjects() { - Timber.i("Loading attendance summary subjects started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { subjectRepository.getSubjects(student, semester) } + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + subjectRepository.getSubjects(student, semester) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading attendance summary subjects started") + Status.SUCCESS -> { + subjects = it.data!! + + Timber.i("Loading attendance summary subjects result: Success") + view?.run { + view?.updateSubjects(ArrayList(it.data.map { subject -> subject.name })) + showSubjects(true) + } + } + Status.ERROR -> { + Timber.i("Loading attendance summary subjects result: An exception occurred") + errorHandler.dispatch(it.error!!) } } - .doOnSuccess { subjects = it } - .map { ArrayList(it.map { subject -> subject.name }) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - Timber.i("Loading attendance summary subjects result: Success") - view?.run { - view?.updateSubjects(it) - showSubjects(true) - } - }, { - Timber.i("Loading attendance summary subjects result: An exception occurred") - errorHandler.dispatch(it) - }) - ) + }.launch("subjects") } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index 844fb263a..21f7ae6e0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.exam +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.repositories.exam.ExamRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -8,13 +9,17 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import io.github.wulkanowy.utils.sunday +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.nextOrSameSchoolDay +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.toFormattedString -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.onEach import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay @@ -90,59 +95,54 @@ class ExamPresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) - currentDate = baseDate - reloadNavigation() - }) { - Timber.i("Loading semester result: An exception occurred") - }) + flow { + val student = studentRepository.getCurrentStudent() + emit(semesterRepository.getCurrentSemester(student)) + }.catch { + Timber.i("Loading semester result: An exception occurred") + }.onEach { + baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) + currentDate = baseDate + reloadNavigation() + }.launch("holidays") } private fun loadData(date: LocalDate, forceRefresh: Boolean = false) { - Timber.i("Loading exam data started") currentDate = date - disposable.apply { - clear() - add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { examRepository.getExams(student, semester, currentDate.monday, currentDate.sunday, forceRefresh) } - } - } - .map { createExamItems(it) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) - } - } - .subscribe({ + + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + examRepository.getExams(student, semester, currentDate.monday, currentDate.sunday, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading exam data started") + Status.SUCCESS -> { Timber.i("Loading exam result: Success") view?.apply { - updateData(it) - showEmpty(it.isEmpty()) + updateData(createExamItems(it.data!!)) + showEmpty(it.data.isEmpty()) showErrorView(false) - showContent(it.isNotEmpty()) + showContent(it.data.isNotEmpty()) } analytics.logEvent( "load_data", "type" to "exam", - "items" to it.size, - "force_refresh" to forceRefresh + "items" to it.data!!.size ) - }) { + } + Status.ERROR -> { Timber.i("Loading exam result: An exception occurred") - errorHandler.dispatch(it) - }) - } + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index ab6c507bb..5d0a310f2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -1,5 +1,7 @@ package io.github.wulkanowy.ui.modules.grade +import io.github.wulkanowy.data.Resource +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester @@ -13,8 +15,17 @@ import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.BOTH_SEMESTERS import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.ONE_SEMESTER import io.github.wulkanowy.utils.calcAverage import io.github.wulkanowy.utils.changeModifier +import io.github.wulkanowy.utils.flowWithResourceIn +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.flatMapConcat +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map import javax.inject.Inject +@OptIn(FlowPreview::class) class GradeAverageProvider @Inject constructor( private val semesterRepository: SemesterRepository, private val gradeRepository: GradeRepository, @@ -25,63 +36,64 @@ class GradeAverageProvider @Inject constructor( private val minusModifier get() = preferencesRepository.gradeMinusModifier - suspend fun getGradesDetailsWithAverage(student: Student, semesterId: Int, forceRefresh: Boolean = false): List { - return semesterRepository.getSemesters(student).let { semesters -> - when (preferencesRepository.gradeAverageMode) { - ONE_SEMESTER -> getSemesterDetailsWithAverage(student, semesters.single { it.semesterId == semesterId }, forceRefresh) - BOTH_SEMESTERS -> calculateBothSemestersAverage(student, semesters, semesterId, forceRefresh) - ALL_YEAR -> calculateAllYearAverage(student, semesters, semesterId, forceRefresh) - } - } - } + fun getGradesDetailsWithAverage(student: Student, semesterId: Int, forceRefresh: Boolean) = flowWithResourceIn { + val semesters = semesterRepository.getSemesters(student) - private suspend fun calculateBothSemestersAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): List { + when (preferencesRepository.gradeAverageMode) { + ONE_SEMESTER -> getSemesterDetailsWithAverage(student, semesters.single { it.semesterId == semesterId }, forceRefresh) + BOTH_SEMESTERS -> calculateBothSemestersAverage(student, semesters, semesterId, forceRefresh) + ALL_YEAR -> calculateAllYearAverage(student, semesters, semesterId, forceRefresh) + } + }.distinctUntilChanged() + + private fun calculateBothSemestersAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Flow>> { val selectedSemester = semesters.single { it.semesterId == semesterId } val firstSemester = semesters.single { it.diaryId == selectedSemester.diaryId && it.semesterName == 1 } - return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).let { selectedDetails -> - val isAnyAverage = selectedDetails.any { it.average != .0 } + return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).flatMapConcat { selectedDetails -> + val isAnyAverage = selectedDetails.data.orEmpty().any { it.average != .0 } if (selectedSemester != firstSemester) { - getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).let { secondDetails -> - selectedDetails.map { selected -> - val second = secondDetails.singleOrNull { it.subject == selected.subject } + getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).map { secondDetails -> + secondDetails.copy(data = selectedDetails.data?.map { selected -> + val second = secondDetails.data.orEmpty().singleOrNull { it.subject == selected.subject } selected.copy(average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { val selectedGrades = selected.grades.updateModifiers(student).calcAverage() (selectedGrades + (second?.grades?.updateModifiers(student)?.calcAverage() ?: selectedGrades)) / 2 } else (selected.average + (second?.average ?: selected.average)) / 2) - } - } - } else selectedDetails + }) + }.filter { it.status != Status.LOADING }.filter { it.data != null } + } else flowOf(selectedDetails) } } - private suspend fun calculateAllYearAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): List { + private fun calculateAllYearAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Flow>> { val selectedSemester = semesters.single { it.semesterId == semesterId } val firstSemester = semesters.single { it.diaryId == selectedSemester.diaryId && it.semesterName == 1 } - return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).let { selectedDetails -> - val isAnyAverage = selectedDetails.any { it.average != .0 } + return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).flatMapConcat { selectedDetails -> + val isAnyAverage = selectedDetails.data.orEmpty().any { it.average != .0 } if (selectedSemester != firstSemester) { - getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).let { secondDetails -> - selectedDetails.map { selected -> - val second = secondDetails.singleOrNull { it.subject == selected.subject } + getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).map { secondDetails -> + secondDetails.copy(data = selectedDetails.data?.map { selected -> + val second = secondDetails.data.orEmpty().singleOrNull { it.subject == selected.subject } selected.copy(average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { (selected.grades.updateModifiers(student) + second?.grades?.updateModifiers(student).orEmpty()).calcAverage() } else selected.average) - } - } - } else selectedDetails + }) + }.filter { it.status != Status.LOADING }.filter { it.data != null } + } else flowOf(selectedDetails) } } - private suspend fun getSemesterDetailsWithAverage(student: Student, semester: Semester, forceRefresh: Boolean): List { - return gradeRepository.getGrades(student, semester, forceRefresh).let { (details, summaries) -> - val isAnyAverage = summaries.any { it.average != .0 } - val allGrades = details.groupBy { it.subject } + private fun getSemesterDetailsWithAverage(student: Student, semester: Semester, forceRefresh: Boolean): Flow>> { + return gradeRepository.getGrades(student, semester, forceRefresh = forceRefresh).map { res -> + val (details, summaries) = res.data ?: null to null + val isAnyAverage = summaries.orEmpty().any { it.average != .0 } + val allGrades = details.orEmpty().groupBy { it.subject } - summaries.emulateEmptySummaries(student, semester, allGrades.toList(), isAnyAverage).map { summary -> + Resource(res.status, summaries?.emulateEmptySummaries(student, semester, allGrades.toList(), isAnyAverage)?.map { summary -> val grades = allGrades[summary.subject].orEmpty() GradeDetailsWithAverage( subject = summary.subject, @@ -92,7 +104,7 @@ class GradeAverageProvider @Inject constructor( summary = summary, grades = grades ) - } + }, res.error) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index 65f6598d1..9dc39d85c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.grade +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -7,10 +8,11 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.getCurrentOrLast -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.onEach import timber.log.Timber -import java.util.concurrent.TimeUnit.MILLISECONDS import javax.inject.Inject class GradePresenter @Inject constructor( @@ -99,29 +101,33 @@ class GradePresenter @Inject constructor( } private fun loadData() { - Timber.i("Loading grade data started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { semesterRepository.getSemesters(it, refreshOnNoCurrent = true) } } - .delay(200, MILLISECONDS) - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - val current = it.getCurrentOrLast() - selectedIndex = if (selectedIndex == 0) current.semesterName else selectedIndex - schoolYear = current.schoolYear - semesters = it.filter { semester -> semester.diaryId == current.diaryId } - view?.setCurrentSemesterName(current.semesterName, schoolYear) + flowWithResource { + val student = studentRepository.getCurrentStudent() + delay(200) + semesterRepository.getSemesters(student, refreshOnNoCurrent = true) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading grade data started") + Status.SUCCESS -> { + val current = it.data!!.getCurrentOrLast() + selectedIndex = if (selectedIndex == 0) current.semesterName else selectedIndex + schoolYear = current.schoolYear + semesters = it.data.filter { semester -> semester.diaryId == current.diaryId } + view?.setCurrentSemesterName(current.semesterName, schoolYear) - view?.run { - Timber.i("Loading grade result: Attempt load index $currentPageIndex") - loadChild(currentPageIndex) - showErrorView(false) - showSemesterSwitch(true) + view?.run { + Timber.i("Loading grade result: Attempt load index $currentPageIndex") + loadChild(currentPageIndex) + showErrorView(false) + showSemesterSwitch(true) + } } - }) { - Timber.i("Loading grade result: An exception occurred") - errorHandler.dispatch(it) - }) + Status.ERROR -> { + Timber.i("Loading grade result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index a99e3a547..5845d32c1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.grade.details +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.repositories.grade.GradeRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository @@ -11,8 +12,11 @@ import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxCompletable -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource +import io.github.wulkanowy.utils.flowWithResourceIn +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -41,7 +45,9 @@ class GradeDetailsPresenter @Inject constructor( fun onParentViewLoadData(semesterId: Int, forceRefresh: Boolean) { currentSemesterId = semesterId + loadData(semesterId, forceRefresh) + if (!forceRefresh) view?.showErrorView(false) } fun onGradeItemSelected(grade: Grade, position: Int) { @@ -63,24 +69,24 @@ class GradeDetailsPresenter @Inject constructor( } fun onMarkAsReadSelected(): Boolean { - Timber.i("Select mark grades as read") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { semesterRepository.getSemesters(it) } } - .flatMap { rxSingle { gradeRepository.getUnreadGrades(it.first { item -> item.semesterId == currentSemesterId }) } } - .map { it.map { grade -> grade.apply { isRead = true } } } - .flatMapCompletable { - Timber.i("Mark as read ${it.size} grades") - rxCompletable { gradeRepository.updateGrades(it) } + flowWithResource { + val student = studentRepository.getCurrentStudent() + val semesters = semesterRepository.getSemesters(student) + val semester = semesters.first { item -> item.semesterId == currentSemesterId } + val unreadGrades = gradeRepository.getUnreadGrades(semester).first() + + Timber.i("Mark as read ${unreadGrades.size} grades") + gradeRepository.updateGrades(unreadGrades.map { it.apply { isRead = true } }) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Select mark grades as read") + Status.SUCCESS -> Timber.i("Mark as read result: Success") + Status.ERROR -> { + Timber.i("Mark as read result: An exception occurred") + errorHandler.dispatch(it.error!!) + } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - Timber.i("Mark as read result: Success") - loadData(currentSemesterId, false) - }, { - Timber.i("Mark as read result: An exception occurred") - errorHandler.dispatch(it) - })) + }.launch("mark") return true } @@ -119,7 +125,7 @@ class GradeDetailsPresenter @Inject constructor( showEmpty(false) clearView() } - disposable.clear() + cancelJobs("load") } fun updateMarkAsDoneButton() { @@ -127,43 +133,46 @@ class GradeDetailsPresenter @Inject constructor( } private fun loadData(semesterId: Int, forceRefresh: Boolean) { - Timber.i("Loading grade details data started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - showRefresh(false) - showProgress(false) - enableSwipe(true) - notifyParentDataLoaded(semesterId) - } - } - .subscribe({ grades -> - Timber.i("Loading grade details result: Success") - newGradesAmount = grades.sumBy { it.grades.sumBy { grade -> if (!grade.isRead) 1 else 0 } } - updateMarkAsDoneButton() - view?.run { - showEmpty(grades.isEmpty()) - showErrorView(false) - showContent(grades.isNotEmpty()) - updateData( - data = createGradeItems(grades), - isGradeExpandable = preferencesRepository.isGradeExpandable, - gradeColorTheme = preferencesRepository.gradeColorTheme + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + averageProvider.getGradesDetailsWithAverage(student, semesterId, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading grade details data started") + Status.SUCCESS -> { + Timber.i("Loading grade details result: Success") + newGradesAmount = it.data!!.sumBy { item -> item.grades.sumBy { grade -> if (!grade.isRead) 1 else 0 } } + updateMarkAsDoneButton() + val items = createGradeItems(it.data) + view?.run { + showEmpty(items.isEmpty()) + showErrorView(false) + showContent(items.isNotEmpty()) + updateData( + data = items, + isGradeExpandable = preferencesRepository.isGradeExpandable, + gradeColorTheme = preferencesRepository.gradeColorTheme + ) + } + analytics.logEvent( + "load_data", + "type" to "grade_details", + "items" to it.data.size ) } - analytics.logEvent( - "load_data", - "type" to "grade_details", - "items" to grades.size, - "force_refresh" to forceRefresh - ) - }) { - Timber.i("Loading grade details result: An exception occurred") - errorHandler.dispatch(it) - }) + Status.ERROR -> { + Timber.i("Loading grade details result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { + showRefresh(false) + showProgress(false) + enableSwipe(true) + notifyParentDataLoaded(semesterId) + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { @@ -197,15 +206,15 @@ class GradeDetailsPresenter @Inject constructor( } private fun updateGrade(grade: Grade) { - Timber.i("Attempt to update grade ${grade.id}") - disposable.add(rxCompletable { gradeRepository.updateGrade(grade) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - Timber.i("Update grade result: Success") - }) { error -> - Timber.i("Update grade result: An exception occurred") - errorHandler.dispatch(error) - }) + flowWithResource { gradeRepository.updateGrade(grade) }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Attempt to update grade ${grade.id}") + Status.SUCCESS -> Timber.i("Update grade result: Success") + Status.ERROR -> { + Timber.i("Update grade result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.launch("update") } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt index b2c56ed22..eb6ae8433 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.grade.statistics +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Subject import io.github.wulkanowy.data.repositories.gradestatistics.GradeStatisticsRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository @@ -10,7 +11,9 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -46,6 +49,7 @@ class GradeStatisticsPresenter @Inject constructor( fun onParentViewLoadData(semesterId: Int, forceRefresh: Boolean) { currentSemesterId = semesterId loadSubjects() + if (!forceRefresh) view?.showErrorView(false) loadDataByType(semesterId, currentSubjectName, currentType, forceRefresh) } @@ -65,7 +69,7 @@ class GradeStatisticsPresenter @Inject constructor( showEmpty(false) clearView() } - disposable.clear() + cancelJobs("load") } fun onSwipeRefresh() { @@ -103,7 +107,7 @@ class GradeStatisticsPresenter @Inject constructor( fun onTypeChange() { val type = view?.currentType ?: ViewType.POINTS Timber.i("Select grade stats semester: $type") - disposable.clear() + cancelJobs("load") view?.run { showContent(false) showProgress(true) @@ -116,77 +120,77 @@ class GradeStatisticsPresenter @Inject constructor( } private fun loadSubjects() { - Timber.i("Loading grade stats subjects started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { subjectRepository.getSubjects(student, semester) } + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + subjectRepository.getSubjects(student, semester) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading grade stats subjects started") + Status.SUCCESS -> { + subjects = it.data!! + + Timber.i("Loading grade stats subjects result: Success") + view?.run { + view?.updateSubjects(ArrayList(it.data.map { subject -> subject.name })) + showSubjects(!preferencesRepository.showAllSubjectsOnStatisticsList) + } + } + Status.ERROR -> { + Timber.i("Loading grade stats subjects result: An exception occurred") + errorHandler.dispatch(it.error!!) } } - .doOnSuccess { subjects = it } - .map { ArrayList(it.map { subject -> subject.name }) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - Timber.i("Loading grade stats subjects result: Success") - view?.updateSubjects(it) - }, { - Timber.i("Loading grade stats subjects result: An exception occurred") - errorHandler.dispatch(it) - }) - ) + }.launch("subjects") } private fun loadDataByType(semesterId: Int, subjectName: String, type: ViewType, forceRefresh: Boolean = false) { currentSubjectName = if (preferencesRepository.showAllSubjectsOnStatisticsList) "Wszystkie" else subjectName currentType = type - Timber.i("Loading grade stats data started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getSemesters(student) }.flatMap { semesters -> - val semester = semesters.first { item -> item.semesterId == semesterId } + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semesters = semesterRepository.getSemesters(student) + val semester = semesters.first { item -> item.semesterId == semesterId } - rxSingle { - with(gradeStatisticsRepository) { - when (type) { - ViewType.SEMESTER -> getGradesStatistics(student, semester, currentSubjectName, true, forceRefresh) - ViewType.PARTIAL -> getGradesStatistics(student, semester, currentSubjectName, false, forceRefresh) - ViewType.POINTS -> getGradesPointsStatistics(student, semester, currentSubjectName, forceRefresh) - } - } + with(gradeStatisticsRepository) { + when (type) { + ViewType.SEMESTER -> getGradesStatistics(student, semester, currentSubjectName, true, forceRefresh) + ViewType.PARTIAL -> getGradesStatistics(student, semester, currentSubjectName, false, forceRefresh) + ViewType.POINTS -> getGradesPointsStatistics(student, semester, currentSubjectName, forceRefresh) + } + } + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading grade stats data started") + Status.SUCCESS -> { + Timber.i("Loading grade stats result: Success") + view?.run { + showEmpty(it.data!!.isEmpty()) + showContent(it.data.isNotEmpty()) + showErrorView(false) + updateData(it.data, preferencesRepository.gradeColorTheme, preferencesRepository.showAllSubjectsOnStatisticsList) + showSubjects(!preferencesRepository.showAllSubjectsOnStatisticsList) } + analytics.logEvent( + "load_data", + "type" to "grade_statistics", + "items" to it.data!!.size + ) + } + Status.ERROR -> { + Timber.i("Loading grade stats result: An exception occurred") + errorHandler.dispatch(it.error!!) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - showRefresh(false) - showProgress(false) - enableSwipe(true) - notifyParentDataLoaded(semesterId) - } + }.afterLoading { + view?.run { + showRefresh(false) + showProgress(false) + enableSwipe(true) + notifyParentDataLoaded(semesterId) } - .subscribe({ - Timber.i("Loading grade stats result: Success") - view?.run { - showEmpty(it.isEmpty()) - showContent(it.isNotEmpty()) - showErrorView(false) - updateData(it, preferencesRepository.gradeColorTheme, preferencesRepository.showAllSubjectsOnStatisticsList) - showSubjects(!preferencesRepository.showAllSubjectsOnStatisticsList) - } - analytics.logEvent( - "load_data", - "type" to "grade_statistics", - "items" to it.size, - "force_refresh" to forceRefresh - ) - }) { - Timber.i("Loading grade stats result: An exception occurred") - errorHandler.dispatch(it) - }) + }.launch("load") } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 62b95d2e9..96908c3c6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.grade.summary +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter @@ -8,7 +9,9 @@ import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -30,36 +33,45 @@ class GradeSummaryPresenter @Inject constructor( fun onParentViewLoadData(semesterId: Int, forceRefresh: Boolean) { Timber.i("Loading grade summary data started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } } - .map { createGradeSummaryItems(it) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - showRefresh(false) - showProgress(false) - enableSwipe(true) - notifyParentDataLoaded(semesterId) + + loadData(semesterId, forceRefresh) + if (!forceRefresh) view?.showErrorView(false) + } + + private fun loadData(semesterId: Int, forceRefresh: Boolean) { + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + averageProvider.getGradesDetailsWithAverage(student, semesterId, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading grade summary started") + Status.SUCCESS -> { + Timber.i("Loading grade summary result: Success") + view?.run { + showEmpty(it.data!!.isEmpty()) + showContent(it.data.isNotEmpty()) + showErrorView(false) + updateData(createGradeSummaryItems(it.data)) + } + analytics.logEvent( + "load_data", + "type" to "grade_summary", + "items" to it.data!!.size + ) } - }.subscribe({ - Timber.i("Loading grade summary result: Success") - view?.run { - showEmpty(it.isEmpty()) - showContent(it.isNotEmpty()) - showErrorView(false) - updateData(it) + Status.ERROR -> { + Timber.i("Loading grade summary result: An exception occurred") + errorHandler.dispatch(it.error!!) } - analytics.logEvent( - "load_data", - "type" to "grade_summary", - "items" to it.size, - "force_refresh" to forceRefresh - ) - }) { - Timber.i("Loading grade summary result: An exception occurred") - errorHandler.dispatch(it) - }) + } + }.afterLoading { + view?.run { + showRefresh(false) + showProgress(false) + enableSwipe(true) + notifyParentDataLoaded(semesterId) + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { @@ -105,7 +117,7 @@ class GradeSummaryPresenter @Inject constructor( showEmpty(false) clearView() } - disposable.clear() + cancelJobs("load") } private fun createGradeSummaryItems(items: List): List { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt index f30529575..ee2751d71 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt @@ -70,10 +70,6 @@ class HomeworkFragment : BaseFragment(R.layout.fragment } } - fun onReloadList() { - presenter.reloadData() - } - override fun clearData() { with(homeworkAdapter) { items = emptyList() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index fe31dfae2..612da7499 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.homework +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.repositories.homework.HomeworkRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -8,13 +9,17 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import io.github.wulkanowy.utils.sunday +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.nextOrSameSchoolDay +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.toFormattedString -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.onEach import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber @@ -79,64 +84,54 @@ class HomeworkPresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) - currentDate = baseDate - reloadNavigation() - }) { - Timber.i("Loading semester result: An exception occurred") - }) - } - - fun reloadData() { - loadData(currentDate, false) + flow { + val student = studentRepository.getCurrentStudent() + emit(semesterRepository.getCurrentSemester(student)) + }.catch { + Timber.i("Loading semester result: An exception occurred") + }.onEach { + baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) + currentDate = baseDate + reloadNavigation() + }.launch("holidays") } private fun loadData(date: LocalDate, forceRefresh: Boolean = false) { - Timber.i("Loading homework data started") currentDate = date - disposable.apply { - clear() - add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { homeworkRepository.getHomework(student, semester, currentDate, currentDate, forceRefresh) } - } - } - .map { createHomeworkItem(it) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) - } - } - .subscribe({ + + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + homeworkRepository.getHomework(student, semester, date, date, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading homework data started") + Status.SUCCESS -> { Timber.i("Loading homework result: Success") view?.apply { - updateData(it) - showEmpty(it.isEmpty()) + updateData(createHomeworkItem(it.data!!)) + showEmpty(it.data.isEmpty()) showErrorView(false) - showContent(it.isNotEmpty()) + showContent(it.data.isNotEmpty()) } analytics.logEvent( "load_data", "type" to "homework", - "items" to it.size, - "force_refresh" to forceRefresh + "items" to it.data!!.size ) - }) { + } + Status.ERROR -> { Timber.i("Loading homework result: An exception occurred") - - errorHandler.dispatch(it) - }) - } + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt index 7b3b9821a..eb85066a7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt @@ -73,7 +73,6 @@ class HomeworkDetailsDialog : BaseDialogFragment(), Homew } override fun updateMarkAsDoneLabel(isDone: Boolean) { - (parentFragment as? HomeworkFragment)?.onReloadList() binding.homeworkDialogRead.text = view?.context?.getString(if (isDone) R.string.homework_mark_as_undone else R.string.homework_mark_as_done) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt index c0475b7c5..2ca7a1f88 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.homework.details +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.repositories.homework.HomeworkRepository import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -7,7 +8,8 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.flowWithResource +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -26,20 +28,19 @@ class HomeworkDetailsPresenter @Inject constructor( } fun toggleDone(homework: Homework) { - Timber.i("Homework details update start") - disposable.add(rxSingle { homeworkRepository.toggleDone(homework) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - Timber.i("Homework details update: Success") - view?.run { - updateMarkAsDoneLabel(homework.isDone) + flowWithResource { homeworkRepository.toggleDone(homework) }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Homework details update start") + Status.SUCCESS -> { + Timber.i("Homework details update: Success") + view?.updateMarkAsDoneLabel(homework.isDone) + analytics.logEvent("homework_mark_as_done") + } + Status.ERROR -> { + Timber.i("Homework details update result: An exception occurred") + errorHandler.dispatch(it.error!!) } - analytics.logEvent("homework_mark_as_done") - }) { - Timber.i("Homework details update result: An exception occurred") - errorHandler.dispatch(it) } - ) + }.launch("toggle") } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt index 27205a2af..8f187ac83 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.login.advanced +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.sdk.Sdk @@ -7,9 +8,10 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.ifNullOrBlank -import io.reactivex.Single -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -126,35 +128,42 @@ class LoginAdvancedPresenter @Inject constructor( fun onSignInClick() { if (!validateCredentials()) return - disposable.add(getStudentsAppropriatesToLoginType() - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnSubscribe { - view?.apply { + flowWithResource { getStudentsAppropriatesToLoginType() }.onEach { + when (it.status) { + Status.LOADING -> view?.run { + Timber.i("Login started") hideSoftKeyboard() showProgress(true) showContent(false) } - Timber.i("Login started") - } - .doFinally { - view?.apply { - showProgress(false) - showContent(true) + Status.SUCCESS -> { + Timber.i("Login result: Success") + analytics.logEvent("registration_form", + "success" to true, + "students" to it.data!!.size, + "error" to "No error" + ) + view?.notifyParentAccountLogged(it.data) + } + Status.ERROR -> { + Timber.i("Login result: An exception occurred") + analytics.logEvent( + "registration_form", + "success" to false, "students" to -1, + "error" to it.error!!.message.ifNullOrBlank { "No message" } + ) + loginErrorHandler.dispatch(it.error) } } - .subscribe({ - Timber.i("Login result: Success") - analytics.logEvent("registration_form", "success" to true, "students" to it.size, "error" to "No error") - view?.notifyParentAccountLogged(it) - }, { - Timber.i("Login result: An exception occurred") - analytics.logEvent("registration_form", "success" to false, "students" to -1, "error" to it.message.ifNullOrBlank { "No message" }) - loginErrorHandler.dispatch(it) - })) + }.afterLoading { + view?.apply { + showProgress(false) + showContent(true) + } + }.launch("login") } - private fun getStudentsAppropriatesToLoginType(): Single> { + private suspend fun getStudentsAppropriatesToLoginType(): List { val email = view?.formUsernameValue.orEmpty() val password = view?.formPassValue.orEmpty() val endpoint = view?.formHostValue.orEmpty() @@ -163,12 +172,10 @@ class LoginAdvancedPresenter @Inject constructor( val symbol = view?.formSymbolValue.orEmpty() val token = view?.formTokenValue.orEmpty() - return rxSingle { - when (Sdk.Mode.valueOf(view?.formLoginType ?: "")) { - Sdk.Mode.API -> studentRepository.getStudentsApi(pin, symbol, token) - Sdk.Mode.SCRAPPER -> studentRepository.getStudentsScrapper(email, password, endpoint, symbol) - Sdk.Mode.HYBRID -> studentRepository.getStudentsHybrid(email, password, endpoint, symbol) - } + return when (Sdk.Mode.valueOf(view?.formLoginType.orEmpty())) { + Sdk.Mode.API -> studentRepository.getStudentsApi(pin, symbol, token) + Sdk.Mode.SCRAPPER -> studentRepository.getStudentsScrapper(email, password, endpoint, symbol) + Sdk.Mode.HYBRID -> studentRepository.getStudentsHybrid(email, password, endpoint, symbol) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index ccbe4bbbe..9e43bf77a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -1,12 +1,15 @@ package io.github.wulkanowy.ui.modules.login.form +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.ifNullOrBlank -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -75,34 +78,44 @@ class LoginFormPresenter @Inject constructor( if (!validateCredentials(email, password, host)) return - disposable.add(rxSingle { studentRepository.getStudentsScrapper(email, password, host, symbol) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnSubscribe { - view?.apply { + flowWithResource { studentRepository.getStudentsScrapper(email, password, host, symbol) }.onEach { + when (it.status) { + Status.LOADING -> view?.run { + Timber.i("Login started") hideSoftKeyboard() showProgress(true) showContent(false) } - Timber.i("Login started") - } - .doFinally { - view?.apply { - showProgress(false) - showContent(true) + Status.SUCCESS -> { + Timber.i("Login result: Success") + analytics.logEvent( + "registration_form", + "success" to true, + "students" to it.data!!.size, + "scrapperBaseUrl" to host, + "error" to "No error" + ) + view?.notifyParentAccountLogged(it.data, Triple(email, password, host)) + } + Status.ERROR -> { + Timber.i("Login result: An exception occurred") + analytics.logEvent( + "registration_form", + "success" to false, + "students" to -1, + "scrapperBaseUrl" to host, + "error" to it.error!!.message.ifNullOrBlank { "No message" }) + loginErrorHandler.dispatch(it.error) + lastError = it.error + view?.showContact(true) } } - .subscribe({ - Timber.i("Login result: Success") - analytics.logEvent("registration_form", "success" to true, "students" to it.size, "scrapperBaseUrl" to host, "error" to "No error") - view?.notifyParentAccountLogged(it, Triple(email, password, host)) - }, { - Timber.i("Login result: An exception occurred") - analytics.logEvent("registration_form", "success" to false, "students" to -1, "scrapperBaseUrl" to host, "error" to it.message.ifNullOrBlank { "No message" }) - loginErrorHandler.dispatch(it) - lastError = it - view?.showContact(true) - })) + }.afterLoading { + view?.apply { + showProgress(false) + showContent(true) + } + }.launch("login") } fun onFaqClick() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt index 84d5af06b..0ef183ccf 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt @@ -1,12 +1,15 @@ package io.github.wulkanowy.ui.modules.login.recover +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.recover.RecoverRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.ifNullOrBlank -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -56,24 +59,22 @@ class LoginRecoverPresenter @Inject constructor( if (!validateInput(username, host)) return - disposable.add(rxSingle { recoverRepository.getReCaptchaSiteKey(host, symbol.ifBlank { "Default" }) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnSubscribe { - view?.run { + flowWithResource { recoverRepository.getReCaptchaSiteKey(host, symbol.ifBlank { "Default" }) }.onEach { + when (it.status) { + Status.LOADING -> view?.run { hideSoftKeyboard() showRecoverForm(false) showProgress(true) showErrorView(false) showCaptcha(false) } + Status.SUCCESS -> view?.loadReCaptcha(siteKey = it.data!!.first, url = it.data.second) + Status.ERROR -> { + Timber.i("Obtain captcha site key result: An exception occurred") + errorHandler.dispatch(it.error!!) + } } - .subscribe({ (resetUrl, siteKey) -> - view?.loadReCaptcha(siteKey, resetUrl) - }) { - Timber.i("Obtain captcha site key result: An exception occurred") - errorHandler.dispatch(it) - }) + }.launch("captcha") } private fun validateInput(username: String, host: String): Boolean { @@ -97,35 +98,28 @@ class LoginRecoverPresenter @Inject constructor( val host = view?.recoverHostValue.orEmpty() val symbol = view?.formHostSymbol.ifNullOrBlank { "Default" } - with(disposable) { - clear() - add(rxSingle { recoverRepository.sendRecoverRequest(host, symbol, username, reCaptchaResponse) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnSubscribe { - view?.run { - showProgress(true) - showRecoverForm(false) - showCaptcha(false) - } + flowWithResource { recoverRepository.sendRecoverRequest(host, symbol, username, reCaptchaResponse) }.onEach { + when (it.status) { + Status.LOADING -> view?.run { + showProgress(true) + showRecoverForm(false) + showCaptcha(false) } - .doFinally { - view?.showProgress(false) - } - .subscribe({ - view?.run { - showSuccessView(true) - setSuccessTitle(it.substringBefore(". ")) - setSuccessMessage(it.substringAfter(". ")) - } - + Status.SUCCESS -> view?.run { + showSuccessView(true) + setSuccessTitle(it.data!!.substringBefore(". ")) + setSuccessMessage(it.data.substringAfter(". ")) analytics.logEvent("account_recover", "register" to host, "symbol" to symbol, "success" to true) - }) { + } + Status.ERROR -> { Timber.i("Send recover request result: An exception occurred") - errorHandler.dispatch(it) + errorHandler.dispatch(it.error!!) analytics.logEvent("account_recover", "register" to host, "symbol" to symbol, "success" to false) - }) - } + } + } + }.afterLoading { + view?.showProgress(false) + }.launch("verified") } fun onDetailsClick() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 91d3e66cd..99ee7d30b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -1,14 +1,15 @@ package io.github.wulkanowy.ui.modules.login.studentselect +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.ifNullOrBlank -import kotlinx.coroutines.rx2.rxCompletable -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.onEach import timber.log.Timber import java.io.Serializable import javax.inject.Inject @@ -28,7 +29,7 @@ class LoginStudentSelectPresenter @Inject constructor( fun onAttachView(view: LoginStudentSelectView, students: Serializable?) { super.onAttachView(view) - view.run { + with(view) { initView() showContact(false) enableSignIn(false) @@ -73,22 +74,20 @@ class LoginStudentSelectPresenter @Inject constructor( private fun loadData(students: List) { resetSelectedState() this.students = students - disposable.add(rxSingle { studentRepository.getSavedStudents(false) } - .map { savedStudents -> - students.map { student -> - student to savedStudents.any { compareStudents(student, it) } + + flowWithResource { studentRepository.getSavedStudents(false) }.onEach { + when (it.status) { + Status.LOADING -> Timber.d("Login student select students load started") + Status.SUCCESS -> view?.updateData(students.map { student -> + student to it.data!!.any { item -> compareStudents(student, item) } + }) + Status.ERROR -> { + errorHandler.dispatch(it.error!!) + lastError = it.error + view?.updateData(students.map { student -> student to false }) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - view?.updateData(it) - }, { - errorHandler.dispatch(it) - lastError = it - view?.updateData(students.map { student -> student to false }) - }) - ) + }.launch() } private fun resetSelectedState() { @@ -97,33 +96,35 @@ class LoginStudentSelectPresenter @Inject constructor( } private fun registerStudents(students: List) { - disposable.add(rxSingle { studentRepository.saveStudents(students) } - .map { students.first().apply { id = it.first() } } - .flatMapCompletable { rxCompletable { studentRepository.switchStudent(it) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnSubscribe { - view?.apply { + flowWithResource { + val savedStudents = studentRepository.saveStudents(students) + val firstRegistered = students.first().apply { id = savedStudents.first() } + studentRepository.switchStudent(firstRegistered) + }.onEach { + when (it.status) { + Status.LOADING -> view?.run { + Timber.i("Registration started") showProgress(true) showContent(false) } - Timber.i("Registration started") - } - .subscribe({ - students.forEach { analytics.logEvent("registration_student_select", "success" to true, "scrapperBaseUrl" to it.scrapperBaseUrl, "symbol" to it.symbol, "error" to "No error") } - Timber.i("Registration result: Success") - view?.openMainView() - }, { error -> - students.forEach { analytics.logEvent("registration_student_select", "success" to false, "scrapperBaseUrl" to it.scrapperBaseUrl, "symbol" to it.symbol, "error" to error.message.ifNullOrBlank { "No message" }) } - Timber.i("Registration result: An exception occurred ") - loginErrorHandler.dispatch(error) - lastError = error - view?.apply { - showProgress(false) - showContent(true) - showContact(true) + Status.SUCCESS -> { + Timber.i("Registration result: Success") + view?.openMainView() + logRegisterEvent(students) } - })) + Status.ERROR -> { + Timber.i("Registration result: An exception occurred ") + view?.apply { + showProgress(false) + showContent(true) + showContact(true) + } + lastError = it.error + loginErrorHandler.dispatch(it.error!!) + logRegisterEvent(students, it.error) + } + } + }.launch("register") } fun onDiscordClick() { @@ -133,4 +134,15 @@ class LoginStudentSelectPresenter @Inject constructor( fun onEmailClick() { view?.openEmail(lastError?.message.ifNullOrBlank { "empty" }) } + + private fun logRegisterEvent(students: List, error: Throwable? = null) { + students.forEach { student -> + analytics.logEvent( + "registration_student_select", + "success" to (error != null), + "scrapperBaseUrl" to student.scrapperBaseUrl, + "symbol" to student.symbol, + "error" to (error?.message?.ifBlank { "No message" } ?: "No error")) + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index b7687ed3f..c0f5803f9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -1,13 +1,15 @@ package io.github.wulkanowy.ui.modules.login.symbol +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.ifNullOrBlank -import io.reactivex.Single -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.onEach import timber.log.Timber import java.io.Serializable import javax.inject.Inject @@ -47,44 +49,55 @@ class LoginSymbolPresenter @Inject constructor( return } - disposable.add( - Single.fromCallable { loginData } - .flatMap { rxSingle { studentRepository.getStudentsScrapper(it.first, it.second, it.third, symbol) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnSubscribe { - view?.apply { - hideSoftKeyboard() - showProgress(true) - showContent(false) - } + flowWithResource { studentRepository.getStudentsScrapper(loginData!!.first, loginData!!.second, loginData!!.third, symbol) }.onEach { + when (it.status) { + Status.LOADING -> view?.run { Timber.i("Login with symbol started") + hideSoftKeyboard() + showProgress(true) + showContent(false) } - .doFinally { - view?.apply { - showProgress(false) - showContent(true) - } - } - .subscribe({ - analytics.logEvent("registration_symbol", "success" to true, "students" to it.size, "scrapperBaseUrl" to loginData?.third, "symbol" to symbol, "error" to "No error") - view?.apply { - if (it.isEmpty()) { + Status.SUCCESS -> { + view?.run { + if (it.data!!.isEmpty()) { Timber.i("Login with symbol result: Empty student list") setErrorSymbolIncorrect() view?.showContact(true) } else { Timber.i("Login with symbol result: Success") - notifyParentAccountLogged(it) + notifyParentAccountLogged(it.data) } } - }, { + analytics.logEvent( + "registration_symbol", + "success" to true, + "students" to it.data!!.size, + "scrapperBaseUrl" to loginData?.third, + "symbol" to symbol, + "error" to "No error" + ) + } + Status.ERROR -> { Timber.i("Login with symbol result: An exception occurred") - analytics.logEvent("registration_symbol", "success" to false, "students" to -1, "scrapperBaseUrl" to loginData?.third, "symbol" to symbol, "error" to it.message.ifNullOrBlank { "No message" }) - loginErrorHandler.dispatch(it) - lastError = it + analytics.logEvent( + "registration_symbol", + "success" to false, + "students" to -1, + "scrapperBaseUrl" to loginData?.third, + "symbol" to symbol, + "error" to it.error!!.message.ifNullOrBlank { "No message" } + ) + loginErrorHandler.dispatch(it.error) + lastError = it.error view?.showContact(true) - })) + } + } + }.afterLoading { + view?.apply { + showProgress(false) + showContent(true) + } + }.launch("login") } fun onParentInitSymbolView(loginData: Triple) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt index 1273a54c5..64df3db8a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt @@ -1,13 +1,15 @@ package io.github.wulkanowy.ui.modules.luckynumber +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.luckynumber.LuckyNumberRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxMaybe -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -34,47 +36,47 @@ class LuckyNumberPresenter @Inject constructor( } private fun loadData(forceRefresh: Boolean = false) { - Timber.i("Loading lucky number started") - disposable.apply { - clear() - add(rxSingle { studentRepository.getCurrentStudent() } - .flatMapMaybe { rxMaybe { luckyNumberRepository.getLuckyNumber(it, forceRefresh) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + luckyNumberRepository.getLuckyNumber(student, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading lucky number started") + Status.SUCCESS -> { + if (it.data != null) { + Timber.i("Loading lucky number result: Success") + view?.apply { + updateData(it.data) + showContent(true) + showEmpty(false) + showErrorView(false) + } + analytics.logEvent( + "load_item", + "type" to "lucky_number", + "number" to it.data.luckyNumber + ) + } else { + Timber.i("Loading lucky number result: No lucky number found") + view?.run { + showContent(false) + showEmpty(true) + showErrorView(false) + } } } - .subscribe({ - Timber.i("Loading lucky number result: Success") - view?.apply { - updateData(it) - showContent(true) - showEmpty(false) - showErrorView(false) - } - analytics.logEvent( - "load_item", - "type" to "lucky_number", - "number" to it.luckyNumber, - "force_refresh" to forceRefresh - ) - }, { + Status.ERROR -> { Timber.i("Loading lucky number result: An exception occurred") - errorHandler.dispatch(it) - }, { - Timber.i("Loading lucky number result: No lucky number found") - view?.run { - showContent(false) - showEmpty(true) - showErrorView(false) - } - }) - ) - } + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt index bb7ea75b2..5bcdc8a1b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.luckynumberwidget +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -8,7 +9,9 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider.Companion.getStudentWidgetKey import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider.Companion.getThemeWidgetKey import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.flowWithResource +import kotlinx.coroutines.flow.onEach +import timber.log.Timber import javax.inject.Inject class LuckyNumberWidgetConfigurePresenter @Inject constructor( @@ -46,23 +49,25 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( } private fun loadData() { - disposable.add(rxSingle { studentRepository.getSavedStudents(false) } - .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } - .map { (students, currentStudentId) -> - students.map { student -> student to (student.id == currentStudentId) } - } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - when { - it.isEmpty() -> view?.openLoginView() - it.size == 1 -> { - selectedStudent = it.single().first - view?.showThemeDialog() + flowWithResource { studentRepository.getSavedStudents(false) }.onEach { + when (it.status) { + Status.LOADING -> Timber.d("Lucky number widget configure students data load") + Status.SUCCESS -> { + val widgetId = appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } + when { + it.data!!.isEmpty() -> view?.openLoginView() + it.data.size == 1 -> { + selectedStudent = it.data.single() + view?.showThemeDialog() + } + else -> view?.updateData(it.data.map { student -> + student to (student.id == widgetId) + }) } - else -> view?.updateData(it) } - }, { errorHandler.dispatch(it) })) + Status.ERROR -> errorHandler.dispatch(it.error!!) + } + }.launch() } private fun registerStudent(student: Student?) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index 204fc79ad..cf8395f3d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -15,6 +15,7 @@ import android.view.View.VISIBLE import android.widget.RemoteViews import dagger.android.AndroidInjection import io.github.wulkanowy.R +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.exceptions.NoCurrentStudentException @@ -24,6 +25,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.SchedulersProvider import io.reactivex.Maybe +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.takeWhile import kotlinx.coroutines.rx2.rxMaybe import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber @@ -157,7 +160,7 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { else -> Maybe.empty() } } - .flatMap { rxMaybe { luckyNumberRepository.getLuckyNumber(it) } } + .flatMap { rxMaybe { luckyNumberRepository.getLuckyNumber(it, false).takeWhile { it.status == Status.LOADING }.first().data } } .subscribeOn(schedulers.backgroundThread) .blockingGet() } catch (e: Exception) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt index 4a9d217b0..1e48f71b5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt @@ -5,7 +5,6 @@ import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED import io.github.wulkanowy.data.repositories.message.MessageFolder.SENT import io.github.wulkanowy.data.repositories.message.MessageFolder.TRASHED @@ -77,10 +76,6 @@ class MessageFragment : BaseFragment(R.layout.fragment_m binding.messageProgress.visibility = if (show) VISIBLE else INVISIBLE } - fun onDeleteMessage(message: Message) { - presenter.onDeleteMessage(message) - } - fun onChildFragmentLoaded() { presenter.onChildViewLoaded() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt index 0f5598b23..ea482c623 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt @@ -1,13 +1,12 @@ package io.github.wulkanowy.ui.modules.message -import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider -import io.reactivex.Completable +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import timber.log.Timber -import java.util.concurrent.TimeUnit.MILLISECONDS import javax.inject.Inject class MessagePresenter @Inject constructor( @@ -18,12 +17,12 @@ class MessagePresenter @Inject constructor( override fun onAttachView(view: MessageView) { super.onAttachView(view) - disposable.add(Completable.timer(150, MILLISECONDS, schedulers.mainThread) - .subscribe { - view.initView() - Timber.i("Message view was initialized") - loadData() - }) + launch { + delay(150) + view.initView() + Timber.i("Message view was initialized") + loadData() + } } fun onPageSelected(index: Int) { @@ -46,15 +45,6 @@ class MessagePresenter @Inject constructor( } } - fun onDeleteMessage(message: Message) { - view?.notifyChildMessageDeleted( - when (message.removed) { - true -> 2 - else -> message.folderId - 1 - } - ) - } - fun onSendMessageButtonClicked() { view?.openSendMessage() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index 575db75b9..ec743cd7b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -203,10 +203,6 @@ class MessagePreviewFragment : (activity as MainActivity).popView() } - override fun notifyParentMessageDeleted(message: Message) { - parentFragmentManager.fragments.forEach { if (it is MessageFragment) it.onDeleteMessage(message) } - } - override fun onSaveInstanceState(outState: Bundle) { outState.putSerializable(MESSAGE_ID_KEY, presenter.message) super.onSaveInstanceState(outState) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index b94c46123..4d3b83f1b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -2,6 +2,7 @@ package io.github.wulkanowy.ui.modules.message.preview import android.annotation.SuppressLint import android.os.Build +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.repositories.message.MessageRepository @@ -11,8 +12,11 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource +import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.toFormattedString -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -54,33 +58,35 @@ class MessagePreviewPresenter @Inject constructor( } private fun loadData(message: Message) { - Timber.i("Loading message ${message.messageId} preview started") - disposable.apply { - clear() - add(rxSingle { studentRepository.getStudentById(message.studentId) } - .flatMap { rxSingle { messageRepository.getMessage(it, message, true) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { view?.showProgress(false) } - .subscribe({ message -> - Timber.i("Loading message ${message.message.messageId} preview result: Success ") - this@MessagePreviewPresenter.message = message.message - this@MessagePreviewPresenter.attachments = message.attachments + flowWithResourceIn { + val student = studentRepository.getStudentById(message.studentId) + messageRepository.getMessage(student, message, true) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading message ${message.messageId} preview started") + Status.SUCCESS -> { + Timber.i("Loading message ${it.data!!.message.messageId} preview result: Success ") + this@MessagePreviewPresenter.message = it.data.message + this@MessagePreviewPresenter.attachments = it.data.attachments view?.apply { - setMessageWithAttachment(message) + setMessageWithAttachment(it.data) initOptions() } analytics.logEvent( "load_item", "type" to "message_preview", - "length" to message.message.content.length + "length" to it.data.message.content.length ) - }) { + } + Status.ERROR -> { Timber.i("Loading message ${message.messageId} preview result: An exception occurred ") retryCallback = { onMessageLoadRetry(message) } - errorHandler.dispatch(it) - }) - } + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.showProgress(false) + }.launch() } fun onReply(): Boolean { @@ -152,34 +158,37 @@ class MessagePreviewPresenter @Inject constructor( } private fun deleteMessage() { - message?.let { message -> - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { messageRepository.deleteMessage(it, message) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnSubscribe { + message ?: return + + view?.run { + showContent(false) + showProgress(true) + showOptions(false) + showErrorView(false) + } + + flowWithResource { + val student = studentRepository.getCurrentStudent() + messageRepository.deleteMessage(student, message!!) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.d("Message ${message?.id} delete started") + Status.SUCCESS -> { + Timber.d("Message ${message?.id} delete success") view?.run { - showContent(false) - showProgress(true) - showOptions(false) - showErrorView(false) - } - } - .doFinally { - view?.showProgress(false) - } - .subscribe({ - view?.run { - notifyParentMessageDeleted(message) showMessage(deleteMessageSuccessString) popView() } - }, { error -> + } + Status.ERROR -> { + Timber.d("Message ${message?.id} delete failed") retryCallback = { onMessageDelete() } - errorHandler.dispatch(error) - }) - ) - } + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.showProgress(false) + }.launch("delete") } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt index 0fdb4bda3..fa6d735ed 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt @@ -22,8 +22,6 @@ interface MessagePreviewView : BaseView { fun showContent(show: Boolean) - fun notifyParentMessageDeleted(message: Message) - fun showErrorView(show: Boolean) fun setErrorDetails(message: String) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt index 545409c6d..c31fd79a7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt @@ -1,8 +1,8 @@ package io.github.wulkanowy.ui.modules.message.send +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Recipient -import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.repositories.message.MessageRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.recipient.RecipientRepository @@ -13,10 +13,10 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.toFormattedString -import io.reactivex.Completable -import kotlinx.coroutines.rx2.rxMaybe -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -37,7 +37,7 @@ class SendMessagePresenter @Inject constructor( view.initView() Timber.i("Send message view was initialized") loadData(message, reply) - view.apply { + with(view) { message?.let { setSubject(when (reply) { true -> "RE: " @@ -95,90 +95,89 @@ class SendMessagePresenter @Inject constructor( } private fun loadData(message: Message?, reply: Boolean?) { - var reportingUnit: ReportingUnit? = null - var recipientChips: List = emptyList() - var selectedRecipientChips: List = emptyList() + flowWithResource { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + val unit = reportingUnitRepository.getReportingUnit(student, semester.unitId) - Timber.i("Loading recipients started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) }.map { semester -> it to semester } } - .flatMapCompletable { (student, semester) -> - rxMaybe { reportingUnitRepository.getReportingUnit(student, semester.unitId) } - .doOnSuccess { reportingUnit = it } - .flatMap { rxMaybe { recipientRepository.getRecipients(student, 2, it) } } - .doOnSuccess { - Timber.i("Loading recipients result: Success, fetched %d recipients", it.size) - recipientChips = createChips(it) - } - .flatMapCompletable { - if (message == null || reply != true) Completable.complete() - else rxSingle { recipientRepository.getMessageRecipients(student, message) } - .doOnSuccess { - Timber.i("Loaded message recipients to reply result: Success, fetched %d recipients", it.size) - selectedRecipientChips = createChips(it) - } - .ignoreElement() - } - } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnSubscribe { - view?.run { + Timber.i("Loading recipients started") + val recipients = when { + unit != null -> recipientRepository.getRecipients(student, 2, unit) + else -> listOf() + }.let { createChips(it) } + Timber.i("Loading recipients result: Success, fetched %d recipients", recipients.size) + + Timber.i("Loading message recipients started") + val messageRecipients = when { + message != null && reply == true -> recipientRepository.getMessageRecipients(student, message) + else -> emptyList() + }.let { createChips(it) } + Timber.i("Loaded message recipients to reply result: Success, fetched %d recipients", messageRecipients.size) + + Triple(unit, recipients, messageRecipients) + }.onEach { + when (it.status) { + Status.LOADING -> view?.run { + Timber.i("Loading recipients started") showProgress(true) showContent(false) } - } - .doFinally { view?.run { showProgress(false) } } - .subscribe({ - view?.run { - if (reportingUnit !== null) { - reportingUnit?.let { setReportingUnit(it) } - setRecipients(recipientChips) - if (selectedRecipientChips.isNotEmpty()) setSelectedRecipients(selectedRecipientChips) - showContent(true) - } else { - Timber.i("Loading recipients result: Can't find the reporting unit") - view?.showEmpty(true) + Status.SUCCESS -> it.data!!.let { (reportingUnit, recipientChips, selectedRecipientChips) -> + view?.run { + if (reportingUnit != null) { + setReportingUnit(reportingUnit) + setRecipients(recipientChips) + if (selectedRecipientChips.isNotEmpty()) setSelectedRecipients(selectedRecipientChips) + showContent(true) + } else { + Timber.i("Loading recipients result: Can't find the reporting unit") + view?.showEmpty(true) + } } } - }, { - Timber.i("Loading recipients result: An exception occurred") - view?.showContent(true) - errorHandler.dispatch(it) - })) + Status.ERROR -> { + Timber.i("Loading recipients result: An exception occurred") + view?.showContent(true) + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { showProgress(false) } + }.launch() } private fun sendMessage(subject: String, content: String, recipients: List) { - Timber.i("Sending message started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { messageRepository.sendMessage(it, subject, content, recipients) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doOnSubscribe { - view?.run { + flowWithResource { + val student = studentRepository.getCurrentStudent() + messageRepository.sendMessage(student, subject, content, recipients) + }.onEach { + when (it.status) { + Status.LOADING -> view?.run { + Timber.i("Sending message started") showSoftInput(false) showContent(false) showProgress(true) showActionBar(false) } + Status.SUCCESS -> { + Timber.i("Sending message result: Success") + view?.run { + showMessage(messageSuccess) + popView() + } + analytics.logEvent("send_message", "recipients" to recipients.size) + } + Status.ERROR -> { + Timber.i("Sending message result: An exception occurred") + view?.run { + showContent(true) + showProgress(false) + showActionBar(true) + } + errorHandler.dispatch(it.error!!) + } } - .subscribe({ - Timber.i("Sending message result: Success") - analytics.logEvent("send_message", "recipients" to recipients.size) - view?.run { - showMessage(messageSuccess) - popView() - } - }, { - Timber.i("Sending message result: An exception occurred") - view?.run { - showContent(true) - showProgress(false) - showActionBar(true) - } - errorHandler.dispatch(it) - }) - ) + }.launch("send") } private fun createChips(recipients: List): List { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 0e96836b1..3c9f04447 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.message.tab +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.message.MessageFolder import io.github.wulkanowy.data.repositories.message.MessageRepository @@ -9,13 +10,20 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.toFormattedString -import io.reactivex.subjects.PublishSubject -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.consumeAsFlow +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch import me.xdrop.fuzzywuzzy.FuzzySearch import timber.log.Timber import java.util.Locale -import java.util.concurrent.TimeUnit import javax.inject.Inject import kotlin.math.pow @@ -36,7 +44,7 @@ class MessageTabPresenter @Inject constructor( private var messages = emptyList() - private val searchQuery = PublishSubject.create() + private val searchChannel = Channel() fun onAttachView(view: MessageTabView, folder: MessageFolder) { super.onAttachView(view) @@ -64,7 +72,7 @@ class MessageTabPresenter @Inject constructor( } fun onDeleteMessage() { - loadData(false) + loadData(true) } fun onParentViewLoadData(forceRefresh: Boolean) { @@ -83,36 +91,37 @@ class MessageTabPresenter @Inject constructor( } private fun loadData(forceRefresh: Boolean) { - Timber.i("Loading $folder message data started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) } - .flatMap { rxSingle { messageRepository.getMessages(student, it, folder, forceRefresh) } } - } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - showRefresh(false) - showProgress(false) - enableSwipe(true) - notifyParentDataLoaded() + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + messageRepository.getMessages(student, semester, folder, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading $folder message data started") + Status.SUCCESS -> { + Timber.i("Loading $folder message result: Success") + messages = it.data!! + updateData(getFilteredData(lastSearchQuery)) + analytics.logEvent( + "load_data", + "type" to "messages", + "items" to it.data.size, + "folder" to folder.name + ) + } + Status.ERROR -> { + Timber.i("Loading $folder message result: An exception occurred") + errorHandler.dispatch(it.error!!) } } - .subscribe({ - Timber.i("Loading $folder message result: Success") - messages = it - view?.updateData(getFilteredData(lastSearchQuery)) - analytics.logEvent( - "load_data", - "type" to "messages", - "items" to it.size, - "folder" to folder.name - ) - }) { - Timber.i("Loading $folder message result: An exception occurred") - errorHandler.dispatch(it) - }) + }.afterLoading { + view?.run { + showRefresh(false) + showProgress(false) + enableSwipe(true) + notifyParentDataLoaded() + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { @@ -127,23 +136,25 @@ class MessageTabPresenter @Inject constructor( } fun onSearchQueryTextChange(query: String) { - if (query != searchQuery.toString()) - searchQuery.onNext(query) + launch { + searchChannel.send(query) + } } private fun initializeSearchStream() { - disposable.add(searchQuery - .debounce(250, TimeUnit.MILLISECONDS) - .map { query -> - lastSearchQuery = query - getFilteredData(query) - } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - Timber.d("Applying filter. Full list: ${messages.size}, filtered: ${it.size}") - updateData(it) - }) { Timber.e(it) }) + launch { + searchChannel.consumeAsFlow() + .debounce(250) + .map { query -> + lastSearchQuery = query + getFilteredData(query) + } + .catch { Timber.e(it) } + .collect { + Timber.d("Applying filter. Full list: ${messages.size}, filtered: ${it.size}") + updateData(it) + } + } } private fun getFilteredData(query: String): List { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt index b1dea5dff..e665a15bf 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.mobiledevice +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.repositories.mobiledevice.MobileDeviceRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -8,7 +9,11 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource +import io.github.wulkanowy.utils.flowWithResourceIn +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -48,39 +53,39 @@ class MobileDevicePresenter @Inject constructor( } private fun loadData(forceRefresh: Boolean = false) { - Timber.i("Loading mobile devices data started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { mobileDeviceRepository.getDevices(student, semester, forceRefresh) } + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + mobileDeviceRepository.getDevices(student, semester, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading mobile devices data started") + Status.SUCCESS -> { + Timber.i("Loading mobile devices result: Success") + view?.run { + updateData(it.data!!) + showContent(it.data.isNotEmpty()) + showEmpty(it.data.isEmpty()) + showErrorView(false) + } + analytics.logEvent( + "load_data", + "type" to "devices", + "items" to it.data!!.size + ) + } + Status.ERROR -> { + Timber.i("Loading mobile devices result: An exception occurred") + errorHandler.dispatch(it.error!!) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) - } - }.subscribe({ - Timber.i("Loading mobile devices result: Success") - view?.run { - updateData(it) - showContent(it.isNotEmpty()) - showEmpty(it.isEmpty()) - showErrorView(false) - } - analytics.logEvent( - "load_data", - "type" to "devices", - "items" to it.size, - "force_refresh" to forceRefresh - ) - }) { - Timber.i("Loading mobile devices result: An exception occurred") - errorHandler.dispatch(it) - }) + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { @@ -114,33 +119,25 @@ class MobileDevicePresenter @Inject constructor( } fun onUnregisterConfirmed(device: MobileDevice) { - Timber.i("Unregister device started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { mobileDeviceRepository.unregisterDevice(student, semester, device) } - .flatMap { rxSingle { mobileDeviceRepository.getDevices(student, semester, it) } } + flowWithResource { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + mobileDeviceRepository.unregisterDevice(student, semester, device) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Unregister device started") + Status.SUCCESS -> { + Timber.i("Unregister device result: Success") + view?.run { + showProgress(false) + enableSwipe(true) + } + } + Status.ERROR -> { + Timber.i("Unregister device result: An exception occurred") + errorHandler.dispatch(it.error!!) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - showProgress(false) - enableSwipe(true) - } - } - .subscribe({ - Timber.i("Unregister device result: Success") - view?.run { - updateData(it) - showContent(it.isNotEmpty()) - showEmpty(it.isEmpty()) - } - }) { - Timber.i("Unregister device result: An exception occurred") - errorHandler.dispatch(it) - } - ) + }.launchIn(this) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt index 1c0506f0d..f5fb7db32 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.mobiledevice.token +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.mobiledevice.MobileDeviceRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -7,7 +8,9 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -28,28 +31,29 @@ class MobileDeviceTokenPresenter @Inject constructor( } private fun loadData() { - Timber.i("Mobile device registration data started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { mobileDeviceRepository.getToken(student, semester) } + flowWithResource { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + mobileDeviceRepository.getToken(student, semester) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Mobile device registration data started") + Status.SUCCESS -> { + Timber.i("Mobile device registration result: Success") + view?.run { + updateData(it.data!!) + showContent() + } + analytics.logEvent("device_register", "symbol" to it.data!!.token.substring(0, 3)) + } + Status.ERROR -> { + Timber.i("Mobile device registration result: An exception occurred") + view?.closeDialog() + errorHandler.dispatch(it.error!!) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { view?.hideLoading() } - .subscribe({ - Timber.i("Mobile device registration result: Success") - view?.run { - updateData(it) - showContent() - } - analytics.logEvent("device_register", "symbol" to it.token.substring(0, 3)) - }) { - Timber.i("Mobile device registration result: An exception occurred") - view?.closeDialog() - errorHandler.dispatch(it) - } - ) + }.afterLoading { + view?.hideLoading() + }.launch() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt index 4009b4f6c..8e5661adc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.note +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.repositories.note.NoteRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -8,7 +9,11 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource +import io.github.wulkanowy.utils.flowWithResourceIn +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -49,38 +54,39 @@ class NotePresenter @Inject constructor( } private fun loadData(forceRefresh: Boolean = false) { - Timber.i("Loading note data started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) }.map { semester -> semester to it } } - .flatMap { rxSingle { noteRepository.getNotes(it.second, it.first, forceRefresh) } } - .map { items -> items.sortedByDescending { it.date } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + noteRepository.getNotes(student, semester, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading note data started") + Status.SUCCESS -> { + Timber.i("Loading note result: Success") + view?.apply { + updateData(it.data!!.sortedByDescending { item -> item.date }) + showEmpty(it.data.isEmpty()) + showErrorView(false) + showContent(it.data.isNotEmpty()) + } + analytics.logEvent( + "load_data", + "type" to "note", + "items" to it.data!!.size + ) } - }.subscribe({ - Timber.i("Loading note result: Success") - view?.apply { - updateData(it) - showEmpty(it.isEmpty()) - showErrorView(false) - showContent(it.isNotEmpty()) + Status.ERROR -> { + Timber.i("Loading note result: An exception occurred") + errorHandler.dispatch(it.error!!) } - analytics.logEvent( - "load_data", - "type" to "note", - "items" to it.size, - "force_refresh" to forceRefresh - ) - }, { - Timber.i("Loading note result: An exception occurred") - errorHandler.dispatch(it) - }) - ) + } + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { @@ -107,14 +113,15 @@ class NotePresenter @Inject constructor( } private fun updateNote(note: Note) { - Timber.i("Attempt to update note ${note.id}") - disposable.add(rxSingle { noteRepository.updateNote(note) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ Timber.i("Update note result: Success") }) - { error -> - Timber.i("Update note result: An exception occurred") - errorHandler.dispatch(error) - }) + flowWithResource { noteRepository.updateNote(note) }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Attempt to update note ${note.id}") + Status.SUCCESS -> Timber.i("Update note result: Success") + Status.ERROR -> { + Timber.i("Update note result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.launchIn(this) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt index 1856803c6..324f2c37b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt @@ -4,9 +4,9 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider -import io.reactivex.Completable +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import timber.log.Timber -import java.util.concurrent.TimeUnit import javax.inject.Inject class SchoolAndTeachersPresenter @Inject constructor( @@ -17,12 +17,12 @@ class SchoolAndTeachersPresenter @Inject constructor( override fun onAttachView(view: SchoolAndTeachersView) { super.onAttachView(view) - disposable.add(Completable.timer(150, TimeUnit.MILLISECONDS, schedulers.mainThread) - .subscribe { - view.initView() - Timber.i("Message view was initialized") - loadData() - }) + launch { + delay(150) + view.initView() + Timber.i("Message view was initialized") + loadData() + } } fun onPageSelected(index: Int) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt index 334c60a32..9c10c6ed7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.schoolandteachers.school +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.school.SchoolRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -7,8 +8,9 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxMaybe -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -64,48 +66,46 @@ class SchoolPresenter @Inject constructor( } private fun loadData(forceRefresh: Boolean = false) { - Timber.i("Loading school info started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMapMaybe { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMapMaybe { - rxMaybe { schoolRepository.getSchoolInfo(student, it, forceRefresh) } - } - } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) - notifyParentDataLoaded() - } - }.subscribe({ - Timber.i("Loading teachers result: Success") - view?.run { - address = it.address.ifBlank { null } - contact = it.contact.ifBlank { null } - updateData(it) - showContent(true) - showEmpty(false) - showErrorView(false) - } - analytics.logEvent( - "load_item", - "type" to "school", - "force_refresh" to forceRefresh - ) - }, { - Timber.i("Loading school result: An exception occurred") - errorHandler.dispatch(it) - }, { - Timber.i("Loading school result: No school info found") - view?.run { + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + schoolRepository.getSchoolInfo(student, semester, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading school info started") + Status.SUCCESS -> if (it.data != null) { + Timber.i("Loading teachers result: Success") + view?.run { + address = it.data.address.ifBlank { null } + contact = it.data.contact.ifBlank { null } + updateData(it.data) + showContent(true) + showEmpty(false) + showErrorView(false) + } + analytics.logEvent( + "load_item", + "type" to "school" + ) + } else view?.run { + Timber.i("Loading school result: No school info found") showContent(!isViewEmpty) showEmpty(isViewEmpty) showErrorView(false) } - })) + Status.ERROR -> { + Timber.i("Loading school result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + notifyParentDataLoaded() + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt index 2ccba71f9..886f5c689 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.schoolandteachers.teacher +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.data.repositories.teacher.TeacherRepository @@ -7,7 +8,9 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -39,7 +42,7 @@ class TeacherPresenter @Inject constructor( showErrorView(false) showProgress(true) } - loadData(true) + loadData() } fun onDetailsClick() { @@ -51,41 +54,40 @@ class TeacherPresenter @Inject constructor( } private fun loadData(forceRefresh: Boolean = false) { - Timber.i("Loading teachers data started") - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { teacherRepository.getTeachers(student, semester, forceRefresh) } + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + teacherRepository.getTeachers(student, semester, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading teachers data started") + Status.SUCCESS -> { + Timber.i("Loading teachers result: Success") + view?.run { + updateData(it.data!!.filter { item -> item.name.isNotBlank() }) + showContent(it.data.isNotEmpty()) + showEmpty(it.data.isEmpty()) + showErrorView(false) + } + analytics.logEvent( + "load_data", + "type" to "teachers", + "items" to it.data!!.size + ) + } + Status.ERROR -> { + Timber.i("Loading teachers result: An exception occurred") + errorHandler.dispatch(it.error!!) } } - .map { it.filter { teacher -> teacher.name.isNotBlank() } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) - notifyParentDataLoaded() - } - }.subscribe({ - Timber.i("Loading teachers result: Success") - view?.run { - updateData(it) - showContent(it.isNotEmpty()) - showEmpty(it.isEmpty()) - showErrorView(false) - } - analytics.logEvent( - "load_data", - "type" to "teachers", - "items" to it.size, - "force_refresh" to forceRefresh - ) - }) { - Timber.i("Loading teachers result: An exception occurred") - errorHandler.dispatch(it) - }) + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + notifyParentDataLoaded() + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt index bfdd17660..7ffbf41af 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt @@ -1,10 +1,13 @@ package io.github.wulkanowy.ui.modules.splash +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.flowWithResource +import kotlinx.coroutines.flow.onEach +import timber.log.Timber import javax.inject.Inject class SplashPresenter @Inject constructor( @@ -15,14 +18,15 @@ class SplashPresenter @Inject constructor( override fun onAttachView(view: SplashView) { super.onAttachView(view) - disposable.add(rxSingle { studentRepository.isCurrentStudentSet() } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - view.apply { - if (it) openMainView() + flowWithResource { studentRepository.isCurrentStudentSet() }.onEach { + when (it.status) { + Status.LOADING -> Timber.d("Is current user set check started") + Status.SUCCESS -> with(view) { + if (it.data!!) openMainView() else openLoginView() } - }, { errorHandler.dispatch(it) })) + Status.ERROR -> errorHandler.dispatch(it.error!!) + } + }.launch() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index da76854a2..bc7e26890 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.modules.timetable import android.annotation.SuppressLint +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -10,13 +11,17 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.onEach import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.of @@ -112,60 +117,60 @@ class TimetablePresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) - currentDate = baseDate - reloadNavigation() - }) { - Timber.i("Loading semester result: An exception occurred") - }) + flow { + val student = studentRepository.getCurrentStudent() + emit(semesterRepository.getCurrentSemester(student)) + }.catch { + Timber.i("Loading semester result: An exception occurred") + }.onEach { + baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) + currentDate = baseDate + reloadNavigation() + }.launch("holidays") } private fun loadData(date: LocalDate, forceRefresh: Boolean = false) { - Timber.i("Loading timetable data started") currentDate = date - disposable.apply { - clear() - add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { timetableRepository.getTimetable(student, semester, currentDate, currentDate, forceRefresh) } - } - } - .map { items -> items.filter { if (prefRepository.showWholeClassPlan == "no") it.isStudentPlan else true } } - .map { items -> items.sortedWith(compareBy({ it.number }, { !it.isStudentPlan })) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) - } - } - .subscribe({ + + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + timetableRepository.getTimetable(student, semester, date, date, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading timetable data started") + Status.SUCCESS -> { Timber.i("Loading timetable result: Success") view?.apply { - updateData(it, prefRepository.showWholeClassPlan, prefRepository.showTimetableTimers) - showEmpty(it.isEmpty()) + updateData( + showWholeClassPlanType = prefRepository.showWholeClassPlan, + showTimetableTimers = prefRepository.showTimetableTimers, + data = it.data!! + .filter { item -> if (prefRepository.showWholeClassPlan == "no") item.isStudentPlan else true } + .sortedWith(compareBy({ item -> item.number }, { item -> !item.isStudentPlan })) + ) + showEmpty(it.data.isEmpty()) showErrorView(false) - showContent(it.isNotEmpty()) + showContent(it.data.isNotEmpty()) } analytics.logEvent( "load_data", "type" to "timetable", - "items" to it.size, - "force_refresh" to forceRefresh + "items" to it.data!!.size ) - }) { + } + Status.ERROR -> { Timber.i("Loading timetable result: An exception occurred") - errorHandler.dispatch(it) - }) - } + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt index c6a2cf84d..0bab7795e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.modules.timetable.completed import android.annotation.SuppressLint +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -8,13 +9,17 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.onEach import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay @@ -94,59 +99,54 @@ class CompletedLessonsPresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) - currentDate = baseDate - reloadNavigation() - }) { - Timber.i("Loading semester result: An exception occurred") - }) + flow { + val student = studentRepository.getCurrentStudent() + emit(semesterRepository.getCurrentSemester(student)) + }.catch { + Timber.i("Loading semester result: An exception occurred") + }.onEach { + baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) + currentDate = baseDate + reloadNavigation() + }.launch("holidays") } private fun loadData(date: LocalDate, forceRefresh: Boolean = false) { - Timber.i("Loading completed lessons data started") currentDate = date - disposable.apply { - clear() - add(rxSingle { studentRepository.getCurrentStudent() } - .flatMap { student -> - rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxSingle { completedLessonsRepository.getCompletedLessons(student, semester, currentDate, currentDate, forceRefresh) } - } - } - .map { items -> items.sortedBy { it.number } } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .doFinally { - view?.run { - hideRefresh() - showProgress(false) - enableSwipe(true) - } - } - .subscribe({ + + flowWithResourceIn { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + completedLessonsRepository.getCompletedLessons(student, semester, date, date, forceRefresh) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading completed lessons data started") + Status.SUCCESS -> { Timber.i("Loading completed lessons lessons result: Success") view?.apply { - updateData(it) - showEmpty(it.isEmpty()) + updateData(it.data!!.sortedBy { item -> item.number }) + showEmpty(it.data.isEmpty()) showErrorView(false) - showContent(it.isNotEmpty()) + showContent(it.data.isNotEmpty()) } analytics.logEvent( "load_data", "type" to "completed_lessons", - "items" to it.size, - "force_refresh" to forceRefresh + "items" to it.data!!.size ) - }) { + } + Status.ERROR -> { Timber.i("Loading completed lessons result: An exception occurred") - completedLessonsErrorHandler.dispatch(it) - }) - } + completedLessonsErrorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { + hideRefresh() + showProgress(false) + enableSwipe(true) + } + }.launch() } private fun showErrorViewOnError(message: String, error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt index cc2ac4bb0..28eef06e2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.timetablewidget +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -8,7 +9,9 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getStudentWidgetKey import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getThemeWidgetKey import io.github.wulkanowy.utils.SchedulersProvider -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.flowWithResource +import kotlinx.coroutines.flow.onEach +import timber.log.Timber import javax.inject.Inject class TimetableWidgetConfigurePresenter @Inject constructor( @@ -51,23 +54,25 @@ class TimetableWidgetConfigurePresenter @Inject constructor( } private fun loadData() { - disposable.add(rxSingle { studentRepository.getSavedStudents(false) } - .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } - .map { (students, currentStudentId) -> - students.map { student -> student to (student.id == currentStudentId) } - } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - when { - it.isEmpty() -> view?.openLoginView() - it.size == 1 && !isFromProvider -> { - selectedStudent = it.single().first - view?.showThemeDialog() + flowWithResource { studentRepository.getSavedStudents(false) }.onEach { + when (it.status) { + Status.LOADING -> Timber.d("Timetable widget configure students data load") + Status.SUCCESS -> { + val widgetId = appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } + when { + it.data!!.isEmpty() -> view?.openLoginView() + it.data.size == 1 && !isFromProvider -> { + selectedStudent = it.data.single() + view?.showThemeDialog() + } + else -> view?.updateData(it.data.map { student -> + student to (student.id == widgetId) + }) } - else -> view?.updateData(it) } - }, { errorHandler.dispatch(it) })) + Status.ERROR -> errorHandler.dispatch(it.error!!) + } + }.launch() } private fun registerStudent(student: Student?) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index 6c043e9e7..de09968cd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -12,6 +12,7 @@ import android.widget.AdapterView.INVALID_POSITION import android.widget.RemoteViews import android.widget.RemoteViewsService import io.github.wulkanowy.R +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository @@ -25,6 +26,8 @@ import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.toFormattedString import io.reactivex.Maybe +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.takeWhile import kotlinx.coroutines.rx2.rxMaybe import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate @@ -113,7 +116,7 @@ class TimetableWidgetFactory( } .flatMap { student -> rxMaybe { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxMaybe { timetableRepository.getTimetable(student, semester, date, date) } + rxMaybe { timetableRepository.getTimetable(student, semester, date, date, true).takeWhile { it.status == Status.LOADING }.first().data } } } .map { items -> items.sortedWith(compareBy({ it.number }, { !it.isStudentPlan })) } diff --git a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt new file mode 100644 index 000000000..6551606ba --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt @@ -0,0 +1,93 @@ +package io.github.wulkanowy.utils + +import io.github.wulkanowy.data.Resource +import io.github.wulkanowy.data.Status +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach + +inline fun networkBoundResource( + showSavedOnLoading: Boolean = true, + crossinline query: () -> Flow, + crossinline fetch: suspend (ResultType) -> RequestType, + crossinline saveFetchResult: suspend (old: ResultType, new: RequestType) -> Unit, + crossinline onFetchFailed: (Throwable) -> Unit = { Unit }, + crossinline shouldFetch: (ResultType) -> Boolean = { true }, + crossinline filterResult: (ResultType) -> ResultType = { it } +) = flow { + emit(Resource.loading()) + + val data = query().first() + emitAll(if (shouldFetch(data)) { + if (showSavedOnLoading) emit(Resource.loading(filterResult(data))) + + try { + saveFetchResult(data, fetch(data)) + query().map { Resource.success(filterResult(it)) } + } catch (throwable: Throwable) { + onFetchFailed(throwable) + query().map { Resource.error(throwable, filterResult(it)) } + } + } else { + query().map { Resource.success(filterResult(it)) } + }) +} + +@JvmName("networkBoundResourceWithMap") +inline fun networkBoundResource( + showSavedOnLoading: Boolean = true, + crossinline query: () -> Flow, + crossinline fetch: suspend (ResultType) -> RequestType, + crossinline saveFetchResult: suspend (old: ResultType, new: RequestType) -> Unit, + crossinline onFetchFailed: (Throwable) -> Unit = { Unit }, + crossinline shouldFetch: (ResultType) -> Boolean = { true }, + crossinline mapResult: (ResultType) -> T +) = flow { + emit(Resource.loading()) + + val data = query().first() + emitAll(if (shouldFetch(data)) { + if (showSavedOnLoading) emit(Resource.loading(mapResult(data))) + + try { + saveFetchResult(data, fetch(data)) + query().map { Resource.success(mapResult(it)) } + } catch (throwable: Throwable) { + onFetchFailed(throwable) + query().map { Resource.error(throwable, mapResult(it)) } + } + } else { + query().map { Resource.success(mapResult(it)) } + }) +} + +fun flowWithResource(block: suspend () -> T) = flow { + emit(Resource.loading()) + try { + emit(Resource.success(block())) + } catch (e: Throwable) { + emit(Resource.error(e)) + } +} + +fun flowWithResourceIn(block: suspend () -> Flow>) = flow { + emit(Resource.loading()) + + try { + block().collect { + if (it.status != Status.LOADING) { // LOADING is already emitted + emit(it) + } + } + } catch (e: Throwable) { + emit(Resource.error(e)) + } +} + +fun Flow>.afterLoading(callback: () -> Unit) = onEach { + if (it.status != Status.LOADING) callback() +} diff --git a/app/src/main/res/layout/fragment_license.xml b/app/src/main/res/layout/fragment_license.xml index 80ecd6b10..f4105355c 100644 --- a/app/src/main/res/layout/fragment_license.xml +++ b/app/src/main/res/layout/fragment_license.xml @@ -1,5 +1,6 @@ @@ -14,5 +15,6 @@ + android:layout_height="match_parent" + tools:listitem="@layout/item_license" /> diff --git a/app/src/test/java/io/github/wulkanowy/MainCoroutineRule.kt b/app/src/test/java/io/github/wulkanowy/MainCoroutineRule.kt new file mode 100644 index 000000000..10724868a --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/MainCoroutineRule.kt @@ -0,0 +1,26 @@ +package io.github.wulkanowy + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain +import org.junit.rules.TestWatcher +import org.junit.runner.Description + +@OptIn(ExperimentalCoroutinesApi::class) +class MainCoroutineRule( + private val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher() +) : TestWatcher() { + + override fun starting(description: Description?) { + super.starting(description) + Dispatchers.setMain(testDispatcher) + } + + override fun finished(description: Description?) { + super.finished(description) + Dispatchers.resetMain() + testDispatcher.cleanupTestCoroutines() + } +} diff --git a/app/src/test/java/io/github/wulkanowy/TestDispatchersProvider.kt b/app/src/test/java/io/github/wulkanowy/TestDispatchersProvider.kt new file mode 100644 index 000000000..e60b1d7a2 --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/TestDispatchersProvider.kt @@ -0,0 +1,11 @@ +package io.github.wulkanowy + +import io.github.wulkanowy.utils.DispatchersProvider +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers + +class TestDispatchersProvider : DispatchersProvider() { + + override val backgroundThread: CoroutineDispatcher + get() = Dispatchers.Unconfined +} diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt index 977e82057..3c01a94c1 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt @@ -1,6 +1,6 @@ package io.github.wulkanowy.data.repositories.message -import androidx.room.EmptyResultSetException +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.getMessageEntity @@ -10,6 +10,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.impl.annotations.MockK import io.mockk.just +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before @@ -39,10 +41,10 @@ class MessageRepositoryTest { @Test fun `throw error when message is not in the db`() { val testMessage = getMessageEntity(1, "", false) - coEvery { local.getMessageWithAttachment(student, testMessage) } throws EmptyResultSetException("No message in database") + coEvery { local.getMessageWithAttachment(student, testMessage) } throws NullPointerException("No message in database") - val message = runCatching { runBlocking { repo.getMessage(student, testMessage) } } - assertEquals(EmptyResultSetException::class.java, message.exceptionOrNull()?.javaClass) + val message = runCatching { runBlocking { repo.getMessage(student, testMessage).toList()[1] } } + assertEquals(NullPointerException::class.java, message.exceptionOrNull()?.javaClass) } @Test @@ -50,11 +52,12 @@ class MessageRepositoryTest { val testMessage = getMessageEntity(123, "Test", false) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) - coEvery { local.getMessageWithAttachment(student, testMessage) } returns messageWithAttachment + coEvery { local.getMessageWithAttachment(student, testMessage) } returns flowOf(messageWithAttachment) - val message = runBlocking { repo.getMessage(student, testMessage) } + val message = runBlocking { repo.getMessage(student, testMessage).toList() } - assertEquals("Test", message.message.content) + assertEquals(Status.SUCCESS, message[1].status) + assertEquals("Test", message[1].data!!.message.content) } @Test @@ -65,14 +68,15 @@ class MessageRepositoryTest { val mWa = MessageWithAttachment(testMessage, emptyList()) val mWaWithContent = MessageWithAttachment(testMessageWithContent, emptyList()) - coEvery { local.getMessageWithAttachment(student, testMessage) } returnsMany listOf(mWa, mWaWithContent) - coEvery { remote.getMessagesContentDetails(student, testMessageWithContent) } returns ("Test" to emptyList()) + coEvery { local.getMessageWithAttachment(student, testMessage) } returnsMany listOf(flowOf(mWa), flowOf(mWaWithContent)) + coEvery { remote.getMessagesContentDetails(student, any(), any()) } returns ("Test" to emptyList()) coEvery { local.updateMessages(any()) } just Runs coEvery { local.saveMessageAttachments(any()) } just Runs - val message = runBlocking { repo.getMessage(student, testMessage) } + val message = runBlocking { repo.getMessage(student, testMessage).toList() } - assertEquals("Test", message.message.content) + assertEquals(Status.SUCCESS, message[2].status) + assertEquals("Test", message[2].data!!.message.content) coVerify { local.updateMessages(listOf(testMessageWithContent)) } } @@ -83,7 +87,7 @@ class MessageRepositoryTest { coEvery { local.getMessageWithAttachment(student, testMessage) } throws UnknownHostException() - val message = runCatching { runBlocking { repo.getMessage(student, testMessage) } } + val message = runCatching { runBlocking { repo.getMessage(student, testMessage).toList()[1] } } assertEquals(UnknownHostException::class.java, message.exceptionOrNull()?.javaClass) } @@ -94,7 +98,7 @@ class MessageRepositoryTest { coEvery { local.getMessageWithAttachment(student, testMessage) } throws UnknownHostException() - val message = runCatching { runBlocking { repo.getMessage(student, testMessage) } } + val message = runCatching { runBlocking { repo.getMessage(student, testMessage).toList()[1] } } assertEquals(UnknownHostException::class.java, message.exceptionOrNull()?.javaClass) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt index 665185a6b..89f5ba16e 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt @@ -9,6 +9,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.impl.annotations.MockK import io.mockk.just +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.junit.Before import org.junit.Test @@ -42,12 +44,12 @@ class MobileDeviceRepositoryTest { getDeviceEntity(2) ) - coEvery { mobileDeviceLocal.getDevices(semester) } returns emptyList() + coEvery { mobileDeviceLocal.getDevices(semester) } returns flowOf(emptyList()) coEvery { mobileDeviceLocal.deleteDevices(emptyList()) } just Runs coEvery { mobileDeviceLocal.saveDevices(devices) } just Runs coEvery { mobileDeviceRemote.getDevices(student, semester) } returns devices - runBlocking { mobileDeviceRepository.getDevices(student, semester) } + runBlocking { mobileDeviceRepository.getDevices(student, semester, true).toList() } coVerify { mobileDeviceLocal.deleteDevices(emptyList()) } coVerify { mobileDeviceLocal.saveDevices(devices) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt index 161ce744f..2a2031034 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories.semester +import io.github.wulkanowy.TestDispatchersProvider import io.github.wulkanowy.createSemesterEntity import io.github.wulkanowy.data.db.entities.Student import io.mockk.MockKAnnotations @@ -32,7 +33,7 @@ class SemesterRepositoryTest { @Before fun initTest() { MockKAnnotations.init(this) - semesterRepository = SemesterRepository(semesterRemote, semesterLocal) + semesterRepository = SemesterRepository(semesterRemote, semesterLocal, TestDispatchersProvider()) every { student.loginMode } returns "SCRAPPER" } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index 85f85a37c..819930815 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.modules.grade import io.github.wulkanowy.createSemesterEntity +import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Student @@ -8,10 +9,13 @@ import io.github.wulkanowy.data.repositories.grade.GradeRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.flowWithResource import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before @@ -22,6 +26,8 @@ import org.threeten.bp.LocalDateTime class GradeAverageProviderTest { + private suspend fun Flow>.getResult() = toList()[1].data!! + @MockK lateinit var preferencesRepository: PreferencesRepository @@ -93,14 +99,27 @@ class GradeAverageProviderTest { gradeAverageProvider = GradeAverageProvider(semesterRepository, gradeRepository, preferencesRepository) } + @Test + fun `force calc average on no grades`() { + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS + + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { emptyList() to emptyList() } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { emptyList() to emptyList() } + + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } + + assertEquals(0, items.size) + } + @Test fun `force calc current semester average with default modifiers in scraper mode`() { every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER coEvery { semesterRepository.getSemesters(student) } returns semesters - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) // from details and after set custom plus/minus } @@ -115,9 +134,9 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER coEvery { semesterRepository.getSemesters(student) } returns semesters - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) // from details and after set custom plus/minus } @@ -132,9 +151,9 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER coEvery { semesterRepository.getSemesters(student) } returns semesters - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) // (from details): 3.375 } @@ -149,9 +168,9 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER coEvery { semesterRepository.getSemesters(student) } returns semesters - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) // (from details): 3.375 } @@ -160,9 +179,9 @@ class GradeAverageProviderTest { fun `calc current semester average`() { every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to secondSummaries } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(2.9, items.single { it.subject == "Matematyka" }.average, .0) // from summary: 2,9 @@ -173,9 +192,9 @@ class GradeAverageProviderTest { fun `force calc current semester average`() { every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to secondSummaries } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(2.5, items.single { it.subject == "Matematyka" }.average, .0) // from details: 2,5 @@ -186,9 +205,9 @@ class GradeAverageProviderTest { fun `force calc full year average when current is first`() { every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[1].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[1].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(3.5, items.single { it.subject == "Matematyka" }.average, .0) // (from summary): 3,5 @@ -199,16 +218,20 @@ class GradeAverageProviderTest { fun `calc both semesters average`() { every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageForceCalc } returns false - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to listOf( - getSummary(22, "Matematyka", 3.0), - getSummary(22, "Fizyka", 3.5) - )) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to listOf( - getSummary(22, "Matematyka", 3.5), - getSummary(22, "Fizyka", 4.0) - )) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { + firstGrades to listOf( + getSummary(22, "Matematyka", 3.0), + getSummary(22, "Fizyka", 3.5) + ) + } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { + secondGrades to listOf( + getSummary(22, "Matematyka", 3.5), + getSummary(22, "Fizyka", 4.0) + ) + } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(3.25, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries ↑): 3,0 + 3,5 → 3,25 @@ -219,13 +242,15 @@ class GradeAverageProviderTest { fun `force calc full year average`() { every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to listOf( - getSummary(22, "Matematyka", 1.1), - getSummary(22, "Fizyka", 7.26) - )) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { + secondGrades to listOf( + getSummary(22, "Matematyka", 1.1), + getSummary(22, "Fizyka", 7.26) + ) + } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -237,10 +262,10 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to emptyList()) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to emptyList()) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to emptyList() } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to emptyList() } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -252,10 +277,10 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to emptyList()) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to emptyList()) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to emptyList() } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to emptyList() } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -267,14 +292,18 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to listOf( - getSummary(22, "Matematyka", 4.0) - )) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to listOf( - getSummary(23, "Matematyka", 3.0) - )) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { + firstGrades to listOf( + getSummary(22, "Matematyka", 4.0) + ) + } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { + secondGrades to listOf( + getSummary(23, "Matematyka", 3.0) + ) + } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(3.5, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries ↑): 4,0 + 3,0 → 3,5 @@ -286,10 +315,10 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries.dropLast(1)) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to secondSummaries.dropLast(1) } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(3.4, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries): 3,9 + 2,9 → 3,4 @@ -301,10 +330,10 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries.dropLast(1)) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries.dropLast(1) } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to secondSummaries } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(3.4, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries): 3,9 + 2,9 → 3,4 @@ -316,10 +345,10 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries.dropLast(1)) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries.dropLast(1) } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to secondSummaries } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -331,23 +360,27 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( - getGrade(22, "Fizyka", 5.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 5.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( - getGrade(23, "Fizyka", 5.0, weight = 1.0), - getGrade(23, "Fizyka", 5.0, weight = 2.0), - getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { + listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)) + } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { + listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)) + } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(5.2296, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,732 → 5.229636363636364 } @@ -357,23 +390,27 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( - getGrade(22, "Fizyka", 5.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 5.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( - getGrade(23, "Fizyka", 5.0, weight = 1.0), - getGrade(23, "Fizyka", 5.0, weight = 2.0), - getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { + listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)) + } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { + listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)) + } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(5.5429, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,732 → .average() } @@ -389,23 +426,27 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS coEvery { semesterRepository.getSemesters(student) } returns semesters - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( - getGrade(22, "Fizyka", 5.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 5.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( - getGrade(23, "Fizyka", 5.0, weight = 1.0), - getGrade(23, "Fizyka", 5.0, weight = 2.0), - getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { + listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)) + } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { + listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)) + } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(5.2636, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,8 → 5.26363636 } @@ -421,23 +462,27 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR coEvery { semesterRepository.getSemesters(student) } returns semesters - coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( - getGrade(22, "Fizyka", 5.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 5.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) - coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( - getGrade(23, "Fizyka", 5.0, weight = 1.0), - getGrade(23, "Fizyka", 5.0, weight = 2.0), - getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { + listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)) + } + coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { + listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)) + } - val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() } assertEquals(5.5555, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,8 → .average() } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt index 6b15fb08b..02d7da34b 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.login.form +import io.github.wulkanowy.MainCoroutineRule import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -7,19 +8,22 @@ import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.mockk.MockKAnnotations import io.mockk.Runs -import io.mockk.clearAllMocks import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.just import io.mockk.verify -import org.junit.After import org.junit.Before +import org.junit.Rule import org.junit.Test import org.threeten.bp.LocalDateTime.now +import java.io.IOException class LoginFormPresenterTest { + @get:Rule + val coroutineRule = MainCoroutineRule() + @MockK(relaxed = true) lateinit var loginFormView: LoginFormView @@ -35,7 +39,7 @@ class LoginFormPresenterTest { private lateinit var presenter: LoginFormPresenter @Before - fun initPresenter() { + fun setUp() { MockKAnnotations.init(this) every { loginFormView.initView() } just Runs @@ -52,11 +56,6 @@ class LoginFormPresenterTest { presenter.onAttachView(loginFormView) } - @After - fun tearDown() { - clearAllMocks() - } - @Test fun initViewTest() { verify { loginFormView.initView() } @@ -111,9 +110,9 @@ class LoginFormPresenterTest { verify { loginFormView.hideSoftKeyboard() } verify { loginFormView.showProgress(true) } -// verify { loginFormView.showProgress(false) } -// verify { loginFormView.showContent(false) } -// verify { loginFormView.showContent(true) } + verify { loginFormView.showProgress(false) } + verify { loginFormView.showContent(false) } + verify { loginFormView.showContent(true) } } @Test @@ -151,7 +150,7 @@ class LoginFormPresenterTest { @Test fun loginErrorTest() { - val testException = RuntimeException("test") + val testException = IOException("test") coEvery { repository.getStudentsScrapper(any(), any(), any(), any()) } throws testException every { loginFormView.formUsernameValue } returns "@" every { loginFormView.formPassValue } returns "123456" @@ -162,10 +161,9 @@ class LoginFormPresenterTest { presenter.onSignInClick() verify { loginFormView.hideSoftKeyboard() } - verify { loginFormView.showProgress(true) } -// verify { loginFormView.showProgress(false) } -// verify { loginFormView.showContent(false) } -// verify { loginFormView.showContent(true) } -// verify { errorHandler.dispatch(testException) } + verify { loginFormView.showProgress(false) } + verify { loginFormView.showContent(false) } + verify { loginFormView.showContent(true) } + verify { errorHandler.dispatch(match { it.message == testException.message }) } } } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index e37642fd0..8b2523471 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.login.studentselect +import io.github.wulkanowy.MainCoroutineRule import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -12,15 +13,17 @@ import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.just -import io.mockk.unmockkAll import io.mockk.verify -import org.junit.After import org.junit.Before +import org.junit.Rule import org.junit.Test import org.threeten.bp.LocalDateTime.now class LoginStudentSelectPresenterTest { + @get:Rule + val coroutineRule = MainCoroutineRule() + @MockK(relaxed = true) lateinit var errorHandler: LoginErrorHandler @@ -40,8 +43,9 @@ class LoginStudentSelectPresenterTest { private val testException by lazy { RuntimeException("Problem") } @Before - fun initPresenter() { + fun setUp() { MockKAnnotations.init(this) + clearMocks(studentRepository, loginStudentSelectView) every { loginStudentSelectView.initView() } just Runs every { loginStudentSelectView.showContact(any()) } just Runs @@ -53,11 +57,6 @@ class LoginStudentSelectPresenterTest { presenter.onAttachView(loginStudentSelectView, null) } - @After - fun tearDown() { - unmockkAll() - } - @Test fun initViewTest() { verify { loginStudentSelectView.initView() } @@ -73,7 +72,7 @@ class LoginStudentSelectPresenterTest { verify { loginStudentSelectView.showContent(false) } verify { loginStudentSelectView.showProgress(true) } -// verify { loginStudentSelectView.openMainView() } + verify { loginStudentSelectView.openMainView() } } @Test @@ -84,6 +83,6 @@ class LoginStudentSelectPresenterTest { presenter.onSignIn() verify { loginStudentSelectView.showContent(false) } verify { loginStudentSelectView.showProgress(true) } - verify { errorHandler.dispatch(testException) } + verify { errorHandler.dispatch(match { testException.message == it.message }) } } } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt index 9c7d605e1..eb4ac6386 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.splash +import io.github.wulkanowy.MainCoroutineRule import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.ErrorHandler @@ -8,10 +9,14 @@ import io.mockk.coEvery import io.mockk.impl.annotations.MockK import io.mockk.verify import org.junit.Before +import org.junit.Rule import org.junit.Test class SplashPresenterTest { + @get:Rule + val coroutineRule = MainCoroutineRule() + @MockK(relaxed = true) lateinit var splashView: SplashView @@ -24,7 +29,7 @@ class SplashPresenterTest { private lateinit var presenter: SplashPresenter @Before - fun initPresenter() { + fun setUp() { MockKAnnotations.init(this) presenter = SplashPresenter(TestSchedulersProvider(), errorHandler, studentRepository) } From f6dce0fbda99ff89cdb37931db8fc101a43d530a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 19 Jul 2020 12:00:08 +0000 Subject: [PATCH 0103/1526] Bump kotlinx-coroutines-rx2 from 1.3.7 to 1.3.8 (#901) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d5031b315..87eaac805 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -129,7 +129,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.3.7' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.3.8' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7' implementation "androidx.core:core-ktx:1.3.0" From 6c4f27aff519e4ead1bc9c9d3b0e44b182012a1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 27 Jul 2020 11:44:30 +0200 Subject: [PATCH 0104/1526] Remove threetenabp (#908) --- app/build.gradle | 13 +++--- .../data/db/migrations/Migration13Test.kt | 2 +- .../data/repositories/TestEntityCreator.kt | 4 +- .../attendance/AttendanceLocalTest.kt | 6 +-- .../CompletedLessonsLocalTest.kt | 6 +-- .../data/repositories/exam/ExamLocalTest.kt | 4 +- .../data/repositories/grade/GradeLocalTest.kt | 4 +- .../repositories/grade/GradeRepositoryTest.kt | 4 +- .../grade/TestGradeEntityCreator.kt | 2 +- .../GradeStatisticsLocalTest.kt | 2 +- .../luckynumber/LuckyNumberLocalTest.kt | 4 +- .../recipient/RecipientLocalTest.kt | 2 +- .../timetable/TestTimetableEntityCreator.kt | 4 +- .../timetable/TimetableLocalTest.kt | 4 +- .../timetable/TimetableRepositoryTest.kt | 4 +- .../java/io/github/wulkanowy/WulkanowyApp.kt | 2 - .../io/github/wulkanowy/data/db/Converters.kt | 13 +++--- .../wulkanowy/data/db/dao/AttendanceDao.kt | 2 +- .../data/db/dao/CompletedLessonsDao.kt | 2 +- .../github/wulkanowy/data/db/dao/ExamDao.kt | 2 +- .../wulkanowy/data/db/dao/HomeworkDao.kt | 2 +- .../wulkanowy/data/db/dao/LuckyNumberDao.kt | 2 +- .../wulkanowy/data/db/dao/TimetableDao.kt | 2 +- .../wulkanowy/data/db/entities/Attendance.kt | 2 +- .../data/db/entities/AttendanceSummary.kt | 2 +- .../data/db/entities/CompletedLesson.kt | 2 +- .../github/wulkanowy/data/db/entities/Exam.kt | 2 +- .../wulkanowy/data/db/entities/Grade.kt | 2 +- .../data/db/entities/GradeSummary.kt | 2 +- .../wulkanowy/data/db/entities/Homework.kt | 2 +- .../wulkanowy/data/db/entities/LuckyNumber.kt | 2 +- .../wulkanowy/data/db/entities/Message.kt | 2 +- .../data/db/entities/MobileDevice.kt | 2 +- .../github/wulkanowy/data/db/entities/Note.kt | 2 +- .../wulkanowy/data/db/entities/Semester.kt | 2 +- .../wulkanowy/data/db/entities/Student.kt | 2 +- .../wulkanowy/data/db/entities/Timetable.kt | 4 +- .../data/db/migrations/Migration5.kt | 4 +- .../attendance/AttendanceLocal.kt | 2 +- .../attendance/AttendanceRemote.kt | 6 +-- .../attendance/AttendanceRepository.kt | 2 +- .../completedlessons/CompletedLessonsLocal.kt | 2 +- .../CompletedLessonsRemote.kt | 2 +- .../CompletedLessonsRepository.kt | 2 +- .../data/repositories/exam/ExamLocal.kt | 2 +- .../data/repositories/exam/ExamRemote.kt | 2 +- .../data/repositories/exam/ExamRepository.kt | 2 +- .../repositories/grade/GradeRepository.kt | 2 +- .../repositories/homework/HomeworkLocal.kt | 2 +- .../repositories/homework/HomeworkRemote.kt | 2 +- .../homework/HomeworkRepository.kt | 2 +- .../luckynumber/LuckyNumberLocal.kt | 2 +- .../luckynumber/LuckyNumberRemote.kt | 2 +- .../luckynumber/LuckyNumberRepository.kt | 2 +- .../repositories/message/MessageRemote.kt | 2 +- .../repositories/student/StudentRemote.kt | 2 +- .../repositories/timetable/TimetableLocal.kt | 2 +- .../repositories/timetable/TimetableRemote.kt | 2 +- .../timetable/TimetableRepository.kt | 2 +- .../io/github/wulkanowy/di/BindingModule.kt | 2 +- .../wulkanowy/services/ServicesModule.kt | 2 +- .../TimetableNotificationSchedulerHelper.kt | 4 +- .../wulkanowy/services/sync/SyncManager.kt | 2 +- .../services/sync/works/AttendanceWork.kt | 2 +- .../sync/works/CompletedLessonWork.kt | 2 +- .../wulkanowy/services/sync/works/ExamWork.kt | 4 +- .../services/sync/works/HomeworkWork.kt | 2 +- .../services/sync/works/TimetableWork.kt | 4 +- .../modules/attendance/AttendanceFragment.kt | 4 +- .../modules/attendance/AttendancePresenter.kt | 6 +-- .../ui/modules/attendance/AttendanceView.kt | 2 +- .../summary/AttendanceSummaryAdapter.kt | 2 +- .../summary/AttendanceSummaryPresenter.kt | 2 +- .../wulkanowy/ui/modules/exam/ExamAdapter.kt | 2 +- .../ui/modules/exam/ExamPresenter.kt | 6 +-- .../ui/modules/homework/HomeworkAdapter.kt | 2 +- .../ui/modules/homework/HomeworkPresenter.kt | 4 +- .../homework/details/HomeworkDetailsDialog.kt | 1 - .../message/preview/MessagePreviewFragment.kt | 1 - .../wulkanowy/ui/modules/note/NoteAdapter.kt | 2 +- .../wulkanowy/ui/modules/note/NoteDialog.kt | 4 +- .../ui/modules/settings/SettingsPresenter.kt | 2 +- .../ui/modules/timetable/TimetableAdapter.kt | 2 +- .../ui/modules/timetable/TimetableDialog.kt | 2 +- .../ui/modules/timetable/TimetableFragment.kt | 2 +- .../modules/timetable/TimetablePresenter.kt | 8 ++-- .../ui/modules/timetable/TimetableView.kt | 2 +- .../completed/CompletedLessonsFragment.kt | 2 +- .../completed/CompletedLessonsPresenter.kt | 6 +-- .../completed/CompletedLessonsView.kt | 2 +- .../timetablewidget/TimetableWidgetFactory.kt | 2 +- .../TimetableWidgetProvider.kt | 4 +- .../wulkanowy/utils/SchooldaysRangeLimiter.kt | 4 +- .../wulkanowy/utils/SemesterExtension.kt | 2 +- .../github/wulkanowy/utils/TimeExtension.kt | 44 +++++++++---------- .../wulkanowy/utils/TimetableExtension.kt | 8 ++-- .../io/github/wulkanowy/TestEnityCreator.kt | 6 +-- .../attendance/AttendanceRemoteTest.kt | 4 +- .../CompletedLessonsRemoteTest.kt | 4 +- .../data/repositories/exam/ExamRemoteTest.kt | 4 +- .../luckynumber/LuckyNumberRemoteTest.kt | 2 +- .../MobileDeviceRepositoryTest.kt | 2 +- .../semester/SemesterRepositoryTest.kt | 2 +- .../timetable/TimetableRemoteTest.kt | 6 +-- .../modules/grade/GradeAverageProviderTest.kt | 6 +-- .../login/form/LoginFormPresenterTest.kt | 2 +- .../LoginStudentSelectPresenterTest.kt | 2 +- .../wulkanowy/utils/GradeExtensionTest.kt | 2 +- .../wulkanowy/utils/TimeExtensionTest.kt | 6 +-- .../wulkanowy/utils/TimetableExtensionTest.kt | 2 +- 110 files changed, 186 insertions(+), 190 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 87eaac805..0bec0db7c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -86,6 +86,7 @@ android { } compileOptions { + coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } @@ -125,16 +126,18 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:61250d3" + implementation "io.github.wulkanowy:sdk:02486b9" + + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.3.8' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.8' implementation "androidx.core:core-ktx:1.3.0" implementation "androidx.activity:activity-ktx:1.1.0" - implementation "androidx.appcompat:appcompat:1.2.0-rc01" + implementation "androidx.appcompat:appcompat:1.2.0-rc02" implementation "androidx.appcompat:appcompat-resources:1.1.0" implementation "androidx.fragment:fragment-ktx:1.2.5" implementation "androidx.annotation:annotation:1.1.0" @@ -175,7 +178,6 @@ dependencies { implementation "io.reactivex.rxjava2:rxjava:2.2.19" implementation "com.google.code.gson:gson:2.8.6" - implementation "com.jakewharton.threetenabp:threetenabp:1.2.4" implementation "com.jakewharton.timber:timber:4.7.1" implementation "at.favre.lib:slf4j-timber:1.0.1" implementation "fr.bipi.treessence:treessence:0.3.2" @@ -199,8 +201,7 @@ dependencies { testImplementation "junit:junit:4.13" testImplementation "io.mockk:mockk:$mockk" - testImplementation "org.threeten:threetenbp:1.4.4" - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.7' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.8' androidTestImplementation "androidx.test:core:1.2.0" androidTestImplementation "androidx.test:runner:1.2.0" diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt index 05a8a5cf0..15e99f5f9 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt @@ -9,7 +9,7 @@ import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test -import org.threeten.bp.LocalDate.of +import java.time.LocalDate.of import kotlin.test.assertFalse import kotlin.test.assertTrue diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestEntityCreator.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestEntityCreator.kt index f7aa51e49..61286fdc1 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestEntityCreator.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestEntityCreator.kt @@ -2,8 +2,8 @@ package io.github.wulkanowy.data.repositories import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import org.threeten.bp.LocalDate.now -import org.threeten.bp.LocalDateTime +import java.time.LocalDate.now +import java.time.LocalDateTime fun getStudent(): Student { return Student( diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt index 4080b8313..fa1289869 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt @@ -12,9 +12,9 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.now -import org.threeten.bp.LocalDate.of +import java.time.LocalDate +import java.time.LocalDate.now +import java.time.LocalDate.of import kotlin.test.assertEquals @RunWith(AndroidJUnit4::class) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt index f8ff92138..ca7d0b1be 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt @@ -12,9 +12,9 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.now -import org.threeten.bp.LocalDate.of +import java.time.LocalDate +import java.time.LocalDate.now +import java.time.LocalDate.of import kotlin.test.assertEquals @RunWith(AndroidJUnit4::class) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt index e595d77c6..14b29c9f6 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt @@ -12,8 +12,8 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.threeten.bp.LocalDate.now -import org.threeten.bp.LocalDate.of +import java.time.LocalDate.now +import java.time.LocalDate.of import kotlin.test.assertEquals @RunWith(AndroidJUnit4::class) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt index 6a01b09cb..946ebf8ea 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt @@ -11,8 +11,8 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.now +import java.time.LocalDate +import java.time.LocalDate.now import kotlin.test.assertEquals @RunWith(AndroidJUnit4::class) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt index 5a8845307..2efcca48d 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt @@ -22,8 +22,8 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.threeten.bp.LocalDate.of -import org.threeten.bp.LocalDateTime +import java.time.LocalDate.of +import java.time.LocalDateTime import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/TestGradeEntityCreator.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/TestGradeEntityCreator.kt index 9146934bf..629c24321 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/TestGradeEntityCreator.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/TestGradeEntityCreator.kt @@ -1,6 +1,6 @@ package io.github.wulkanowy.data.repositories.grade -import org.threeten.bp.LocalDate +import java.time.LocalDate import io.github.wulkanowy.sdk.pojo.Grade as GradeRemote import io.github.wulkanowy.data.db.entities.Grade as GradeLocal diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt index ff6541589..197d2d0ec 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt @@ -13,7 +13,7 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.threeten.bp.LocalDate.now +import java.time.LocalDate.now import kotlin.test.assertEquals @RunWith(AndroidJUnit4::class) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt index dfd973944..67c612dd0 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt @@ -12,8 +12,8 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime.now +import java.time.LocalDate +import java.time.LocalDateTime.now import kotlin.test.assertEquals @RunWith(AndroidJUnit4::class) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt index 9ba8a9fb4..61eb9a1b3 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt @@ -12,7 +12,7 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.threeten.bp.LocalDateTime +import java.time.LocalDateTime import kotlin.test.assertEquals @RunWith(AndroidJUnit4::class) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TestTimetableEntityCreator.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TestTimetableEntityCreator.kt index aa35fe790..dddf6464c 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TestTimetableEntityCreator.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TestTimetableEntityCreator.kt @@ -1,7 +1,7 @@ package io.github.wulkanowy.data.repositories.timetable -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalDateTime.now +import java.time.LocalDateTime +import java.time.LocalDateTime.now import io.github.wulkanowy.data.db.entities.Timetable as TimetableLocal import io.github.wulkanowy.sdk.pojo.Timetable as TimetableRemote diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt index 77d7188c1..e793212e6 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt @@ -11,8 +11,8 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime.of +import java.time.LocalDate +import java.time.LocalDateTime.of import kotlin.test.assertEquals @RunWith(AndroidJUnit4::class) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt index fa62849ac..1bd3c4679 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt @@ -20,8 +20,8 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime.of +import java.time.LocalDate +import java.time.LocalDateTime.of import kotlin.test.assertEquals @SdkSuppress(minSdkVersion = P) diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index 0e094f699..c7c5a6fd0 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -6,7 +6,6 @@ import android.util.Log.INFO import android.util.Log.VERBOSE import androidx.multidex.MultiDex import androidx.work.Configuration -import com.jakewharton.threetenabp.AndroidThreeTen import com.yariksoffice.lingver.Lingver import dagger.android.AndroidInjector import dagger.android.support.DaggerApplication @@ -43,7 +42,6 @@ class WulkanowyApp : DaggerApplication(), Configuration.Provider { override fun onCreate() { super.onCreate() - AndroidThreeTen.init(this) RxJavaPlugins.setErrorHandler(::onError) Lingver.init(this) themeManager.applyDefaultTheme() diff --git a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt index 294f73d3d..b21c4834f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt @@ -3,19 +3,18 @@ package io.github.wulkanowy.data.db import androidx.room.TypeConverter import com.google.gson.Gson import com.google.gson.reflect.TypeToken -import org.threeten.bp.DateTimeUtils -import org.threeten.bp.Instant -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime -import org.threeten.bp.Month -import org.threeten.bp.ZoneOffset +import java.time.Instant +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.Month +import java.time.ZoneOffset import java.util.Date class Converters { @TypeConverter fun timestampToDate(value: Long?): LocalDate? = value?.run { - DateTimeUtils.toInstant(Date(value)).atZone(ZoneOffset.UTC).toLocalDate() + Date(value).toInstant().atZone(ZoneOffset.UTC).toLocalDate() } @TypeConverter 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 960795479..8ef3fd446 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 @@ -4,7 +4,7 @@ import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Attendance import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Singleton @Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt index 4a827b4fd..8c03609d6 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt @@ -4,7 +4,7 @@ import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.CompletedLesson import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Singleton @Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt index e3119d9b5..311eeb9c5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt @@ -4,7 +4,7 @@ import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Exam import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Singleton @Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt index 5d417b046..2092de49d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt @@ -4,7 +4,7 @@ import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Homework import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Singleton @Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt index 55a005fff..e3fdf01be 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt @@ -4,7 +4,7 @@ import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.LuckyNumber import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Singleton @Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt index a099dd80d..5e6eec668 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt @@ -4,7 +4,7 @@ import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Timetable import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Singleton @Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt index aa8da8db7..f141d5d52 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDate import java.io.Serializable +import java.time.LocalDate @Entity(tableName = "Attendance") data class Attendance( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/AttendanceSummary.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/AttendanceSummary.kt index d2e1f174e..7d628ebaa 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/AttendanceSummary.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/AttendanceSummary.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.Month import java.io.Serializable +import java.time.Month @Entity(tableName = "AttendanceSummary") data class AttendanceSummary( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/CompletedLesson.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/CompletedLesson.kt index 775f3f558..e305d467a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/CompletedLesson.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/CompletedLesson.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDate import java.io.Serializable +import java.time.LocalDate @Entity(tableName = "CompletedLesson") data class CompletedLesson( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt index 9ae795e71..50ed343a9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDate import java.io.Serializable +import java.time.LocalDate @Entity(tableName = "Exams") data class Exam( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Grade.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Grade.kt index 3f69c61b1..a0f1c3a6d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Grade.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Grade.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDate import java.io.Serializable +import java.time.LocalDate @Entity(tableName = "Grades") data class Grade( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt index dd3126d4d..fb7b60bbc 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDateTime +import java.time.LocalDateTime @Entity(tableName = "GradesSummary") data class GradeSummary( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt index cd7d153e9..5b21445b4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDate import java.io.Serializable +import java.time.LocalDate @Entity(tableName = "Homework") data class Homework( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/LuckyNumber.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/LuckyNumber.kt index 5b9130f5d..7c24c8f5c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/LuckyNumber.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/LuckyNumber.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDate import java.io.Serializable +import java.time.LocalDate @Entity(tableName = "LuckyNumbers") data class LuckyNumber ( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt index 058298415..77c8d0600 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDateTime import java.io.Serializable +import java.time.LocalDateTime @Entity(tableName = "Messages") data class Message( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt index f67ed599f..9d8f11625 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDateTime import java.io.Serializable +import java.time.LocalDateTime @Entity(tableName = "MobileDevices") data class MobileDevice( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt index 6f707a66a..cfd549625 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDate import java.io.Serializable +import java.time.LocalDate @Entity(tableName = "Notes") data class Note( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Semester.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Semester.kt index 0641e0b6d..28fb2b9af 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Semester.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Semester.kt @@ -4,7 +4,7 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.Index import androidx.room.PrimaryKey -import org.threeten.bp.LocalDate +import java.time.LocalDate @Entity(tableName = "Semesters", indices = [Index(value = ["student_id", "diary_id", "semester_id"], unique = true)]) data class Semester( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt index 905979f99..1edb81d52 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt @@ -4,8 +4,8 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.Index import androidx.room.PrimaryKey -import org.threeten.bp.LocalDateTime import java.io.Serializable +import java.time.LocalDateTime @Entity(tableName = "Students", indices = [Index(value = ["email", "symbol", "student_id", "school_id", "class_id"], unique = true)]) data class Student( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt index cad3b7c69..1bf159efd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt @@ -3,9 +3,9 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime import java.io.Serializable +import java.time.LocalDate +import java.time.LocalDateTime @Entity(tableName = "Timetable") data class Timetable( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt index fe0dec48f..dbcd916ba 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt @@ -2,8 +2,8 @@ package io.github.wulkanowy.data.db.migrations import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -import org.threeten.bp.LocalDateTime.now -import org.threeten.bp.ZoneOffset +import java.time.LocalDateTime.now +import java.time.ZoneOffset class Migration5 : Migration(4, 5) { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt index 1e56d872e..9aaa52304 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt @@ -4,7 +4,7 @@ import io.github.wulkanowy.data.db.dao.AttendanceDao import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.Semester import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt index 1f794f5a2..870690ec0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt @@ -6,9 +6,9 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Absent import io.github.wulkanowy.utils.init -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalTime +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.LocalTime import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt index cf4edb6a0..60f864f27 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt @@ -7,7 +7,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt index f68e13cbc..51a1bdbfc 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt @@ -4,7 +4,7 @@ import io.github.wulkanowy.data.db.dao.CompletedLessonsDao import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt index b3d786058..d15a27623 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt @@ -5,7 +5,7 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt index 7303575e0..61268a66a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt @@ -6,7 +6,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt index 2b32f5270..acc55b5ec 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt @@ -4,7 +4,7 @@ import io.github.wulkanowy.data.db.dao.ExamDao import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt index 0668b5c14..ac4aa93d7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt @@ -5,7 +5,7 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt index 152974170..e7f115ac6 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt @@ -6,7 +6,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt index 935cbedd9..c42bb00dd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt @@ -9,7 +9,7 @@ import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map -import org.threeten.bp.LocalDateTime +import java.time.LocalDateTime import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt index 5373e1b10..f2cbb8031 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt @@ -4,7 +4,7 @@ import io.github.wulkanowy.data.db.dao.HomeworkDao import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Semester import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt index 9e99843dd..32109877a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt @@ -5,7 +5,7 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt index 5b6aeed41..54397ea02 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt @@ -7,7 +7,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt index ecc784c44..0c3156d1e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt @@ -4,7 +4,7 @@ import io.github.wulkanowy.data.db.dao.LuckyNumberDao import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt index e93a6c047..2872957d0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt @@ -4,7 +4,7 @@ import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt index 3553a4615..ef0ced3a5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt @@ -4,7 +4,7 @@ import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.networkBoundResource import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate.now +import java.time.LocalDate.now import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt index 26ef3d9e2..4dd52ee5b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt @@ -9,7 +9,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Folder import io.github.wulkanowy.sdk.pojo.SentMessage import io.github.wulkanowy.utils.init -import org.threeten.bp.LocalDateTime.now +import java.time.LocalDateTime.now import javax.inject.Inject import javax.inject.Singleton import io.github.wulkanowy.sdk.pojo.Recipient as SdkRecipient diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt index 74d66fedd..0a23eb309 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt @@ -2,7 +2,7 @@ package io.github.wulkanowy.data.repositories.student import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk -import org.threeten.bp.LocalDateTime.now +import java.time.LocalDateTime.now import javax.inject.Inject import javax.inject.Singleton import io.github.wulkanowy.sdk.pojo.Student as SdkStudent diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt index 91a4b2617..df4bfb20a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt @@ -4,7 +4,7 @@ import io.github.wulkanowy.data.db.dao.TimetableDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Timetable import kotlinx.coroutines.flow.Flow -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt index 71db8854f..eef8729e8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt @@ -5,7 +5,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt index 54ddf10b1..ee2734aaf 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.map -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt b/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt index 1b462964d..246e8c706 100644 --- a/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.di import dagger.Module import dagger.android.ContributesAndroidInjector import io.github.wulkanowy.di.scopes.PerActivity -import io.github.wulkanowy.ui.base.ErrorDialog import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver +import io.github.wulkanowy.ui.base.ErrorDialog import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginModule import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetConfigureActivity diff --git a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt index b87f0e683..facba9cb1 100644 --- a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt +++ b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt @@ -17,8 +17,8 @@ import io.github.wulkanowy.services.sync.channels.LuckyNumberChannel import io.github.wulkanowy.services.sync.channels.NewGradesChannel import io.github.wulkanowy.services.sync.channels.NewMessagesChannel import io.github.wulkanowy.services.sync.channels.NewNotesChannel -import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel import io.github.wulkanowy.services.sync.channels.PushChannel +import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel import io.github.wulkanowy.services.sync.works.AttendanceSummaryWork import io.github.wulkanowy.services.sync.works.AttendanceWork import io.github.wulkanowy.services.sync.works.CompletedLessonWork diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt index 54b245ddb..9922a2753 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt @@ -26,9 +26,9 @@ import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companio import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_NAME import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.toTimestamp -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalDateTime.now import timber.log.Timber +import java.time.LocalDateTime +import java.time.LocalDateTime.now import javax.inject.Inject class TimetableNotificationSchedulerHelper @Inject constructor( diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt index 965ed0ad9..c94f8145e 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt @@ -23,8 +23,8 @@ import io.github.wulkanowy.services.sync.channels.Channel import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.isHolidays import io.reactivex.Observable -import org.threeten.bp.LocalDate.now import timber.log.Timber +import java.time.LocalDate.now import java.util.concurrent.TimeUnit.MINUTES import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt index 23cb1acd2..543ec5f34 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt @@ -7,7 +7,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.sunday import io.reactivex.Completable import kotlinx.coroutines.rx2.rxCompletable -import org.threeten.bp.LocalDate.now +import java.time.LocalDate.now import javax.inject.Inject class AttendanceWork @Inject constructor(private val attendanceRepository: AttendanceRepository) : Work { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt index 347d8bbb1..4612ebb48 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt @@ -7,7 +7,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.sunday import io.reactivex.Completable import kotlinx.coroutines.rx2.rxCompletable -import org.threeten.bp.LocalDate.now +import java.time.LocalDate.now import javax.inject.Inject class CompletedLessonWork @Inject constructor( diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt index a8c7fdb39..119226716 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt @@ -3,11 +3,11 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.exam.ExamRepository -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.reactivex.Completable import kotlinx.coroutines.rx2.rxCompletable -import org.threeten.bp.LocalDate.now +import java.time.LocalDate.now import javax.inject.Inject class ExamWork @Inject constructor(private val examRepository: ExamRepository) : Work { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt index 8b69b7b6e..315c2caf4 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt @@ -7,7 +7,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.sunday import io.reactivex.Completable import kotlinx.coroutines.rx2.rxCompletable -import org.threeten.bp.LocalDate.now +import java.time.LocalDate.now import javax.inject.Inject class HomeworkWork @Inject constructor(private val homeworkRepository: HomeworkRepository) : Work { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt index f77018569..0832eb4da 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt @@ -3,11 +3,11 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.timetable.TimetableRepository -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.reactivex.Completable import kotlinx.coroutines.rx2.rxCompletable -import org.threeten.bp.LocalDate.now +import java.time.LocalDate.now import javax.inject.Inject class TimetableWork @Inject constructor(private val timetableRepository: TimetableRepository) : Work { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 6599243dd..51f9cb7b5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -19,13 +19,13 @@ import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.databinding.DialogExcuseBinding import io.github.wulkanowy.databinding.FragmentAttendanceBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.ui.modules.attendance.summary.AttendanceSummaryFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.SchooldaysRangeLimiter import io.github.wulkanowy.utils.dpToPx -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject class AttendanceFragment : BaseFragment(R.layout.fragment_attendance), AttendanceView, MainView.MainChildView, 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 0645c7a4f..c5002c8b8 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 @@ -23,10 +23,10 @@ import io.github.wulkanowy.utils.toFormattedString import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.now -import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber +import java.time.LocalDate +import java.time.LocalDate.now +import java.time.LocalDate.ofEpochDay import javax.inject.Inject class AttendancePresenter @Inject constructor( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt index 484070a2e..d54fb8bf1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt @@ -2,7 +2,7 @@ package io.github.wulkanowy.ui.modules.attendance import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.ui.base.BaseView -import org.threeten.bp.LocalDate +import java.time.LocalDate interface AttendanceView : BaseView { 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 236c3da16..4250a9109 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 @@ -9,7 +9,7 @@ import io.github.wulkanowy.databinding.ItemAttendanceSummaryBinding import io.github.wulkanowy.databinding.ScrollableHeaderAttendanceSummaryBinding import io.github.wulkanowy.utils.calculatePercentage import io.github.wulkanowy.utils.getFormattedName -import org.threeten.bp.Month +import java.time.Month import java.util.Locale import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt index 5d16b3143..b5d8538fa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt @@ -13,8 +13,8 @@ import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import kotlinx.coroutines.flow.onEach -import org.threeten.bp.Month import timber.log.Timber +import java.time.Month import javax.inject.Inject class AttendanceSummaryPresenter @Inject constructor( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamAdapter.kt index 85061997c..535587399 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamAdapter.kt @@ -9,7 +9,7 @@ import io.github.wulkanowy.databinding.HeaderExamBinding import io.github.wulkanowy.databinding.ItemExamBinding import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.weekDayName -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject class ExamAdapter @Inject constructor() : RecyclerView.Adapter() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index 21f7ae6e0..a5c6e8519 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -20,10 +20,10 @@ import io.github.wulkanowy.utils.toFormattedString import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.now -import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber +import java.time.LocalDate +import java.time.LocalDate.now +import java.time.LocalDate.ofEpochDay import javax.inject.Inject class ExamPresenter @Inject constructor( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkAdapter.kt index a87ad18e8..8ae06aeb5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkAdapter.kt @@ -10,7 +10,7 @@ import io.github.wulkanowy.databinding.HeaderHomeworkBinding import io.github.wulkanowy.databinding.ItemHomeworkBinding import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.weekDayName -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject class HomeworkAdapter @Inject constructor() : RecyclerView.Adapter() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index 612da7499..cf38d9c2b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -20,9 +20,9 @@ import io.github.wulkanowy.utils.toFormattedString import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber +import java.time.LocalDate +import java.time.LocalDate.ofEpochDay import javax.inject.Inject class HomeworkPresenter @Inject constructor( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt index eb85066a7..82938a47d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt @@ -12,7 +12,6 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.databinding.DialogHomeworkBinding import io.github.wulkanowy.ui.base.BaseDialogFragment -import io.github.wulkanowy.ui.modules.homework.HomeworkFragment import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index ec743cd7b..e218d759c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -23,7 +23,6 @@ import io.github.wulkanowy.databinding.FragmentMessagePreviewBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView -import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.shareText diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteAdapter.kt index 2ffcad949..6c7cd3f4e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteAdapter.kt @@ -6,11 +6,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat -import io.github.wulkanowy.sdk.scrapper.notes.Note.CategoryType import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.databinding.ItemNoteBinding +import io.github.wulkanowy.sdk.scrapper.notes.Note.CategoryType import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.toFormattedString import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteDialog.kt index 6d1b181ac..b175934f9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteDialog.kt @@ -10,10 +10,10 @@ import androidx.fragment.app.DialogFragment import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.databinding.DialogNoteBinding -import io.github.wulkanowy.utils.getThemeAttrColor -import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.sdk.scrapper.notes.Note.CategoryType +import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.lifecycleAwareVariable +import io.github.wulkanowy.utils.toFormattedString class NoteDialog : DialogFragment() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt index bccb6f0bb..ea2b21222 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt @@ -12,8 +12,8 @@ import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.isHolidays -import org.threeten.bp.LocalDate.now import timber.log.Timber +import java.time.LocalDate.now import javax.inject.Inject class SettingsPresenter @Inject constructor( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index 85ded2025..d87f06207 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -17,8 +17,8 @@ import io.github.wulkanowy.utils.isShowTimeUntil import io.github.wulkanowy.utils.left import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.until -import org.threeten.bp.LocalDateTime import timber.log.Timber +import java.time.LocalDateTime import java.util.Timer import javax.inject.Inject import kotlin.concurrent.timer diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt index 8efecf07c..f7d5b1ed9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt @@ -15,7 +15,7 @@ import io.github.wulkanowy.databinding.DialogTimetableBinding import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.lifecycleAwareVariable import io.github.wulkanowy.utils.toFormattedString -import org.threeten.bp.LocalDateTime +import java.time.LocalDateTime class TimetableDialog : DialogFragment() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index 2f01511ad..c2be76ea7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -19,7 +19,7 @@ import io.github.wulkanowy.ui.modules.timetable.completed.CompletedLessonsFragme import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.SchooldaysRangeLimiter import io.github.wulkanowy.utils.dpToPx -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject class TimetableFragment : BaseFragment(R.layout.fragment_timetable), diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index bc7e26890..2e232381b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -22,11 +22,11 @@ import io.github.wulkanowy.utils.toFormattedString import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.now -import org.threeten.bp.LocalDate.of -import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber +import java.time.LocalDate +import java.time.LocalDate.now +import java.time.LocalDate.of +import java.time.LocalDate.ofEpochDay import javax.inject.Inject class TimetablePresenter @Inject constructor( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt index 1efa320fc..fe34f1ee9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt @@ -2,7 +2,7 @@ package io.github.wulkanowy.ui.modules.timetable import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.ui.base.BaseView -import org.threeten.bp.LocalDate +import java.time.LocalDate interface TimetableView : BaseView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt index 2efd30a34..5a41f96c5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt @@ -17,7 +17,7 @@ import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.SchooldaysRangeLimiter import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.getCompatDrawable -import org.threeten.bp.LocalDate +import java.time.LocalDate import javax.inject.Inject class CompletedLessonsFragment : diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt index 0bab7795e..eedd4c25a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt @@ -20,10 +20,10 @@ import io.github.wulkanowy.utils.toFormattedString import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.now -import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber +import java.time.LocalDate +import java.time.LocalDate.now +import java.time.LocalDate.ofEpochDay import javax.inject.Inject class CompletedLessonsPresenter @Inject constructor( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsView.kt index 170e19694..7e92cc63c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsView.kt @@ -2,7 +2,7 @@ package io.github.wulkanowy.ui.modules.timetable.completed import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.ui.base.BaseView -import org.threeten.bp.LocalDate +import java.time.LocalDate interface CompletedLessonsView : BaseView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index de09968cd..1ab6757a0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -30,8 +30,8 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.takeWhile import kotlinx.coroutines.rx2.rxMaybe import kotlinx.coroutines.rx2.rxSingle -import org.threeten.bp.LocalDate import timber.log.Timber +import java.time.LocalDate class TimetableWidgetFactory( private val timetableRepository: TimetableRepository, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 8beef08a3..4c4cc868d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -33,9 +33,9 @@ import io.github.wulkanowy.utils.toFormattedString import io.reactivex.Maybe import kotlinx.coroutines.rx2.rxMaybe import kotlinx.coroutines.rx2.rxSingle -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.now import timber.log.Timber +import java.time.LocalDate +import java.time.LocalDate.now import javax.inject.Inject class TimetableWidgetProvider : BroadcastReceiver() { diff --git a/app/src/main/java/io/github/wulkanowy/utils/SchooldaysRangeLimiter.kt b/app/src/main/java/io/github/wulkanowy/utils/SchooldaysRangeLimiter.kt index 46a707abb..e7c51745c 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SchooldaysRangeLimiter.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SchooldaysRangeLimiter.kt @@ -3,8 +3,8 @@ package io.github.wulkanowy.utils import android.os.Parcel import android.os.Parcelable import com.wdullaer.materialdatetimepicker.date.DateRangeLimiter -import org.threeten.bp.DayOfWeek -import org.threeten.bp.LocalDate +import java.time.DayOfWeek +import java.time.LocalDate import java.util.Calendar @Suppress("UNUSED_PARAMETER") diff --git a/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt index b3c479c38..1fa3128ab 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt @@ -1,7 +1,7 @@ package io.github.wulkanowy.utils import io.github.wulkanowy.data.db.entities.Semester -import org.threeten.bp.LocalDate.now +import java.time.LocalDate.now inline val Semester.isCurrent: Boolean get() = now() in start..end diff --git a/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt index 802b2ee0f..d1aba1605 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt @@ -1,21 +1,23 @@ package io.github.wulkanowy.utils -import org.threeten.bp.DayOfWeek.FRIDAY -import org.threeten.bp.DayOfWeek.MONDAY -import org.threeten.bp.DayOfWeek.SATURDAY -import org.threeten.bp.DayOfWeek.SUNDAY -import org.threeten.bp.Instant.ofEpochMilli -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalDateTime.ofInstant -import org.threeten.bp.Month -import org.threeten.bp.ZoneId -import org.threeten.bp.ZoneOffset -import org.threeten.bp.format.DateTimeFormatter.ofPattern -import org.threeten.bp.format.TextStyle.FULL_STANDALONE -import org.threeten.bp.temporal.TemporalAdjusters.firstInMonth -import org.threeten.bp.temporal.TemporalAdjusters.next -import org.threeten.bp.temporal.TemporalAdjusters.previous +import android.annotation.SuppressLint +import java.time.DayOfWeek.FRIDAY +import java.time.DayOfWeek.MONDAY +import java.time.DayOfWeek.SATURDAY +import java.time.DayOfWeek.SUNDAY +import java.time.Instant.ofEpochMilli +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.LocalDateTime.ofInstant +import java.time.Month +import java.time.ZoneId +import java.time.ZoneOffset +import java.time.format.DateTimeFormatter.ofPattern +import java.time.format.TextStyle.FULL_STANDALONE +import java.time.format.TextStyle.* +import java.time.temporal.TemporalAdjusters.firstInMonth +import java.time.temporal.TemporalAdjusters.next +import java.time.temporal.TemporalAdjusters.previous import java.util.Locale private const val DATE_PATTERN = "dd.MM.yyyy" @@ -24,17 +26,15 @@ fun String.toLocalDate(format: String = DATE_PATTERN): LocalDate = LocalDate.par fun LocalDateTime.toTimestamp() = atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneOffset.UTC).toInstant().toEpochMilli() -fun Long.toLocalDateTime() = ofInstant(ofEpochMilli(this), ZoneId.systemDefault()) +fun Long.toLocalDateTime(): LocalDateTime = ofInstant(ofEpochMilli(this), ZoneId.systemDefault()) fun LocalDate.toFormattedString(format: String = DATE_PATTERN): String = format(ofPattern(format)) fun LocalDateTime.toFormattedString(format: String = DATE_PATTERN): String = format(ofPattern(format)) -/** - * https://github.com/ThreeTen/threetenbp/issues/55 - */ +@SuppressLint("DefaultLocale") fun Month.getFormattedName(): String { - return getDisplayName(FULL_STANDALONE, Locale.getDefault()) + return getDisplayName(FULL, Locale.getDefault()) .let { when (it) { "stycznia" -> "Styczeń" @@ -51,7 +51,7 @@ fun Month.getFormattedName(): String { "grudnia" -> "Grudzień" else -> it } - } + }.capitalize() } inline val LocalDate.nextSchoolDay: LocalDate diff --git a/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt index ccb2afeb0..f3591306e 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt @@ -1,10 +1,10 @@ package io.github.wulkanowy.utils import io.github.wulkanowy.data.db.entities.Timetable -import org.threeten.bp.Duration -import org.threeten.bp.Duration.between -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalDateTime.now +import java.time.Duration +import java.time.Duration.between +import java.time.LocalDateTime +import java.time.LocalDateTime.now fun Timetable.isShowTimeUntil(previousLessonEnd: LocalDateTime?) = when { !isStudentPlan -> false diff --git a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt index f7d29220f..09486ed9d 100644 --- a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt +++ b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt @@ -5,9 +5,9 @@ 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.sdk.Sdk -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalDateTime.now +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.LocalDateTime.now fun createSemesterEntity(diaryId: Int, semesterId: Int, start: LocalDate, end: LocalDate, semesterName: Int = 1): Semester { return Semester( diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt index a4ca16b6d..2400c6c46 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt @@ -14,8 +14,8 @@ import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.of +import java.time.LocalDate +import java.time.LocalDate.of class AttendanceRemoteTest { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt index 31b2af5bc..7be3f84fd 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt @@ -14,8 +14,8 @@ import kotlinx.coroutines.runBlocking import org.junit.Assert import org.junit.Before import org.junit.Test -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.of +import java.time.LocalDate +import java.time.LocalDate.of class CompletedLessonsRemoteTest { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt index 868f60258..23bf0297e 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt @@ -14,8 +14,8 @@ import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.of +import java.time.LocalDate +import java.time.LocalDate.of class ExamRemoteTest { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt index 84761ada5..1a8157f66 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt @@ -11,7 +11,7 @@ import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.threeten.bp.LocalDate +import java.time.LocalDate class LuckyNumberRemoteTest { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt index 89f5ba16e..286cf5e91 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt @@ -14,7 +14,7 @@ import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.junit.Before import org.junit.Test -import org.threeten.bp.LocalDateTime.of +import java.time.LocalDateTime.of class MobileDeviceRepositoryTest { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt index 2a2031034..866c2af4d 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt @@ -15,7 +15,7 @@ import org.junit.Assert.assertEquals import org.junit.Assert.assertNotEquals import org.junit.Before import org.junit.Test -import org.threeten.bp.LocalDate.now +import java.time.LocalDate.now class SemesterRepositoryTest { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt index a88c87bd1..c948ba31b 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt @@ -13,9 +13,9 @@ import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDate.of -import org.threeten.bp.LocalDateTime.now +import java.time.LocalDate +import java.time.LocalDate.of +import java.time.LocalDateTime.now class TimetableRemoteTest { diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index 819930815..33af3f781 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -20,9 +20,9 @@ import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.threeten.bp.LocalDate.now -import org.threeten.bp.LocalDate.of -import org.threeten.bp.LocalDateTime +import java.time.LocalDate.now +import java.time.LocalDate.of +import java.time.LocalDateTime class GradeAverageProviderTest { diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt index 02d7da34b..32c6a74e5 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt @@ -16,7 +16,7 @@ import io.mockk.verify import org.junit.Before import org.junit.Rule import org.junit.Test -import org.threeten.bp.LocalDateTime.now +import java.time.LocalDateTime.now import java.io.IOException class LoginFormPresenterTest { diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index 8b2523471..8176fc2e6 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -17,7 +17,7 @@ import io.mockk.verify import org.junit.Before import org.junit.Rule import org.junit.Test -import org.threeten.bp.LocalDateTime.now +import java.time.LocalDateTime.now class LoginStudentSelectPresenterTest { diff --git a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt index 6cc37e11e..e1693d523 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt @@ -8,7 +8,7 @@ import io.mockk.impl.annotations.MockK import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.threeten.bp.LocalDate +import java.time.LocalDate class GradeExtensionTest { diff --git a/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt index 72d08c411..9709ded36 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt @@ -4,9 +4,9 @@ import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test -import org.threeten.bp.LocalDate.of -import org.threeten.bp.LocalDateTime -import org.threeten.bp.Month.JANUARY +import java.time.LocalDate.of +import java.time.LocalDateTime +import java.time.Month.JANUARY import java.util.Locale class TimeExtensionTest { diff --git a/app/src/test/java/io/github/wulkanowy/utils/TimetableExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/TimetableExtensionTest.kt index 33a798502..eac84759d 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/TimetableExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/TimetableExtensionTest.kt @@ -6,7 +6,7 @@ import org.junit.Assert.assertFalse import org.junit.Assert.assertNotEquals import org.junit.Assert.assertTrue import org.junit.Test -import org.threeten.bp.LocalDateTime.now +import java.time.LocalDateTime.now class TimetableExtensionTest { From 6a1a34757988e7580518ad649802d686c1864b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 27 Jul 2020 13:20:45 +0200 Subject: [PATCH 0105/1526] Migrate workers and app widgets to coroutines (#907) --- app/build.gradle | 7 +- app/proguard-rules.pro | 7 -- .../java/io/github/wulkanowy/WulkanowyApp.kt | 12 --- .../java/io/github/wulkanowy/di/AppModule.kt | 5 -- .../alarm/TimetableNotificationReceiver.kt | 26 +++---- .../wulkanowy/services/sync/SyncManager.kt | 9 ++- .../wulkanowy/services/sync/SyncWorker.kt | 75 +++++++++---------- .../sync/works/AttendanceSummaryWork.kt | 8 +- .../services/sync/works/AttendanceWork.kt | 7 +- .../sync/works/CompletedLessonWork.kt | 7 +- .../wulkanowy/services/sync/works/ExamWork.kt | 7 +- .../sync/works/GradeStatisticsWork.kt | 15 ++-- .../services/sync/works/GradeWork.kt | 33 ++++---- .../services/sync/works/HomeworkWork.kt | 7 +- .../services/sync/works/LuckyNumberWork.kt | 18 ++--- .../services/sync/works/MessageWork.kt | 18 ++--- .../wulkanowy/services/sync/works/NoteWork.kt | 18 ++--- .../services/sync/works/RecipientWork.kt | 18 ++--- .../services/sync/works/TeacherWork.kt | 7 +- .../services/sync/works/TimetableWork.kt | 11 +-- .../wulkanowy/services/sync/works/Work.kt | 12 +-- .../widgets/TimetableWidgetService.kt | 8 +- .../github/wulkanowy/ui/base/BasePresenter.kt | 9 +-- .../ui/modules/about/AboutPresenter.kt | 4 +- .../about/contributor/ContributorPresenter.kt | 4 +- .../modules/about/license/LicensePresenter.kt | 4 +- .../about/logviewer/LogViewerPresenter.kt | 4 +- .../ui/modules/account/AccountPresenter.kt | 4 +- .../modules/attendance/AttendancePresenter.kt | 4 +- .../summary/AttendanceSummaryPresenter.kt | 4 +- .../ui/modules/exam/ExamPresenter.kt | 4 +- .../ui/modules/grade/GradePresenter.kt | 4 +- .../grade/details/GradeDetailsPresenter.kt | 4 +- .../statistics/GradeStatisticsPresenter.kt | 4 +- .../grade/summary/GradeSummaryPresenter.kt | 4 +- .../ui/modules/homework/HomeworkPresenter.kt | 4 +- .../details/HomeworkDetailsPresenter.kt | 4 +- .../ui/modules/login/LoginPresenter.kt | 4 +- .../login/advanced/LoginAdvancedPresenter.kt | 4 +- .../modules/login/form/LoginFormPresenter.kt | 4 +- .../login/recover/LoginRecoverPresenter.kt | 4 +- .../LoginStudentSelectPresenter.kt | 4 +- .../login/symbol/LoginSymbolPresenter.kt | 4 +- .../luckynumber/LuckyNumberPresenter.kt | 4 +- .../LuckyNumberWidgetConfigurePresenter.kt | 4 +- .../LuckyNumberWidgetProvider.kt | 50 +++++-------- .../ui/modules/main/MainPresenter.kt | 4 +- .../ui/modules/message/MessagePresenter.kt | 4 +- .../preview/MessagePreviewPresenter.kt | 4 +- .../message/send/SendMessagePresenter.kt | 4 +- .../message/tab/MessageTabPresenter.kt | 4 +- .../mobiledevice/MobileDevicePresenter.kt | 4 +- .../token/MobileDeviceTokenPresenter.kt | 4 +- .../ui/modules/more/MorePresenter.kt | 4 +- .../ui/modules/note/NotePresenter.kt | 4 +- .../SchoolAndTeachersPresenter.kt | 4 +- .../school/SchoolPresenter.kt | 4 +- .../teacher/TeacherPresenter.kt | 4 +- .../ui/modules/settings/SettingsPresenter.kt | 50 ++++++------- .../ui/modules/splash/SplashPresenter.kt | 4 +- .../modules/timetable/TimetablePresenter.kt | 4 +- .../completed/CompletedLessonsPresenter.kt | 4 +- .../TimetableWidgetConfigurePresenter.kt | 4 +- .../timetablewidget/TimetableWidgetFactory.kt | 49 +++++------- .../TimetableWidgetProvider.kt | 59 ++++++--------- .../io/github/wulkanowy/utils/FlowUtils.kt | 6 ++ .../wulkanowy/utils/SchedulersProvider.kt | 14 ---- .../wulkanowy/TestSchedulersProvider.kt | 15 ---- .../ui/modules/login/LoginPresenterTest.kt | 3 +- .../login/form/LoginFormPresenterTest.kt | 3 +- .../LoginStudentSelectPresenterTest.kt | 3 +- .../ui/modules/main/MainPresenterTest.kt | 3 +- .../ui/modules/splash/SplashPresenterTest.kt | 3 +- 73 files changed, 269 insertions(+), 485 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/utils/SchedulersProvider.kt delete mode 100644 app/src/test/java/io/github/wulkanowy/TestSchedulersProvider.kt diff --git a/app/build.gradle b/app/build.gradle index 0bec0db7c..fe316e863 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -132,7 +132,6 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.3.8' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.8' implementation "androidx.core:core-ktx:1.3.0" @@ -155,10 +154,9 @@ dependencies { implementation "me.zhanghai.android.materialprogressbar:library:1.6.1" implementation "androidx.work:work-runtime-ktx:$work_manager" - implementation "androidx.work:work-rxjava2:$work_manager" implementation "androidx.work:work-gcm:$work_manager" - implementation 'com.github.PaulinaSadowska:RxWorkManagerObservers:1.0.0' + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0" implementation "androidx.room:room-runtime:$room" implementation "androidx.room:room-ktx:$room" @@ -174,9 +172,6 @@ dependencies { implementation "com.ncapdevi:frag-nav:3.3.0" implementation "com.github.YarikSOffice:lingver:1.2.2" - implementation "io.reactivex.rxjava2:rxandroid:2.1.1" - implementation "io.reactivex.rxjava2:rxjava:2.2.19" - implementation "com.google.code.gson:gson:2.8.6" implementation "com.jakewharton.timber:timber:4.7.1" implementation "at.favre.lib:slf4j-timber:1.0.1" diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 1a8b8c329..7c7962575 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -30,13 +30,6 @@ -dontwarn javax.annotation.** -#Config for ReactiveNetwork --dontwarn com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork --dontwarn io.reactivex.functions.Function --dontwarn rx.internal.util.** --dontwarn sun.misc.Unsafe - - #Config for MPAndroidChart -keep class com.github.mikephil.charting.** { *; } diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index c7c5a6fd0..9b1944c3f 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -18,10 +18,7 @@ import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.CrashlyticsExceptionTree import io.github.wulkanowy.utils.CrashlyticsTree import io.github.wulkanowy.utils.DebugLogTree -import io.reactivex.exceptions.UndeliverableException -import io.reactivex.plugins.RxJavaPlugins import timber.log.Timber -import java.io.IOException import javax.inject.Inject class WulkanowyApp : DaggerApplication(), Configuration.Provider { @@ -42,7 +39,6 @@ class WulkanowyApp : DaggerApplication(), Configuration.Provider { override fun onCreate() { super.onCreate() - RxJavaPlugins.setErrorHandler(::onError) Lingver.init(this) themeManager.applyDefaultTheme() @@ -66,14 +62,6 @@ class WulkanowyApp : DaggerApplication(), Configuration.Provider { registerActivityLifecycleCallbacks(ActivityLifecycleLogger()) } - private fun onError(error: Throwable) { - //RxJava's too deep stack traces may cause SOE on older android devices - val cause = error.cause - if (error is UndeliverableException && cause is IOException || cause is InterruptedException || cause is StackOverflowError) { - Timber.e(cause, "An undeliverable error occurred") - } else throw error - } - override fun applicationInjector(): AndroidInjector { return DaggerAppComponent.factory().create(this) } diff --git a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt index 29b66a4e5..d791f0a35 100644 --- a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt @@ -8,7 +8,6 @@ import dagger.Provides import io.github.wulkanowy.WulkanowyApp import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.DispatchersProvider -import io.github.wulkanowy.utils.SchedulersProvider import javax.inject.Singleton @Module @@ -18,10 +17,6 @@ internal class AppModule { @Provides fun provideContext(app: WulkanowyApp): Context = app - @Singleton - @Provides - fun provideSchedulersProvider() = SchedulersProvider() - @Singleton @Provides fun provideDispatchersProvider() = DispatchersProvider() diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt index 283f0a984..1e68685f7 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt @@ -12,14 +12,17 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import dagger.android.AndroidInjection import io.github.wulkanowy.R +import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel.Companion.CHANNEL_ID import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView -import io.github.wulkanowy.utils.SchedulersProvider +import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.toLocalDateTime -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -28,9 +31,6 @@ class TimetableNotificationReceiver : BroadcastReceiver() { @Inject lateinit var studentRepository: StudentRepository - @Inject - lateinit var schedulers: SchedulersProvider - companion object { const val NOTIFICATION_TYPE_CURRENT = 1 const val NOTIFICATION_TYPE_UPCOMING = 2 @@ -54,14 +54,14 @@ class TimetableNotificationReceiver : BroadcastReceiver() { Timber.d("Receiving intent... ${intent.toUri(0)}") AndroidInjection.inject(this, context) - rxSingle { studentRepository.getCurrentStudent(false) } - .subscribeOn(schedulers.backgroundThread) - .observeOn(schedulers.mainThread) - .subscribe({ - val studentId = intent.getIntExtra(STUDENT_ID, 0) - if (it.studentId == studentId) prepareNotification(context, intent) - else Timber.d("Notification studentId($studentId) differs from current(${it.studentId})") - }, { Timber.e(it) }) + flowWithResource { + val student = studentRepository.getCurrentStudent(false) + val studentId = intent.getIntExtra(STUDENT_ID, 0) + if (student.studentId == studentId) prepareNotification(context, intent) + else Timber.d("Notification studentId($studentId) differs from current(${student.studentId})") + }.onEach { + if (it.status == Status.ERROR) Timber.e(it.error!!) + }.launchIn(GlobalScope) } private fun prepareNotification(context: Context, intent: Intent) { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt index c94f8145e..1d005ae8e 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.services.sync import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES.O import androidx.core.app.NotificationManagerCompat +import androidx.lifecycle.asFlow import androidx.work.BackoffPolicy.EXPONENTIAL import androidx.work.Constraints import androidx.work.Data @@ -15,14 +16,13 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkInfo import androidx.work.WorkManager -import com.paulinasadowska.rxworkmanagerobservers.extensions.getWorkInfoByIdObservable import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.SharedPrefProvider.Companion.APP_VERSION_CODE_KEY import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.services.sync.channels.Channel import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.isHolidays -import io.reactivex.Observable +import kotlinx.coroutines.flow.Flow import timber.log.Timber import java.time.LocalDate.now import java.util.concurrent.TimeUnit.MINUTES @@ -67,7 +67,7 @@ class SyncManager @Inject constructor( } } - fun startOneTimeSyncWorker(): Observable { + fun startOneTimeSyncWorker(): Flow { val work = OneTimeWorkRequestBuilder() .setInputData( Data.Builder() @@ -77,7 +77,8 @@ class SyncManager @Inject constructor( .build() workManager.enqueueUniqueWork("${SyncWorker::class.java.simpleName}_one_time", ExistingWorkPolicy.REPLACE, work) - return workManager.getWorkInfoByIdObservable(work.id) + + return workManager.getWorkInfoByIdLiveData(work.id).asFlow() } fun stopSyncWorker() { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt index fc02ca759..75711f0eb 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt @@ -5,9 +5,9 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat.BigTextStyle import androidx.core.app.NotificationCompat.PRIORITY_DEFAULT import androidx.core.app.NotificationManagerCompat +import androidx.work.CoroutineWorker import androidx.work.Data import androidx.work.ListenableWorker -import androidx.work.RxWorker import androidx.work.WorkerParameters import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject @@ -20,10 +20,7 @@ import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import io.github.wulkanowy.services.sync.channels.DebugChannel import io.github.wulkanowy.services.sync.works.Work import io.github.wulkanowy.utils.getCompatColor -import io.reactivex.Completable -import io.reactivex.Single -import kotlinx.coroutines.rx2.rxMaybe -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.coroutineScope import timber.log.Timber import kotlin.random.Random @@ -35,45 +32,43 @@ class SyncWorker @AssistedInject constructor( private val works: Set<@JvmSuppressWildcards Work>, private val preferencesRepository: PreferencesRepository, private val notificationManager: NotificationManagerCompat -) : RxWorker(appContext, workerParameters) { +) : CoroutineWorker(appContext, workerParameters) { - override fun createWork(): Single { + override suspend fun doWork() = coroutineScope { Timber.i("SyncWorker is starting") - return rxSingle { studentRepository.isCurrentStudentSet() } - .filter { true } - .flatMap { rxMaybe { studentRepository.getCurrentStudent() } } - .flatMapCompletable { student -> - rxSingle { semesterRepository.getCurrentSemester(student, true) } - .flatMapCompletable { semester -> - Completable.mergeDelayError(works.map { work -> - work.create(student, semester) - .onErrorResumeNext { - if (it is FeatureDisabledException || it is FeatureNotAvailableException) Completable.complete() - else Completable.error(it) - } - .doOnSubscribe { Timber.i("${work::class.java.simpleName} is starting") } - .doOnError { Timber.i("${work::class.java.simpleName} result: An exception occurred") } - .doOnComplete { Timber.i("${work::class.java.simpleName} result: Success") } - }) - } + + if (!studentRepository.isCurrentStudentSet()) return@coroutineScope Result.failure() + + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student, true) + + val exceptions = works.mapNotNull { work -> + try { + Timber.i("${work::class.java.simpleName} is starting") + work.doWork(student, semester) + Timber.i("${work::class.java.simpleName} result: Success") + null + } catch (e: Throwable) { + Timber.w("${work::class.java.simpleName} result: An exception ${e.message} occurred") + if (e is FeatureDisabledException || e is FeatureNotAvailableException) null + else e } - .toSingleDefault(Result.success()) - .onErrorReturn { - Timber.e(it, "There was an error during synchronization") - when { - inputData.getBoolean("one_time", false) -> { - Result.failure(Data.Builder() - .putString("error", it.toString()) - .build() - ) - } - else -> Result.retry() - } - } - .doOnSuccess { - if (preferencesRepository.isDebugNotificationEnable) notify(it) - Timber.i("SyncWorker result: $it") + } + val result = when { + exceptions.isNotEmpty() && inputData.getBoolean("one_time", false) -> { + Result.failure(Data.Builder() + .putString("error", exceptions.toString()) + .build() + ) } + exceptions.isNotEmpty() -> Result.retry() + else -> Result.success() + } + + if (preferencesRepository.isDebugNotificationEnable) notify(result) + Timber.i("SyncWorker result: $result") + + result } private fun notify(result: Result) { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt index 3d118e6f1..9e4ab9025 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt @@ -3,16 +3,14 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.attendancesummary.AttendanceSummaryRepository -import io.reactivex.Completable -import kotlinx.coroutines.rx2.rxCompletable +import io.github.wulkanowy.utils.waitForResult import javax.inject.Inject class AttendanceSummaryWork @Inject constructor( private val attendanceSummaryRepository: AttendanceSummaryRepository ) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { attendanceSummaryRepository.getAttendanceSummary(student, semester, -1, true).waitForResult() } + override suspend fun doWork(student: Student, semester: Semester) { + attendanceSummaryRepository.getAttendanceSummary(student, semester, -1, true).waitForResult() } } - diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt index 543ec5f34..ecf0be018 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt @@ -5,14 +5,13 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.sunday -import io.reactivex.Completable -import kotlinx.coroutines.rx2.rxCompletable +import io.github.wulkanowy.utils.waitForResult import java.time.LocalDate.now import javax.inject.Inject class AttendanceWork @Inject constructor(private val attendanceRepository: AttendanceRepository) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true).waitForResult() } + override suspend fun doWork(student: Student, semester: Semester) { + attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true).waitForResult() } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt index 4612ebb48..212ea6327 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt @@ -5,8 +5,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRepository import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.sunday -import io.reactivex.Completable -import kotlinx.coroutines.rx2.rxCompletable +import io.github.wulkanowy.utils.waitForResult import java.time.LocalDate.now import javax.inject.Inject @@ -14,7 +13,7 @@ class CompletedLessonWork @Inject constructor( private val completedLessonsRepository: CompletedLessonsRepository ) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { completedLessonsRepository.getCompletedLessons(student, semester, now().monday, now().sunday, true).waitForResult() } + override suspend fun doWork(student: Student, semester: Semester) { + completedLessonsRepository.getCompletedLessons(student, semester, now().monday, now().sunday, true).waitForResult() } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt index 119226716..f7d8db0ae 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt @@ -5,14 +5,13 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.exam.ExamRepository import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.sunday -import io.reactivex.Completable -import kotlinx.coroutines.rx2.rxCompletable +import io.github.wulkanowy.utils.waitForResult import java.time.LocalDate.now import javax.inject.Inject class ExamWork @Inject constructor(private val examRepository: ExamRepository) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { examRepository.getExams(student, semester, now().monday, now().sunday, true).waitForResult() } + override suspend fun doWork(student: Student, semester: Semester) { + examRepository.getExams(student, semester, now().monday, now().sunday, true).waitForResult() } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt index cbfa2d9af..3d61a423b 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt @@ -3,21 +3,18 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.gradestatistics.GradeStatisticsRepository -import io.reactivex.Completable -import kotlinx.coroutines.rx2.rxCompletable +import io.github.wulkanowy.utils.waitForResult import javax.inject.Inject class GradeStatisticsWork @Inject constructor( private val gradeStatisticsRepository: GradeStatisticsRepository ) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { - with(gradeStatisticsRepository) { - getGradesStatistics(student, semester, "Wszystkie", isSemester = true, forceRefresh = true).waitForResult() - getGradesStatistics(student, semester, "Wszystkie", isSemester = false, forceRefresh = true).waitForResult() - getGradesPointsStatistics(student, semester, "Wszystkie", forceRefresh = true).waitForResult() - } + override suspend fun doWork(student: Student, semester: Semester) { + with(gradeStatisticsRepository) { + getGradesStatistics(student, semester, "Wszystkie", isSemester = true, forceRefresh = true).waitForResult() + getGradesStatistics(student, semester, "Wszystkie", isSemester = false, forceRefresh = true).waitForResult() + getGradesPointsStatistics(student, semester, "Wszystkie", forceRefresh = true).waitForResult() } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt index 741809930..9d4df201d 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt @@ -18,10 +18,8 @@ import io.github.wulkanowy.services.sync.channels.NewGradesChannel import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor -import io.reactivex.Completable +import io.github.wulkanowy.utils.waitForResult import kotlinx.coroutines.flow.first -import kotlinx.coroutines.rx2.rxCompletable -import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject import kotlin.random.Random @@ -32,18 +30,23 @@ class GradeWork @Inject constructor( private val preferencesRepository: PreferencesRepository ) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable).waitForResult() } - .concatWith(Completable.concatArray(rxSingle { gradeRepository.getNotNotifiedGrades(semester).first() }.flatMapCompletable { - if (it.isNotEmpty()) notifyDetails(it) - rxCompletable { gradeRepository.updateGrades(it.onEach { grade -> grade.isNotified = true }) } - }, rxSingle { gradeRepository.getNotNotifiedPredictedGrades(semester).first() }.flatMapCompletable { - if (it.isNotEmpty()) notifyPredicted(it) - rxCompletable { gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isPredictedGradeNotified = true }) } - }, rxSingle { gradeRepository.getNotNotifiedFinalGrades(semester).first() }.flatMapCompletable { - if (it.isNotEmpty()) notifyFinal(it) - rxCompletable { gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isFinalGradeNotified = true }) } - })) + override suspend fun doWork(student: Student, semester: Semester) { + gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable).waitForResult() + + gradeRepository.getNotNotifiedGrades(semester).first().let { + if (it.isNotEmpty()) notifyDetails(it) + gradeRepository.updateGrades(it.onEach { grade -> grade.isNotified = true }) + } + + gradeRepository.getNotNotifiedPredictedGrades(semester).first().let { + if (it.isNotEmpty()) notifyPredicted(it) + gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isPredictedGradeNotified = true }) + } + + gradeRepository.getNotNotifiedFinalGrades(semester).first().let { + if (it.isNotEmpty()) notifyFinal(it) + gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isFinalGradeNotified = true }) + } } private fun getNotificationBuilder(): NotificationCompat.Builder { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt index 315c2caf4..a07f11073 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt @@ -5,14 +5,13 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.homework.HomeworkRepository import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.sunday -import io.reactivex.Completable -import kotlinx.coroutines.rx2.rxCompletable +import io.github.wulkanowy.utils.waitForResult import java.time.LocalDate.now import javax.inject.Inject class HomeworkWork @Inject constructor(private val homeworkRepository: HomeworkRepository) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { homeworkRepository.getHomework(student, semester, now().monday, now().sunday, true).waitForResult() } + override suspend fun doWork(student: Student, semester: Semester) { + homeworkRepository.getHomework(student, semester, now().monday, now().sunday, true).waitForResult() } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt index 9bf3de0c6..0024d9038 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt @@ -17,10 +17,8 @@ import io.github.wulkanowy.services.sync.channels.LuckyNumberChannel import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor -import io.reactivex.Completable +import io.github.wulkanowy.utils.waitForResult import kotlinx.coroutines.flow.first -import kotlinx.coroutines.rx2.rxCompletable -import kotlinx.coroutines.rx2.rxMaybe import javax.inject.Inject import kotlin.random.Random @@ -31,13 +29,13 @@ class LuckyNumberWork @Inject constructor( private val preferencesRepository: PreferencesRepository ) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxMaybe { luckyNumberRepository.getLuckyNumber(student, true, preferencesRepository.isNotificationsEnable).waitForResult() } - .flatMap { rxMaybe { luckyNumberRepository.getNotNotifiedLuckyNumber(student).first() } } - .flatMapCompletable { - notify(it) - rxCompletable { luckyNumberRepository.updateLuckyNumber(it.apply { isNotified = true }) } - } + override suspend fun doWork(student: Student, semester: Semester) { + luckyNumberRepository.getLuckyNumber(student, true, preferencesRepository.isNotificationsEnable).waitForResult() + + luckyNumberRepository.getNotNotifiedLuckyNumber(student).first()?.let { + notify(it) + luckyNumberRepository.updateLuckyNumber(it.apply { isNotified = true }) + } } private fun notify(luckyNumber: LuckyNumber) { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt index 28f6e3076..ba026a0e9 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt @@ -18,10 +18,8 @@ import io.github.wulkanowy.services.sync.channels.NewMessagesChannel import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor -import io.reactivex.Completable +import io.github.wulkanowy.utils.waitForResult import kotlinx.coroutines.flow.first -import kotlinx.coroutines.rx2.rxCompletable -import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject import kotlin.random.Random @@ -32,13 +30,13 @@ class MessageWork @Inject constructor( private val preferencesRepository: PreferencesRepository ) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxSingle { messageRepository.getMessages(student, semester, RECEIVED, true, preferencesRepository.isNotificationsEnable).waitForResult() } - .flatMap { rxSingle { messageRepository.getNotNotifiedMessages(student).first() } } - .flatMapCompletable { - if (it.isNotEmpty()) notify(it) - rxCompletable { messageRepository.updateMessages(it.onEach { message -> message.isNotified = true }) } - } + override suspend fun doWork(student: Student, semester: Semester) { + messageRepository.getMessages(student, semester, RECEIVED, true, preferencesRepository.isNotificationsEnable).waitForResult() + + messageRepository.getNotNotifiedMessages(student).first().let { + if (it.isNotEmpty()) notify(it) + messageRepository.updateMessages(it.onEach { message -> message.isNotified = true }) + } } private fun notify(messages: List) { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt index 029c9f98a..2cd9d549a 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt @@ -17,10 +17,8 @@ import io.github.wulkanowy.services.sync.channels.NewNotesChannel import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor -import io.reactivex.Completable +import io.github.wulkanowy.utils.waitForResult import kotlinx.coroutines.flow.first -import kotlinx.coroutines.rx2.rxCompletable -import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject import kotlin.random.Random @@ -31,13 +29,13 @@ class NoteWork @Inject constructor( private val preferencesRepository: PreferencesRepository ) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxSingle { noteRepository.getNotes(student, semester, true, preferencesRepository.isNotificationsEnable).waitForResult() } - .flatMap { rxSingle { noteRepository.getNotNotifiedNotes(student).first() } } - .flatMapCompletable { - if (it.isNotEmpty()) notify(it) - rxCompletable { noteRepository.updateNotes(it.onEach { note -> note.isNotified = true }) } - } + override suspend fun doWork(student: Student, semester: Semester) { + noteRepository.getNotes(student, semester, true, preferencesRepository.isNotificationsEnable).waitForResult() + + noteRepository.getNotNotifiedNotes(student).first().let { + if (it.isNotEmpty()) notify(it) + noteRepository.updateNotes(it.onEach { note -> note.isNotified = true }) + } } private fun notify(notes: List) { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt index 2a53e51ba..c433c0ac8 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt @@ -4,9 +4,6 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.recipient.RecipientRepository import io.github.wulkanowy.data.repositories.reportingunit.ReportingUnitRepository -import io.reactivex.Completable -import kotlinx.coroutines.rx2.rxCompletable -import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class RecipientWork @Inject constructor( @@ -14,14 +11,13 @@ class RecipientWork @Inject constructor( private val recipientRepository: RecipientRepository ) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxSingle { reportingUnitRepository.refreshReportingUnits(student) } - .flatMap { rxSingle { reportingUnitRepository.getReportingUnits(student) } } - .flatMapCompletable { units -> - Completable.mergeDelayError(units.map { - rxCompletable { recipientRepository.refreshRecipients(student, 2, it) } - }) + override suspend fun doWork(student: Student, semester: Semester) { + reportingUnitRepository.refreshReportingUnits(student) + + reportingUnitRepository.getReportingUnits(student).let { units -> + units.map { + recipientRepository.refreshRecipients(student, 2, it) } + } } } - diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt index 9954db314..a9abdaa72 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt @@ -3,13 +3,12 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.teacher.TeacherRepository -import io.reactivex.Completable -import kotlinx.coroutines.rx2.rxCompletable +import io.github.wulkanowy.utils.waitForResult import javax.inject.Inject class TeacherWork @Inject constructor(private val teacherRepository: TeacherRepository) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { teacherRepository.getTeachers(student, semester, true).waitForResult() } + override suspend fun doWork(student: Student, semester: Semester) { + teacherRepository.getTeachers(student, semester, true).waitForResult() } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt index 0832eb4da..3b8c6f5dc 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt @@ -5,14 +5,15 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.timetable.TimetableRepository import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.sunday -import io.reactivex.Completable -import kotlinx.coroutines.rx2.rxCompletable +import io.github.wulkanowy.utils.waitForResult import java.time.LocalDate.now import javax.inject.Inject -class TimetableWork @Inject constructor(private val timetableRepository: TimetableRepository) : Work { +class TimetableWork @Inject constructor( + private val timetableRepository: TimetableRepository +) : Work { - override fun create(student: Student, semester: Semester): Completable { - return rxCompletable { timetableRepository.getTimetable(student, semester, now().monday, now().sunday, true).waitForResult() } + override suspend fun doWork(student: Student, semester: Semester) { + timetableRepository.getTimetable(student, semester, now().monday, now().sunday, true).waitForResult() } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt index 8dc0b98d2..c41f41ce2 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt @@ -1,19 +1,9 @@ package io.github.wulkanowy.services.sync.works -import io.github.wulkanowy.data.Resource -import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Completable -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.flow.takeWhile interface Work { - fun create(student: Student, semester: Semester): Completable - - suspend fun Flow>.waitForResult() = takeWhile { - it.status == Status.LOADING - }.collect() + suspend fun doWork(student: Student, semester: Semester) } diff --git a/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt b/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt index e5ccf963c..a3b9da95e 100644 --- a/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt +++ b/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt @@ -9,7 +9,7 @@ import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.data.repositories.timetable.TimetableRepository import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetFactory -import io.github.wulkanowy.utils.SchedulersProvider +import timber.log.Timber import javax.inject.Inject class TimetableWidgetService : RemoteViewsService() { @@ -29,11 +29,9 @@ class TimetableWidgetService : RemoteViewsService() { @Inject lateinit var sharedPref: SharedPrefProvider - @Inject - lateinit var schedulers: SchedulersProvider - override fun onGetViewFactory(intent: Intent?): RemoteViewsFactory { AndroidInjection.inject(this) - return TimetableWidgetFactory(timetableRepo, studentRepo, semesterRepo, prefRepository, sharedPref, schedulers, applicationContext, intent) + Timber.d("TimetableWidgetFactory created") + return TimetableWidgetFactory(timetableRepo, studentRepo, semesterRepo, prefRepository, sharedPref, applicationContext, intent) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index b0fc0f6bc..aec524259 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -2,9 +2,7 @@ package io.github.wulkanowy.ui.base import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.student.StudentRepository -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.flowWithResource -import io.reactivex.disposables.CompositeDisposable import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -16,8 +14,7 @@ import kotlin.coroutines.CoroutineContext open class BasePresenter( protected val errorHandler: ErrorHandler, - protected val studentRepository: StudentRepository, - protected val schedulers: SchedulersProvider + protected val studentRepository: StudentRepository ) : CoroutineScope { private var job: Job = Job() @@ -27,9 +24,6 @@ open class BasePresenter( override val coroutineContext: CoroutineContext get() = Dispatchers.Main + job - @Deprecated("Use flow instead :)") - val disposable = CompositeDisposable() - var view: T? = null open fun onAttachView(view: T) { @@ -83,7 +77,6 @@ open class BasePresenter( open fun onDetachView() { view = null - disposable.clear() job.cancel() errorHandler.clear() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt index ee892adfc..24e59d36b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt @@ -5,17 +5,15 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import timber.log.Timber import javax.inject.Inject class AboutPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val appInfo: AppInfo, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: AboutView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt index c2238de7c..c1fe1e118 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt @@ -6,17 +6,15 @@ import io.github.wulkanowy.data.repositories.appcreator.AppCreatorRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach import javax.inject.Inject class ContributorPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val appCreatorRepository: AppCreatorRepository -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: ContributorView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt index ec1ad8a4c..18d257eed 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.DispatchersProvider -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach @@ -15,11 +14,10 @@ import timber.log.Timber import javax.inject.Inject class LicensePresenter @Inject constructor( - schedulers: SchedulersProvider, private val dispatchers: DispatchersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: LicenseView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt index 50df763aa..85eae8e6e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt @@ -5,18 +5,16 @@ import io.github.wulkanowy.data.repositories.logger.LoggerRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject class LogViewerPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val loggerRepository: LoggerRepository -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: LogViewerView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt index 402394170..8751e5233 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach @@ -14,11 +13,10 @@ import timber.log.Timber import javax.inject.Inject class AccountPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val syncManager: SyncManager -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: AccountView) { super.onAttachView(view) 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 c5002c8b8..158f08ba3 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 @@ -10,7 +10,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn @@ -30,14 +29,13 @@ import java.time.LocalDate.ofEpochDay import javax.inject.Inject class AttendancePresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val attendanceRepository: AttendanceRepository, private val semesterRepository: SemesterRepository, private val prefRepository: PreferencesRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private var baseDate: LocalDate = now().previousOrSameSchoolDay diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt index b5d8538fa..e5dce9ac8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt @@ -9,7 +9,6 @@ import io.github.wulkanowy.data.repositories.subject.SubjectRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import kotlinx.coroutines.flow.onEach @@ -18,14 +17,13 @@ import java.time.Month import javax.inject.Inject class AttendanceSummaryPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val attendanceSummaryRepository: AttendanceSummaryRepository, private val subjectRepository: SubjectRepository, private val semesterRepository: SemesterRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private var subjects = emptyList() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index a5c6e8519..f63316a8d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -8,7 +8,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday @@ -27,13 +26,12 @@ import java.time.LocalDate.ofEpochDay import javax.inject.Inject class ExamPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val examRepository: ExamRepository, private val semesterRepository: SemesterRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private var baseDate: LocalDate = now().nextOrSameSchoolDay diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index 9dc39d85c..d4c9f210a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -7,7 +7,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.getCurrentOrLast import kotlinx.coroutines.delay @@ -16,12 +15,11 @@ import timber.log.Timber import javax.inject.Inject class GradePresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val semesterRepository: SemesterRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { var selectedIndex = 0 private set diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index 5845d32c1..a36517938 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -11,7 +11,6 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn @@ -21,7 +20,6 @@ import timber.log.Timber import javax.inject.Inject class GradeDetailsPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val gradeRepository: GradeRepository, @@ -29,7 +27,7 @@ class GradeDetailsPresenter @Inject constructor( private val preferencesRepository: PreferencesRepository, private val averageProvider: GradeAverageProvider, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private var newGradesAmount: Int = 0 diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt index eb6ae8433..112f4c582 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt @@ -10,7 +10,6 @@ import io.github.wulkanowy.data.repositories.subject.SubjectRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import kotlinx.coroutines.flow.onEach @@ -18,7 +17,6 @@ import timber.log.Timber import javax.inject.Inject class GradeStatisticsPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val gradeStatisticsRepository: GradeStatisticsRepository, @@ -26,7 +24,7 @@ class GradeStatisticsPresenter @Inject constructor( private val semesterRepository: SemesterRepository, private val preferencesRepository: PreferencesRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private var subjects = emptyList() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 96908c3c6..9484d8b77 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -8,7 +8,6 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import kotlinx.coroutines.flow.onEach @@ -16,12 +15,11 @@ import timber.log.Timber import javax.inject.Inject class GradeSummaryPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val averageProvider: GradeAverageProvider, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private lateinit var lastError: Throwable diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index cf38d9c2b..8af0d83f6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -8,7 +8,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday @@ -26,13 +25,12 @@ import java.time.LocalDate.ofEpochDay import javax.inject.Inject class HomeworkPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val homeworkRepository: HomeworkRepository, private val semesterRepository: SemesterRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private var baseDate: LocalDate = LocalDate.now().nextOrSameSchoolDay diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt index 2ca7a1f88..a53d38e86 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt @@ -7,19 +7,17 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject class HomeworkDetailsPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val homeworkRepository: HomeworkRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: HomeworkDetailsView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginPresenter.kt index 16342de4f..8ff7e6fe6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginPresenter.kt @@ -4,15 +4,13 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.SchedulersProvider import timber.log.Timber import javax.inject.Inject class LoginPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: LoginView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt index 8f187ac83..f5c30c517 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt @@ -7,7 +7,6 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.ifNullOrBlank @@ -16,11 +15,10 @@ import timber.log.Timber import javax.inject.Inject class LoginAdvancedPresenter @Inject constructor( - schedulers: SchedulersProvider, studentRepository: StudentRepository, private val loginErrorHandler: LoginErrorHandler, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(loginErrorHandler, studentRepository, schedulers) { +) : BasePresenter(loginErrorHandler, studentRepository) { override fun onAttachView(view: LoginAdvancedView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index 9e43bf77a..b921140c7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.ifNullOrBlank @@ -14,11 +13,10 @@ import timber.log.Timber import javax.inject.Inject class LoginFormPresenter @Inject constructor( - schedulers: SchedulersProvider, studentRepository: StudentRepository, private val loginErrorHandler: LoginErrorHandler, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(loginErrorHandler, studentRepository, schedulers) { +) : BasePresenter(loginErrorHandler, studentRepository) { private var lastError: Throwable? = null diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt index 0ef183ccf..1d509e1bb 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.repositories.recover.RecoverRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.ifNullOrBlank @@ -14,12 +13,11 @@ import timber.log.Timber import javax.inject.Inject class LoginRecoverPresenter @Inject constructor( - schedulers: SchedulersProvider, studentRepository: StudentRepository, private val loginErrorHandler: RecoverErrorHandler, private val analytics: FirebaseAnalyticsHelper, private val recoverRepository: RecoverRepository -) : BasePresenter(loginErrorHandler, studentRepository, schedulers) { +) : BasePresenter(loginErrorHandler, studentRepository) { private lateinit var lastError: Throwable diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 99ee7d30b..76e0693f5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.ifNullOrBlank import kotlinx.coroutines.flow.onEach @@ -15,11 +14,10 @@ import java.io.Serializable import javax.inject.Inject class LoginStudentSelectPresenter @Inject constructor( - schedulers: SchedulersProvider, studentRepository: StudentRepository, private val loginErrorHandler: LoginErrorHandler, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(loginErrorHandler, studentRepository, schedulers) { +) : BasePresenter(loginErrorHandler, studentRepository) { private var lastError: Throwable? = null diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index c0f5803f9..a2cda4fc1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.ifNullOrBlank @@ -16,10 +15,9 @@ import javax.inject.Inject class LoginSymbolPresenter @Inject constructor( studentRepository: StudentRepository, - schedulers: SchedulersProvider, private val loginErrorHandler: LoginErrorHandler, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(loginErrorHandler, studentRepository, schedulers) { +) : BasePresenter(loginErrorHandler, studentRepository) { private var lastError: Throwable? = null diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt index 64df3db8a..90aea441e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import kotlinx.coroutines.flow.onEach @@ -14,12 +13,11 @@ import timber.log.Timber import javax.inject.Inject class LuckyNumberPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val luckyNumberRepository: LuckyNumberRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private lateinit var lastError: Throwable diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt index 5bcdc8a1b..32196ee29 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt @@ -8,18 +8,16 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider.Companion.getStudentWidgetKey import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider.Companion.getThemeWidgetKey -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject class LuckyNumberWidgetConfigurePresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val sharedPref: SharedPrefProvider -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private var appWidgetId: Int? = null diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index cf8395f3d..3daaaaf66 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -15,20 +15,14 @@ import android.view.View.VISIBLE import android.widget.RemoteViews import dagger.android.AndroidInjection import io.github.wulkanowy.R -import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.SharedPrefProvider -import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.exceptions.NoCurrentStudentException import io.github.wulkanowy.data.repositories.luckynumber.LuckyNumberRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView -import io.github.wulkanowy.utils.SchedulersProvider -import io.reactivex.Maybe -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.takeWhile -import kotlinx.coroutines.rx2.rxMaybe -import kotlinx.coroutines.rx2.rxSingle +import io.github.wulkanowy.utils.toFirstResult +import kotlinx.coroutines.runBlocking import timber.log.Timber import javax.inject.Inject @@ -40,12 +34,6 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { @Inject lateinit var luckyNumberRepository: LuckyNumberRepository - @Inject - lateinit var schedulers: SchedulersProvider - - @Inject - lateinit var appWidgetManager: AppWidgetManager - @Inject lateinit var sharedPref: SharedPrefProvider @@ -142,27 +130,23 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { return n - 1 } - private fun getLuckyNumber(studentId: Long, appWidgetId: Int): LuckyNumber? { - return try { - rxSingle { studentRepository.isStudentSaved() } - .filter { true } - .flatMap { rxMaybe { studentRepository.getSavedStudents() } } - .flatMap { students -> - val student = students.singleOrNull { student -> student.id == studentId } - when { - student != null -> Maybe.just(student) - studentId != 0L -> { - rxSingle { studentRepository.isCurrentStudentSet() } - .filter { true } - .flatMap { rxMaybe { studentRepository.getCurrentStudent(false) } } - .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } - } - else -> Maybe.empty() + private fun getLuckyNumber(studentId: Long, appWidgetId: Int) = runBlocking { + try { + val students = studentRepository.getSavedStudents() + val student = students.singleOrNull { student -> student.id == studentId } + val currentStudent = when { + student != null -> student + studentId != 0L && studentRepository.isCurrentStudentSet() -> { + studentRepository.getCurrentStudent(false).also { + sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } } - .flatMap { rxMaybe { luckyNumberRepository.getLuckyNumber(it, false).takeWhile { it.status == Status.LOADING }.first().data } } - .subscribeOn(schedulers.backgroundThread) - .blockingGet() + else -> null + } + + currentStudent?.let { + luckyNumberRepository.getLuckyNumber(it, false).toFirstResult().data + } } catch (e: Exception) { if (e.cause !is NoCurrentStudentException) { Timber.e(e, "An error has occurred in lucky number provider") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index 233d44917..8d5c9d67f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -9,18 +9,16 @@ import io.github.wulkanowy.ui.modules.main.MainView.Section.GRADE import io.github.wulkanowy.ui.modules.main.MainView.Section.MESSAGE import io.github.wulkanowy.ui.modules.main.MainView.Section.SCHOOL import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import timber.log.Timber import javax.inject.Inject class MainPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val prefRepository: PreferencesRepository, private val syncManager: SyncManager, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { fun onAttachView(view: MainView, initMenu: MainView.Section?) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt index ea482c623..0fb454b31 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt @@ -3,17 +3,15 @@ package io.github.wulkanowy.ui.modules.message import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.SchedulersProvider import kotlinx.coroutines.delay import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject class MessagePresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: MessageView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index 4d3b83f1b..39437fe45 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -11,7 +11,6 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn @@ -21,13 +20,12 @@ import timber.log.Timber import javax.inject.Inject class MessagePreviewPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val messageRepository: MessageRepository, private val analytics: FirebaseAnalyticsHelper, private var appInfo: AppInfo -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { var message: Message? = null diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt index c31fd79a7..f877c8096 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt @@ -12,7 +12,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.toFormattedString @@ -21,7 +20,6 @@ import timber.log.Timber import javax.inject.Inject class SendMessagePresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val semesterRepository: SemesterRepository, @@ -30,7 +28,7 @@ class SendMessagePresenter @Inject constructor( private val recipientRepository: RecipientRepository, private val preferencesRepository: PreferencesRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { fun onAttachView(view: SendMessageView, message: Message?, reply: Boolean?) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 3c9f04447..0d5bb2a6c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -9,7 +9,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.toFormattedString @@ -28,13 +27,12 @@ import javax.inject.Inject import kotlin.math.pow class MessageTabPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val messageRepository: MessageRepository, private val semesterRepository: SemesterRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { lateinit var folder: MessageFolder diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt index e665a15bf..6314c2c31 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt @@ -8,7 +8,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn @@ -18,13 +17,12 @@ import timber.log.Timber import javax.inject.Inject class MobileDevicePresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val semesterRepository: SemesterRepository, private val mobileDeviceRepository: MobileDeviceRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private lateinit var lastError: Throwable diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt index f5fb7db32..f6d0de992 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt @@ -7,7 +7,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach @@ -15,13 +14,12 @@ import timber.log.Timber import javax.inject.Inject class MobileDeviceTokenPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val semesterRepository: SemesterRepository, private val mobileDeviceRepository: MobileDeviceRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: MobileDeviceTokenVIew) { super.onAttachView(view) 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 593645c19..6d80f4181 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 @@ -3,15 +3,13 @@ package io.github.wulkanowy.ui.modules.more import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.SchedulersProvider import timber.log.Timber import javax.inject.Inject class MorePresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: MoreView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt index 8e5661adc..db3b495a8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt @@ -8,7 +8,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn @@ -18,13 +17,12 @@ import timber.log.Timber import javax.inject.Inject class NotePresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val noteRepository: NoteRepository, private val semesterRepository: SemesterRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private lateinit var lastError: Throwable diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt index 324f2c37b..305f4e7d5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt @@ -3,17 +3,15 @@ package io.github.wulkanowy.ui.modules.schoolandteachers import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.SchedulersProvider import kotlinx.coroutines.delay import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject class SchoolAndTeachersPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: SchoolAndTeachersView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt index 9c10c6ed7..4cda5d33c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt @@ -7,7 +7,6 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import kotlinx.coroutines.flow.onEach @@ -15,13 +14,12 @@ import timber.log.Timber import javax.inject.Inject class SchoolPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val semesterRepository: SemesterRepository, private val schoolRepository: SchoolRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private var address: String? = null diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt index 886f5c689..ff02116b9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt @@ -7,7 +7,6 @@ import io.github.wulkanowy.data.repositories.teacher.TeacherRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import kotlinx.coroutines.flow.onEach @@ -15,13 +14,12 @@ import timber.log.Timber import javax.inject.Inject class TeacherPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val semesterRepository: SemesterRepository, private val teacherRepository: TeacherRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private lateinit var lastError: Throwable diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt index ea2b21222..f9e6731f9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt @@ -10,14 +10,14 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.isHolidays +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.onEach import timber.log.Timber import java.time.LocalDate.now import javax.inject.Inject class SettingsPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val preferencesRepository: PreferencesRepository, @@ -26,7 +26,7 @@ class SettingsPresenter @Inject constructor( private val syncManager: SyncManager, private val chuckerCollector: ChuckerCollector, private val appInfo: AppInfo -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: SettingsView) { super.onAttachView(view) @@ -64,31 +64,27 @@ class SettingsPresenter @Inject constructor( fun onForceSyncDialogSubmit() { view?.run { - val successString = syncSuccessString - val failedString = syncFailedString - disposable.add(syncManager.startOneTimeSyncWorker() - .doOnSubscribe { - setSyncInProgress(true) - Timber.i("Setting sync now started") - analytics.logEvent("sync_now", "status" to "started") - } - .doFinally { setSyncInProgress(false) } - .subscribe({ workInfo -> - when (workInfo.state) { - WorkInfo.State.SUCCEEDED -> { - showMessage(successString) - analytics.logEvent("sync_now", "status" to "success") - } - WorkInfo.State.FAILED -> { - showError(failedString, Throwable(workInfo.outputData.getString("error"))) - analytics.logEvent("sync_now", "status" to "failed") - } - else -> Timber.d("Sync now state: ${workInfo.state}") + syncManager.startOneTimeSyncWorker().onEach { workInfo -> + when (workInfo.state) { + WorkInfo.State.ENQUEUED -> { + setSyncInProgress(true) + Timber.i("Setting sync now started") + analytics.logEvent("sync_now", "status" to "started") } - }, { - Timber.e(it, "Sync now failed") - }) - ) + WorkInfo.State.SUCCEEDED -> { + showMessage(syncSuccessString) + analytics.logEvent("sync_now", "status" to "success") + } + WorkInfo.State.FAILED -> { + showError(syncFailedString, Throwable(workInfo.outputData.getString("error"))) + analytics.logEvent("sync_now", "status" to "failed") + } + else -> Timber.d("Sync now state: ${workInfo.state}") + } + if (workInfo.state.isFinished) setSyncInProgress(false) + }.catch { + Timber.e(it, "Sync now failed") + }.launch("sync") } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt index 7ffbf41af..d16ca4a80 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt @@ -4,17 +4,15 @@ import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject class SplashPresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: SplashView) { super.onAttachView(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 2e232381b..e410eeb95 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -10,7 +10,6 @@ import io.github.wulkanowy.data.repositories.timetable.TimetableRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday @@ -30,14 +29,13 @@ import java.time.LocalDate.ofEpochDay import javax.inject.Inject class TimetablePresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val timetableRepository: TimetableRepository, private val semesterRepository: SemesterRepository, private val prefRepository: PreferencesRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private var baseDate: LocalDate = now().nextOrSameSchoolDay diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt index eedd4c25a..f1c2cedc6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt @@ -8,7 +8,6 @@ import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday @@ -27,13 +26,12 @@ import java.time.LocalDate.ofEpochDay import javax.inject.Inject class CompletedLessonsPresenter @Inject constructor( - schedulers: SchedulersProvider, studentRepository: StudentRepository, private val completedLessonsErrorHandler: CompletedLessonsErrorHandler, private val semesterRepository: SemesterRepository, private val completedLessonsRepository: CompletedLessonsRepository, private val analytics: FirebaseAnalyticsHelper -) : BasePresenter(completedLessonsErrorHandler, studentRepository, schedulers) { +) : BasePresenter(completedLessonsErrorHandler, studentRepository) { private var baseDate: LocalDate = now().nextOrSameSchoolDay diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt index 28eef06e2..3bac1dac8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt @@ -8,18 +8,16 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getStudentWidgetKey import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getThemeWidgetKey -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject class TimetableWidgetConfigurePresenter @Inject constructor( - schedulers: SchedulersProvider, errorHandler: ErrorHandler, studentRepository: StudentRepository, private val sharedPref: SharedPrefProvider -) : BasePresenter(errorHandler, studentRepository, schedulers) { +) : BasePresenter(errorHandler, studentRepository) { private var appWidgetId: Int? = null diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index 1ab6757a0..d238b240a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -12,7 +12,6 @@ import android.widget.AdapterView.INVALID_POSITION import android.widget.RemoteViews import android.widget.RemoteViewsService import io.github.wulkanowy.R -import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository @@ -22,14 +21,10 @@ import io.github.wulkanowy.data.repositories.timetable.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.utils.SchedulersProvider import io.github.wulkanowy.utils.getCompatColor +import io.github.wulkanowy.utils.toFirstResult import io.github.wulkanowy.utils.toFormattedString -import io.reactivex.Maybe -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.takeWhile -import kotlinx.coroutines.rx2.rxMaybe -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.runBlocking import timber.log.Timber import java.time.LocalDate @@ -39,7 +34,6 @@ class TimetableWidgetFactory( private val semesterRepository: SemesterRepository, private val prefRepository: PreferencesRepository, private val sharedPref: SharedPrefProvider, - private val schedulers: SchedulersProvider, private val context: Context, private val intent: Intent? ) : RemoteViewsService.RemoteViewsFactory { @@ -74,7 +68,7 @@ class TimetableWidgetFactory( val studentId = sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0) updateTheme(appWidgetId) - updateLessons(date, studentId) + lessons = getLessons(date, studentId) } } @@ -103,30 +97,23 @@ class TimetableWidgetFactory( } } - private fun updateLessons(date: LocalDate, studentId: Long) { - lessons = try { - rxSingle { studentRepository.isStudentSaved() } - .filter { true } - .flatMap { rxMaybe { studentRepository.getSavedStudents() } } - .flatMap { - val student = it.singleOrNull { student -> student.id == studentId } + private fun getLessons(date: LocalDate, studentId: Long) = try { + runBlocking { + if (!studentRepository.isStudentSaved()) return@runBlocking emptyList() - if (student != null) Maybe.just(student) - else Maybe.empty() - } - .flatMap { student -> - rxMaybe { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> - rxMaybe { timetableRepository.getTimetable(student, semester, date, date, true).takeWhile { it.status == Status.LOADING }.first().data } - } - } - .map { items -> items.sortedWith(compareBy({ it.number }, { !it.isStudentPlan })) } - .map { lessons -> lessons.filter { if (prefRepository.showWholeClassPlan == "no") it.isStudentPlan else true } } - .subscribeOn(schedulers.backgroundThread) - .blockingGet(emptyList()) - } catch (e: Exception) { - Timber.e(e, "An error has occurred in timetable widget factory") - emptyList() + val students = studentRepository.getSavedStudents() + val student = students.singleOrNull { student -> student.id == studentId } + ?: return@runBlocking emptyList() + + val semester = semesterRepository.getCurrentSemester(student) + timetableRepository.getTimetable(student, semester, date, date, false) + .toFirstResult().data.orEmpty() + .sortedWith(compareBy({ it.number }, { !it.isStudentPlan })) + .filter { if (prefRepository.showWholeClassPlan == "no") it.isStudentPlan else true } } + } catch (e: Exception) { + Timber.e(e, "An error has occurred in timetable widget factory") + emptyList() } @SuppressLint("DefaultLocale") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 4c4cc868d..426f6cdd7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -25,14 +25,12 @@ import io.github.wulkanowy.services.widgets.TimetableWidgetService import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString -import io.reactivex.Maybe -import kotlinx.coroutines.rx2.rxMaybe -import kotlinx.coroutines.rx2.rxSingle +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import timber.log.Timber import java.time.LocalDate import java.time.LocalDate.now @@ -49,9 +47,6 @@ class TimetableWidgetProvider : BroadcastReceiver() { @Inject lateinit var sharedPref: SharedPrefProvider - @Inject - lateinit var schedulers: SchedulersProvider - @Inject lateinit var analytics: FirebaseAnalyticsHelper @@ -80,13 +75,15 @@ class TimetableWidgetProvider : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { AndroidInjection.inject(this, context) - when (intent.action) { - ACTION_APPWIDGET_UPDATE -> onUpdate(context, intent) - ACTION_APPWIDGET_DELETED -> onDelete(intent) + GlobalScope.launch { + when (intent.action) { + ACTION_APPWIDGET_UPDATE -> onUpdate(context, intent) + ACTION_APPWIDGET_DELETED -> onDelete(intent) + } } } - private fun onUpdate(context: Context, intent: Intent) { + private suspend fun onUpdate(context: Context, intent: Intent) { if (intent.getStringExtra(EXTRA_BUTTON_TYPE) === null) { intent.getIntArrayExtra(EXTRA_APPWIDGET_IDS)?.forEach { appWidgetId -> val student = getStudent(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId) @@ -170,8 +167,9 @@ class TimetableWidgetProvider : BroadcastReceiver() { } with(appWidgetManager) { - notifyAppWidgetViewDataChanged(appWidgetId, R.id.timetableWidgetList) updateAppWidget(appWidgetId, remoteView) + notifyAppWidgetViewDataChanged(appWidgetId, R.id.timetableWidgetList) + Timber.d("TimetableWidgetProvider updated") } } @@ -184,31 +182,22 @@ class TimetableWidgetProvider : BroadcastReceiver() { }, FLAG_UPDATE_CURRENT) } - private fun getStudent(studentId: Long, appWidgetId: Int): Student? { - return try { - rxSingle { studentRepository.isStudentSaved() } - .filter { true } - .flatMap { rxMaybe { studentRepository.getSavedStudents(false) } } - .flatMap { students -> - val student = students.singleOrNull { student -> student.id == studentId } - when { - student != null -> Maybe.just(student) - studentId != 0L -> { - rxSingle { studentRepository.isCurrentStudentSet() } - .filter { true } - .flatMap { rxMaybe { studentRepository.getCurrentStudent(false) } } - .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } - } - else -> Maybe.empty() - } + private suspend fun getStudent(studentId: Long, appWidgetId: Int) = try { + val students = studentRepository.getSavedStudents(false) + val student = students.singleOrNull { student -> student.id == studentId } + when { + student != null -> student + studentId != 0L && studentRepository.isCurrentStudentSet() -> { + studentRepository.getCurrentStudent(false).also { + sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } - .subscribeOn(schedulers.backgroundThread) - .blockingGet() - } catch (e: Exception) { - if (e.cause !is NoCurrentStudentException) { - Timber.e(e, "An error has occurred in timetable widget provider") } - null + else -> null } + } catch (e: Exception) { + if (e.cause !is NoCurrentStudentException) { + Timber.e(e, "An error has occurred in timetable widget provider") + } + null } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt index 6551606ba..736a42709 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt @@ -5,10 +5,12 @@ import io.github.wulkanowy.data.Status import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.takeWhile inline fun networkBoundResource( showSavedOnLoading: Boolean = true, @@ -91,3 +93,7 @@ fun flowWithResourceIn(block: suspend () -> Flow>) = flow { fun Flow>.afterLoading(callback: () -> Unit) = onEach { if (it.status != Status.LOADING) callback() } + +suspend fun Flow>.toFirstResult() = filter { it.status != Status.LOADING }.first() + +suspend fun Flow>.waitForResult() = takeWhile { it.status == Status.LOADING }.collect() diff --git a/app/src/main/java/io/github/wulkanowy/utils/SchedulersProvider.kt b/app/src/main/java/io/github/wulkanowy/utils/SchedulersProvider.kt deleted file mode 100644 index e426d4d5d..000000000 --- a/app/src/main/java/io/github/wulkanowy/utils/SchedulersProvider.kt +++ /dev/null @@ -1,14 +0,0 @@ -package io.github.wulkanowy.utils - -import io.reactivex.Scheduler -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.schedulers.Schedulers - -open class SchedulersProvider { - - open val mainThread: Scheduler - get() = AndroidSchedulers.mainThread() - - open val backgroundThread: Scheduler - get() = Schedulers.io() -} diff --git a/app/src/test/java/io/github/wulkanowy/TestSchedulersProvider.kt b/app/src/test/java/io/github/wulkanowy/TestSchedulersProvider.kt deleted file mode 100644 index 8c52d7b37..000000000 --- a/app/src/test/java/io/github/wulkanowy/TestSchedulersProvider.kt +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.wulkanowy - -import io.github.wulkanowy.utils.SchedulersProvider -import io.reactivex.Scheduler -import io.reactivex.schedulers.Schedulers - -class TestSchedulersProvider : SchedulersProvider() { - - override val backgroundThread: Scheduler - get() = Schedulers.trampoline() - - override val mainThread: Scheduler - get() = Schedulers.trampoline() -} - diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt index 921b32eda..4f32cf7eb 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.login -import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.repositories.student.StudentRepository import io.mockk.MockKAnnotations import io.mockk.clearMocks @@ -29,7 +28,7 @@ class LoginPresenterTest { MockKAnnotations.init(this) clearMocks(loginView) - presenter = LoginPresenter(TestSchedulersProvider(), errorHandler, studentRepository) + presenter = LoginPresenter(errorHandler, studentRepository) presenter.onAttachView(loginView) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt index 32c6a74e5..d6f58ef83 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.ui.modules.login.form import io.github.wulkanowy.MainCoroutineRule -import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.modules.login.LoginErrorHandler @@ -52,7 +51,7 @@ class LoginFormPresenterTest { every { loginFormView.setErrorPassRequired(any()) } just Runs every { loginFormView.setErrorUsernameRequired() } just Runs - presenter = LoginFormPresenter(TestSchedulersProvider(), repository, errorHandler, analytics) + presenter = LoginFormPresenter(repository, errorHandler, analytics) presenter.onAttachView(loginFormView) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index 8176fc2e6..46ae8a613 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.ui.modules.login.studentselect import io.github.wulkanowy.MainCoroutineRule -import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.modules.login.LoginErrorHandler @@ -53,7 +52,7 @@ class LoginStudentSelectPresenterTest { every { loginStudentSelectView.showProgress(any()) } just Runs every { loginStudentSelectView.showContent(any()) } just Runs - presenter = LoginStudentSelectPresenter(TestSchedulersProvider(), studentRepository, errorHandler, analytics) + presenter = LoginStudentSelectPresenter(studentRepository, errorHandler, analytics) presenter.onAttachView(loginStudentSelectView, null) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt index 5b0408c35..fc2832b2e 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.main -import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.services.sync.SyncManager @@ -48,7 +47,7 @@ class MainPresenterTest { every { mainView.startMenuIndex } returns 1 every { mainView.startMenuMoreIndex } returns 1 every { mainView.initView() } just Runs - presenter = MainPresenter(TestSchedulersProvider(), errorHandler, studentRepository, prefRepository, syncManager, analytics) + presenter = MainPresenter(errorHandler, studentRepository, prefRepository, syncManager, analytics) presenter.onAttachView(mainView, null) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt index eb4ac6386..a81f1abd9 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.ui.modules.splash import io.github.wulkanowy.MainCoroutineRule -import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.ErrorHandler import io.mockk.MockKAnnotations @@ -31,7 +30,7 @@ class SplashPresenterTest { @Before fun setUp() { MockKAnnotations.init(this) - presenter = SplashPresenter(TestSchedulersProvider(), errorHandler, studentRepository) + presenter = SplashPresenter(errorHandler, studentRepository) } @Test From 3ba16f2903dd376ac2eea670b6792387ed5f1296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 2 Aug 2020 18:29:41 +0200 Subject: [PATCH 0106/1526] Migrate to dagger hilt (#909) --- app/build.gradle | 19 ++- .../java/io/github/wulkanowy/WulkanowyApp.kt | 16 +- .../github/wulkanowy/data/RepositoryModule.kt | 16 +- .../repositories/logger/LoggerRepository.kt | 3 +- .../preferences/PreferencesRepository.kt | 3 +- .../data/repositories/student/StudentLocal.kt | 3 +- .../io/github/wulkanowy/di/AppComponent.kt | 22 --- .../java/io/github/wulkanowy/di/AppModule.kt | 16 +- .../io/github/wulkanowy/di/BindingModule.kt | 55 ------- .../github/wulkanowy/di/scopes/PerActivity.kt | 7 - .../wulkanowy/di/scopes/PerChildFragment.kt | 7 - .../github/wulkanowy/di/scopes/PerFragment.kt | 7 - .../services/HiltBroadcastReceiver.kt | 9 ++ .../wulkanowy/services/ServicesModule.kt | 19 +-- .../alarm/TimetableNotificationReceiver.kt | 9 +- .../TimetableNotificationSchedulerHelper.kt | 3 +- .../wulkanowy/services/sync/SyncWorker.kt | 13 +- .../services/sync/SyncWorkerFactory.kt | 20 --- .../services/sync/channels/DebugChannel.kt | 3 +- .../sync/channels/LuckyNumberChannel.kt | 3 +- .../sync/channels/NewGradesChannel.kt | 3 +- .../sync/channels/NewMessagesChannel.kt | 3 +- .../services/sync/channels/NewNotesChannel.kt | 3 +- .../services/sync/channels/PushChannel.kt | 3 +- .../sync/channels/UpcomingLessonsChannel.kt | 3 +- .../services/sync/works/GradeWork.kt | 3 +- .../services/sync/works/LuckyNumberWork.kt | 3 +- .../services/sync/works/MessageWork.kt | 3 +- .../wulkanowy/services/sync/works/NoteWork.kt | 3 +- .../widgets/TimetableWidgetService.kt | 4 +- .../github/wulkanowy/ui/base/BaseActivity.kt | 13 +- .../wulkanowy/ui/base/BaseDialogFragment.kt | 4 +- .../github/wulkanowy/ui/base/BaseFragment.kt | 4 +- .../github/wulkanowy/ui/base/ErrorDialog.kt | 2 + .../ui/modules/about/AboutFragment.kt | 2 + .../about/contributor/ContributorFragment.kt | 2 + .../modules/about/license/LicenseFragment.kt | 8 +- .../ui/modules/about/license/LicenseModule.kt | 15 -- .../about/logviewer/LogViewerFragment.kt | 2 + .../ui/modules/account/AccountDialog.kt | 2 + .../modules/attendance/AttendanceFragment.kt | 2 + .../summary/AttendanceSummaryFragment.kt | 2 + .../wulkanowy/ui/modules/exam/ExamFragment.kt | 2 + .../ui/modules/grade/GradeFragment.kt | 8 +- .../wulkanowy/ui/modules/grade/GradeModule.kt | 35 ----- .../grade/details/GradeDetailsFragment.kt | 2 + .../statistics/GradeStatisticsFragment.kt | 2 + .../grade/summary/GradeSummaryFragment.kt | 2 + .../ui/modules/homework/HomeworkFragment.kt | 2 + .../homework/details/HomeworkDetailsDialog.kt | 2 + .../ui/modules/login/LoginActivity.kt | 5 +- .../wulkanowy/ui/modules/login/LoginModule.kt | 45 ------ .../login/advanced/LoginAdvancedFragment.kt | 2 + .../modules/login/form/LoginFormFragment.kt | 2 + .../login/recover/LoginRecoverFragment.kt | 2 + .../LoginStudentSelectFragment.kt | 2 + .../login/symbol/LoginSymbolFragment.kt | 2 + .../luckynumber/LuckyNumberFragment.kt | 2 + .../LuckyNumberWidgetConfigureActivity.kt | 2 + .../LuckyNumberWidgetProvider.kt | 9 +- .../wulkanowy/ui/modules/main/MainActivity.kt | 15 +- .../wulkanowy/ui/modules/main/MainModule.kt | 139 ------------------ .../ui/modules/message/MessageFragment.kt | 5 +- .../ui/modules/message/MessageModule.kt | 25 ---- .../message/preview/MessagePreviewFragment.kt | 2 + .../message/send/SendMessageActivity.kt | 4 +- .../modules/message/tab/MessageTabFragment.kt | 2 + .../mobiledevice/MobileDeviceFragment.kt | 2 + .../token/MobileDeviceTokenDialog.kt | 2 + .../wulkanowy/ui/modules/more/MoreFragment.kt | 2 + .../wulkanowy/ui/modules/note/NoteFragment.kt | 2 + .../SchoolAndTeachersFragment.kt | 5 +- .../SchoolAndTeachersModule.kt | 30 ---- .../school/SchoolFragment.kt | 2 + .../teacher/TeacherFragment.kt | 2 + .../ui/modules/settings/SettingsFragment.kt | 4 +- .../ui/modules/splash/SplashActivity.kt | 2 + .../ui/modules/timetable/TimetableFragment.kt | 2 + .../completed/CompletedLessonsFragment.kt | 2 + .../TimetableWidgetConfigureActivity.kt | 4 +- .../TimetableWidgetProvider.kt | 9 +- .../java/io/github/wulkanowy/utils/AppInfo.kt | 3 +- .../utils/FirebaseAnalyticsHelper.kt | 5 +- build.gradle | 10 +- 84 files changed, 208 insertions(+), 542 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/di/AppComponent.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/di/BindingModule.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/di/scopes/PerActivity.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/di/scopes/PerChildFragment.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/di/scopes/PerFragment.kt create mode 100644 app/src/main/java/io/github/wulkanowy/services/HiltBroadcastReceiver.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/services/sync/SyncWorkerFactory.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseModule.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeModule.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginModule.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/main/MainModule.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageModule.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersModule.kt diff --git a/app/build.gradle b/app/build.gradle index fe316e863..e0a7551c6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' +apply plugin: 'dagger.hilt.android.plugin' apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'com.github.triplet.play' apply plugin: 'com.mikepenz.aboutlibraries.plugin' @@ -28,7 +29,7 @@ android { ] javaCompileOptions { annotationProcessorOptions { - arguments = [ + arguments += [ "room.schemaLocation": "$projectDir/schemas".toString(), "room.incremental" : "true" ] @@ -114,9 +115,8 @@ play { } ext { - work_manager = "2.3.4" + work_manager = "2.4.0" room = "2.2.5" - dagger = "2.28.3" chucker = "3.2.0" mockk = "1.10.0" } @@ -128,13 +128,13 @@ configurations.all { dependencies { implementation "io.github.wulkanowy:sdk:02486b9" - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.8' - implementation "androidx.core:core-ktx:1.3.0" + implementation "androidx.core:core-ktx:1.3.1" implementation "androidx.activity:activity-ktx:1.1.0" implementation "androidx.appcompat:appcompat:1.2.0-rc02" implementation "androidx.appcompat:appcompat-resources:1.1.0" @@ -162,11 +162,10 @@ dependencies { implementation "androidx.room:room-ktx:$room" kapt "androidx.room:room-compiler:$room" - implementation "com.google.dagger:dagger-android-support:$dagger" - kapt "com.google.dagger:dagger-compiler:$dagger" - kapt "com.google.dagger:dagger-android-processor:$dagger" - implementation "com.squareup.inject:assisted-inject-annotations-dagger2:0.5.2" - kapt "com.squareup.inject:assisted-inject-processor-dagger2:0.5.2" + implementation "com.google.dagger:hilt-android:$hilt_version" + kapt "com.google.dagger:hilt-android-compiler:$hilt_version" + implementation 'androidx.hilt:hilt-work:1.0.0-alpha02' + kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02' implementation "com.aurelhubert:ahbottomnavigation:2.3.4" implementation "com.ncapdevi:frag-nav:3.3.0" diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index 9b1944c3f..649958582 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -1,17 +1,16 @@ package io.github.wulkanowy +import android.app.Application import android.content.Context import android.util.Log.DEBUG import android.util.Log.INFO import android.util.Log.VERBOSE +import androidx.hilt.work.HiltWorkerFactory import androidx.multidex.MultiDex import androidx.work.Configuration import com.yariksoffice.lingver.Lingver -import dagger.android.AndroidInjector -import dagger.android.support.DaggerApplication +import dagger.hilt.android.HiltAndroidApp import fr.bipi.tressence.file.FileLoggerTree -import io.github.wulkanowy.di.DaggerAppComponent -import io.github.wulkanowy.services.sync.SyncWorkerFactory import io.github.wulkanowy.ui.base.ThemeManager import io.github.wulkanowy.utils.ActivityLifecycleLogger import io.github.wulkanowy.utils.AppInfo @@ -21,10 +20,11 @@ import io.github.wulkanowy.utils.DebugLogTree import timber.log.Timber import javax.inject.Inject -class WulkanowyApp : DaggerApplication(), Configuration.Provider { +@HiltAndroidApp +class WulkanowyApp : Application(), Configuration.Provider { @Inject - lateinit var workerFactory: SyncWorkerFactory + lateinit var workerFactory: HiltWorkerFactory @Inject lateinit var themeManager: ThemeManager @@ -62,10 +62,6 @@ class WulkanowyApp : DaggerApplication(), Configuration.Provider { registerActivityLifecycleCallbacks(ActivityLifecycleLogger()) } - override fun applicationInjector(): AndroidInjector { - return DaggerAppComponent.factory().create(this) - } - override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .setMinimumLoggingLevel(if (appInfo.isDebug) VERBOSE else INFO) diff --git a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt index 6ece2d978..3370d0ac3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt @@ -10,6 +10,9 @@ import com.chuckerteam.chucker.api.ChuckerInterceptor import com.chuckerteam.chucker.api.RetentionManager import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository @@ -18,11 +21,12 @@ import timber.log.Timber import javax.inject.Singleton @Module +@InstallIn(ApplicationComponent::class) internal class RepositoryModule { @Singleton @Provides - fun provideSdk(chuckerCollector: ChuckerCollector, context: Context): Sdk { + fun provideSdk(chuckerCollector: ChuckerCollector, @ApplicationContext context: Context): Sdk { return Sdk().apply { androidVersion = android.os.Build.VERSION.RELEASE buildTag = android.os.Build.MODEL @@ -35,7 +39,7 @@ internal class RepositoryModule { @Singleton @Provides - fun provideChuckerCollector(context: Context, prefRepository: PreferencesRepository): ChuckerCollector { + fun provideChuckerCollector(@ApplicationContext context: Context, prefRepository: PreferencesRepository): ChuckerCollector { return ChuckerCollector( context = context, showNotification = prefRepository.isDebugNotificationEnable, @@ -45,19 +49,19 @@ internal class RepositoryModule { @Singleton @Provides - fun provideDatabase(context: Context, sharedPrefProvider: SharedPrefProvider) = AppDatabase.newInstance(context, sharedPrefProvider) + fun provideDatabase(@ApplicationContext context: Context, sharedPrefProvider: SharedPrefProvider) = AppDatabase.newInstance(context, sharedPrefProvider) @Singleton @Provides - fun provideResources(context: Context): Resources = context.resources + fun provideResources(@ApplicationContext context: Context): Resources = context.resources @Singleton @Provides - fun provideAssets(context: Context): AssetManager = context.assets + fun provideAssets(@ApplicationContext context: Context): AssetManager = context.assets @Singleton @Provides - fun provideSharedPref(context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + fun provideSharedPref(@ApplicationContext context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) @Singleton @Provides diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt index e50955e2c..85168fee5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.repositories.logger import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.utils.DispatchersProvider import kotlinx.coroutines.withContext import java.io.File @@ -8,7 +9,7 @@ import java.io.FileNotFoundException import javax.inject.Inject class LoggerRepository @Inject constructor( - private val context: Context, + @ApplicationContext private val context: Context, private val dispatchers: DispatchersProvider ) { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index 7715cde0d..1d5e57f8a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -2,6 +2,7 @@ package io.github.wulkanowy.data.repositories.preferences import android.content.Context import android.content.SharedPreferences +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.grade.GradeAverageMode import javax.inject.Inject @@ -10,7 +11,7 @@ import javax.inject.Singleton @Singleton class PreferencesRepository @Inject constructor( private val sharedPref: SharedPreferences, - val context: Context + @ApplicationContext val context: Context ) { val startMenuIndex: Int get() = getString(R.string.pref_key_start_menu, R.string.pref_default_startup).toInt() diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt index 3a964aae5..5aff8f869 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.repositories.student import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.db.dao.StudentDao import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk @@ -15,7 +16,7 @@ import javax.inject.Singleton class StudentLocal @Inject constructor( private val studentDb: StudentDao, private val dispatchers: DispatchersProvider, - private val context: Context + @ApplicationContext private val context: Context ) { suspend fun saveStudents(students: List) = withContext(dispatchers.backgroundThread) { diff --git a/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt b/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt deleted file mode 100644 index c0329f7d7..000000000 --- a/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt +++ /dev/null @@ -1,22 +0,0 @@ -package io.github.wulkanowy.di - -import dagger.Component -import dagger.android.AndroidInjector -import dagger.android.support.AndroidSupportInjectionModule -import io.github.wulkanowy.WulkanowyApp -import io.github.wulkanowy.data.RepositoryModule -import io.github.wulkanowy.services.ServicesModule -import javax.inject.Singleton - -@Singleton -@Component(modules = [ - AndroidSupportInjectionModule::class, - AppModule::class, - RepositoryModule::class, - ServicesModule::class, - BindingModule::class]) -interface AppComponent : AndroidInjector { - - @Component.Factory - interface Factory : AndroidInjector.Factory -} diff --git a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt index d791f0a35..9133c34ed 100644 --- a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt @@ -5,29 +5,23 @@ import android.content.Context import com.yariksoffice.lingver.Lingver import dagger.Module import dagger.Provides -import io.github.wulkanowy.WulkanowyApp -import io.github.wulkanowy.utils.AppInfo +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.utils.DispatchersProvider import javax.inject.Singleton @Module +@InstallIn(ApplicationComponent::class) internal class AppModule { - @Singleton - @Provides - fun provideContext(app: WulkanowyApp): Context = app - @Singleton @Provides fun provideDispatchersProvider() = DispatchersProvider() @Singleton @Provides - fun provideAppWidgetManager(context: Context): AppWidgetManager = AppWidgetManager.getInstance(context) - - @Singleton - @Provides - fun provideAppInfo() = AppInfo() + fun provideAppWidgetManager(@ApplicationContext context: Context): AppWidgetManager = AppWidgetManager.getInstance(context) @Singleton @Provides diff --git a/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt b/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt deleted file mode 100644 index 246e8c706..000000000 --- a/app/src/main/java/io/github/wulkanowy/di/BindingModule.kt +++ /dev/null @@ -1,55 +0,0 @@ -package io.github.wulkanowy.di - -import dagger.Module -import dagger.android.ContributesAndroidInjector -import io.github.wulkanowy.di.scopes.PerActivity -import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver -import io.github.wulkanowy.ui.base.ErrorDialog -import io.github.wulkanowy.ui.modules.login.LoginActivity -import io.github.wulkanowy.ui.modules.login.LoginModule -import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetConfigureActivity -import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider -import io.github.wulkanowy.ui.modules.main.MainActivity -import io.github.wulkanowy.ui.modules.main.MainModule -import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity -import io.github.wulkanowy.ui.modules.splash.SplashActivity -import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetConfigureActivity -import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider - -@Suppress("unused") -@Module -internal abstract class BindingModule { - - @ContributesAndroidInjector - abstract fun bindErrorDialog(): ErrorDialog - - @PerActivity - @ContributesAndroidInjector - abstract fun bindSplashActivity(): SplashActivity - - @PerActivity - @ContributesAndroidInjector(modules = [LoginModule::class]) - abstract fun bindLoginActivity(): LoginActivity - - @PerActivity - @ContributesAndroidInjector(modules = [MainModule::class]) - abstract fun bindMainActivity(): MainActivity - - @ContributesAndroidInjector - abstract fun bindMessageSendActivity(): SendMessageActivity - - @ContributesAndroidInjector - abstract fun bindTimetableWidgetAccountActivity(): TimetableWidgetConfigureActivity - - @ContributesAndroidInjector - abstract fun bindTimetableWidgetProvider(): TimetableWidgetProvider - - @ContributesAndroidInjector - abstract fun bindLuckyNumberWidgetAccountActivity(): LuckyNumberWidgetConfigureActivity - - @ContributesAndroidInjector - abstract fun bindLuckyNumberWidgetProvider(): LuckyNumberWidgetProvider - - @ContributesAndroidInjector - abstract fun bindTimetableNotificationReceiver(): TimetableNotificationReceiver -} diff --git a/app/src/main/java/io/github/wulkanowy/di/scopes/PerActivity.kt b/app/src/main/java/io/github/wulkanowy/di/scopes/PerActivity.kt deleted file mode 100644 index c1b4352a4..000000000 --- a/app/src/main/java/io/github/wulkanowy/di/scopes/PerActivity.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.github.wulkanowy.di.scopes - -import javax.inject.Scope - -@Scope -@Retention(AnnotationRetention.RUNTIME) -annotation class PerActivity diff --git a/app/src/main/java/io/github/wulkanowy/di/scopes/PerChildFragment.kt b/app/src/main/java/io/github/wulkanowy/di/scopes/PerChildFragment.kt deleted file mode 100644 index 08884dac5..000000000 --- a/app/src/main/java/io/github/wulkanowy/di/scopes/PerChildFragment.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.github.wulkanowy.di.scopes - -import javax.inject.Scope - -@Scope -@Retention(AnnotationRetention.RUNTIME) -annotation class PerChildFragment diff --git a/app/src/main/java/io/github/wulkanowy/di/scopes/PerFragment.kt b/app/src/main/java/io/github/wulkanowy/di/scopes/PerFragment.kt deleted file mode 100644 index 1203d7d88..000000000 --- a/app/src/main/java/io/github/wulkanowy/di/scopes/PerFragment.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.github.wulkanowy.di.scopes - -import javax.inject.Scope - -@Scope -@Retention(AnnotationRetention.RUNTIME) -annotation class PerFragment diff --git a/app/src/main/java/io/github/wulkanowy/services/HiltBroadcastReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/HiltBroadcastReceiver.kt new file mode 100644 index 000000000..1e795d439 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/HiltBroadcastReceiver.kt @@ -0,0 +1,9 @@ +package io.github.wulkanowy.services + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent + +abstract class HiltBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) {} +} diff --git a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt index facba9cb1..ac5a84e8f 100644 --- a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt +++ b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt @@ -5,11 +5,12 @@ import android.content.Context import androidx.core.app.NotificationManagerCompat import androidx.core.content.getSystemService import androidx.work.WorkManager -import com.squareup.inject.assisted.dagger2.AssistedModule import dagger.Binds import dagger.Module import dagger.Provides -import dagger.android.ContributesAndroidInjector +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.android.qualifiers.ApplicationContext import dagger.multibindings.IntoSet import io.github.wulkanowy.services.sync.channels.Channel import io.github.wulkanowy.services.sync.channels.DebugChannel @@ -33,31 +34,27 @@ import io.github.wulkanowy.services.sync.works.RecipientWork import io.github.wulkanowy.services.sync.works.TeacherWork import io.github.wulkanowy.services.sync.works.TimetableWork import io.github.wulkanowy.services.sync.works.Work -import io.github.wulkanowy.services.widgets.TimetableWidgetService import javax.inject.Singleton @Suppress("unused") -@AssistedModule -@Module(includes = [AssistedInject_ServicesModule::class]) +@Module +@InstallIn(ApplicationComponent::class) abstract class ServicesModule { companion object { @Provides - fun provideWorkManager(context: Context) = WorkManager.getInstance(context) + fun provideWorkManager(@ApplicationContext context: Context) = WorkManager.getInstance(context) @Singleton @Provides - fun provideNotificationManager(context: Context) = NotificationManagerCompat.from(context) + fun provideNotificationManager(@ApplicationContext context: Context) = NotificationManagerCompat.from(context) @Singleton @Provides - fun provideAlarmManager(context: Context): AlarmManager = context.getSystemService()!! + fun provideAlarmManager(@ApplicationContext context: Context): AlarmManager = context.getSystemService()!! } - @ContributesAndroidInjector - abstract fun bindTimetableWidgetService(): TimetableWidgetService - @Binds @IntoSet abstract fun provideGradeWork(work: GradeWork): Work diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt index 1e68685f7..592d0919e 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt @@ -3,17 +3,17 @@ package io.github.wulkanowy.services.alarm import android.annotation.SuppressLint import android.app.PendingIntent import android.app.PendingIntent.FLAG_UPDATE_CURRENT -import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.os.Build import android.os.Build.VERSION_CODES.N import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat -import dagger.android.AndroidInjection +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.student.StudentRepository +import io.github.wulkanowy.services.HiltBroadcastReceiver import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel.Companion.CHANNEL_ID import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView @@ -26,7 +26,8 @@ import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject -class TimetableNotificationReceiver : BroadcastReceiver() { +@AndroidEntryPoint +class TimetableNotificationReceiver : HiltBroadcastReceiver() { @Inject lateinit var studentRepository: StudentRepository @@ -51,8 +52,8 @@ class TimetableNotificationReceiver : BroadcastReceiver() { @SuppressLint("CheckResult") override fun onReceive(context: Context, intent: Intent) { + super.onReceive(context, intent) Timber.d("Receiving intent... ${intent.toUri(0)}") - AndroidInjection.inject(this, context) flowWithResource { val student = studentRepository.getCurrentStudent(false) diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt index 9922a2753..8f8782a2f 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt @@ -8,6 +8,7 @@ import android.content.Context import android.content.Intent import androidx.core.app.AlarmManagerCompat import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository @@ -32,7 +33,7 @@ import java.time.LocalDateTime.now import javax.inject.Inject class TimetableNotificationSchedulerHelper @Inject constructor( - private val context: Context, + @ApplicationContext private val context: Context, private val alarmManager: AlarmManager, private val preferencesRepository: PreferencesRepository ) { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt index 75711f0eb..2ba0435b4 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt @@ -5,12 +5,11 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat.BigTextStyle import androidx.core.app.NotificationCompat.PRIORITY_DEFAULT import androidx.core.app.NotificationManagerCompat +import androidx.hilt.Assisted +import androidx.hilt.work.WorkerInject import androidx.work.CoroutineWorker import androidx.work.Data -import androidx.work.ListenableWorker import androidx.work.WorkerParameters -import com.squareup.inject.assisted.Assisted -import com.squareup.inject.assisted.AssistedInject import io.github.wulkanowy.R import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -24,7 +23,7 @@ import kotlinx.coroutines.coroutineScope import timber.log.Timber import kotlin.random.Random -class SyncWorker @AssistedInject constructor( +class SyncWorker @WorkerInject constructor( @Assisted appContext: Context, @Assisted workerParameters: WorkerParameters, private val studentRepository: StudentRepository, @@ -81,10 +80,4 @@ class SyncWorker @AssistedInject constructor( .setPriority(PRIORITY_DEFAULT) .build()) } - - @AssistedInject.Factory - interface Factory { - - fun create(appContext: Context, workerParameters: WorkerParameters): ListenableWorker - } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorkerFactory.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorkerFactory.kt deleted file mode 100644 index aadfc27f4..000000000 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorkerFactory.kt +++ /dev/null @@ -1,20 +0,0 @@ -package io.github.wulkanowy.services.sync - -import android.content.Context -import androidx.work.ListenableWorker -import androidx.work.WorkerFactory -import androidx.work.WorkerParameters -import timber.log.Timber -import javax.inject.Inject - -class SyncWorkerFactory @Inject constructor(private val syncWorkerFactory: SyncWorker.Factory) : WorkerFactory() { - - override fun createWorker(appContext: Context, workerClassName: String, workerParameters: WorkerParameters): ListenableWorker? { - return if (workerClassName == SyncWorker::class.java.name) { - syncWorkerFactory.create(appContext, workerParameters) - } else { - Timber.e(IllegalArgumentException("Unknown worker class name: $workerClassName")) - null - } - } -} diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt index a67350550..2c7565195 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt @@ -6,6 +6,7 @@ import android.app.NotificationChannel import android.app.NotificationManager.IMPORTANCE_DEFAULT import android.content.Context import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.utils.AppInfo import javax.inject.Inject @@ -13,7 +14,7 @@ import javax.inject.Inject @TargetApi(26) class DebugChannel @Inject constructor( private val notificationManager: NotificationManagerCompat, - private val context: Context, + @ApplicationContext private val context: Context, private val appInfo: AppInfo ) : Channel { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/LuckyNumberChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/LuckyNumberChannel.kt index ae228edd7..8025bd76c 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/LuckyNumberChannel.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/LuckyNumberChannel.kt @@ -6,13 +6,14 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import javax.inject.Inject @TargetApi(26) class LuckyNumberChannel @Inject constructor( private val notificationManager: NotificationManagerCompat, - private val context: Context + @ApplicationContext private val context: Context ) : Channel { companion object { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewGradesChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewGradesChannel.kt index 7d6f275d9..5d5727d35 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewGradesChannel.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewGradesChannel.kt @@ -6,13 +6,14 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import javax.inject.Inject @TargetApi(26) class NewGradesChannel @Inject constructor( private val notificationManager: NotificationManagerCompat, - private val context: Context + @ApplicationContext private val context: Context ) : Channel { companion object { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewMessagesChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewMessagesChannel.kt index 49f39c6be..962fbfa24 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewMessagesChannel.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewMessagesChannel.kt @@ -6,13 +6,14 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import javax.inject.Inject @TargetApi(26) class NewMessagesChannel @Inject constructor( private val notificationManager: NotificationManagerCompat, - private val context: Context + @ApplicationContext private val context: Context ) : Channel { companion object { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewNotesChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewNotesChannel.kt index d80d43dc5..c6e79b393 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewNotesChannel.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewNotesChannel.kt @@ -6,13 +6,14 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import javax.inject.Inject @TargetApi(26) class NewNotesChannel @Inject constructor( private val notificationManager: NotificationManagerCompat, - private val context: Context + @ApplicationContext private val context: Context ) : Channel { companion object { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/PushChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/PushChannel.kt index a0e24ab45..1d7376b92 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/PushChannel.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/PushChannel.kt @@ -6,13 +6,14 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import javax.inject.Inject @TargetApi(26) class PushChannel @Inject constructor( private val notificationManager: NotificationManagerCompat, - private val context: Context + @ApplicationContext private val context: Context ) : Channel { companion object { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt index a292c8b53..cd25eea67 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt @@ -6,13 +6,14 @@ import android.app.NotificationChannel import android.app.NotificationManager.IMPORTANCE_DEFAULT import android.content.Context import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import javax.inject.Inject @TargetApi(26) class UpcomingLessonsChannel @Inject constructor( private val notificationManager: NotificationManagerCompat, - private val context: Context + @ApplicationContext private val context: Context ) : Channel { companion object { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt index 9d4df201d..00bce109e 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt @@ -7,6 +7,7 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat.DEFAULT_ALL import androidx.core.app.NotificationCompat.PRIORITY_HIGH import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary @@ -24,7 +25,7 @@ import javax.inject.Inject import kotlin.random.Random class GradeWork @Inject constructor( - private val context: Context, + @ApplicationContext private val context: Context, private val notificationManager: NotificationManagerCompat, private val gradeRepository: GradeRepository, private val preferencesRepository: PreferencesRepository diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt index 0024d9038..9cb765ec4 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt @@ -7,6 +7,7 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat.DEFAULT_ALL import androidx.core.app.NotificationCompat.PRIORITY_HIGH import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Semester @@ -23,7 +24,7 @@ import javax.inject.Inject import kotlin.random.Random class LuckyNumberWork @Inject constructor( - private val context: Context, + @ApplicationContext private val context: Context, private val notificationManager: NotificationManagerCompat, private val luckyNumberRepository: LuckyNumberRepository, private val preferencesRepository: PreferencesRepository diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt index ba026a0e9..7b32f13bb 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt @@ -7,6 +7,7 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat.DEFAULT_ALL import androidx.core.app.NotificationCompat.PRIORITY_HIGH import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Semester @@ -24,7 +25,7 @@ import javax.inject.Inject import kotlin.random.Random class MessageWork @Inject constructor( - private val context: Context, + @ApplicationContext private val context: Context, private val notificationManager: NotificationManagerCompat, private val messageRepository: MessageRepository, private val preferencesRepository: PreferencesRepository diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt index 2cd9d549a..84b806795 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt @@ -7,6 +7,7 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat.DEFAULT_ALL import androidx.core.app.NotificationCompat.PRIORITY_HIGH import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.db.entities.Semester @@ -23,7 +24,7 @@ import javax.inject.Inject import kotlin.random.Random class NoteWork @Inject constructor( - private val context: Context, + @ApplicationContext private val context: Context, private val notificationManager: NotificationManagerCompat, private val noteRepository: NoteRepository, private val preferencesRepository: PreferencesRepository diff --git a/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt b/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt index a3b9da95e..42c6d3bfd 100644 --- a/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt +++ b/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt @@ -2,7 +2,7 @@ package io.github.wulkanowy.services.widgets import android.content.Intent import android.widget.RemoteViewsService -import dagger.android.AndroidInjection +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -12,6 +12,7 @@ import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetFactory import timber.log.Timber import javax.inject.Inject +@AndroidEntryPoint class TimetableWidgetService : RemoteViewsService() { @Inject @@ -30,7 +31,6 @@ class TimetableWidgetService : RemoteViewsService() { lateinit var sharedPref: SharedPrefProvider override fun onGetViewFactory(intent: Intent?): RemoteViewsFactory { - AndroidInjection.inject(this) Timber.d("TimetableWidgetFactory created") return TimetableWidgetFactory(timetableRepo, studentRepo, semesterRepo, prefRepository, sharedPref, applicationContext, intent) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index f20fb22f3..86b6701b3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -14,9 +14,6 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.viewbinding.ViewBinding import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG -import dagger.android.AndroidInjection -import dagger.android.DispatchingAndroidInjector -import dagger.android.HasAndroidInjector import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.utils.FragmentLifecycleLogger @@ -25,13 +22,10 @@ import io.github.wulkanowy.utils.lifecycleAwareVariable import javax.inject.Inject abstract class BaseActivity, VB : ViewBinding> : - AppCompatActivity(), BaseView, HasAndroidInjector { + AppCompatActivity(), BaseView { protected var binding: VB by lifecycleAwareVariable() - @Inject - lateinit var androidInjector: DispatchingAndroidInjector - @Inject lateinit var fragmentLifecycleLogger: FragmentLifecycleLogger @@ -42,8 +36,7 @@ abstract class BaseActivity, VB : ViewBinding> : abstract var presenter: T - public override fun onCreate(savedInstanceState: Bundle?) { - AndroidInjection.inject(this) + override fun onCreate(savedInstanceState: Bundle?) { themeManager.applyActivityTheme(this) super.onCreate(savedInstanceState) supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true) @@ -91,6 +84,4 @@ abstract class BaseActivity, VB : ViewBinding> : invalidateOptionsMenu() presenter.onDetachView() } - - override fun androidInjector() = androidInjector } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt index 0279dccf4..18cd58b41 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt @@ -1,11 +1,11 @@ package io.github.wulkanowy.ui.base import android.widget.Toast +import androidx.fragment.app.DialogFragment import androidx.viewbinding.ViewBinding -import dagger.android.support.DaggerAppCompatDialogFragment import io.github.wulkanowy.utils.lifecycleAwareVariable -abstract class BaseDialogFragment : DaggerAppCompatDialogFragment(), BaseView { +abstract class BaseDialogFragment : DialogFragment(), BaseView { protected var binding: VB by lifecycleAwareVariable() diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt index 83f787654..c6a2e1d1c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt @@ -2,14 +2,14 @@ package io.github.wulkanowy.ui.base import android.view.View import androidx.annotation.LayoutRes +import androidx.fragment.app.Fragment import androidx.viewbinding.ViewBinding import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG -import dagger.android.support.DaggerFragment import io.github.wulkanowy.R import io.github.wulkanowy.utils.lifecycleAwareVariable -abstract class BaseFragment(@LayoutRes layoutId: Int) : DaggerFragment(layoutId), +abstract class BaseFragment(@LayoutRes layoutId: Int) : Fragment(layoutId), BaseView { protected var binding: VB by lifecycleAwareVariable() diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt index 627e0a5f5..8d6739a15 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt @@ -11,6 +11,7 @@ import android.widget.Toast import android.widget.Toast.LENGTH_LONG import androidx.appcompat.app.AlertDialog import androidx.core.content.getSystemService +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.DialogErrorBinding import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException @@ -28,6 +29,7 @@ import java.net.SocketTimeoutException import java.net.UnknownHostException import javax.inject.Inject +@AndroidEntryPoint class ErrorDialog : BaseDialogFragment() { private lateinit var error: Throwable diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt index d85d01e9e..5ec1a66e3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt @@ -4,6 +4,7 @@ import android.graphics.drawable.Drawable import android.os.Bundle import android.view.View import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.FragmentAboutBinding import io.github.wulkanowy.ui.base.BaseFragment @@ -19,6 +20,7 @@ import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject +@AndroidEntryPoint class AboutFragment : BaseFragment(R.layout.fragment_about), AboutView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt index 42eebd347..5d7e076c7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorFragment.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.pojos.Contributor import io.github.wulkanowy.databinding.FragmentContributorBinding @@ -14,6 +15,7 @@ import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject +@AndroidEntryPoint class ContributorFragment : BaseFragment(R.layout.fragment_contributor), ContributorView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt index f6c3b5698..cdd29b41b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseFragment.kt @@ -9,13 +9,14 @@ import androidx.core.text.parseAsHtml import androidx.recyclerview.widget.LinearLayoutManager import com.mikepenz.aboutlibraries.Libs import com.mikepenz.aboutlibraries.entity.Library -import dagger.Lazy +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.FragmentLicenseBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainView import javax.inject.Inject +@AndroidEntryPoint class LicenseFragment : BaseFragment(R.layout.fragment_license), LicenseView, MainView.TitledView { @@ -25,14 +26,13 @@ class LicenseFragment : BaseFragment(R.layout.fragment_l @Inject lateinit var licenseAdapter: LicenseAdapter - @Inject - lateinit var libs: Lazy + private val libs by lazy { Libs(requireContext()) } override val titleStringId get() = R.string.license_title override val appLibraries: ArrayList? get() = context?.let { - libs.get().prepareLibraries(it, emptyArray(), emptyArray(), autoDetect = true, checkCachedDetection = true, sort = true) + libs.prepareLibraries(it, emptyArray(), emptyArray(), autoDetect = true, checkCachedDetection = true, sort = true) } companion object { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseModule.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseModule.kt deleted file mode 100644 index 0ffc3d90e..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicenseModule.kt +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.wulkanowy.ui.modules.about.license - -import android.content.Context -import com.mikepenz.aboutlibraries.Libs -import dagger.Module -import dagger.Provides -import io.github.wulkanowy.di.scopes.PerFragment - -@Module -class LicenseModule { - - @PerFragment - @Provides - fun provideLibs(context: Context) = Libs(context) -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerFragment.kt index 08f91aff1..cf40975e7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerFragment.kt @@ -14,6 +14,7 @@ import android.view.MenuItem import android.view.View import androidx.core.content.FileProvider import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.BuildConfig.APPLICATION_ID import io.github.wulkanowy.R import io.github.wulkanowy.databinding.FragmentLogviewerBinding @@ -22,6 +23,7 @@ import io.github.wulkanowy.ui.modules.main.MainView import java.io.File import javax.inject.Inject +@AndroidEntryPoint class LogViewerFragment : BaseFragment(R.layout.fragment_logviewer), LogViewerView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt index 320613745..1fa87268b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountDialog.kt @@ -8,12 +8,14 @@ import android.widget.Toast import android.widget.Toast.LENGTH_LONG import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.DialogAccountBinding import io.github.wulkanowy.ui.base.BaseDialogFragment import io.github.wulkanowy.ui.modules.login.LoginActivity import javax.inject.Inject +@AndroidEntryPoint class AccountDialog : BaseDialogFragment(), AccountView { @Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 51f9cb7b5..c7caef069 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -14,6 +14,7 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.view.ActionMode import androidx.recyclerview.widget.LinearLayoutManager import com.wdullaer.materialdatetimepicker.date.DatePickerDialog +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.databinding.DialogExcuseBinding @@ -28,6 +29,7 @@ import io.github.wulkanowy.utils.dpToPx import java.time.LocalDate import javax.inject.Inject +@AndroidEntryPoint class AttendanceFragment : BaseFragment(R.layout.fragment_attendance), AttendanceView, MainView.MainChildView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt index 1b9fe08ef..2f8622374 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt @@ -8,6 +8,7 @@ import android.view.View.VISIBLE import android.widget.ArrayAdapter import android.widget.TextView import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.databinding.FragmentAttendanceSummaryBinding @@ -17,6 +18,7 @@ import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.setOnItemSelectedListener import javax.inject.Inject +@AndroidEntryPoint class AttendanceSummaryFragment : BaseFragment(R.layout.fragment_attendance_summary), AttendanceSummaryView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt index eeab30c15..000da00f8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt @@ -6,6 +6,7 @@ import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.databinding.FragmentExamBinding @@ -16,6 +17,7 @@ import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.dpToPx import javax.inject.Inject +@AndroidEntryPoint class ExamFragment : BaseFragment(R.layout.fragment_exam), ExamView, MainView.MainChildView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt index 59b83c4b0..0678e13ef 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt @@ -8,6 +8,7 @@ import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE import androidx.appcompat.app.AlertDialog +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.FragmentGradeBinding import io.github.wulkanowy.ui.base.BaseFragment @@ -20,13 +21,14 @@ import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.setOnSelectPageListener import javax.inject.Inject -class GradeFragment : BaseFragment(R.layout.fragment_grade), GradeView, MainView.MainChildView, MainView.TitledView { +@AndroidEntryPoint +class GradeFragment : BaseFragment(R.layout.fragment_grade), GradeView, + MainView.MainChildView, MainView.TitledView { @Inject lateinit var presenter: GradePresenter - @Inject - lateinit var pagerAdapter: BaseFragmentPagerAdapter + private val pagerAdapter by lazy { BaseFragmentPagerAdapter(childFragmentManager) } private var semesterSwitchMenu: MenuItem? = null diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeModule.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeModule.kt deleted file mode 100644 index 342f356cb..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeModule.kt +++ /dev/null @@ -1,35 +0,0 @@ -package io.github.wulkanowy.ui.modules.grade - -import dagger.Module -import dagger.Provides -import dagger.android.ContributesAndroidInjector -import io.github.wulkanowy.di.scopes.PerChildFragment -import io.github.wulkanowy.di.scopes.PerFragment -import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter -import io.github.wulkanowy.ui.modules.grade.details.GradeDetailsFragment -import io.github.wulkanowy.ui.modules.grade.statistics.GradeStatisticsFragment -import io.github.wulkanowy.ui.modules.grade.summary.GradeSummaryFragment - -@Suppress("unused") -@Module -abstract class GradeModule { - - companion object { - - @PerFragment - @Provides - fun provideGradeAdapter(fragment: GradeFragment) = BaseFragmentPagerAdapter(fragment.childFragmentManager) - } - - @PerChildFragment - @ContributesAndroidInjector - abstract fun bindGradeDetailsFragment(): GradeDetailsFragment - - @PerChildFragment - @ContributesAndroidInjector - abstract fun binGradeSummaryFragment(): GradeSummaryFragment - - @PerChildFragment - @ContributesAndroidInjector - abstract fun binGradeStatisticsFragment(): GradeStatisticsFragment -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt index ac50b9f53..ef9a932e1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt @@ -9,6 +9,7 @@ import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.databinding.FragmentGradeDetailsBinding @@ -18,6 +19,7 @@ import io.github.wulkanowy.ui.modules.grade.GradeView import io.github.wulkanowy.ui.modules.main.MainActivity import javax.inject.Inject +@AndroidEntryPoint class GradeDetailsFragment : BaseFragment(R.layout.fragment_grade_details), GradeDetailsView, GradeView.GradeChildView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt index 3a8f40073..75050249a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt @@ -5,6 +5,7 @@ import android.view.View import android.widget.ArrayAdapter import android.widget.TextView import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.pojos.GradeStatisticsItem import io.github.wulkanowy.databinding.FragmentGradeStatisticsBinding @@ -15,6 +16,7 @@ import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.setOnItemSelectedListener import javax.inject.Inject +@AndroidEntryPoint class GradeStatisticsFragment : BaseFragment(R.layout.fragment_grade_statistics), GradeStatisticsView, GradeView.GradeChildView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt index d169f7c62..4d12dcd50 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt @@ -6,6 +6,7 @@ import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.databinding.FragmentGradeSummaryBinding @@ -14,6 +15,7 @@ import io.github.wulkanowy.ui.modules.grade.GradeFragment import io.github.wulkanowy.ui.modules.grade.GradeView import javax.inject.Inject +@AndroidEntryPoint class GradeSummaryFragment : BaseFragment(R.layout.fragment_grade_summary), GradeSummaryView, GradeView.GradeChildView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt index ee2751d71..e1d7ac52f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.databinding.FragmentHomeworkBinding @@ -16,6 +17,7 @@ import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.dpToPx import javax.inject.Inject +@AndroidEntryPoint class HomeworkFragment : BaseFragment(R.layout.fragment_homework), HomeworkView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt index 82938a47d..78abfffd0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.databinding.DialogHomeworkBinding @@ -15,6 +16,7 @@ import io.github.wulkanowy.ui.base.BaseDialogFragment import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject +@AndroidEntryPoint class HomeworkDetailsDialog : BaseDialogFragment(), HomeworkDetailsView { @Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt index ffb36fe6e..c568b33c2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.view.MenuItem +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.databinding.ActivityLoginBinding import io.github.wulkanowy.ui.base.BaseActivity @@ -16,13 +17,13 @@ import io.github.wulkanowy.ui.modules.login.symbol.LoginSymbolFragment import io.github.wulkanowy.utils.setOnSelectPageListener import javax.inject.Inject +@AndroidEntryPoint class LoginActivity : BaseActivity(), LoginView { @Inject override lateinit var presenter: LoginPresenter - @Inject - lateinit var loginAdapter: BaseFragmentPagerAdapter + private val loginAdapter = BaseFragmentPagerAdapter(supportFragmentManager) companion object { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginModule.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginModule.kt deleted file mode 100644 index 26a243dcd..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginModule.kt +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.wulkanowy.ui.modules.login - -import dagger.Module -import dagger.Provides -import dagger.android.ContributesAndroidInjector -import io.github.wulkanowy.di.scopes.PerActivity -import io.github.wulkanowy.di.scopes.PerFragment -import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter -import io.github.wulkanowy.ui.modules.login.advanced.LoginAdvancedFragment -import io.github.wulkanowy.ui.modules.login.form.LoginFormFragment -import io.github.wulkanowy.ui.modules.login.recover.LoginRecoverFragment -import io.github.wulkanowy.ui.modules.login.studentselect.LoginStudentSelectFragment -import io.github.wulkanowy.ui.modules.login.symbol.LoginSymbolFragment - -@Suppress("unused") -@Module -internal abstract class LoginModule { - - companion object { - - @PerActivity - @Provides - fun provideLoginAdapter(activity: LoginActivity) = BaseFragmentPagerAdapter(activity.supportFragmentManager) - } - - @PerFragment - @ContributesAndroidInjector - abstract fun bindLoginFormFragment(): LoginFormFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindLoginAdvancedFragment(): LoginAdvancedFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindLoginSymbolFragment(): LoginSymbolFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindLoginSelectStudentFragment(): LoginStudentSelectFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindLoginRecoverFragment(): LoginRecoverFragment -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt index 3b6a985be..389517912 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt @@ -6,6 +6,7 @@ import android.view.View.GONE import android.view.View.VISIBLE import android.widget.ArrayAdapter import androidx.core.widget.doOnTextChanged +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.databinding.FragmentLoginAdvancedBinding @@ -18,6 +19,7 @@ import io.github.wulkanowy.utils.setOnEditorDoneSignIn import io.github.wulkanowy.utils.showSoftInput import javax.inject.Inject +@AndroidEntryPoint class LoginAdvancedFragment : BaseFragment(R.layout.fragment_login_advanced), LoginAdvancedView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index a2a083c00..2dd5abc3a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -6,6 +6,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import androidx.core.widget.doOnTextChanged +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.databinding.FragmentLoginFormBinding @@ -19,6 +20,7 @@ import io.github.wulkanowy.utils.setOnEditorDoneSignIn import io.github.wulkanowy.utils.showSoftInput import javax.inject.Inject +@AndroidEntryPoint class LoginFormFragment : BaseFragment(R.layout.fragment_login_form), LoginFormView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt index e27c845a6..f0c9652fb 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt @@ -10,6 +10,7 @@ import android.webkit.JavascriptInterface import android.webkit.WebView import android.webkit.WebViewClient import androidx.core.widget.doOnTextChanged +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.FragmentLoginRecoverBinding import io.github.wulkanowy.ui.base.BaseFragment @@ -19,6 +20,7 @@ import io.github.wulkanowy.utils.hideSoftInput import io.github.wulkanowy.utils.showSoftInput import javax.inject.Inject +@AndroidEntryPoint class LoginRecoverFragment : BaseFragment(R.layout.fragment_login_recover), LoginRecoverView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index b0df51991..d2884c21e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.databinding.FragmentLoginStudentSelectBinding @@ -16,6 +17,7 @@ import io.github.wulkanowy.utils.openInternetBrowser import java.io.Serializable import javax.inject.Inject +@AndroidEntryPoint class LoginStudentSelectFragment : BaseFragment(R.layout.fragment_login_student_select), LoginStudentSelectView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt index befbffd50..005fcb7fa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt @@ -8,6 +8,7 @@ import android.view.inputmethod.EditorInfo.IME_ACTION_DONE import android.view.inputmethod.EditorInfo.IME_NULL import android.widget.ArrayAdapter import androidx.core.widget.doOnTextChanged +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.databinding.FragmentLoginSymbolBinding @@ -20,6 +21,7 @@ import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.showSoftInput import javax.inject.Inject +@AndroidEntryPoint class LoginSymbolFragment : BaseFragment(R.layout.fragment_login_symbol), LoginSymbolView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt index 0775ce189..0f1d836d0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import android.view.View.GONE import android.view.View.VISIBLE +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.databinding.FragmentLuckyNumberBinding @@ -11,6 +12,7 @@ import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainView import javax.inject.Inject +@AndroidEntryPoint class LuckyNumberFragment : BaseFragment(R.layout.fragment_lucky_number), LuckyNumberView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt index 961ac6338..692615d98 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt @@ -9,6 +9,7 @@ import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.databinding.ActivityWidgetConfigureBinding @@ -18,6 +19,7 @@ import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.utils.AppInfo import javax.inject.Inject +@AndroidEntryPoint class LuckyNumberWidgetConfigureActivity : BaseActivity(), LuckyNumberWidgetConfigureView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index 3daaaaf66..4d42b355a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -7,13 +7,12 @@ import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH import android.appwidget.AppWidgetProvider import android.content.Context -import android.content.Intent import android.content.res.Configuration import android.os.Bundle import android.view.View.GONE import android.view.View.VISIBLE import android.widget.RemoteViews -import dagger.android.AndroidInjection +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.exceptions.NoCurrentStudentException @@ -26,6 +25,7 @@ import kotlinx.coroutines.runBlocking import timber.log.Timber import javax.inject.Inject +@AndroidEntryPoint class LuckyNumberWidgetProvider : AppWidgetProvider() { @Inject @@ -48,11 +48,6 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { fun getWidthWidgetKey(appWidgetId: Int) = "lucky_number_widget_width_$appWidgetId" } - override fun onReceive(context: Context, intent: Intent) { - AndroidInjection.inject(this, context) - super.onReceive(context, intent) - } - override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray?) { super.onUpdate(context, appWidgetManager, appWidgetIds) appWidgetIds?.forEach { appWidgetId -> diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index f5b7c47c8..035608893 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -17,7 +17,7 @@ import com.aurelhubert.ahbottomnavigation.AHBottomNavigationItem import com.google.android.material.elevation.ElevationOverlayProvider import com.ncapdevi.fragnav.FragNavController import com.ncapdevi.fragnav.FragNavController.Companion.HIDE -import dagger.Lazy +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.ActivityMainBinding import io.github.wulkanowy.ui.base.BaseActivity @@ -39,19 +39,18 @@ import io.github.wulkanowy.utils.setOnViewChangeListener import timber.log.Timber import javax.inject.Inject +@AndroidEntryPoint class MainActivity : BaseActivity(), MainView { @Inject override lateinit var presenter: MainPresenter - @Inject - lateinit var navController: FragNavController - @Inject lateinit var analytics: FirebaseAnalyticsHelper - @Inject - lateinit var overlayProvider: Lazy + private val overlayProvider by lazy { ElevationOverlayProvider(this) } + + private val navController = FragNavController(supportFragmentManager, R.id.mainFragmentContainer) companion object { const val EXTRA_START_MENU = "extraStartMenu" @@ -106,7 +105,7 @@ class MainActivity : BaseActivity(), MainVie override fun initView() { with(binding.mainToolbar) { if (SDK_INT >= LOLLIPOP) stateListAnimator = null - setBackgroundColor(overlayProvider.get().compositeOverlayWithThemeSurfaceColorIfNeeded(dpToPx(4f))) + setBackgroundColor(overlayProvider.compositeOverlayWithThemeSurfaceColorIfNeeded(dpToPx(4f))) } with(binding.mainBottomNav) { @@ -119,7 +118,7 @@ class MainActivity : BaseActivity(), MainVie )) accentColor = getThemeAttrColor(R.attr.colorPrimary) inactiveColor = getThemeAttrColor(R.attr.colorOnSurface, 153) - defaultBackgroundColor = overlayProvider.get().compositeOverlayWithThemeSurfaceColorIfNeeded(dpToPx(8f)) + defaultBackgroundColor = overlayProvider.compositeOverlayWithThemeSurfaceColorIfNeeded(dpToPx(8f)) titleState = ALWAYS_SHOW currentItem = startMenuIndex isBehaviorTranslationEnabled = false diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainModule.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainModule.kt deleted file mode 100644 index 03f6ac382..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainModule.kt +++ /dev/null @@ -1,139 +0,0 @@ -package io.github.wulkanowy.ui.modules.main - -import com.google.android.material.elevation.ElevationOverlayProvider -import com.ncapdevi.fragnav.FragNavController -import dagger.Module -import dagger.Provides -import dagger.android.ContributesAndroidInjector -import io.github.wulkanowy.R -import io.github.wulkanowy.di.scopes.PerFragment -import io.github.wulkanowy.ui.modules.about.AboutFragment -import io.github.wulkanowy.ui.modules.about.contributor.ContributorFragment -import io.github.wulkanowy.ui.modules.about.license.LicenseFragment -import io.github.wulkanowy.ui.modules.about.license.LicenseModule -import io.github.wulkanowy.ui.modules.about.logviewer.LogViewerFragment -import io.github.wulkanowy.ui.modules.account.AccountDialog -import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment -import io.github.wulkanowy.ui.modules.attendance.summary.AttendanceSummaryFragment -import io.github.wulkanowy.ui.modules.exam.ExamFragment -import io.github.wulkanowy.ui.modules.grade.GradeFragment -import io.github.wulkanowy.ui.modules.grade.GradeModule -import io.github.wulkanowy.ui.modules.homework.HomeworkFragment -import io.github.wulkanowy.ui.modules.homework.details.HomeworkDetailsDialog -import io.github.wulkanowy.ui.modules.luckynumber.LuckyNumberFragment -import io.github.wulkanowy.ui.modules.message.MessageFragment -import io.github.wulkanowy.ui.modules.message.MessageModule -import io.github.wulkanowy.ui.modules.message.preview.MessagePreviewFragment -import io.github.wulkanowy.ui.modules.mobiledevice.MobileDeviceFragment -import io.github.wulkanowy.ui.modules.mobiledevice.token.MobileDeviceTokenDialog -import io.github.wulkanowy.ui.modules.more.MoreFragment -import io.github.wulkanowy.ui.modules.note.NoteFragment -import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersFragment -import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersModule -import io.github.wulkanowy.ui.modules.settings.SettingsFragment -import io.github.wulkanowy.ui.modules.timetable.TimetableFragment -import io.github.wulkanowy.ui.modules.timetable.completed.CompletedLessonsFragment - -@Suppress("unused") -@Module -abstract class MainModule { - - companion object { - - @Provides - fun provideFragNavController(activity: MainActivity) = - FragNavController(activity.supportFragmentManager, R.id.mainFragmentContainer) - - //In activities must be injected as Lazy - @Provides - fun provideElevationOverlayProvider(activity: MainActivity) = ElevationOverlayProvider(activity) - } - - @PerFragment - @ContributesAndroidInjector - abstract fun bindAttendanceFragment(): AttendanceFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindAttendanceSummaryFragment(): AttendanceSummaryFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindExamFragment(): ExamFragment - - @PerFragment - @ContributesAndroidInjector(modules = [GradeModule::class]) - abstract fun bindGradeFragment(): GradeFragment - - @PerFragment - @ContributesAndroidInjector(modules = [MessageModule::class]) - abstract fun bindMessagesFragment(): MessageFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindMessagePreviewFragment(): MessagePreviewFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindMoreFragment(): MoreFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindTimetableFragment(): TimetableFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindAboutFragment(): AboutFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindSettingsFragment(): SettingsFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindNoteFragment(): NoteFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindHomeworkFragment(): HomeworkFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindHomeworkDetailsDialog(): HomeworkDetailsDialog - - @PerFragment - @ContributesAndroidInjector - abstract fun bindLuckyNumberFragment(): LuckyNumberFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindCompletedLessonsFragment(): CompletedLessonsFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindAccountDialog(): AccountDialog - - @PerFragment - @ContributesAndroidInjector - abstract fun bindMobileDevices(): MobileDeviceFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindMobileDeviceDialog(): MobileDeviceTokenDialog - - @PerFragment - @ContributesAndroidInjector(modules = [LicenseModule::class]) - abstract fun bindLicenseFragment(): LicenseFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindLogViewerFragment(): LogViewerFragment - - @PerFragment - @ContributesAndroidInjector - abstract fun bindContributorFragment(): ContributorFragment - - @PerFragment - @ContributesAndroidInjector(modules = [SchoolAndTeachersModule::class]) - abstract fun bindSchoolAndTeachersFragment(): SchoolAndTeachersFragment -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt index 1e48f71b5..16e0184a0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED import io.github.wulkanowy.data.repositories.message.MessageFolder.SENT @@ -18,14 +19,14 @@ import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.setOnSelectPageListener import javax.inject.Inject +@AndroidEntryPoint class MessageFragment : BaseFragment(R.layout.fragment_message), MessageView, MainView.TitledView { @Inject lateinit var presenter: MessagePresenter - @Inject - lateinit var pagerAdapter: BaseFragmentPagerAdapter + private val pagerAdapter by lazy { BaseFragmentPagerAdapter(childFragmentManager) } companion object { fun newInstance() = MessageFragment() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageModule.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageModule.kt deleted file mode 100644 index bf7950209..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageModule.kt +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.wulkanowy.ui.modules.message - -import dagger.Module -import dagger.Provides -import dagger.android.ContributesAndroidInjector -import io.github.wulkanowy.di.scopes.PerChildFragment -import io.github.wulkanowy.di.scopes.PerFragment -import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter -import io.github.wulkanowy.ui.modules.message.tab.MessageTabFragment - -@Suppress("unused") -@Module -abstract class MessageModule { - - companion object { - - @PerFragment - @Provides - fun provideMessageAdapter(fragment: MessageFragment) = BaseFragmentPagerAdapter(fragment.childFragmentManager) - } - - @PerChildFragment - @ContributesAndroidInjector - abstract fun bindMessageTabFragment(): MessageTabFragment -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index e218d759c..740f4927c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -16,6 +16,7 @@ import android.webkit.WebViewClient import androidx.annotation.RequiresApi import androidx.core.content.getSystemService import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment @@ -28,6 +29,7 @@ import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.shareText import javax.inject.Inject +@AndroidEntryPoint class MessagePreviewFragment : BaseFragment(R.layout.fragment_message_preview), MessagePreviewView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt index 7b7503433..2267279c2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt @@ -11,6 +11,7 @@ import android.view.View.GONE import android.view.View.VISIBLE import android.widget.Toast import android.widget.Toast.LENGTH_LONG +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.ReportingUnit @@ -21,6 +22,7 @@ import io.github.wulkanowy.utils.hideSoftInput import io.github.wulkanowy.utils.showSoftInput import javax.inject.Inject +@AndroidEntryPoint class SendMessageActivity : BaseActivity(), SendMessageView { @Inject @@ -62,7 +64,7 @@ class SendMessageActivity : BaseActivity(R.layout.fragment_message_tab), MessageTabView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt index 6a3e5a441..8065e9b60 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDeviceFragment.kt @@ -7,6 +7,7 @@ import android.view.View.VISIBLE import androidx.core.view.postDelayed import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.snackbar.Snackbar +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.databinding.FragmentMobileDeviceBinding @@ -17,6 +18,7 @@ import io.github.wulkanowy.ui.modules.mobiledevice.token.MobileDeviceTokenDialog import io.github.wulkanowy.ui.widgets.DividerItemDecoration import javax.inject.Inject +@AndroidEntryPoint class MobileDeviceFragment : BaseFragment(R.layout.fragment_mobile_device), MobileDeviceView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenDialog.kt index 9ac6049e9..48150d8de 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenDialog.kt @@ -12,12 +12,14 @@ import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.Toast import androidx.core.content.getSystemService +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.pojos.MobileDeviceToken import io.github.wulkanowy.databinding.DialogMobileDeviceBinding import io.github.wulkanowy.ui.base.BaseDialogFragment import javax.inject.Inject +@AndroidEntryPoint class MobileDeviceTokenDialog : BaseDialogFragment(), MobileDeviceTokenVIew { @Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt index a79087de2..1bdcc26fa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt @@ -4,6 +4,7 @@ import android.graphics.drawable.Drawable import android.os.Bundle import android.view.View import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.FragmentMoreBinding import io.github.wulkanowy.ui.base.BaseFragment @@ -20,6 +21,7 @@ import io.github.wulkanowy.ui.modules.settings.SettingsFragment import io.github.wulkanowy.utils.getCompatDrawable import javax.inject.Inject +@AndroidEntryPoint class MoreFragment : BaseFragment(R.layout.fragment_more), MoreView, MainView.TitledView, MainView.MainChildView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt index 473381659..079285a80 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NoteFragment.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.databinding.FragmentNoteBinding @@ -14,6 +15,7 @@ import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.widgets.DividerItemDecoration import javax.inject.Inject +@AndroidEntryPoint class NoteFragment : BaseFragment(R.layout.fragment_note), NoteView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt index 0245aa076..c1c569611 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.FragmentSchoolandteachersBinding import io.github.wulkanowy.ui.base.BaseFragment @@ -15,6 +16,7 @@ import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.setOnSelectPageListener import javax.inject.Inject +@AndroidEntryPoint class SchoolAndTeachersFragment : BaseFragment(R.layout.fragment_schoolandteachers), SchoolAndTeachersView, MainView.TitledView { @@ -22,8 +24,7 @@ class SchoolAndTeachersFragment : @Inject lateinit var presenter: SchoolAndTeachersPresenter - @Inject - lateinit var pagerAdapter: BaseFragmentPagerAdapter + private val pagerAdapter by lazy { BaseFragmentPagerAdapter(childFragmentManager) } companion object { fun newInstance() = SchoolAndTeachersFragment() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersModule.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersModule.kt deleted file mode 100644 index 2087b0b42..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersModule.kt +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.wulkanowy.ui.modules.schoolandteachers - -import dagger.Module -import dagger.Provides -import dagger.android.ContributesAndroidInjector -import io.github.wulkanowy.di.scopes.PerChildFragment -import io.github.wulkanowy.di.scopes.PerFragment -import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter -import io.github.wulkanowy.ui.modules.schoolandteachers.school.SchoolFragment -import io.github.wulkanowy.ui.modules.schoolandteachers.teacher.TeacherFragment - -@Suppress("unused") -@Module -abstract class SchoolAndTeachersModule { - - companion object { - - @PerFragment - @Provides - fun provideSchoolAndTeachersAdapter(fragment: SchoolAndTeachersFragment) = BaseFragmentPagerAdapter(fragment.childFragmentManager) - } - - @PerChildFragment - @ContributesAndroidInjector - abstract fun provideSchoolFragment(): SchoolFragment - - @PerChildFragment - @ContributesAndroidInjector - abstract fun provideTeacherFragment(): TeacherFragment -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt index 722999f86..d3f110073 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import android.view.View.GONE import android.view.View.VISIBLE +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.School import io.github.wulkanowy.databinding.FragmentSchoolBinding @@ -15,6 +16,7 @@ import io.github.wulkanowy.utils.openDialer import io.github.wulkanowy.utils.openNavigation import javax.inject.Inject +@AndroidEntryPoint class SchoolFragment : BaseFragment(R.layout.fragment_school), SchoolView, MainView.TitledView, SchoolAndTeachersChildView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt index aa50339c1..5914945b9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherFragment.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Teacher import io.github.wulkanowy.databinding.FragmentTeacherBinding @@ -15,6 +16,7 @@ import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersFragmen import io.github.wulkanowy.ui.widgets.DividerItemDecoration import javax.inject.Inject +@AndroidEntryPoint class TeacherFragment : BaseFragment(R.layout.fragment_teacher), TeacherView, MainView.TitledView, SchoolAndTeachersChildView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index 248417fd1..a8a15cec5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -9,7 +9,7 @@ import androidx.preference.PreferenceFragmentCompat import com.thelittlefireman.appkillermanager.AppKillerManager import com.thelittlefireman.appkillermanager.exceptions.NoActionFoundException import com.yariksoffice.lingver.Lingver -import dagger.android.support.AndroidSupportInjection +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog @@ -18,6 +18,7 @@ import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject +@AndroidEntryPoint class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener, MainView.TitledView, SettingsView { @@ -42,7 +43,6 @@ class SettingsFragment : PreferenceFragmentCompat(), override val syncFailedString get() = getString(R.string.pref_services_message_sync_failed) override fun onAttach(context: Context) { - AndroidSupportInjection.inject(this) super.onAttach(context) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt index 23a437506..7fc20d238 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt @@ -4,11 +4,13 @@ import android.os.Bundle import android.widget.Toast import android.widget.Toast.LENGTH_LONG import androidx.viewbinding.ViewBinding +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.main.MainActivity import javax.inject.Inject +@AndroidEntryPoint class SplashActivity : BaseActivity(), SplashView { @Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index c2be76ea7..2c5e136dd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -9,6 +9,7 @@ import android.view.View.GONE import android.view.View.VISIBLE import androidx.recyclerview.widget.LinearLayoutManager import com.wdullaer.materialdatetimepicker.date.DatePickerDialog +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.databinding.FragmentTimetableBinding @@ -22,6 +23,7 @@ import io.github.wulkanowy.utils.dpToPx import java.time.LocalDate import javax.inject.Inject +@AndroidEntryPoint class TimetableFragment : BaseFragment(R.layout.fragment_timetable), TimetableView, MainView.MainChildView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt index 5a41f96c5..5b77fc1f3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt @@ -7,6 +7,7 @@ import android.view.View.INVISIBLE import android.view.View.VISIBLE import androidx.recyclerview.widget.LinearLayoutManager import com.wdullaer.materialdatetimepicker.date.DatePickerDialog +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.databinding.FragmentTimetableCompletedBinding @@ -20,6 +21,7 @@ import io.github.wulkanowy.utils.getCompatDrawable import java.time.LocalDate import javax.inject.Inject +@AndroidEntryPoint class CompletedLessonsFragment : BaseFragment(R.layout.fragment_timetable_completed), CompletedLessonsView, MainView.TitledView { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt index 3dc7a3a8c..23d1f27ab 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt @@ -10,6 +10,7 @@ import android.widget.Toast import android.widget.Toast.LENGTH_LONG import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.databinding.ActivityWidgetConfigureBinding @@ -20,6 +21,7 @@ import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Co import io.github.wulkanowy.utils.AppInfo import javax.inject.Inject +@AndroidEntryPoint class TimetableWidgetConfigureActivity : BaseActivity(), TimetableWidgetConfigureView { @@ -35,7 +37,7 @@ class TimetableWidgetConfigureActivity : private var dialog: AlertDialog? = null - override fun onCreate(savedInstanceState: Bundle?) { + override public fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setResult(RESULT_CANCELED) setContentView(ActivityWidgetConfigureBinding.inflate(layoutInflater).apply { binding = this }.root) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 426f6cdd7..8b3709a8e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -8,19 +8,19 @@ 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.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.res.Configuration import android.widget.RemoteViews -import dagger.android.AndroidInjection +import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.exceptions.NoCurrentStudentException import io.github.wulkanowy.data.repositories.student.StudentRepository +import io.github.wulkanowy.services.HiltBroadcastReceiver import io.github.wulkanowy.services.widgets.TimetableWidgetService import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView @@ -36,7 +36,8 @@ import java.time.LocalDate import java.time.LocalDate.now import javax.inject.Inject -class TimetableWidgetProvider : BroadcastReceiver() { +@AndroidEntryPoint +class TimetableWidgetProvider : HiltBroadcastReceiver() { @Inject lateinit var appWidgetManager: AppWidgetManager @@ -74,7 +75,7 @@ class TimetableWidgetProvider : BroadcastReceiver() { } override fun onReceive(context: Context, intent: Intent) { - AndroidInjection.inject(this, context) + super.onReceive(context, intent) GlobalScope.launch { when (intent.action) { ACTION_APPWIDGET_UPDATE -> onUpdate(context, intent) diff --git a/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt b/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt index 6912baa36..1098a9a06 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt @@ -7,10 +7,11 @@ import android.os.Build.VERSION.SDK_INT import io.github.wulkanowy.BuildConfig.DEBUG import io.github.wulkanowy.BuildConfig.VERSION_CODE import io.github.wulkanowy.BuildConfig.VERSION_NAME +import javax.inject.Inject import javax.inject.Singleton @Singleton -open class AppInfo { +open class AppInfo @Inject constructor() { open val isDebug get() = DEBUG diff --git a/app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt b/app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt index b0b2fda4d..f7e4a0fc0 100644 --- a/app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt @@ -4,11 +4,14 @@ import android.app.Activity import android.content.Context import android.os.Bundle import com.google.firebase.analytics.FirebaseAnalytics +import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject import javax.inject.Singleton @Singleton -class FirebaseAnalyticsHelper @Inject constructor(private val context: Context) { +class FirebaseAnalyticsHelper @Inject constructor( + @ApplicationContext private val context: Context +) { private val analytics by lazy { FirebaseAnalytics.getInstance(context) } diff --git a/build.gradle b/build.gradle index 164e258af..cc66780fd 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,9 @@ buildscript { - ext.kotlin_version = '1.3.72' - ext.about_libraries = '8.3.0' + ext { + kotlin_version = '1.3.72' + about_libraries = '8.3.0' + hilt_version = "2.28.3-alpha" + } repositories { mavenCentral() google() @@ -10,12 +13,13 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.android.tools.build:gradle:4.0.1' + classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0' classpath "com.github.triplet.gradle:play-publisher:2.7.5" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" - classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${about_libraries}" + classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" } } From 8922d7d48d20324527cfa40e1720283de71eb52d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 2 Aug 2020 16:30:06 +0000 Subject: [PATCH 0107/1526] Bump core-ktx from 1.3.0 to 1.3.1 (#911) From 062985c5a0f4fc2515283f7bd60265cd1daf51a9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 2 Aug 2020 16:30:31 +0000 Subject: [PATCH 0108/1526] Bump firebase-messaging from 20.2.3 to 20.2.4 (#912) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e0a7551c6..3d078c811 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -184,7 +184,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics:17.4.4' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.1.0' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.1.0" - playImplementation 'com.google.firebase:firebase-messaging:20.2.3' + playImplementation 'com.google.firebase:firebase-messaging:20.2.4' playImplementation 'com.google.firebase:firebase-crashlytics:17.1.1' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' From ca7d9773421e9254a5fae4c2f9a1b4b5bdde81f0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 2 Aug 2020 18:41:22 +0200 Subject: [PATCH 0109/1526] Bump work_manager from 2.3.4 to 2.4.0 (#910) Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> From d5187d1808fe15a2592a556a0434f6b7a7617462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 26 Aug 2020 10:25:01 +0200 Subject: [PATCH 0110/1526] Save semesters with students during registration (#915) --- .idea/codeStyles/Project.xml | 11 ++++- app/build.gradle | 7 ++- .../wulkanowy/data/db/dao/SemesterDao.kt | 5 ++ .../wulkanowy/data/db/dao/StudentDao.kt | 6 +++ .../wulkanowy/data/db/entities/Semester.kt | 3 +- .../data/db/entities/StudentWithSemesters.kt | 13 +++++ .../wulkanowy/data/mappers/SemesterMapper.kt | 19 ++++++++ .../wulkanowy/data/mappers/StudentMapper.kt | 34 ++++++++++++++ .../repositories/grade/GradeRepository.kt | 2 +- .../repositories/semester/SemesterLocal.kt | 2 +- .../data/repositories/student/StudentLocal.kt | 4 +- .../repositories/student/StudentRemote.kt | 44 ++++------------- .../repositories/student/StudentRepository.kt | 20 ++++---- .../ui/modules/account/AccountAdapter.kt | 17 ++++--- .../ui/modules/account/AccountPresenter.kt | 14 +++--- .../ui/modules/login/LoginActivity.kt | 14 +++--- .../ui/modules/login/LoginPresenter.kt | 12 ++--- .../wulkanowy/ui/modules/login/LoginView.kt | 4 +- .../login/advanced/LoginAdvancedFragment.kt | 6 +-- .../login/advanced/LoginAdvancedPresenter.kt | 4 +- .../login/advanced/LoginAdvancedView.kt | 4 +- .../modules/login/form/LoginFormFragment.kt | 6 +-- .../ui/modules/login/form/LoginFormView.kt | 4 +- .../LoginStudentSelectAdapter.kt | 15 +++--- .../LoginStudentSelectFragment.kt | 8 ++-- .../LoginStudentSelectPresenter.kt | 47 ++++++++++--------- .../studentselect/LoginStudentSelectView.kt | 4 +- .../login/symbol/LoginSymbolFragment.kt | 6 +-- .../modules/login/symbol/LoginSymbolView.kt | 4 +- .../LuckyNumberWidgetConfigurePresenter.kt | 6 +-- .../LuckyNumberWidgetProvider.kt | 2 +- .../message/tab/MessageTabPresenter.kt | 2 +- .../wulkanowy/ui/modules/note/NoteAdapter.kt | 8 ++-- .../wulkanowy/ui/modules/note/NoteDialog.kt | 8 ++-- .../TimetableWidgetConfigurePresenter.kt | 6 +-- .../timetablewidget/TimetableWidgetFactory.kt | 2 +- .../TimetableWidgetProvider.kt | 2 +- .../wulkanowy/utils/SemesterExtension.kt | 2 +- .../repositories/student/StudentRemoteTest.kt | 8 +++- .../login/form/LoginFormPresenterTest.kt | 3 +- .../LoginStudentSelectPresenterTest.kt | 11 +++-- build.gradle | 2 +- 42 files changed, 239 insertions(+), 162 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/entities/StudentWithSemesters.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/mappers/SemesterMapper.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/mappers/StudentMapper.kt diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index d66c3361f..cb2f41195 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -4,7 +4,16 @@ + @@ -48,6 +50,7 @@ rawamazowiecka zdunskawola sieradz + skarzyskokamienna lask powiatlaski powiatkrasnostawski From 20f931c5cc8725aca38661f4a088012d9e9e54a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 1 Sep 2020 09:33:14 +0200 Subject: [PATCH 0127/1526] Fix recaptcha loading in password recover (#935) --- .../ui/modules/login/recover/LoginRecoverPresenter.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt index 1d509e1bb..e58377058 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt @@ -66,7 +66,12 @@ class LoginRecoverPresenter @Inject constructor( showErrorView(false) showCaptcha(false) } - Status.SUCCESS -> view?.loadReCaptcha(siteKey = it.data!!.first, url = it.data.second) + Status.SUCCESS -> view?.run { + loadReCaptcha(url = it.data!!.first, siteKey = it.data.second) + showProgress(false) + showErrorView(false) + showCaptcha(true) + } Status.ERROR -> { Timber.i("Obtain captcha site key result: An exception occurred") errorHandler.dispatch(it.error!!) From 90be9d1add6ad1f92c90b6125e91b77dd9a49625 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Tue, 1 Sep 2020 12:57:45 +0200 Subject: [PATCH 0128/1526] Disable notification sound (#936) --- .../wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt index cd25eea67..41fb61925 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt @@ -26,6 +26,7 @@ class UpcomingLessonsChannel @Inject constructor( lockscreenVisibility = VISIBILITY_PUBLIC setShowBadge(false) enableVibration(false) + setSound(null, null) } ) } From f8b7baef24260e173ec76eafd589115adf085eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 1 Sep 2020 14:58:45 +0200 Subject: [PATCH 0129/1526] Remove force sync dialog (#938) --- .../ui/modules/settings/SettingsFragment.kt | 9 --------- .../ui/modules/settings/SettingsPresenter.kt | 12 ++++-------- .../wulkanowy/ui/modules/settings/SettingsView.kt | 1 - 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index a8a15cec5..6f4a695d6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -120,15 +120,6 @@ class SettingsFragment : PreferenceFragmentCompat(), ErrorDialog.newInstance(error).show(childFragmentManager, error.toString()) } - override fun showForceSyncDialog() { - AlertDialog.Builder(requireContext()) - .setTitle(R.string.pref_services_dialog_force_sync_title) - .setMessage(R.string.pref_services_dialog_force_sync_summary) - .setPositiveButton(android.R.string.ok) { _, _ -> presenter.onForceSyncDialogSubmit() } - .setNegativeButton(android.R.string.cancel) { _, _ -> } - .show() - } - override fun showFixSyncDialog() { AlertDialog.Builder(requireContext()) .setTitle(R.string.pref_notify_fix_sync_issues) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt index f9e6731f9..3d1e063e2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt @@ -55,14 +55,6 @@ class SettingsPresenter @Inject constructor( } fun onSyncNowClicked() { - view?.showForceSyncDialog() - } - - fun onFixSyncIssuesClicked() { - view?.showFixSyncDialog() - } - - fun onForceSyncDialogSubmit() { view?.run { syncManager.startOneTimeSyncWorker().onEach { workInfo -> when (workInfo.state) { @@ -87,4 +79,8 @@ class SettingsPresenter @Inject constructor( }.launch("sync") } } + + fun onFixSyncIssuesClicked() { + view?.showFixSyncDialog() + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt index 3786ba4b2..b647c0b76 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt @@ -18,6 +18,5 @@ interface SettingsView : BaseView { fun setSyncInProgress(inProgress: Boolean) - fun showForceSyncDialog() fun showFixSyncDialog() } From 2ad1d086e01b4284cc2dccdfd3467df22492fbbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 1 Sep 2020 15:39:34 +0200 Subject: [PATCH 0130/1526] Fix lucky number notification (#937) --- .../github/wulkanowy/data/db/dao/LuckyNumberDao.kt | 2 +- .../luckynumber/LuckyNumberRepository.kt | 12 +++++------- .../wulkanowy/services/sync/works/LuckyNumberWork.kt | 3 +-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt index e3fdf01be..57f3005ad 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt @@ -12,5 +12,5 @@ import javax.inject.Singleton interface LuckyNumberDao : BaseDao { @Query("SELECT * FROM LuckyNumbers WHERE student_id = :studentId AND date = :date") - fun load(studentId: Int, date: LocalDate): Flow + fun load(studentId: Int, date: LocalDate): Flow } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt index ef0ced3a5..173ce7e45 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt @@ -3,7 +3,8 @@ package io.github.wulkanowy.data.repositories.luckynumber import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.networkBoundResource -import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map import java.time.LocalDate.now import javax.inject.Inject import javax.inject.Singleton @@ -28,11 +29,8 @@ class LuckyNumberRepository @Inject constructor( } ) - fun getNotNotifiedLuckyNumber(student: Student): Flow { - return local.getLuckyNumber(student, now()) - } + suspend fun getNotNotifiedLuckyNumber(student: Student) = + local.getLuckyNumber(student, now()).map { if (it?.isNotified == false) it else null }.first() - suspend fun updateLuckyNumber(luckyNumber: LuckyNumber?) { - local.updateLuckyNumber(luckyNumber) - } + suspend fun updateLuckyNumber(luckyNumber: LuckyNumber?) = local.updateLuckyNumber(luckyNumber) } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt index 9cb765ec4..7b9f5ab30 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt @@ -19,7 +19,6 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.waitForResult -import kotlinx.coroutines.flow.first import javax.inject.Inject import kotlin.random.Random @@ -33,7 +32,7 @@ class LuckyNumberWork @Inject constructor( override suspend fun doWork(student: Student, semester: Semester) { luckyNumberRepository.getLuckyNumber(student, true, preferencesRepository.isNotificationsEnable).waitForResult() - luckyNumberRepository.getNotNotifiedLuckyNumber(student).first()?.let { + luckyNumberRepository.getNotNotifiedLuckyNumber(student)?.let { notify(it) luckyNumberRepository.updateLuckyNumber(it.apply { isNotified = true }) } From 0f65af8958925d5780d9275e784570529a706d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 1 Sep 2020 23:57:56 +0200 Subject: [PATCH 0131/1526] Fix grade summary empty view (#941) --- .../ui/modules/grade/summary/GradeSummaryAdapter.kt | 2 +- .../ui/modules/grade/summary/GradeSummaryPresenter.kt | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt index 30c4ccc23..ccebe94f0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt @@ -21,7 +21,7 @@ class GradeSummaryAdapter @Inject constructor() : RecyclerView.Adapter() - override fun getItemCount() = items.size + 1 + override fun getItemCount() = items.size + if (items.isNotEmpty()) 1 else 0 override fun getItemViewType(position: Int) = when (position) { 0 -> ViewType.HEADER.id diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 9484d8b77..caa3cb84d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -45,16 +45,17 @@ class GradeSummaryPresenter @Inject constructor( Status.LOADING -> Timber.i("Loading grade summary started") Status.SUCCESS -> { Timber.i("Loading grade summary result: Success") + val items = createGradeSummaryItems(it.data!!) view?.run { - showEmpty(it.data!!.isEmpty()) - showContent(it.data.isNotEmpty()) + showEmpty(items.isEmpty()) + showContent(items.isNotEmpty()) showErrorView(false) - updateData(createGradeSummaryItems(it.data)) + updateData(items) } analytics.logEvent( "load_data", "type" to "grade_summary", - "items" to it.data!!.size + "items" to it.data.size ) } Status.ERROR -> { From 69a11931547358f030330fac4f9a49e4ba74603b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 1 Sep 2020 23:58:18 +0200 Subject: [PATCH 0132/1526] Fix semester list refresh on no current semester found (#940) --- .../semester/SemesterRepository.kt | 42 ++++++++++++------- .../semester/SemesterRepositoryTest.kt | 23 +++++++++- 2 files changed, 47 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt index 28d37ed85..7a76503f2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories.semester +import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.DispatchersProvider @@ -18,24 +19,33 @@ class SemesterRepository @Inject constructor( ) { suspend fun getSemesters(student: Student, forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false) = withContext(dispatchers.backgroundThread) { - local.getSemesters(student).let { semesters -> - semesters.filter { - !forceRefresh && when { - Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API -> semesters.firstOrNull { it.isCurrent }?.diaryId != 0 - refreshOnNoCurrent -> semesters.any { semester -> semester.isCurrent } - else -> true - } - } - }.ifEmpty { - val new = remote.getSemesters(student) - if (new.isEmpty()) throw IllegalArgumentException("Empty semester list!") - - val old = local.getSemesters(student) - local.deleteSemesters(old.uniqueSubtract(new)) - local.saveSemesters(new.uniqueSubtract(old)) + val semesters = local.getSemesters(student) + if (isShouldFetch(student, semesters, forceRefresh, refreshOnNoCurrent)) { + refreshSemesters(student) local.getSemesters(student) - } + } else semesters + } + + private fun isShouldFetch(student: Student, semesters: List, forceRefresh: Boolean, refreshOnNoCurrent: Boolean): Boolean { + val isNoSemesters = semesters.isEmpty() + + val isRefreshOnModeChangeRequired = if (Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { + semesters.firstOrNull { it.isCurrent }?.diaryId == 0 + } else false + + val isRefreshOnNoCurrentAppropriate = refreshOnNoCurrent && !semesters.any { semester -> semester.isCurrent } + + return forceRefresh || isNoSemesters || isRefreshOnModeChangeRequired || isRefreshOnNoCurrentAppropriate + } + + private suspend fun refreshSemesters(student: Student) { + val new = remote.getSemesters(student) + if (new.isEmpty()) throw IllegalArgumentException("Empty semester list!") + + val old = local.getSemesters(student) + local.deleteSemesters(old.uniqueSubtract(new)) + local.saveSemesters(new.uniqueSubtract(old)) } suspend fun getCurrentSemester(student: Student, forceRefresh: Boolean = false) = withContext(dispatchers.backgroundThread) { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt index 866c2af4d..5a2388ff7 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt @@ -63,7 +63,15 @@ class SemesterRepositoryTest { createSemesterEntity(0, 2, now().minusMonths(3), now()) ) + val goodSemesters = listOf( + createSemesterEntity(122, 1, now().minusMonths(6), now().minusMonths(3)), + createSemesterEntity(123, 2, now().minusMonths(3), now()) + ) + coEvery { semesterLocal.getSemesters(student) } returns badSemesters + coEvery { semesterRemote.getSemesters(student) } returns goodSemesters + coEvery { semesterLocal.deleteSemesters(any()) } just Runs + coEvery { semesterLocal.saveSemesters(any()) } just Runs val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) @@ -152,12 +160,23 @@ class SemesterRepositoryTest { @Test fun getSemesters_noCurrent_refreshOnNoCurrent() { - val semesters = listOf( + val semestersWithNoCurrent = listOf( createSemesterEntity(1, 1, now().minusMonths(12), now().minusMonths(6)), createSemesterEntity(1, 2, now().minusMonths(6), now().minusMonths(1)) ) - coEvery { semesterLocal.getSemesters(student) } returns semesters + val newSemesters = listOf( + createSemesterEntity(1, 1, now().minusMonths(12), now().minusMonths(6)), + createSemesterEntity(1, 2, now().minusMonths(6), now().minusMonths(1)), + + createSemesterEntity(2, 1, now().minusMonths(1), now().plusMonths(5)), + createSemesterEntity(2, 2, now().plusMonths(5), now().plusMonths(11)), + ) + + coEvery { semesterLocal.getSemesters(student) } returns semestersWithNoCurrent + coEvery { semesterRemote.getSemesters(student) } returns newSemesters + coEvery { semesterLocal.deleteSemesters(any()) } just Runs + coEvery { semesterLocal.saveSemesters(any()) } just Runs val items = runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } assertEquals(2, items.size) From 40492e6c01ac8212a02dcb5d23555e9f48036f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 2 Sep 2020 00:14:18 +0200 Subject: [PATCH 0133/1526] Version 0.20.1 --- .travis.yml | 2 +- README.en.md | 1 - README.md | 1 - app/build.gradle | 2 +- app/src/main/play/release-notes/pl-PL/default.txt | 8 +++++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index c9f9bbe16..e8366be2a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.20.0 + - 0.20.1 android: licenses: diff --git a/README.en.md b/README.en.md index 7444cccae..28cce1c34 100644 --- a/README.en.md +++ b/README.en.md @@ -47,7 +47,6 @@ You can also download a [development version](https://wulkanowy.github.io/#downl * [Wulkanowy SDK](https://github.com/wulkanowy/sdk) -* [RxJava 2](https://github.com/ReactiveX/RxJava) * [Dagger 2](https://github.com/google/dagger) * [Room](https://developer.android.com/topic/libraries/architecture/room) * [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager) diff --git a/README.md b/README.md index 61b13444a..02e1900c8 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,6 @@ Możesz także pobrać [wersję rozwojową](https://wulkanowy.github.io/#downloa ## Zbudowana za pomocą * [Wulkanowy SDK](https://github.com/wulkanowy/SDK) -* [RxJava 2](https://github.com/ReactiveX/RxJava) * [Dagger 2](https://github.com/google/dagger) * [Room](https://developer.android.com/topic/libraries/architecture/room) * [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager) diff --git a/app/build.gradle b/app/build.gradle index 8dd3b1f8d..eb9329787 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,7 +126,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.20.0" + implementation "io.github.wulkanowy:sdk:0.20.1" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 5cf0c5175..51c3c13ac 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,7 @@ -Wersja 0.20.0 -- naprawiliśmy obsługę wiadomości -- naprawiliśmy wyświetlanie oznaczenia klasy ucznia w menadżerze kont +Wersja 0.20.1 +- naprawiliśmy powiadomienie o szczęśliwym numerku +- naprawiliśmy przełączanie na nowy rok szkolny +- naprawiliśmy funkcję resetowania hasła +- dodaliśmy dziennik e-Skarżysko Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From ee168bafe0df36d4d3dc0a952bebc8fcabdd86c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 2 Sep 2020 00:23:41 +0200 Subject: [PATCH 0134/1526] Version 0.20.2 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index e8366be2a..688dd0006 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.20.1 + - 0.20.2 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index eb9329787..b046834a6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 64 - versionName "0.20.0" + versionCode 66 + versionName "0.20.2" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -126,7 +126,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.20.1" + implementation "io.github.wulkanowy:sdk:0.20.2" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 51c3c13ac..d0e2c8233 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 0.20.1 +Wersja 0.20.2 - naprawiliśmy powiadomienie o szczęśliwym numerku - naprawiliśmy przełączanie na nowy rok szkolny - naprawiliśmy funkcję resetowania hasła From 6ded83d1327ce7a0ddb5b3be0e90f0c4c776b790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 3 Sep 2020 20:52:24 +0200 Subject: [PATCH 0135/1526] Fix attendance item description (#943) --- .../ui/modules/attendance/AttendanceAdapter.kt | 3 ++- .../ui/modules/attendance/AttendanceDialog.kt | 3 ++- .../wulkanowy/utils/AttendanceExtension.kt | 16 +++++++++++++++- app/src/main/res/values-pl/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt index a63d5045a..8e8a6149d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.repositories.attendance.SentExcuseStatus import io.github.wulkanowy.databinding.ItemAttendanceBinding +import io.github.wulkanowy.utils.description import javax.inject.Inject class AttendanceAdapter @Inject constructor() : @@ -34,7 +35,7 @@ class AttendanceAdapter @Inject constructor() : with(holder.binding) { attendanceItemNumber.text = item.number.toString() attendanceItemSubject.text = item.subject - attendanceItemDescription.text = item.name + attendanceItemDescription.setText(item.description) attendanceItemAlert.visibility = item.run { if (absence && !excused) View.VISIBLE else View.INVISIBLE } attendanceItemNumber.visibility = View.GONE attendanceItemExcuseInfo.visibility = View.GONE diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt index 97b76e812..d5e2fe122 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.databinding.DialogAttendanceBinding +import io.github.wulkanowy.utils.description import io.github.wulkanowy.utils.lifecycleAwareVariable import io.github.wulkanowy.utils.toFormattedString @@ -43,7 +44,7 @@ class AttendanceDialog : DialogFragment() { with(binding) { attendanceDialogSubject.text = attendance.subject - attendanceDialogDescription.text = attendance.name + attendanceDialogDescription.setText(attendance.description) attendanceDialogDate.text = attendance.date.toFormattedString() attendanceDialogNumber.text = attendance.number.toString() attendanceDialogClose.setOnClickListener { dismiss() } 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 c2b1efaa8..92e8661fe 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt @@ -1,6 +1,9 @@ package io.github.wulkanowy.utils +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.AttendanceSummary +import io.github.wulkanowy.sdk.scrapper.attendance.AttendanceCategory /** * [UONET+ - Zasady tworzenia podsumowań liczb uczniów obecnych i nieobecnych w tabeli frekwencji] @@ -23,4 +26,15 @@ private fun calculatePercentage(presence: Double, absence: Double): Double { return if ((presence + absence) == 0.0) 0.0 else (presence / (presence + absence)) * 100 } - +inline val Attendance.description + get() = when (AttendanceCategory.valueOf(name)) { + AttendanceCategory.PRESENCE -> R.string.attendance_present + AttendanceCategory.ABSENCE_UNEXCUSED -> R.string.attendance_absence_unexcused + AttendanceCategory.ABSENCE_EXCUSED -> R.string.attendance_absence_excused + AttendanceCategory.UNEXCUSED_LATENESS -> R.string.attendance_unexcused_lateness + AttendanceCategory.EXCUSED_LATENESS -> R.string.attendance_excused_lateness + AttendanceCategory.ABSENCE_FOR_SCHOOL_REASONS -> R.string.attendance_absence_school + AttendanceCategory.EXEMPTION -> R.string.attendance_exemption + AttendanceCategory.DELETED -> R.string.attendance_deleted + else -> R.string.attendance_unknown + } diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e4d3e9029..ebc145423 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -168,6 +168,8 @@ Spóźnienie usprawiedliwione Spóźnienie nieusprawiedliwione Obecność + Usunięty + Nieznany Numer lekcji Brak wpisów diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1eaebf284..963c70478 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -170,6 +170,8 @@ Excused lateness Unexcused lateness Present + Deleted + Unknown Number of lesson No entries From 18b9bf42e115ebf24885e6a4e4cb2e73c7e562ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 3 Sep 2020 20:54:28 +0200 Subject: [PATCH 0136/1526] Fix crash in flowWithResourceIn() (#944) --- app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index aec524259..ba8bfd85f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -7,6 +7,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import timber.log.Timber @@ -63,7 +64,7 @@ open class BasePresenter( fun Flow.launch(individualJobTag: String = "load"): Job { jobs[individualJobTag]?.cancel() - val job = launchIn(this@BasePresenter) + val job = catch { errorHandler.dispatch(it) }.launchIn(this@BasePresenter) jobs[individualJobTag] = job Timber.d("Job $individualJobTag launched in ${this@BasePresenter.javaClass.simpleName}: $job") return job From debb21f5f9945502ddf470c09aecd96ec05f8594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 3 Sep 2020 21:10:39 +0200 Subject: [PATCH 0137/1526] Add full stacktrace to errors list in sync now (#945) --- .../java/io/github/wulkanowy/services/sync/SyncWorker.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt index 2ba0435b4..13326ca06 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt @@ -50,13 +50,16 @@ class SyncWorker @WorkerInject constructor( } catch (e: Throwable) { Timber.w("${work::class.java.simpleName} result: An exception ${e.message} occurred") if (e is FeatureDisabledException || e is FeatureNotAvailableException) null - else e + else { + Timber.e(e) + e + } } } val result = when { exceptions.isNotEmpty() && inputData.getBoolean("one_time", false) -> { Result.failure(Data.Builder() - .putString("error", exceptions.toString()) + .putString("error", exceptions.map { it.stackTraceToString() }.toString()) .build() ) } From 9a7c04fe7b590f1661b0c25387d6b4a5f9f7f71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 4 Sep 2020 23:42:01 +0200 Subject: [PATCH 0138/1526] Version 0.20.3 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 7 ++----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 688dd0006..1c1038b82 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.20.2 + - 0.20.3 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index b046834a6..2d608f973 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 66 - versionName "0.20.2" + versionCode 67 + versionName "0.20.3" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -126,7 +126,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.20.2" + implementation "io.github.wulkanowy:sdk:0.20.3" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index d0e2c8233..47df9980f 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,7 +1,4 @@ -Wersja 0.20.2 -- naprawiliśmy powiadomienie o szczęśliwym numerku -- naprawiliśmy przełączanie na nowy rok szkolny -- naprawiliśmy funkcję resetowania hasła -- dodaliśmy dziennik e-Skarżysko +Wersja 0.20.3 +- naprawiliśmy opisy wpisów frekwencyjnych, które teraz będą już w całości po polsku Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From c30f105be558acac6a783e40116f22fc65aefd7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 7 Sep 2020 09:35:26 +0200 Subject: [PATCH 0139/1526] Fix crash on unknown attendance category type (#949) --- app/build.gradle | 2 +- .../main/java/io/github/wulkanowy/utils/AttendanceExtension.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2d608f973..cb7995d40 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,7 +126,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.20.3" + implementation "io.github.wulkanowy:sdk:0faa503" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' 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 92e8661fe..f10b00a07 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt @@ -27,7 +27,7 @@ private fun calculatePercentage(presence: Double, absence: Double): Double { } inline val Attendance.description - get() = when (AttendanceCategory.valueOf(name)) { + get() = when (AttendanceCategory.getCategoryByName(name)) { AttendanceCategory.PRESENCE -> R.string.attendance_present AttendanceCategory.ABSENCE_UNEXCUSED -> R.string.attendance_absence_unexcused AttendanceCategory.ABSENCE_EXCUSED -> R.string.attendance_absence_excused From 6363c90e37452508d011be4f8e573664d17b311e Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Mon, 7 Sep 2020 20:28:32 +0200 Subject: [PATCH 0140/1526] Disable sound of upcoming lessons notification (fix) (#950) --- .../main/java/io/github/wulkanowy/services/sync/SyncManager.kt | 1 + .../wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt index 1d005ae8e..47a949273 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt @@ -44,6 +44,7 @@ class SyncManager @Inject constructor( if (SDK_INT >= O) { channels.forEach { it.create() } + notificationManager.deleteNotificationChannel("lesson_channel") notificationManager.deleteNotificationChannel("new_entries_channel") } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt index 41fb61925..63b3a4f91 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/UpcomingLessonsChannel.kt @@ -17,7 +17,7 @@ class UpcomingLessonsChannel @Inject constructor( ) : Channel { companion object { - const val CHANNEL_ID = "lesson_channel" + const val CHANNEL_ID = "upcoming_lesson_channel" } override fun create() { From ec761f63294d977b46455a09c68d65236903436f Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Tue, 8 Sep 2020 20:13:17 +0200 Subject: [PATCH 0141/1526] Fix bug in grade statistics (#951) --- .../ui/modules/grade/statistics/GradeStatisticsPresenter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt index 112f4c582..73cee9e96 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt @@ -164,8 +164,8 @@ class GradeStatisticsPresenter @Inject constructor( Status.SUCCESS -> { Timber.i("Loading grade stats result: Success") view?.run { - showEmpty(it.data!!.isEmpty()) - showContent(it.data.isNotEmpty()) + showEmpty(it.data!!.isEmpty() || it.data.first().partial.isEmpty()) + showContent(it.data.isNotEmpty() && it.data.first().partial.isNotEmpty()) showErrorView(false) updateData(it.data, preferencesRepository.gradeColorTheme, preferencesRepository.showAllSubjectsOnStatisticsList) showSubjects(!preferencesRepository.showAllSubjectsOnStatisticsList) From 6e56d3ff061d14308f8011723d56f3b56b4ca07d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 9 Sep 2020 13:28:44 +0200 Subject: [PATCH 0142/1526] Ignore empty semesters on refresh (#955) --- .../wulkanowy/data/repositories/semester/SemesterRepository.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt index 7a76503f2..2748f1df5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.utils.getCurrentOrLast import io.github.wulkanowy.utils.isCurrent import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.withContext +import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @@ -41,7 +42,7 @@ class SemesterRepository @Inject constructor( private suspend fun refreshSemesters(student: 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) local.deleteSemesters(old.uniqueSubtract(new)) From adde5541e2f4d42972c7e04eb3efa370ddc761f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 11 Sep 2020 13:02:16 +0200 Subject: [PATCH 0143/1526] Move timetable notifications scheduling to background thread (#954) --- .../TimetableNotificationSchedulerHelper.kt | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt index 8f8782a2f..5c4b916bc 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt @@ -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_NAME import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.toTimestamp +import kotlinx.coroutines.withContext import timber.log.Timber import java.time.LocalDateTime import java.time.LocalDateTime.now @@ -35,7 +37,8 @@ import javax.inject.Inject class TimetableNotificationSchedulerHelper @Inject constructor( @ApplicationContext private val context: Context, 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() @@ -44,13 +47,15 @@ class TimetableNotificationSchedulerHelper @Inject constructor( return day.getOrNull(index - 1)?.end ?: lesson.start.minusMinutes(30) } - fun cancelScheduled(lessons: List, studentId: Int = 1) { - lessons.sortedBy { it.start }.forEachIndexed { index, lesson -> - val upcomingTime = getUpcomingLessonTime(index, lessons, lesson) - cancelScheduledTo(upcomingTime..lesson.start, getRequestCode(upcomingTime, studentId)) - cancelScheduledTo(lesson.start..lesson.end, getRequestCode(lesson.start, studentId)) + suspend fun cancelScheduled(lessons: List, studentId: Int = 1) { + withContext(dispatchersProvider.backgroundThread) { + lessons.sortedBy { it.start }.forEachIndexed { index, lesson -> + val upcomingTime = getUpcomingLessonTime(index, lessons, lesson) + 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 scheduleNotifications(lessons: List, student: Student) { + suspend fun scheduleNotifications(lessons: List, student: Student) { if (!preferencesRepository.isUpcomingLessonsNotificationsEnable) return cancelScheduled(lessons, student.studentId) - lessons.groupBy { it.date } - .map { it.value.sortedBy { lesson -> lesson.start } } - .map { it.filter { lesson -> !lesson.canceled && lesson.isStudentPlan } } - .map { day -> - day.forEachIndexed { index, lesson -> - val intent = createIntent(student, lesson, day.getOrNull(index + 1)) + withContext(dispatchersProvider.backgroundThread) { + lessons.groupBy { it.date } + .map { it.value.sortedBy { lesson -> lesson.start } } + .map { it.filter { lesson -> !lesson.canceled && lesson.isStudentPlan } } + .map { day -> + day.forEachIndexed { index, lesson -> + val intent = createIntent(student, lesson, day.getOrNull(index + 1)) - if (lesson.start > now()) { - scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_UPCOMING, getUpcomingLessonTime(index, day, lesson)) - } + if (lesson.start > now()) { + scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_UPCOMING, getUpcomingLessonTime(index, day, lesson)) + } - if (lesson.end > now()) { - scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_CURRENT, lesson.start) - if (day.lastIndex == index) { - scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION, lesson.end) + if (lesson.end > now()) { + scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_CURRENT, lesson.start) + if (day.lastIndex == index) { + scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION, lesson.end) + } } } } - } + } } private fun createIntent(student: Student, lesson: Timetable, nextLesson: Timetable?): Intent { From cd51fac621c9cee5a87018ec43fae54708a1ef62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 13 Sep 2020 13:46:45 +0200 Subject: [PATCH 0144/1526] Add eduportal.koszalin.pl register (#959) --- app/build.gradle | 2 +- app/src/main/res/values/api_hosts.xml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index cb7995d40..c4c6efa86 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,7 +126,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0faa503" + implementation "io.github.wulkanowy:sdk:7c0e838" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/res/values/api_hosts.xml b/app/src/main/res/values/api_hosts.xml index 64618568a..29434602e 100644 --- a/app/src/main/res/values/api_hosts.xml +++ b/app/src/main/res/values/api_hosts.xml @@ -7,6 +7,7 @@ Lubelski Portal Oświatowy EduNet Miasta Tarnowa ResMan Rzeszów + Platforma Edukacyjna Koszalina Rawa Mazowiecka - Platforma vEdukacja Zduńska Wola - e-Urząd Sieradz - Portal oświatowy @@ -27,6 +28,7 @@ https://edu.lublin.eu https://umt.tarnow.pl https://resman.pl + https://eduportal.koszalin.pl https://vulcan.net.pl/ https://vulcan.net.pl/ https://vulcan.net.pl/ @@ -47,6 +49,7 @@ lublin tarnow rzeszow + koszalin rawamazowiecka zdunskawola sieradz From 7cfe58d311f0f75d17c9fb8d9f5f86a0dc2bb50e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2020 14:02:31 +0000 Subject: [PATCH 0145/1526] Bump material from 1.2.0 to 1.2.1 (#963) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c4c6efa86..e4d84e0c2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -147,7 +147,7 @@ dependencies { implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.constraintlayout:constraintlayout:2.0.1" 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.PhilJay:MPAndroidChart:v3.1.0" implementation "me.zhanghai.android.materialprogressbar:library:1.6.1" From 53561668fc704dfed91a9ac42f53fe82821e4ac7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2020 14:03:09 +0000 Subject: [PATCH 0146/1526] Bump hilt_version from 2.28.3-alpha to 2.29.1-alpha (#962) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9f239fddc..7ccadff37 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.4.0' about_libraries = '8.3.0' - hilt_version = "2.28.3-alpha" + hilt_version = "2.29.1-alpha" } repositories { mavenCentral() From acf5c8e9ba6708baec1dde1d979c5c1345af44ed Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2020 14:04:41 +0000 Subject: [PATCH 0147/1526] Bump firebase-crashlytics-gradle from 2.2.1 to 2.3.0 (#964) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7ccadff37..d40c71dcb 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { classpath 'com.android.tools.build:gradle:4.0.1' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" 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 "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" From 792b1235982ce87b3334b19812f77b9df1f38d5a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2020 14:07:30 +0000 Subject: [PATCH 0148/1526] Bump coil from 1.0.0-rc1 to 1.0.0-rc2 (#961) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e4d84e0c2..eb1cab5e8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -176,7 +176,7 @@ dependencies { implementation "fr.bipi.treessence:treessence:0.3.2" implementation "com.mikepenz:aboutlibraries-core:$about_libraries" 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 'me.xdrop:fuzzywuzzy:1.3.1' From 47150364d862fff62feac2008844e7630a7403fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 13 Sep 2020 16:27:53 +0200 Subject: [PATCH 0149/1526] Fix lifecycle of timer tasks in timetable lessons (#958) Co-authored-by: Faierbel --- .../java/io/github/wulkanowy/data/Resource.kt | 2 +- .../ui/modules/timetable/TimetableAdapter.kt | 18 +++++++++--------- .../ui/modules/timetable/TimetableFragment.kt | 1 + .../io/github/wulkanowy/utils/FlowUtils.kt | 2 +- build.gradle | 2 +- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/Resource.kt b/app/src/main/java/io/github/wulkanowy/data/Resource.kt index ae22832aa..406440c83 100644 --- a/app/src/main/java/io/github/wulkanowy/data/Resource.kt +++ b/app/src/main/java/io/github/wulkanowy/data/Resource.kt @@ -1,6 +1,6 @@ package io.github.wulkanowy.data -data class Resource(val status: Status, val data: T?, val error: Throwable?) { +data class Resource(val status: Status, val data: T?, val error: Throwable?) { companion object { fun success(data: T?): Resource { return Resource(Status.SUCCESS, data, null) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index d87f06207..58be38cec 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -6,6 +6,7 @@ import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.TextView +import androidx.core.view.ViewCompat import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable @@ -44,8 +45,8 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter() - private fun resetTimers() { - Timber.d("Timetable timers reset") + fun resetTimers() { + Timber.d("Timetable timers (${timers.size}) reset") with(timers) { forEach { (_, timer) -> timer.cancel() } clear() @@ -69,11 +70,6 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter(R.layout.fragme } override fun onDestroyView() { + timetableAdapter.resetTimers() presenter.onDetachView() super.onDestroyView() } diff --git a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt index 314994054..23b86dd35 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt @@ -89,7 +89,7 @@ fun flowWithResourceIn(block: suspend () -> Flow>) = flow { } } } catch (e: Throwable) { - emit(Resource.error(e)) + emit(Resource.error(e)) } } diff --git a/build.gradle b/build.gradle index d40c71dcb..4205cce56 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.4.0' + kotlin_version = '1.4.10' about_libraries = '8.3.0' hilt_version = "2.29.1-alpha" } From 5d8fb376abcae8211409ecfdcd354ee4a56f7256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 13 Sep 2020 18:37:34 +0200 Subject: [PATCH 0150/1526] Expand exam sync date range to next month (#960) --- .../data/repositories/exam/ExamRepository.kt | 8 ++-- .../wulkanowy/services/sync/works/ExamWork.kt | 4 +- .../github/wulkanowy/utils/TimeExtension.kt | 9 ++++- .../wulkanowy/utils/TimeExtensionTest.kt | 38 +++++++++++++++++++ 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt index e7f115ac6..3f4591a25 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt @@ -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.Student -import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.endExamsDay 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 java.time.LocalDate 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( shouldFetch = { it.isEmpty() || forceRefresh }, - query = { local.getExams(semester, start.monday, end.sunday) }, - fetch = { remote.getExams(student, semester, start.monday, end.sunday) }, + query = { local.getExams(semester, start.startExamsDay, start.endExamsDay) }, + fetch = { remote.getExams(student, semester, start.startExamsDay, start.endExamsDay) }, saveFetchResult = { old, new -> local.deleteExams(old uniqueSubtract new) local.saveExams(new uniqueSubtract old) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt index f7d8db0ae..899d45cba 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt @@ -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.Student 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 java.time.LocalDate.now import javax.inject.Inject @@ -12,6 +10,6 @@ import javax.inject.Inject class ExamWork @Inject constructor(private val examRepository: ExamRepository) : Work { 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() } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt index d1aba1605..9bd30e878 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt @@ -13,8 +13,7 @@ import java.time.Month import java.time.ZoneId import java.time.ZoneOffset import java.time.format.DateTimeFormatter.ofPattern -import java.time.format.TextStyle.FULL_STANDALONE -import java.time.format.TextStyle.* +import java.time.format.TextStyle.FULL import java.time.temporal.TemporalAdjusters.firstInMonth import java.time.temporal.TemporalAdjusters.next 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 get() { return when (dayOfWeek) { diff --git a/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt index 9709ded36..d604dfef4 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/TimeExtensionTest.kt @@ -171,4 +171,42 @@ class TimeExtensionTest { assertEquals(of(2019, 5, 1), of(2019, 5, 1).getLastSchoolDayIfHoliday(2018)) 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) + } + } } From cd92f37435f8122db016072a9fc6a99790d343d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 13 Sep 2020 19:00:32 +0200 Subject: [PATCH 0151/1526] Version 0.20.4 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 7 +++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1c1038b82..eadf43fcb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.20.3 + - 0.20.4 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index eb1cab5e8..d99364801 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 67 - versionName "0.20.3" + versionCode 68 + versionName "0.20.4" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -126,7 +126,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:7c0e838" + implementation "io.github.wulkanowy:sdk:0.20.4" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 47df9980f..6ca04c57f 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,7 @@ -Wersja 0.20.3 -- naprawiliśmy opisy wpisów frekwencyjnych, które teraz będą już w całości po polsku +Wersja 0.20.4 +- 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 From 73be4168078678233d71619d8905bc9ddfe22c29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 19 Sep 2020 00:57:55 +0200 Subject: [PATCH 0152/1526] Fix crash in flowWithResourceIn() (#967) --- app/build.gradle | 2 +- .../github/wulkanowy/data/db/dao/MessagesDao.kt | 2 +- .../github/wulkanowy/data/db/entities/Message.kt | 12 ++++++------ .../data/repositories/message/MessageLocal.kt | 3 +-- .../data/repositories/message/MessageRemote.kt | 4 ++-- .../repositories/message/MessageRepository.kt | 4 +++- .../message/preview/MessagePreviewPresenter.kt | 4 +++- .../java/io/github/wulkanowy/utils/FlowUtils.kt | 16 ++++++---------- .../java/io/github/wulkanowy/TestEnityCreator.kt | 4 ++-- 9 files changed, 25 insertions(+), 26 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d99364801..9107f8107 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,7 +126,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.20.4" + implementation "io.github.wulkanowy:sdk:b652036" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt index 79050de0f..729ba6a68 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt @@ -12,7 +12,7 @@ interface MessagesDao : BaseDao { @Transaction @Query("SELECT * FROM Messages WHERE student_id = :studentId AND message_id = :messageId") - fun loadMessageWithAttachment(studentId: Int, messageId: Int): Flow + fun loadMessageWithAttachment(studentId: Int, messageId: Int): Flow @Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder ORDER BY date DESC") fun loadAll(studentId: Int, folder: Int): Flow> diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt index 914dc3816..1f10a1645 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt @@ -36,12 +36,6 @@ data class Message( var unread: Boolean, - @ColumnInfo(name = "unread_by") - val unreadBy: Int, - - @ColumnInfo(name = "read_by") - val readBy: Int, - val removed: Boolean, @ColumnInfo(name = "has_attachments") @@ -54,5 +48,11 @@ data class Message( @ColumnInfo(name = "is_notified") var isNotified: Boolean = true + @ColumnInfo(name = "unread_by") + var unreadBy: Int = 0 + + @ColumnInfo(name = "read_by") + var readBy: Int = 0 + var content: String = "" } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt index 730bd005b..f1c8eaf08 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.message.MessageFolder.TRASHED import kotlinx.coroutines.flow.Flow import javax.inject.Inject import javax.inject.Singleton @@ -29,7 +28,7 @@ class MessageLocal @Inject constructor( messagesDb.deleteAll(messages) } - fun getMessageWithAttachment(student: Student, message: Message): Flow { + fun getMessageWithAttachment(student: Student, message: Message): Flow { return messagesDb.loadMessageWithAttachment(student.id.toInt(), message.messageId) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt index fdf0c6754..044a13a28 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt @@ -30,12 +30,12 @@ class MessageRemote @Inject constructor(private val sdk: Sdk) { date = it.date ?: now(), folderId = it.folderId, unread = it.unread ?: false, - unreadBy = it.unreadBy ?: 0, - readBy = it.readBy ?: 0, removed = it.removed, hasAttachments = it.hasAttachments ).apply { content = it.content.orEmpty() + unreadBy = it.unreadBy ?: 0 + readBy = it.readBy ?: 0 } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt index f653f2683..bb9326992 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt @@ -34,12 +34,14 @@ class MessageRepository @Inject constructor( fun getMessage(student: Student, message: Message, markAsRead: Boolean = false) = networkBoundResource( shouldFetch = { + checkNotNull(it, { "This message no longer exist!" }) Timber.d("Message content in db empty: ${it.message.content.isEmpty()}") it.message.unread || it.message.content.isEmpty() }, query = { local.getMessageWithAttachment(student, message) }, - fetch = { remote.getMessagesContentDetails(student, it.message, markAsRead) }, + fetch = { remote.getMessagesContentDetails(student, it!!.message, markAsRead) }, saveFetchResult = { old, (downloadedMessage, attachments) -> + checkNotNull(old, { "Fetched message no longer exist!" }) local.updateMessages(listOf(old.message.copy(unread = !markAsRead).apply { id = old.message.id content = content.ifBlank { downloadedMessage } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index d261d1ee1..7a633a2df 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -64,7 +64,8 @@ class MessagePreviewPresenter @Inject constructor( when (it.status) { Status.LOADING -> Timber.i("Loading message ${message.messageId} preview started") Status.SUCCESS -> { - Timber.i("Loading message ${it.data!!.message.messageId} preview result: Success ") + Timber.i("Loading message ${message.messageId} preview result: Success ") + checkNotNull(it.data, { "Can't find message in local db! Probably no longer exist in this folder" }) this@MessagePreviewPresenter.message = it.data.message this@MessagePreviewPresenter.attachments = it.data.attachments view?.apply { @@ -194,6 +195,7 @@ class MessagePreviewPresenter @Inject constructor( view?.run { lastError = error setErrorDetails(message) + showContent(false) showErrorView(true) setErrorRetryCallback { retryCallback() } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt index 23b86dd35..724458c04 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt @@ -80,17 +80,13 @@ fun flowWithResource(block: suspend () -> T) = flow { fun flowWithResourceIn(block: suspend () -> Flow>) = flow { emit(Resource.loading()) - try { - block() - .catch { emit(Resource.error(it)) } - .collect { - if (it.status != Status.LOADING) { // LOADING is already emitted - emit(it) - } + block() + .catch { emit(Resource.error(it)) } + .collect { + if (it.status != Status.LOADING) { // LOADING is already emitted + emit(it) } - } catch (e: Throwable) { - emit(Resource.error(e)) - } + } } fun Flow>.afterLoading(callback: () -> Unit) = onEach { diff --git a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt index 35a20030b..d15dc9530 100644 --- a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt +++ b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt @@ -90,10 +90,10 @@ fun getMessageEntity( date = now(), folderId = 1, unread = unread, - unreadBy = 1, - readBy = 1, removed = false, hasAttachments = false ).apply { this.content = content + unreadBy = 1 + readBy = 1 } From d6ebc343d5b039c909ed32e729d9091ec51da008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 19 Sep 2020 01:25:34 +0200 Subject: [PATCH 0153/1526] Version 0.20.5 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 8 +++----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index eadf43fcb..5dbd9e366 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.20.4 + - 0.20.5 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index 9107f8107..11a82fbd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 68 - versionName "0.20.4" + versionCode 69 + versionName "0.20.5" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -126,7 +126,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:b652036" + implementation "io.github.wulkanowy:sdk:0.20.5" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 6ca04c57f..62a71f437 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,7 +1,5 @@ -Wersja 0.20.4 -- 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 +Wersja 0.20.5 +- naprawiliśmy logowanie do koszalińskiego dziennika +- naprawiliśmy resetowanie hasła na gdańskim dzienniku Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From b0b3ccfd530e2b450804c194365b4e4fe225c754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 20 Sep 2020 21:54:59 +0200 Subject: [PATCH 0154/1526] Upgrade gradle wrapper to 6.6.1 (#968) --- .travis.yml | 4 ++-- app/jacoco.gradle | 4 ++-- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 58695 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 ++ gradlew.bat | 22 ++++------------------ 11 files changed, 16 insertions(+), 28 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5dbd9e366..45818739f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,8 +48,8 @@ before_script: script: - ./gradlew dependencies --stacktrace --daemon - fossa --no-ansi || true - - ./gradlew -Pcoverage testPlayDebugUnitTest --stacktrace --daemon - - ./gradlew -Pcoverage createFdroidDebugCoverageReport --stacktrace --daemon + - ./gradlew -Pcoverage testFdroidDebugUnitTest --stacktrace --daemon + - ./gradlew -Pcoverage connectedFdroidDebugAndroidTest --stacktrace --daemon - ./gradlew -Pcoverage jacocoTestReport --stacktrace --daemon - | if [ $TRAVIS_TAG ]; then diff --git a/app/jacoco.gradle b/app/jacoco.gradle index e9abfb613..a5cf84e63 100644 --- a/app/jacoco.gradle +++ b/app/jacoco.gradle @@ -35,13 +35,13 @@ task jacocoTestReport(type: JacocoReport) { dir: "$buildDir/intermediates/classes/debug", excludes: excludes ) + fileTree( - dir: "$buildDir/tmp/kotlin-classes/playDebug", + dir: "$buildDir/tmp/kotlin-classes/fdroidDebug", excludes: excludes )) sourceDirectories.setFrom(files([ "src/main/java", - "src/play/java" + "src/fdroid/java" ])) executionData.setFrom(fileTree( dir: project.projectDir, diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 42169ca53..7e2877674 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -19,7 +19,7 @@ Hausaufgaben Wählen Sie ein Konto - Semester %d, %d/%d + Semester %1$d, %2$d/%3$d Melden Sie sich mit dem Studenten- oder Elternkonto an Geben Sie das Symbol diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ebc145423..bc94b227f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -19,7 +19,7 @@ Zadania domowe Wybierz konto - Semestr %d, %d/%d + Semestr %1$d, %2$d/%3$d Zaloguj się za pomocą konta ucznia lub rodzica Podaj symbol diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 15c583173..7052fbc9c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -19,7 +19,7 @@ Домашние задания Выберите аккаунт - %d семестр, %d/%d + %1$d семестр, %2$d/%3$d Авторизируйтесь при помощи аккаунта ученика или родителя Впишите \"symbol\" diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 423c4e12f..15fe203d5 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -19,7 +19,7 @@ Домашні завдання Оберіть аккаунт - %d семестр, %d/%d + %1$d семестр, %2$d/%3$d Авторизуйтеся за допомогою аккаунта учня або батька Впишіть \"symbol\" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 963c70478..7df2b68a8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,7 +21,7 @@ - Semester %d, %d/%d + Semester %1$d, %2$d/%3$d diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f3d88b1c2faf2fc91d853cd5d4242b5547257070..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch delta 12842 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6623300be..33682bbbf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7d9..4f906e0c8 100755 --- a/gradlew +++ b/gradlew @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index 9109989e3..ac1b06f93 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From 2a74b11cce0a0388d1dd2d5e589a0fa5a23969bb Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Fri, 25 Sep 2020 15:37:19 +0200 Subject: [PATCH 0155/1526] Add app shortcuts (#939) Co-authored-by: Faierbel --- .../wulkanowy/ui/modules/main/MainActivity.kt | 42 +++++++++++++++++- .../drawable-hdpi/ic_shortcut_attendance.png | Bin 0 -> 1536 bytes .../res/drawable-hdpi/ic_shortcut_exam.png | Bin 0 -> 1602 bytes .../res/drawable-hdpi/ic_shortcut_grade.png | Bin 0 -> 1812 bytes .../res/drawable-hdpi/ic_shortcut_message.png | Bin 0 -> 1775 bytes .../drawable-hdpi/ic_shortcut_timetable.png | Bin 0 -> 1625 bytes .../drawable-mdpi/ic_shortcut_attendance.png | Bin 0 -> 902 bytes .../res/drawable-mdpi/ic_shortcut_exam.png | Bin 0 -> 913 bytes .../res/drawable-mdpi/ic_shortcut_grade.png | Bin 0 -> 1034 bytes .../res/drawable-mdpi/ic_shortcut_message.png | Bin 0 -> 1048 bytes .../drawable-mdpi/ic_shortcut_timetable.png | Bin 0 -> 937 bytes .../drawable-xhdpi/ic_shortcut_attendance.png | Bin 0 -> 1907 bytes .../res/drawable-xhdpi/ic_shortcut_exam.png | Bin 0 -> 1940 bytes .../res/drawable-xhdpi/ic_shortcut_grade.png | Bin 0 -> 2231 bytes .../drawable-xhdpi/ic_shortcut_message.png | Bin 0 -> 2387 bytes .../drawable-xhdpi/ic_shortcut_timetable.png | Bin 0 -> 1971 bytes .../ic_shortcut_attendance.png | Bin 0 -> 3393 bytes .../res/drawable-xxhdpi/ic_shortcut_exam.png | Bin 0 -> 3417 bytes .../res/drawable-xxhdpi/ic_shortcut_grade.png | Bin 0 -> 3917 bytes .../drawable-xxhdpi/ic_shortcut_message.png | Bin 0 -> 4279 bytes .../drawable-xxhdpi/ic_shortcut_timetable.png | Bin 0 -> 3457 bytes .../ic_shortcut_attendance.png | Bin 0 -> 4892 bytes .../res/drawable-xxxhdpi/ic_shortcut_exam.png | Bin 0 -> 5027 bytes .../drawable-xxxhdpi/ic_shortcut_grade.png | Bin 0 -> 5529 bytes .../drawable-xxxhdpi/ic_shortcut_message.png | Bin 0 -> 5994 bytes .../ic_shortcut_timetable.png | Bin 0 -> 5087 bytes 26 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_shortcut_attendance.png create mode 100644 app/src/main/res/drawable-hdpi/ic_shortcut_exam.png create mode 100644 app/src/main/res/drawable-hdpi/ic_shortcut_grade.png create mode 100644 app/src/main/res/drawable-hdpi/ic_shortcut_message.png create mode 100644 app/src/main/res/drawable-hdpi/ic_shortcut_timetable.png create mode 100644 app/src/main/res/drawable-mdpi/ic_shortcut_attendance.png create mode 100644 app/src/main/res/drawable-mdpi/ic_shortcut_exam.png create mode 100644 app/src/main/res/drawable-mdpi/ic_shortcut_grade.png create mode 100644 app/src/main/res/drawable-mdpi/ic_shortcut_message.png create mode 100644 app/src/main/res/drawable-mdpi/ic_shortcut_timetable.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_shortcut_attendance.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_shortcut_exam.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_shortcut_grade.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_shortcut_message.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_shortcut_timetable.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_shortcut_attendance.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_shortcut_exam.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_shortcut_grade.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_shortcut_message.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_shortcut_timetable.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_shortcut_attendance.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_shortcut_exam.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_shortcut_grade.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_shortcut_message.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_shortcut_timetable.png diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 035608893..95b4aa77a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -1,14 +1,21 @@ package io.github.wulkanowy.ui.modules.main +import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK import android.content.Intent.FLAG_ACTIVITY_NEW_TASK +import android.content.pm.ShortcutInfo +import android.content.pm.ShortcutManager +import android.graphics.drawable.Icon +import android.os.Build import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Bundle import android.view.Menu import android.view.MenuItem +import androidx.annotation.RequiresApi +import androidx.core.content.getSystemService import androidx.core.view.ViewCompat import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment @@ -31,6 +38,7 @@ import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.more.MoreFragment import io.github.wulkanowy.ui.modules.note.NoteFragment import io.github.wulkanowy.ui.modules.timetable.TimetableFragment +import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.getThemeAttrColor @@ -48,6 +56,9 @@ class MainActivity : BaseActivity(), MainVie @Inject lateinit var analytics: FirebaseAnalyticsHelper + @Inject + lateinit var appInfo: AppInfo + private val overlayProvider by lazy { ElevationOverlayProvider(this) } private val navController = FragNavController(supportFragmentManager, R.id.mainFragmentContainer) @@ -59,7 +70,7 @@ class MainActivity : BaseActivity(), MainVie return Intent(context, MainActivity::class.java) .apply { if (clear) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK - startMenu?.let { putExtra(EXTRA_START_MENU, it) } + startMenu?.let { putExtra(EXTRA_START_MENU, it.id) } } } } @@ -83,18 +94,45 @@ class MainActivity : BaseActivity(), MainVie MainView.Section.LUCKY_NUMBER.id to LuckyNumberFragment.newInstance() ) + @SuppressLint("NewApi") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(ActivityMainBinding.inflate(layoutInflater).apply { binding = this }.root) setSupportActionBar(binding.mainToolbar) messageContainer = binding.mainFragmentContainer - presenter.onAttachView(this, intent.getSerializableExtra(EXTRA_START_MENU) as? MainView.Section) + presenter.onAttachView(this, MainView.Section.values().singleOrNull { it.id == intent.getIntExtra(EXTRA_START_MENU, -1) }) with(navController) { initialize(startMenuIndex, savedInstanceState) pushFragment(moreMenuFragments[startMenuMoreIndex]) } + if (appInfo.systemVersion >= Build.VERSION_CODES.N_MR1) initShortcuts() + } + + @RequiresApi(Build.VERSION_CODES.N_MR1) + fun initShortcuts() { + val shortcutsList = mutableListOf() + + listOf( + Triple(getString(R.string.grade_title), R.drawable.ic_shortcut_grade, MainView.Section.GRADE), + Triple(getString(R.string.attendance_title), R.drawable.ic_shortcut_attendance, MainView.Section.ATTENDANCE), + Triple(getString(R.string.exam_title), R.drawable.ic_shortcut_exam, MainView.Section.EXAM), + Triple(getString(R.string.timetable_title), R.drawable.ic_shortcut_timetable, MainView.Section.TIMETABLE), + Triple(getString(R.string.message_title), R.drawable.ic_shortcut_message, MainView.Section.MESSAGE) + ).forEach { (title, icon, enum) -> + shortcutsList.add(ShortcutInfo.Builder(applicationContext, title) + .setShortLabel(title) + .setLongLabel(title) + .setIcon(Icon.createWithResource(applicationContext, icon)) + .setIntents(arrayOf( + Intent(applicationContext, MainActivity::class.java).setAction(Intent.ACTION_VIEW), + Intent(applicationContext, MainActivity::class.java).putExtra(EXTRA_START_MENU, enum.id) + .setAction(Intent.ACTION_VIEW).addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK))) + .build()) + } + + getSystemService()?.dynamicShortcuts = shortcutsList } override fun onCreateOptionsMenu(menu: Menu?): Boolean { diff --git a/app/src/main/res/drawable-hdpi/ic_shortcut_attendance.png b/app/src/main/res/drawable-hdpi/ic_shortcut_attendance.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5feff2dfcbc56abf45eb59dab87786b7944275 GIT binary patch literal 1536 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D5Ik9)c}hE&A8o#USq;wp1| z|NgtILSAb+mzq9YARc|B)_VOEG5t7>Bh8D#`L?Mo)2L4pUi9K@v-wIPB~Rzfx4cv!}vt>$JH0*Y3XE_dV@?_3d}3d^UORw*LJ4?C&%0 z%|Fks?_V%ko$*r59?lF0JF!g<8|sqR7_)yl+7VQ_pu44lk)e2{y80qZ#yhP7dlZiF zcrSmSv*c<%#{!<@e4&B}hV{%791bn9WU3Q7VA}jy{t!oyX0*A(cHhrSn*^GfD)=2{ zd!;fxiBx$oTjJsmxzoGE7wpNOc!Du?(n%4a&VGd>4eP&Y7z_9+O#glAMB3$vUA1JCd{M?i@F(ROCV;#d`2CGFYLRgHRG0riw_^-ES z&4q?dE3ddZmYC$Yz6zYzBH_L4^85CQvJw-FV@`{`;tp=Cny#9l#mBSf%+I?DyO@6Hi;+KGRlE?PtHS7$% z5}@^TuDOMLQSc+K6Z57Xf4t}3)@+WSKW&PmSqs=xX5G*GG3jX9MWtB=Ia%?C zl<3X<`}c)}6jSa^A-A6V$d5k^|JjuD)yM97GW)tVGh_OsIrUL9muoHHN#;(R?s>ak zw)szv%dYx|Oi$EPqD(CAzvTAN+rYd-ENCY0a*h`l-{^$p-D7Ft&@S6*BN$axwPEk> z+yBg!9D=SqJk{G!DmEoGCxl_4*vuu%f*iOXKi*+)#3U%Fpyc$sQ}~9Zg@mR8lb)L8 z{{>q_uQQ%9_~yAN9$lPL;^E*PE^ef}Wr1b$XYp9Z zk0GnH-BgsHUs!pjsjGqE&5PI0r}x!v`_pc095Hj=w*S-azrFF^wmxQOAv6EnKc!49 zEEhtpF6(EX<4Jzcz_Itj-g8I27#tF{5n;iBZ{Q2G0@@a!l zv4m5NOyi_idTQ#Wdh0G~G$gqkULSESsw0?9BYReOi$MNW;Q;S^{itv6wuX94pD2I( zXjPR${bw)j?Rkl*X~)h5>5B`yga=RiT2{)Pbmo(VM}YA5RkZ;wi)Xxf@tT!`!Q8_9 zE`zJciV&X9OBYA@&WJU-E-t`x?z+wDO_SH@D;%G?ZT4#3En*H#Wf#=%p3%15wB~BV z<~}{O)O;<4+ooNN_g=iXCE{3jz3z{NhFEc`3bUW}yh{zMjH|R5ZWe32P5OV|FN*(j z+~JyAChIQ*%V`K*yt*WM!H?CM^E5dMt-1n^=5D(6BA8d8HZ$Uy6tit)Y(DS1$)V31 zoK&7qm|ePavBHsemp0$1I=JRe(;o3NDRFzByxRX{mH1olHD39@|FApf-acNq`GR!& zd0ES*=l*kdUU{IkSizj{{Jf)=o}OO#<;s>qiKEww7p>)8+s>zW@0Qf6M|G{m z{BjTGzrH>(I_lHuS3j$Lqt6Egxyi?EXngfpf0EOL$NJkuUowZh6H{S)sazqa7xw1j z7e&9;eev?lVGUCfb5>o<|E6K%R+uu&tLWb16+Ad)dr}V-&B9v*r~RI(PS>euh8}Op?2vB4z7;9GE6J(z4%x(>q5gE&CY#d z@2;D^6zBdSSX6g?{jva-rSW--I8MD>{N;6FNTp@^#%jkS94|!d^dp2^iVGk3Id+sV z&ET_&S$$3aQ=;99M`@bkCk^iF@Jlb5CpCe8YdvFs)1k6Yv6ibC7#J8lUHx3vIVCg! E09nbx1poj5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_shortcut_exam.png b/app/src/main/res/drawable-hdpi/ic_shortcut_exam.png new file mode 100644 index 0000000000000000000000000000000000000000..e5af0d086652352adeb55f94422f0dbad97f8b7c GIT binary patch literal 1602 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D6zI6Yk)Ln`9l&bgl-;wo}{ z|MPcF4NixfpN4yUado({yO?{Sgb*{oie182c>y1eh&q>e5nlzvg%4dXh;u%5pRE@5 zpV7hDr$%v)2k*1M{T_5e8J%w4o0(U z4=eo=Jn+e2>OO|KJB2y0rfxo(%U&MRqdutBAsV8GjZQ{$DKO=y7bu1I( zD~I!$EP^*CZ($65Hm8QY>YS2C=7DQ-CvRaCZTZpJXnSkl&MmCRb2YdATEv>6ssA+b zxMMl@1MU@@IAyqRPf%S~ek0%brci)t&5x@$_-4LZmCSccuWMboZ}4ZA+fl8mx{Oa- zf1FCm+4}Fw%BbMw>th(Fdqqt+v1!A*Bb~F}TzPsrs%ni=(Qx)L54F^j}Zm?pwTcxo(IK*Ls}>bA{tSZ7JdG=L_=poJRjeSF%b=6F=`Pj@VnSzhd%pYH=PPwn`}Gy3Ca@Q1XXU<{98v#iN#*&>90}uPZEXweBAJ)& z|EQ2KkzKT9$1#T`DwDHT%*ucDT!y*#yUD_5DqqF73KZBXKXuqU*R|o3)1SNt8OxLz z8E0%+T60u*!kM(~Q7&1}WpJy(>~o^ z)vm+x#6tYwpTd;ynKPQx+}sUo-%1IX{QH!}A$X0KXTkFhtH~~v{|pV;HKWBY9+h1e zefyCPLrB3K=`(+}6*?R~{B-Iu6@{%%Vdnj6jD{D_u6e!h@}1_EfP<5+yEZx8dG%aj zD@!=z$^*hLw=CCP`=e*Yp4JX#0ftQPNbYY^&lfaUa^$D^GOpa?8GC$IW;W}hk4#Ov zslDDzD^6;tHq@wfvji|{T&UXQVexSRhn&cJqx+JpXM8uBUpz-zo(4a520au>8UTz3m}z8bIM=AiKFP}yCn=4~vizglPh zznATCgp=a~UzoPINY5STcOm>*hWV@aci)}X63Jc}@VaGY(L0Nvb;iodGvuV0q`k@~ zc$Kf1@$N<7;+K4Pr>y?C~weUR*5xY25wrQI8D<^r+S?i{6z6(cK7rBLP+%UDgDURtx`V=7tyM}+P X`g79CRJ3M+>IMc+S3j3^P6R)D literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_shortcut_grade.png b/app/src/main/res/drawable-hdpi/ic_shortcut_grade.png new file mode 100644 index 0000000000000000000000000000000000000000..095a8228c4467a76872236c47ca5d286cb1d2b58 GIT binary patch literal 1812 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D6zZhN{ohE&A8opU=s#8u|_ z{>{5Nwk*Bkax1{&i>t$(yOuFJP7?$a40*-=Gahs~Ak?u>Lu!HI(@6~r^o2OK&xrWT zoN>`mU?yYpcUlATuHIX;9oOxVm_`nSCE+cw`R%w6q=16!Qr8$bJQTfBOWgNOLBWBWQ(gbbJ7 zUG-{B{ADSpIq%s&G_JB!{cUOHcH*Avu7CY0zxSkhsc87UbYpO5G+8-gN|Rk1!o9m8BXMHqk4BD>hkS}oK3s>^? zlw*^ajx4%p&eZaU^6ibW%)2&bT-=qS^|e;?;7OxOAs&`% z`fuKg>t8D@WL?3fx?G?o+p~yAV{!4LPz_6Ah1Q0S;JHsE0-7$(x7=`MV@_DvQEkCv zGPd2y4pa9`J-v^8xmttnf*!#es@4;^^0%KnH)9LSltTHs;4DSq+vQ5frxedDb53s2 z*-+%IlPf_U>!BAS2Ii zSH>>pOIy~5w(6v9+m__#&d#zTXxfz*8hP?oEx&DT-?b?&(O&fW{VY=>R+Xk$&vQ#_ z#5X&p<=*RACTq=eQgUaNsPgsoyQ>*y-`eUu-RaK(%YSyIr+#$)&-0ovp)$?UJlKKL z%l`2J^*pu>tE{t6Pcu6d{lT=q+G+F#|@xQvBnB8fA%DFTw ziq+EAM73)6_AcxCGjZMW-#QU?S}Gc!_vE&AHgF0}S@1=K{SNy~4#&&i-m>uo^28Q= zT9WL*bnZ?wJ8x`I&T?Vz%Q-(+Fu62bPCRz2xHXw+fyL5#kELmw8n!KK?q=$fcHqs; z&A7K$y7A@Z?pOUm%uEIXiEoxJYKSngvUlj%Fz2p#e?w9Eu7~&HdcJ)1o#8AwO~UEG zpBR68|E5P%_Axu?U3e=xp?$93RiV>+CiV&*+jn-~+!}{jWg>Ix-^A48x4x)TluZD{%zxb zS34@nRVMOb&po>uiSOs<&i=4SgxRTOW1-$ub`FCc$Ha`Tpv@H<6C0v_MxK{ZNaRWT zyY<+&vS|C$>?w~s?4%otoR$6w&6aqV5wTzHZ1p#VfZ*g^(P3Sa=55Kfi-_;v$XpwjZCrCYLVf5xqeBG0YW z4^NsVWqjFVg`ei%4&AfdF1(Ti}>)GO8zWs3;tLR$hv_+eqPgw1_ z!}-bKXC-Ax$GSvcb|h*FwJ%=$@9k z*hHAN2VgxZ5vraL86 z+rATr7{LBZjQ(YtikNe#7b)CO1==?FG$rgJ){AuHzu{S$BN^tt7f^}xCZ@+zL zV)S_QquYYnB>jKg72Wv016wj*O)V7LmE~Y`Jl^Qkt*?w)j~85-WqK@c>8}ML>jJb) zES~ZObe^oRYFd8lnql;&d%b@7?jMYTRPsLkXt!8fvZ|iv#=$<}6qy|#q;-9c;Mk$GJ9hVsq_|Mk-80@ixO(9n jd&=i&H4bJC|CmjbP0l+XkKoH@ITr z|7J7J%mqI)n0#9^ET;r)*gKm!fX~)3M8!@^z{x3#VPTNU5~d(-nF&=Zjx=8Is`2n} zXjKSta^i4d=+t_8h53lgqm8_(UmThPE>AF#Z#7Z5VSP2{&6UD8cTb+Py0M{nOZmO( z&$GX$Jv)0&r!m@xQ($_(C8PL+)^;Du1@}Wr>v$p-2?%vCZ*AH5opD9vn|Lwrmn{gN_O!Kaqq7uO0QybDN&XtL>5XF{bV|8jDu(GVn3ac-s=lcj5)p zhU@+>DH7sg8py_s^EYi6saK1s=EpfhjP37BW3yzeWt;gG{vN}wZUAlh3xsG!;xJ+gKm2TRl&ikS+_HNgXb@w$CEIieeb4mmze^W_x=rmLhYM5utI7$3Ncc15>hDEEY+8MoDYmN8I^Ze2j z&FU6dP&4n;+i%S;gboM=BnjR~xjw;W{q~z#hM8O%6YXqHEEe5#dC%^o799g`Zy!e2 zkgpMPPs041J*Su7@qf84$7>Ul(WavQ_Gh0`=c~ z+`{|kU&``!sA-lxU@GZ*_4fAUYkjf`aqD{|9`4c+JA8Sv`o-E`TMFjt@UQc%7c@B7 zyl7R`B*viGKHO1J57y4RAi3$->}&m{<&Pa}_fFwsn)4}emvZO{76-x5zs}#To>`P2 zuq2~o^@{(;co(O;%h|JCE?vo{qAl#|c=6882lJx#WljBPEG>C(uj-}ha@jgB`x9Ip zY)o6Z6lk&Zd3O(vGmRElH_9bt+(EnXcBgway>+R6Y=HY;JhK zniXvPw@^+b@alO+kNlE;<|zjbwzV5xx!1Q&+1=pAHM5^H+XbdvyPEiIo~_2pwXB+Y za_qMh`5zfc|C#d7S3m&~`# zt_WGPU3>$VwQJ+{O_x5*c(pdVH*(_9#}bvFSZveJJ=n|4-cwM|rtxrDAlmDo-`t0uA zWxZ9i*GVtDQTfC(u1Jqo!V)ok>gMG%;n7_C*(a{{Fqi^l0tVdq)nhO}lTG96LGc$F7x|H(ume zU9!GX*+ygQM4R&2TZ`3Cg{?EGliN`#?C(EE;MCfMi$D8T=%X)Afp(21sZUH4oIEz`-*);qZ<*<NPx(x#?9%oypRMGn1|!VPt(-e4_9BDo(}ar7wGQJ#4$@ zUgq7*^hMz_ukpRWchgpXowj;+=6s<`@3QCrPwd$H&9i0Z??(oV=W4&sVK7`7etwVN z5!*cp3yS;q7jTvJ?U#sqBDdhwJ4cxb)hy>#j!fD-zq;eHmg)1=uWj~SR8FWn<}PE+ zHs_J&+Mjis-9^OqGd@}TC3)g=-SeL6tvkX6SqgSdk7QBUd3_;^g6INu-(ON8Ld_o} zrkv~T_bgnnk|B?Qb+1G7i?7SSl-**RA~NN?H^ar1cXTqAFscR#eUI94^}>_7hyz^# zkLtf)7HL{=r++p_lUGmRyXS>2m8$2G^w|`(7@rw;^XnKoS=l)3J{NI=o8_(F^+n$- v?atl~jnVijGxHhu(v4+rN*E&pe)CJnPcMtC;BaSPU|{fc^>bP0l+XkKvNuDO literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_shortcut_timetable.png b/app/src/main/res/drawable-hdpi/ic_shortcut_timetable.png new file mode 100644 index 0000000000000000000000000000000000000000..2808559a54b2c9a5f5b3ce003753ac7dd5aae0c0 GIT binary patch literal 1625 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_shortcut_grade.png b/app/src/main/res/drawable-mdpi/ic_shortcut_grade.png new file mode 100644 index 0000000000000000000000000000000000000000..e35135071cbf8dd97a30c7fdc83d8d6964ff9bbc GIT binary patch literal 1034 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F4ZLo%H2&f4oQ;wW<9 z{%vb%K_(87g!4yt-`@E|h)ZanY1ZSw?DU1b(-w(L;BIu;aK(+=dhJ0sJ3YmKfC({0 zo6DDfVE0gM?1;Mic1Gll(){a|D z#&(J1!#oWP2j*%CZ$8MNq44f23sdypmtW>rsc+D0*t6=MK9h~pkrr`xiR5g?2L43f z-)~&!zph|9aXg8?dyxL)8vYtKQqlLif`Q!hBD=ZyL$CPx>d$>u`3emT6*m=1 zEHz0H*J6CIwYP7F+NMW;xS*zAnX`YGV zJizS`dU@H|nVT5;9(`PWy!BB2MUhXvRmJuDQ;w}>Eb;Mm{QpLWW!EmRGj+03Ouv10 zcQTkSF)r)PnDuZq>w=?6oGCe>YzIm##JeRQU1e}uDZ)}+{&J9hV>a9E*7M zpMfLNtzo7c(+NG@?Sc*sQ#qEp<)$&7cviQsB}Msy4gS@ z+x3;`e(}EkhZ%)}=gP{Lep%1noSPPZwbU|}(;@2$8)vBQ@}0FaxzDCDU)gh^fMce1 zYDV>KuiiNIY4eZBLTw{I6>hLP)ykb#H&BT`u)wzpj z1Pb4+m%X^PX#d~u|2Ju2jYAHM$fE7i^EN|<@AuwB6og+ITKq&Uvm zemB1QWz1=riapG0U;pw6mizgJ@5i^9S1r5u)xIce`mpa+f6_-Y1GAo{dQ%66u8wNf uSpS)SeP=!m^>wQfzHaPcTw2TjLHrtjw7+q%Mlk~e1B0ilpUXO@geCy77}r_= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_shortcut_message.png b/app/src/main/res/drawable-mdpi/ic_shortcut_message.png new file mode 100644 index 0000000000000000000000000000000000000000..392c45d2482df45902ce93adb278865ef7278105 GIT binary patch literal 1048 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?FH_O(8JX-m&o~>rZS!Z%`LivGeH~ZAtwO&i4VzuA#Pun9t#mhh5ZC?M zPA`3rT(H=I5~E5tt*h({cHZf%eY~k>#s1W+S9KA!3mNXXC>@mW)_f3gqf_VU@u^d$ z&n>aa)y$V?oc_6(<<7>?JyMpebIMzGWG_Cf#iaMVnI&dpV1%Y5E03kq7nYaYEGG)= z)--rKc3pd9$*5eYxXbIM9%lgW`QN>~T}QeYUhjO?yeRzD+z2s;bm^osyg_^Bou4}8 zT+z+U$Oe<={@!nvz0NGJ(_@-2GzN?u=iE1;erMk@hcXl0z!r7m%x!!G< z`pwx)@yI`?rS*(2Zn+8Bav5tMO-ek{of4`io@EofYVU@!U)%>u=d^EYy}8Y~eZ%_w z@*8EXog^QKpR4`VVqRPOT7;a&f~kO?7pVdbLqCC>!#bDG2ThpG#_FZ1MM70SYv#>3kfX(#>oUXpuz6W| za&@%y7o%Buxm)GVby!6$TXrVsKl6c~0*rUJMcFXu>Whng$g7a}oSfV+Wof8E+ppl| z8`s%&ZKlKrx}y>2{_!Wia%Y+P?hx7^Xi$xqpBFEl zvAb5fsPN*Q&9|aVVsALg50rfiCB(@|Z;=5XcV4{y%9_fuTrbL01Ai4}h}H7$*c|9W3@`Prh5U+leY z9beR!b{<-PuDHbhm8nbHXZ7qGjoZ!&*X^u%r(g3S-)x&n;*#j@xDKVecfKkp-HltH zrqXol)x6wBb{STIi?&Ipod0C)z8|yt+}3vv-kQ6wKbf%J;Je$m8CUmjcKNp8HvgjE ztK^Gz9u9b=!20KE1B0WB{`4htKKz>fH1F&(?oG1}N+;$#VXR})|NPw{f8zcs1_lNO MPgg&ebxsLQ00JlO`~Uy| literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_shortcut_timetable.png b/app/src/main/res/drawable-mdpi/ic_shortcut_timetable.png new file mode 100644 index 0000000000000000000000000000000000000000..7d61306a41b585969825c6309b8b5e23680c3cea GIT binary patch literal 937 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F>zS{ z|M`zDjSJs~{A19X^h3urYboDUEm219mpszUItD=zUMgx)ZV?Fy%{x;UiiU0v%UbGT zsqXl;Z^o&x8A9?_;>-J9A1Ob#UTWgSy7xb8-`%}i{avqR%72Zg{}$^r+}U)@=Wv9G z(;3bN#vNA^6SlD&aNJ@(^JL9jt?BjOtr~0@ujszc6RvP@IjYjfp=f4wpnc8b8ox#Q zr9zBXa(~a$KElm#eR7?}lJXRRy=TI-=9j$9WVHBMbI+j1l=05BzY`YynO1OjdDzyd z&?({l4ToM$_0H9gpX8bMuei>}FkI_|1)> z|1l5mBU{G&;yLy&({^hg&~USRlM|z2#l%y5?zrpv+p{`YChX>wY!gnenDM^#byVQ) zU=@d{8_(+9G`W<2DrL{}MK|A^TB;>(=5!#f@3Xbw`P=e;eS_pn-Oa;SR%m^7TBzJo zVi&DfU1WOu+Fur)MZX`Wl7###)` z8Jf{6D}w*>G;9oIns%AN;XqVh@p`jtMwOetqpi=s(YcWEVgvKC&Nu(+F6owPpWhjN ziJh@!9(#KBf&0Jzs)(k$tL=^}cA8gw{`)>gkL0>ZUCa{>I9A?u)hYeYd?GO5Dh!GTL+gZSH>7X<_yX^A++h@+)rj#$ha7(qMfQwi1!5_1zg2zpGpFWl_Pc%4>F4R{x$56ZA4b z|Lk>%-$n=cN`jiM-IF)@kZ-n4C2>`BcU?!&-8)|ugYL%3r>Z=<^=e=KMsXR&jxTYB zTNV6nzgu5weSOvMWp5mIuiI@i!F%5V;gx&Sc>7bb^miRr*tEXtPR_j+fnt%*;mk}H yf^SV@%5T5VU*)$^!}6)?ozw1YD`!_V*vIMIb8w%&XbS@a1B0ilpUXO@geCyjim&7V literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_shortcut_attendance.png b/app/src/main/res/drawable-xhdpi/ic_shortcut_attendance.png new file mode 100644 index 0000000000000000000000000000000000000000..302b9e0ee885ba3c5885e709bea958844f0baaf2 GIT binary patch literal 1907 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^Tstvp>ELn`9l&h_mPaTPiK zf4zC5%Z?ut1^BBR^tErtZWdJO5-^!){IMbK14E3$9R}ftXC{0oyxLuGp}R`qj)y_u zq4a>0e!ltziIyHoPZW+FnB=kPv(MRY>o#w;y?oU)^zP=%SFf+D3jJFbx_)2WUbP>~ zLwEyLF8zJzA>))g95xL63%0W@Q&(r*9wpdu?BE``1KA02?2F8UiUrR${1j|xSEyom zRxQGEwsWOsDakbR^b-k16zh{9nE)=4X+dS^=#be{qV|_{Ao}4 zbe5GcTWUYE2G z_o~$Mw~Nl?W-oB>aMpdG(J(!ywnf#lpYe*b=J|+8%T<>dFcgZsWxpu?wy|W#{C3@E z!i#SHS=Etc#crT`g#Ap7jLUnmkB-+)CG7KbIj*+k&&^q9L>&DXk2uX?D>(6#T}0ux zkH*u)@TV4x2C=JilhUrX-Y*ON*!1+C+M>V0y~oyXJH3@pp>NS%g1hMP8NubI~}cC-epty{mgi+AUo%?qde&be}tt0AJ} zJwr{>Vkd2nW8W7}na>w>zmYK{MdC2R!^uOQ+tOd#<2smbAmB6TgmbnYVaOf5*L(yCY8XDu_ABruCfSx?Wbj zL)L4jVgH2~2Dg-a_5M1aOV4guUt+s(?zetEdLb!`E*4yU)bqsedY0SIEk>*dm&M6d z*fQQ(dDU;*jQ$MKgb6Ex7&`n~dyhTO%zAZ~Icw{0y;{@VjCXGD5?%ZJJa53W^FnK) zT0gE1pPo{3i@781klSP5T!wXL`&W6GH(1X$Z~p(+e7_lQ(Tc|SUdOrp!3?Vw$fap) zWj_*FBI0tKcb~7d_frM~dG6U~tF|{?V&o{~Jm7xomWjs<)&h(7LlM6JofF?A+HVFa!u( z*|pwV*Vu8Rz;4Ex#r)TFQbidVe&|g3blb02mpx$h)q`vP{FrMumBpb%DaT}5#iS)) z8=Uss*~FGO{foC0^A&a7;wN6r1-3gEz6fH!8qIzt`?H(I(@DO|O@yD6u7RH#YX*Y_=leO?tWFLkSi!G%Y>u@#CT=q6Yr|%3Fa39SI>Y;A95);b ztH?0^s`>PP;QGh&yT#A4q&zp;zi5iXhv{E7O}(RiG-3LeDIxW~S7UxN@TIppo!hf) z))%JwKx=z;Yw@kO8J<11`yIe)sjy`R|BEB@uf1aAWRYLvEZ*=oLH6X7EA6WRri!~`F@>}#1TYTlwl zVS2L`X}Ne^Z#8sqDSexn5fxkW;?cISQ=GAP3^l}ymiufs6q~c|&V#$6?FJh@P5sAa zECM;Z5QlL`qzH$vy>+9fkzIumOBj-?p@XTG5s0C zxy7gUoA}?o6Z~#Maj~_-7TM4Ht+tD9_d9xEH{-L@64JXvzSTdOySC-?t^I4hoGe|* z;qo{k?*6}a#*4e=F{aK;clg3_z*)eS;j=AQQ(F0)ZEK3UYvOltYJEy>->AdCAVo{A ifjwXoo0r}{dkLo>eU zBo(n=2(tQ|#~|Nmxg#}wUD|YpMVj0@?x_5-%a_>6SkQXI`#>DqwpG{ig(_L@q&#TS zecGyWf2CKp%z;?NK9k1B3~_;>oUTRl7$mkXwOQ;Dr(<}GVMkvvgG>AtwoCW^`I^u4 z?{s^dEqwF}UqVm^|BRn19rsKF6;mq>?kg=4b`JWt#3!vmVJ$<9;y#uFmvmO16L!ho zl_BAFQ4BuUvXsxfDSf!TRP@eTPN6?Ze{1cW-KGQ=qE3ES@{kMw#{+<*Vl2+b612n&jHax)@L+MafO#w?@0FE zso8nKg@J3+_Q@{xnU~aVS$FX+*t(kY&x~a*slVGA_#eMpbd2qR)wvy=x~Wmy)-;RT zS5NDlpH;b$>u}BKJd-`fZ%@SQFkC9+i*Si|^$MPlup;jLgrf4#X-irkXx2Y|dt3IC zTDB?c(jLX8p9^Fk2dIlNgm>Kcotq-c#$b@^{WD5rl?TH=$#vx$lAeSsFl=a8EUkQQ zhBD(0r$33G81{NFFxYHdT2s1l+HMVo^Q9~emzX=g9s0u0lkoQ8;fS57+-shm?)|di zr_U^7;~%e&@!Hr_i~YB$Sz-LXwtMFu9j=6+4(VNg%6?s6d-%ap?~2T?S#ziMPx<@) z@$nhAHoHr+oPVF;aq9bFE+MW3Pd8r6(XwZrtAFCa4T-pWJB@=J)r9_3KIK~0FME0V z)YRUV$_K4XJEB+5%`>WBwmKxgw_n=aI0{+EbvH+VXbn?O9lq}8$s{7xD(hKu60&&GM>2+w62HcK|J@XJA&TH$x8b) z6&WU^Ufs3cTi3vGoj^51%#{V7`6k|Fc$a&-?b+w&yEf;Z-2UtL#)rSY_U+knuIbCY!BsdAXROWPVC3r+;z8fzhQ#Yfoa9fb zm->EToa6R%&g_&Ne&1}t-dvwIb5`Hv*<1HcCM@^b|ARP+T~_w?*rPuIw^>-^o7{ z=KQ$4v8sXppvQ*3FQM-i>W8ww{;+&W=#E)4dbYN#{&>7eiRE$M%41hfeqqU(rSB)Y zDJRgN%6ZyWpNlamU$ipf8Q7H_fB#|JxkK>MzUB2G9d||<+ zkcHjRQ76?)3U4pSdEys&=U9eC?7oA$z4;V3f3p3XYUKEK?b?)Q8k28kUY~8m@bArv zAA(nnUA*{>`n?!M>bhnXt=f5G#}XNb+evGyj%gk1ao}#)c5o+0wR`8cvZNP#lsm&1 z^veQQFXwUInZa%_f3tjjm8Z=!&S$}ekL=WQ-@36qT;a6SsUqL|+mqsLVg^#8Sr)76 zJpY?tW8TFbX8Xcs`NTU6dn8u0x0^?v**&{$z6pDQWNO_dn}Xu=#qD$E-ep}RJEQtl zOz0geeYSfRGuAI$|32&9`xDvGoa$Ta17H4q9R#kGHhgVkyg2JZ!=^LA3RNr#QZD=l zYWj6nUzA<0s}(=_|MR>ipRjG>pI0$F@mb0gz<45(*)sjVJe%tNKJ)t<-!m{UFnGH9 KxvXO5T>Ln`9l&OM!f#ZBh; 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 Nc)I$ztaD0e0syj8YmWc` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_shortcut_timetable.png b/app/src/main/res/drawable-xhdpi/ic_shortcut_timetable.png new file mode 100644 index 0000000000000000000000000000000000000000..9a40fe61c794ef5e83f61d43a7e653221e844e7b GIT binary patch literal 1971 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^Tst2|vCLn`9l&OP5R;wo}{ z|N84Xoc2iFlp|rxCe)d3iJh(Ixng+-mP4gUVVM$&3SKMy<7F_-n)6PL-tmEwF_New_k0_ z{t#VQWxjLpVDF51_gELnGTdX|;4|^zJmwv&&$3^<+?mzi`*)c~ zUXtNT<_xL1mF5lo2W9ST5)R+&%y6-VH6~Bs?*y}+D-1jOHcxNZ%aaqBdtc)d$Bv^1 zSfe|*13#_w%9c4`d))F8LmzX6Z>Xxs$x60_8)A=olq!RgdKe3|r!p)2+GIH)?YH^O z1iPnKUf-V)5NzF0c>L#tnf^^LY=uRG!q`6NDp?sS965g~g^lA9*MZVG>ltJ&Mlv#Q zI)B4S=4xo47{lYMuLO*%V}HoTc1cgGp5DR7b0us4D!p(^hV4N&*%#%9YR}@VJoEc) z)!#i{u~V1|R$rZ*@GZ^a=U+qq+h2cihKh!;9VnGqfAxLv(uiYE=WK7ivEIpDl_BQ% zPrd`{S|U*{M*Ft6{xDg&uai;a%8$)u{yd6;4NW`e=Jnc6wC>_Pur_4R(a?SDF_HhB zOmePgZDe~E!BAv-b&6?K`mPzlS57eealNKr`1MS&ol=$gt0Y|`hUBStqEDGw?)`4$?)pM8ZRnBBM8|(XExrLOdEPWE5@RoVy!B`;sygXPvawj8$&n>4tf^AwN4fSoWW!Fgje9FO~^Wa6> z1mkA`4C@~MN&LiM>(9Vov$?gRcHy+$3JmXGaWE`p7g&4h%eSwIUmqTh*jH)1W~q1Y zmkl?aq=JKgyng0uV^=Nq-==QO<~Oz6v6Ybm2X;KZbEPzYdHGqXFY&ut!o${GiToLG z^S@nfSEp_D7RL|oWO+G0I-0xgV#>G|k!><%e&acyT9 z33iFsUmu>kjf?GpML1)ItRgo%!;gz%Nz-*2G#R4QpRuwSq;hYx5o!3Zv!d2rr>~#$ zWUvE+!s%6IcGG7)Z;Cm7llj3Sw%OY|->`g0cpYXEx9>`9PVl~~x4TQt^R`S~S}OLX z-gEvWRJz1H(3fTr+*fA8U_Z&{@Iq;HI^y_?C#Oh8}M3Ny}IS zHb~EU^2;+sLbXBYK+No!_8j3_{JYzlJ8xYP^N`=h7Z7p9CUE7~hKA;uK6*!NnAh&F zvlVOpeS2H$y(Qkf4Og7bTxhnAea$d)qlznoP_&@rjUMk!Lg!2vPM+NnvTd>TcCMmV zO^3EGzHBvNV&=|`Y^@DGnL8C$GE4f$UoZR@Cb3@kLLTcJR@?2ZGsKzojoUx5zF-vO zdm6lB+N5fRiR+eT>=S?WbIGBd3pB(x&wAYOaCPTSyD9xurWe@@q@F&FQ5Dwj&PZ{7 za(d^iyBB6ZKbLs)+gmTK86h5O>z7wgz4X%|`Q)vwFZNdm+G>ZXY>i*^XJ+k!hwIt5 z*ad!4SYubhak{OoXTNBKi2sxt4mbIis#)i5o}Tk&;=FMA%jZKjryq8alI7)YmHFj! z^*!q`xh(ZndE1OuSFX6rVj%qerpJn=oSO#w%y^$Q8+}~9w5oyspvQ*3AED<0{H`9f z`lFdCxz26U#%Tqn{~{)|C)}Bo)-%_~|G=`y(o+*sxtlIZZ(8%RD@|$fbjROJ780Dd zp7Wph**ih*`sW#3(U#AW!mk96Lks4t3X_?P9Ln*)M zc^}?2IeX;PoUiMQ3CPaYo?-3vq%7*~GM)x|>r?eEUs)zzYQD2Lh+*gaMaSl3>6z$h zvR~K~p>3b6YN&jHX+dhixx@DYm+Y10oV{K3B3DA5_|`vD62tXwF`k+B=J@%S$H51!2{mo2KQ67MKWcozJ8)uU^bh9BGx*6`ZehF|{Iw`beb zf{_2>)9%&lg)&~WGWc%3Kha^!s%(eIXPg4Ij0T*G+!N{?riH%mxhxj8?&SaAaz{1o s*+(~dF=z&BGEQL#+U9WT=zn%|sf&HlPZ<&!7#J8lUHx3vIVCg!00GvCg#Z8m literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_shortcut_attendance.png b/app/src/main/res/drawable-xxhdpi/ic_shortcut_attendance.png new file mode 100644 index 0000000000000000000000000000000000000000..9b4ef2daf0472bcce13162e5aae899b279f46345 GIT binary patch literal 3393 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Bd2>4A0#j?Ov*ReIS%vM@&D*XYvMYFy?5X2$O6u5|GFRIk-TE^=<)z_YL(cD+ z_RVB{+}>Z;^H;Cly*f_tM-r=$h6CrRqQEc)9s%bG9*k@n6Ki5-Feb4HX&zuuoz&0$ zUDe_0#EGhxzKc(u!p%5`|A7s|XT~)>9Y^>Wf*I`CKg?9Ia@l#O@zReU|2m#lA6xUB zkt@M*?>}$OH42La84k{0S?0~~IOtR%Q`tWYgAeZ~+E#!2%A>0*mE?6|UFNppjEsA8 zoE{nptZkZNUaC7mSX=EDljip4*;~I)^YN40rljWU_=UyccYE8jpRI>V?Fw`ouFl$G z_%tn=ufjHb_1T)L;VW1Z2}+iHKkH1AJ2@Oj8 z^t~u!$Y#_r)AZ}w$Il?~dFh=uRrgA|zN)R$GG++vKKk>-^Y?92_|@{Zp5^N>TNGEn z$;435=4oVoB>x5V#fyu%jg9NyR2KL-x-!jX`~1_FyZrsXb7@^`*jBvS^_{WeOd4Zw z$6J0?#eZ|0Y&WjjAf)inBD=^X`Rw%SjZ)W=TbFs9+Um-!emjhDOa0GJm0uUT%Wr@7 zw>MWrDEH*~dA08+#qM5HIX#8fLAbAYuS!*u``m!6=8G@pEqcCJC~Ia@qbNh@>8HyT zp2})&*T}wd1}&9!46)Q&no6k+-JaaA?|wYb7p?&;1=1{ z+6qtGCOyx5FZ`C_qjcKWeZCu8zL{T(V!ZWw*Xf!B8&}62TCS`$n(ndZFJE(yVw_cQ zSO3T16-oWea^z|nbh!%Gt;^cVc*NVNq|}qE&P0#(B2z%I;f>RpCUaL`Si<00+1%%v z*~yrt^Cw#@~tma-M%U2 z&Drja3|1yqR^L7L{#!dWs32gY$cm?*)8izPrAu`hY_8w+IKaG7>8Vqhmcy2fAuDZ` zNX;>F=+%*AWOn4zjcG%))!vdW^3rCsM;{={}ZV4IAO<%vAP*vS`bC>A+_0j3h&3sc@B)X(LQW|DiR|iY>rnRo|d!XsF$kOZKHJKK)q=Z&YV$nRqKa)U(42=tM@;DcIM!PZ*O&zH#`-)#*-KA z+2MWo2p8*#ZMVZOEGT1m8@*HL->@d>v7~uO1&+9BiE$A9OG1)1K$Ir@rQxu=Xd9q(UlBk~qid zHy0~eithR|^c-7vH^7nY#DooN@4nOHEKFP@xZ>5WeFvGdl2;#KI66(w&oNR+X*o~8 z<1LS8N^1Mdq%}M$n6SX7y|d(Y^o(%5c;BFZ%8px)bs0GvTax=SLMZleh*tiVUmJBD zwym+t5#7S&@X|{*F8bNLLv>j}w?n(;GW_ChxZmnMX&)=|lwHs2bvZv)UllxYYt1K~ zfL9D#&wja;$?{9RVd~0usfA8#8ciNmzGYKdeoTGEk#g63Lo#nd!?#k4x&MIZqX1iV65c)8+=b9W9 z&XOwIBRiMA>Q$I$&ZaRh@0RyhVTV7O&enDrYqo~fYMBVMtvVes-{?p3s#RwM-xzZR ztm$95XO1$Hz$!IKR*h>#eZLuOmT3h@ebdTcbh*QQXZQD9?vbKuS3ULOfNl&=8z4HsL>UsV}uk#;g-I=Ft?%&>I?slFj?4vp< zd~d$b?g-gL#^Iaaxhe=_g!dAh%T2`K+<8=r`A*juLKeo}W9^KhI4&&9UU~j^)p6UT`r)pFJ%Rclc7jozuG><3qg0 zDG%%a+kT5JnJ6mwJ1FjDRos$&eKt&{iklvtIQ{wB+QaA9?_^V0`eE&hInx|}*zxWE zrM2(QmXmD~XJsmHvYhA&?b>|KPCEU5sra+FD$SzSCf-HI`xGTA_f>xO{ga-<^Yw6h z^6!fg7w#@D~|9KQMeVcDnu@*aG_1-3bF3b zh6W#|da35j7GzCJ6Pu!@wk%{(C|ifSqG;vjWbH=ZK7mu^(;^sZjjXJ;2duB3En8`E z$$<6Qlh5gTclQ3?ZLmAIzMpl1uYbxa-n8G-xHN1l=e|%hbMWnG+IgYo-4q{f15i1A zM@)su!{Xd5nTyed+RuybhBqwPvq|FP+Tzt2!i-nu1nlR~%zw2{M5b{QlVF%k+fN^! z3;&*;ettE3>w}okeN$Uk=3ajv{L?A1;^ey6&bWGYHjN7@hYHtCchSGSl;8cbC*!0~ zZHu1oofM*~%V3(H>hE~UdJ@}_r@;XYFJ1;MEn40;YYXEQiO!hs+?;b3D;s=EbYo=N zr^8jaPVapbqfnpmB;{LcwJp9aj&GDPFw!|97dvk&)0G`lcdjeF-B8kbmATGo`^y#E z0<9f*J7m&rJIq$F9sc%A|S<}n><>eyR)>{uA zSo2JbI725O+yDDqF&oFTD;Y}GbcSAkYB{lT zTF<#kKVJLLhFQgn(p3spSIYig-?pKqO-;m8cEJL{>e%wR{5Cm@9BW?(pW;GQ>=K2ELd>gkyUDsV) z7e1aW-Fe2_F=Th}<4HVMSNU(*&a~jzlV8hSGyOlDI(FgR93{>77dJ}iY+1&^c8x*g z$gK#u>Mt)I?>V;1_q-su1(ts)b%o%Lj+`V>hvSRp70fZ6l+ok9`0-zhr`|iwvd+yr zv3LE!3tkO<=X+zWca<1PmH0hU`nGJp%2YSqY*PnEWxn3Nb92{SmsfbuxT5zJr}d)V zt&NTLu@cF<3unFEF1O(E;=l=_D)aa6eja>UAlGH@za?4IdQ28>{G_R~is7tE_;%(9 z?u5cCMbmD}G8jDb-g)!up3Kw9wwim+^f;__;oTM{Twp91J5}{!|52$FXVpc|y`1*U zJ^G`0hB5C2!;8%}*XkA)%;k^aPT2Z%?nYhqJ@Zyyjf*z2oS6~6g7@tk&IUh`O*2LQ z8VRi3^sH9sqL|0dzaDG9-RqKTP`g~LaP|MLkEy4potrgtrw5aEM+S?-hxAwS?o1NX zgZhLw2><-E-|O+?-=WFpChgT!TzgHyqBHQuRsD73+4A0#j?On6v#EOGCX69SlMwTk0F`Cj6m>D-IPkxF^77OFV+bw5VV2&hGEpvo$wKE!gz>9`^&o z*{nVa+wP0E{zzu}+Oq19S3}F=H75mfv-jNLzPf==+r%wsopyx9&23x@m`_hXzgEuv z-wxCF`8kUxWVq)Y>#45#{$}H|*h!`gy;kQ+C%xd5D`i^w)qU}9?s?yf7Njzn}uc#8OhdCcUG3BHSqp*vYAuzTZsKc@tpL| z6aRS*PETazsMw}(r0Q^9^e%6a1)E;~6TM$=_*~nLHBOuBSfGC%XHc6I{iH`8j9#Nz+VIgTC0zMhL7+vv7wO_Ada%J<$osy@Ye*POc{kR+33LAqDOzRW<)?M$t=CWmRgw|iZ zuJazCsFL#hk~W25M^3fq3h&C)DQmAzWYF6E?)kQRyNqIEgTMLwy5Q!N5_Pj zrrEEmj<3DD(I!kJsV>6Qi8vi(jgO_r+3uZ`)f@|pY6`S$kP=WV|}&Mrw%$dOkK z)cf-6XaIw(q|__Bu(fqFT}~gmc97wvX86gcY5Lq7d#ywq=Dp5Sd{DPnVDi?q29vL9 zw}N!0%3aY}I{#I!lDC`L>+`j1_DL)dxEs9s?Dex;i)@*uva^{jR}5xj7GYW-uy}%) zL+=y6`)wS$AC-6lEKa@-nzwNB6EALs+w=Bp+MNFQ47dJ~Ijh$nJG0L&CG8x~@~A^g z|AccMKb89D{nT&+JDZ+c=J!=(98bU6GVeqQqg94?)XvM|`p5QIzdJBfJeFlbnDLsI zI+3d%zMgCSasJxqK+CEt({}KQw!R4Db&LGzc1}+Fo>ltp-5V1wtNls2s--YFFn9IT zvdIFqzfLHd^}1wtIqg}iG{eYY-s3%a-eyj$5*3H%rLzu(Ot|Nhp} zOX(YL|G1efdp>$~&_p4JI=N?AcK_o=+dXgmsrg-2q8mNUCA9PE$G0C0{%y6p7<*Fp z_O#U@=fX}VuVuMVcRe!Z7=vC^39E5wi#0PA-JKB@-jU3W$1bh^la&z%ljwie1nIwW%YIsVsX?SkkxLw2L^7Vg?3|EtF z7MN|}I?G_SqsmmREH!bXR0S=jFa^Q*D2lyyHoR z!9L51p1XB-mIOEKX>8o8^7OtBXZj_6=9Hkb3GtI&WGxS=s?|FEOnJi5_PvG<2j}M9 zSoBisXc)s^&I7V-%!ZHp7>$$`_f57JZ`~1G&a%mD^&T+?-EGpVH8QHiv$dW(I9&Ew zzt(L*JwwDwrJ_q_Rt#HT8BE>bYcIJ}WWilmMZGJsjcb0hncZYy^I)yrY<6~E=T@mk z2?Yilrdoa_W|2?qCm9SKe1q4mFgVI!=)g1Kl)mbLw){jz*C&DSU9ct4)+5?<*U+Vhvb8KxuxFt)jLY+XYz)b_P9z-FK&sxbgKK+;SYilYP}4K zXBJh(cW!#UEGyc7&hrG8NeeS3I5ix~eVxfLWmRu0&jh8TRcQ~+#g^q}8#6C)Z|f@E zvi7W|_qqcND-{-I3ajpHTDv>ARPM3q)2_QVxy1|K8_oQ8u=e+?cLDEKumsyM&3tYj z)U>j*v!pBNj-f*vqtTQ{@7NghrTBCwS?_Cgo#el~;ET%a!?w1?>5)^G-pjXTUUJx> zB6@1h*T&)n$9^veQIUH7$Khe(%tcFPx;);OZ1?Iw#&MsQYZmugZP1PWt3R(^Zu1*E zx9HhB`s{L!h96$`c;2%$vE8iF=2_*F*0Ngt+p+wZ%?mDu{F@gzcWyp+$lpBwnB?i{ z%m1A*kmjGW+PiY;>q@WMwI-eOT9&=pRVGvE*)ntQ-Wlc3=UP1e^Eo%cDun0qs}rY> zX{4Oja#ecr?99QLtHTcNUpjYRif7h2f!W*I-z|H2<9&cLlep8G<8|hCxjAi9_%~dW zUBPg1TGGld3;a%RdFCL@Aj~Fo!^z+}pzq|R_ zb;<@M<|pBHuPm;6E}FiGQbOV%tRv2Vnurb8G^o=Vk@RhU#uP&mjG)wc3udsyIQsZU6@{JcLuemw2wmtW`d_3EmcHw-_g z8oLyhJ?yVlXYG$KR$}lq+xTXeje6Jor4i3iWA_bKw_P)9kW#)F#QDQN z;}2ul*5iJgKHK+PTe9cS*F6&jj`oUVYCEW_U1w(ABjU2%npf}Sg|)v@s%-owKd4(fZRy<^8Q!Y1{~q2XaJzSM&aSTvb0vEJtWnr`CsuZT zR2#U_S-Lqzg|m06f8r`8lSwgmxe{a>R98LK*>25}5FLAJdF*-V?KaosTc*zv%+Lz_ zyY?!}9T%7IrJi3-Ml79@FL3eOB7ywnhIRJOLYPf7cg;V(Yu@?zX!doC1uLJ<{TRnq zp&Pt%&#meY2}@!Znr+#v%wQFH!Y$~_X@@PhW_|Z`u~v9`E_v#y-P%?RvqH`{meiL* zDx}qagP62CG6Wj_i(lt=XOfs0)F)uj6Z3BV(TNk8cNs1}X{V>S_Syma&cJK0y**B~ zGMr=Hu;AmRqNPa>b~FCi$zl)hB`iN|G}Y{~kb4A0#j?Ol$p zhrgT7uyoe!;}>(vbQYGFG;lNYumrFtba|_kF}z^smSiBvBm!0wQc89|8{AH zePp<~L1FUF9;V40if0+#)H~kvW!w_zb(>?u=L(BI=bzbD+pU*~;*t=WqP+BHPI~R% z4UQLIm@1@LY3vP+a{i^ImZGfjS7VZ2y~Vo4kE>O09a$+T%6MVluV0BbGrla-F&!HP4`mv2>sAXTXk|A9Ewh{)RAsIBZe`h4Ja;ptz#1&{ov>aZ+ePCn*x z`RY~qfP_^VhktFBW6J3+D~~TPOi#DUuxH_$(5C)EKx~>m*P;WAS>|Wg?s`6vJ@Cw? zWvnZ00~)@}Q9p5E=QP@nt6W8J=!ixa@NES3f7eiK6Puw1s-je%zINExjNl`LT8t|K=Slim$qyI98$b z(c0dqmhnoS#AXe}*?&zOu1|g4sIzqQUzxSvSOZR(><_Jdp%fabz|3}{carzpFEg~VHm@%(og6Kz=M}cAP2Fz1VPZH$2T`d1}-sa_gM}Mvkn|gM_(-#h2AFpmo z{qb;axlDJF=7r0~O{Ur$)(*YBr$f(9DLnZ3{Pgb^LK~Wte}8-U;Lp#P9|arLG1tzEd~ZE1$#chClb-U>^KGjbi-e1w8z2fz`K_o zJvqE+|7N}YqRbramtQ`dEc5PL0gJ~qL)n=OH}#dz*Z;~4F*p7BYgyPk2F3y#wkJFj zmdLgnF-xX7>hP0UzAk1yyg7?p?@b>UW7}VEvP!ga^GyatpmfO zX`z!QPO{%-YT7G5;p{ExXRY=|jH~YNlbyKG*?;TIpcH=jv`@}6{TKP)kmBptFBMMq zYzS&Al;*g3;EAbUYbw)`T%&U@xUZ^R-1#iHs@i5|&CVH`s*ICno)2LD@_)iczSf>Q z({$cVxw*K6KV{Z##)|mkzc#oqFJW_FhK!Ab6UCJ?2hzru~G`942xRsWT*(e7n4ft z`tC4EzdD$ALD1piZ!ZFu@XH+FpKbp5`P~?0#-J$KydfzirEz z@|@@uB5W%%mR%3BykoXMbl8wb-BtAVwT0~l)14z$3a{J4bl$snb(yQ!mZx(M_r7yHMH}mcB*{^C19;{xqieakN+*SQw ze{fmeKh?$bez8wS5A8K^W&BjPVZ(m8+%oy1eX5}>C+=T-RyQlAQD5xc z(v=(&)<5Ag@?TyRdF*=r?P;g8D^5LD)b0K~;j?aK)wJ5^s&}(*EuDU7Uyt9hVjGdH zjC-4xzu-(gUj9|n^Zt=N3?&b5ZI!6GnQHV$W`^JIeH+eIerB5dUgbu3)5<$8yLy7| z+}tkG7qxR!(Yk7;4_|}*A6}T9Z*|mi#(m4BJ9e`kSbcEIh8-dLwgK;3i=Ef)+4M(I zsPC+e*iSjDygB8~JHe!( zY3C;+{tL|v^8^!Tv3ayi=YGZU?o#Z;>vfYEnGODJK7Zw`?gpub`-9oGLn_tmMl z_q5|nWu+fVK{eHJyF?d;si~kZWhi0XTw=S+-d*;5M4Wmkx zYub00^!QrSwsW)Dr8R{3x)aO=WV@J-Z29!+wZwUbr;3}NJC!z8?CJ=pE_GYA%4OA) zb*I}r7A^-@!P}0DJ4{PF!zH-s=IWwY|9$KnOE)L$-M13YTC3miN%&Q`!^^dwVi!gq zc*7`e%{MpY7hA^tBb|qhUT&#fzv{xmGbauH?q1BkOX*_9;T^HN_m%5JE^5ec$hrBp zt_3d#lBNUptLJZNc*b`6)?sg>@P;Di znVDXeY)4Kjis~KzID>EX-#d(_98KPcRgm#w5_mS zdFQDhxJ@V7BHPF~MgH89xY?2|hff8hU3{%oc|%CU;pfzwVO%~>FGlD#pJisbA+~u< zX3o|dUhI4q8V!>dy?phG-^3-S@niI@HuYO~YwsSNJ2!LxCau7ZXf_0#d9&4c7u5J)abc`(U1on^S8v4p zqHpaN<-F2oolKeC{wijb2kVO`Pj+n#%x6vHRX?sPxn|YxY2i!@?mYQ*WZ9PIU(UH5 zFDMiA690IE=h=#ru8gS+n{Lm#Em!^K#^$R2(upSoHyH+ner>p)yFzbAL9B~rLsj%$ zaGUORX?}@OUu>k8_>QwTA6xyB;nL!~aB}CwOfGNr!w083c7CXNp}&Gn(~?~)?ajey z(`LQ%d6vjzqjN~{)C+|aS1Xyis;2hG$CPpdcCo*D-4PQu!6RkiiYrD+%>`Y0;LgR_ zS*p%q)u-7O#IZk}9CMd7fw5uZCYj@r@9P*|Z=SNwc(UixbGFtuBg+`Rnx3$W@@=@y zp?KX|a@C{vWo98xC)#$T?p>es`_7h?YZzadUO1OLx7RKI6jL$7nS$gUM~tGK4%}W? z@@s9Otn5C&R4A0#j?O7 z{hN2cWpa&*+Tv=W#uSwCea@vxkC=r;FAB^P7c_mCBoYv^P9bjRD|x1Wid}K~8d_XG z9E9ULY@GG@O$FC2Y`nBtH$cRr$8m*%erD?JyK`q-=5hAlwSB+2cw6zLe_KEQI9qNv z_j!IA#}Rdr4GS1H3WU3eayc-lC~R2Lz;I$xjnXCt4}%0xM#c%MKV6>iaR$_;rq)aK ze^;LJjjceoA&#Mo@y;UQ&bJJ+7-ZN!7^^-}`1tc%dsg=Mmp$`M4{nlEVB=nNaki$x z41pldhQF4fd0Y#o1x0x`$mZ7l=byT}{QX&}s7WG6G!>1P-R!$`X_4N+2L%E~JX8Em z%}^9i^Ets4u**`QGw03y8$YbY&2FZ+gfVPczh#St98X_A^J9iPsguq8R5zbwU-QXT zNqaM+nm==h{%K{+rNJDE$#Yias$X6@W!=I9MV2yg&r|IDmc6xX5b-?qSi8Zu!m}A+@}uQ-;rc_l)&V*Vr%z)K*p+GBrvr_+oi_=`%}4r)SDiu_9R+37c)+ z*}r4F6&X5JzUSz_sb3$&G;y)Uo#SSSd$%|HdgeUMM^X!_BI~3MWZQ7RXv+Q1qj_q7 z?1|$cVlhlhJT7U-D|!oeS1;q5mO613$I{@_mNGfTtQYpZdbKDc`}ONPYwmw=Q&iMu z+PQP{uj^L|Hcvak>%cpy#9lRJVMeLR%G9+N&wMKQVSILi9?Ju!1;4twwmZH|)|+Bp zy-DH8+<@4-k7w!yxG@H)ti0rZqKfOwnJofwXXZ1wa~Lf02`o!L^{iIQKsn661c4JsIeTk()N}d|moVAs|8Z1-0J}tWav{-h*29>?;9ErCD9&L_f zWZDzHPNVDA?-8AUSB&Zv2A_CZLSM)k#Z93S+OE6DX9UC7E42mEOMe{Z*m1R z>-^U;bK||X;`G6rY&km@#pH%>+s3F8WAtW~kocvI7e$YVH3*$cn7=EaWMZo?mw=c2 zhQpd?jT}}E{_^5hZBDS zV()%->ow+?Q03ir|NJq#N2kqLlQs%1-rgj^zGBg%rF~_=ZrchcZL(2|Qgmie)hoBU zoyhXGfwedI*3}cL;cW~;#_RbUr!1758Q37T`9;)DKF8)xr+56CUMufa>|*q~bMx@k zRmLaJvYtG7F*;1|@WpLr7p{ff%aIlhn)0=(=Mrx~#H6s#1=6ebFJSn2xNYHwd)0z( z?n)nde?8bQ@9>2Po{7!ug^y0_7gl{vJK~pGSJ``4PP_GR^4E@K+zMs<#U>Iq>(m|9 z50|{UEq>HE?Ln8K^PDqk$(jE*=1R{J(>t=0ncXPOx%yb6$CCDW)oV%_x42J}?`8Hj ziqxvFv#UBgvpH}3UA7-JGfj@}-1E3_&d+z&GV{#&H(s8(H~KQWk9P2s@~vE}xffJL z{>xvM-|*h7L}Oj-h6A5tr-ij{(0e=m=H|k**I{cH`2F9fxkRHpJ9QDKfd1X@jvG$C_mx>>WKX#X0oibUw zL1V5ESNrtkMpn8GHh0rkh%flowC&2(hew{ze|*OLzJgrgpGE7I{QA}87*lv$R%6$D zyONbFF0d@OW$}wf(TV$U+tGRTNA<0QT zb_<8Cny-`J`FWb+l9A!pwqyvNtNE>)lzz@4OHW#*eD~k7($lH|5i?Bmw?*72d&1GT zKB94wq_N)Y*djIoUQMr4OaD(PSg~IAc+#Cc7IU~3?A?B^%dhs=ip{hB2r38l8Ah0w zmEATgy}YUNx!;A1D`68n6dLw8Hed0*x6Zk(p)~%aotc~U-o$3B?3C&_=6(O?l{ZYt zQNhWpK1vu^8#oBpeM!=E{Qe678H#Z;;MOv9xc*B7Uk@U>nj{+6>< z)aTdH#~t%*I)h(ddwAp1(~iF%kGmfHGVSz~#&51(FPF~XTVT%c=dhjhnx!crFZP`B z+G?G+c|pis&g@3N+&dk@@imRb_Wv?Y9Pl&0({PAWIKZIh$5ZVmol_#VpG<4i`8)0I z$@|WRQF_j9x5R&(ov_Fza|`RES7DWhorD*itNXNS^;I#Y3j<7zA>%gIvdru&iro6p^uL*Zrvqy zX1>+U>)&qYTkNbd^;;X;eeH1jRfU~S`K+B^o+P@@2&qnzWm`}t7&`ye?)PpVh5Z|NcTC>qc5%fmE>qpOHUG{;$zJ_$ zCEy`7Z>yDW{@&Khv&~*+mFoGpFr={Gv%0h)I^&t&!DDVY8)|3H_SkLvR(g|W*u#=6s7(9(>~pr2 z+oSF6q6{+w&$`GQZ%Nzzw6#@3#+=VquEwA=d&-8HTdj`U{Si>#|L@kcyLHD;r8+$> z33TCJqN?%v`pOj!C(q1$5fW8(^OoT3d-IDA-1lHu5^8An_uaG$IkV1hQ`yxo-R^fL zS>V7<=k|i4t6J_ha(A_+U(FKGoxsRC^L)`c)9VjTwaW!1%U1ud-6CuErsMoph7%4) zBRF4)F6^ClQTwTo?u3i8N;PZDn5URVOX_V*(30+FNXgPZe0%oFWved#^^jvcaV2fl z^1GII+z-a|$uXXoVtxEFL!7aC_uq{+N?RT_RWFG-CVOhnvrAb!o>_E0U~M?Fb4%6H zmGjz-pNJ)VVRBeD=haNLIE!nCkE*iVdVcTq z;+lg~G8%mhvo$6y8@P{VgWYapZGj2?RY*<=<$My4A(4`7w-%?+Fbms9k+>{@vx5PzhO(kp6#z_Ir&XXsy z@Gz@HDJp-eQrBUPnmAnrJB!KV z%!wV(53XozON$d%%adBb;*z5il5-_WaGo~nET^tXe}r;n)1sI>CN2rIbGr8GggeW_ z5Jsn$FN)@_K6kP!fpfu;hF{77R-M7MEs-xpE<7w;p}HWo;ah09xT~_@w{@#toZ52b z+3WAi91J3^?O*n+Tstk2tt0iGg6H>OC%dgl9UZUNF|}M`KXv%w`8Ch7xE(szy~z#u zH6ygyrAAx?+GZ|$k|OPp<*jmhf6#*EvTdCva{?O}+)s%<&DtHbT~xt!l2&cYn@y)J zCiea1`q6O8$kp>-#mvq(IjkOUPo>Q4PIge+@`5AKr2nOa=)tmvkPekhK8~5$S0n`Q zS+dp~m}BHxdGVc$3}c7n$;)Tu%DSIz{lf7fZs#JKS1ot@7^l2Aw`14KtDKCs6Vgse zhrQi!H?Tp-c(bmEL{|GoCEjE%frRXxi|%CVOxt*&kNHdRe7l1larf95CvNQ8C^hS# za891w#qS3gYxDDGow-ohFe8>pY4X-&qgl}(3_iy&u83`~iWEy$nj9d}@$AKn=Rwvn ztQv-DRnwXJB?MepuC8pjR@-JZ*-+$6X~T@t>Xe_Y76#`hELAF~g0!q-ubU_{s4n}F zboAD~dam2yGrrE6X4oL4d(nYwgXF9m4OgR+#aoi47aMxHpL$rZw)4d{my;R}&)Khw ziXIX@l2Ll=#iT@&*W8DT87Eln_;*?}cj1SeD{IcFIlc6;o^#No_>y3Qbi<6btEzLd zU%x(d+{*Q=;3lOBv#n3Bl3vB9SHk{~YeCs+X_ZV7)s&SPz2~kc2hX{*vg-Yti?P4W zSe^(i_?)a9DR%uN!!rKAHxIO@3B@oUSz{j&I`zIxubp>8x~cbMUq+6Z@*jW4OQt;9 zv2nIh0sn=c*E;TU32~e`@oRM|$ISkWl8G0ijqbFxosOIl$0#&C#+TVZ)WLr5M+^S# z@&_(iEcJd;uw!O%w7$`KW8DCwz?&Ddn0(Y)dOl8i@pfB~*L4A>X{{oud&S?Tn^j9K zD7$#m_S(mUf*KhK_6K_Bw38?EM?CFz3Hz3xv!z69N_$ZntAjY#%pD@N795ht&Q=L2 zYCF7qHq9gD@dKTPW0#W^7XL5Z%FNDpqVs6pq5}y|9;yuAo?o%&V-4`uT&sG3kA>+! z_tk6fjI%aRKV+?{a$Rb}bcsxxd;I~oqz{xbRH=&T=3mVGQO58_@8DsEx@9dgDt7n( z<+Q8LG?Nulm^+~(!AeAc;iZ5li|5(~29FDg&`x~{4A0#j?O#wRuemXITGej^X$Tdt=oOpvfLFRxuLto*d#Zyko==Jr;a7Egi z9u4B3z|XzvYPZFPrVcj7AN8wlon`DPIOonG@lS8|--Hhb8vBEsy(hP=5ZaVHi}(AN zGjpe&kLO!-^}(NIeXK>Rk{8W=P*c7xsB(RI&Kqv!q)8$!S`1cKE*o#3cRoIxeI4rt zw@GHJ&b&Frus&UD>h((u!HXERcE6iC=W}$&i>%PSYcJ_N|KrPN^SC? znDMwIwIh#tgWLh3sgE+Y)Jh!qX7&91j(O$_FXrcjcQUSs(KzF*S8i@mZ&0?{*UVvy z=+#%jM=u8c*F68@bVY-mjMS@h*R#Gamz#4r;NgMf*qwKhxxc^ve=4P`hi%21UEdii z?xZl99{KiLDY^d21NBMV%8W^Uo6VfJ?EP4zA9OeCPVBmU*9 zs_D$rUuE4W`R07!_s`BwZ83Svpun}wMGZPOt9EbLSsN>$$)0hg^!ts8%Zmj>C3gEP zEnmuT)3X26I_}))mvcNM9Tu2{@pfaW)4pq8^zyBrPc1$yDEI~T++%fyDiL; z8BJbUWLsX0E@awJYQ5TF?&sBya@O{-2HY&QH~)HV>dRMIw~W6&KF;_qJu$FAP|-L$ zta!ihv3C)2`bK8ZH4N_@Z?yjB7J~fBUs_d0kB}ACJphW!bMv z`Eflg7cMSb`0nx5SJSPc#IClpdid=0(lf7)Y{|Vck>OKJxi%wzN9&61TUb2;@)xZ= z8uU`}VAP|P_tZA0q-_3o=lF}$Od<=bv$p^E z@^(R|%W+4UM0`J4Jx}jc*(tbK=OKfPfX{KzUMWsQ1{!NRHePu>_lT3ftrw=}m|{xScswM<4cH{_abx+CH; z-|p86PvwiZl#<`K2zUgnZjJ~Z_ILpLn^!D3R^Ak)WSJoEQ*~hJ%vs>vwPQOEg z&z)t-jFXr>IJ6sYH#9LC6&zj2s^N0|w1!a9(If+hb*nSJhJF!?YFL!59<}*IM6}zj ze-@icGVe=%-L*gA-ip&qOEy|>y1B1R-EbT0iZ>SK%^B^-3Y>RtVrZS@>8E%uU$g4o z=e0dsSx;Q4X%kbh%xT#uH09>vzZ_3?$umiCJ@!bKsdM5vQ;Jb7Z(GDisyEd-(WUM$_{J(X*^X~4R?Ur$)`^ZX(%847N#jlBGGO4^(xHj!c=i#{#I%?e~ zUEbZvFrJvlIl4eRJ*=PS%Y4i5t6J-4!11YxFfez_di_ul()&ufA*U za-=YJ-SpR#YD{44;&h(!N^F6~s>~J1`H504c4u2<8^2`pSu>S7d@;~-bz5NYtz??# zi{Kky<}$x*QSQ;_4v?5CGJT`+grvsVGv;qAR`?sV{dHO1jT? z@E>@5>3^xJgvd~jyrgYbB>Gq{fHS`)}9qpaGd2V(!YJHW#UOu9S6k@ z0bL>WolPru2fNBWcKsR@YnQow!+WEd{|+*H#J~d)&8$y3W98lrt?l-YgfQ`r9ys6 zhs$F#`+$;&Sy!e^&bVWq({DB5mZ5L&(qAi>FK@c~|52;B!Ra^2TUtB4zb0z$lTwrY zZjyf2O6SHF&mEI})=v2Kc%Ibf1=@^za-GzloU>%Nzq^SwT{nK-597l=HU;a>{S00A zy!F-VfXOd3Gfu6`J~nZ>%Z!`1yDQ7@wr_22Iv43ghn)NW-(|0`jQdiR@al9rJJZ^xgV7xpNq ze=A=sDgi3avsyMXfNT3NVIj}A#XT2QIJaJ_rRMb=om&wMrfOI8n?BFB(r@i`h-ehh z=4;M5#`faEr>DiMr*_q^TeWv8>&o0~?;r21*|)#^{yzOjEuzv2_kXT<9CN-iu1~mQ z?dovGM}OLyp6?a9zFMR~YWt?;2Y$0U3AV?<@iP(gB#~>Fh)*W%4AZhT^##(8{YHt4c7(WXxYjm*rr!eb3Te;R#wu@ z(zkOwY`wjn+bnNiFS_8^oEMRNcUHw6fB9TdWBx)e*DcIX%pWayZ5P9CwmRd&maQj$ zE?e|G^ZFKL22;6@Z>6&DFAK=_wt%?6&R^WbpM{w?BT$weG+Uv-sE&n|ycC^NzA-X=iqrzcacb5YwWUB;pVp*l%?%%5TfvJ~#E> zg?rBZ{I$Wd+UfhgmL@l*lA^pPyPhqXJW-*{MR=n5U)L|{A!joh{!EjRm3lRAMVP$8 z1IC5ZRQDQOyyj*0yFFEKoAm3PT^||d%JlwOqpr{pKW5fO}1 zp6kF(+esU~^5~bto3@D+YwS7n4V43o1OKkQ%5ulYC0yO}%gPAL=lMbx`;?O3s~FbV zKXYL=QQbBF_%2w}`q+naH>NVioe$Ak|Fy68=q=GKC+lFw3oD(>CM^QB(U0x%SGvV{ zu3Ub7$i3)^Oc_G9>_UInOGob7^1dhP?R1$4N0(-XKlY*jEo2UGJg;eKNPJTCU#G7} zMyS`)^Jyq&<`%Ypo;`cw;+^K`vlK8ku=Y-$rtQqOPrPBi_XlBy;}#bKPo?lJmz|b& z%g4LH$tkJ3HQ)e~h?7e6lC4Z)3f}HItU3-GpKPA0>oBb`f-9mS>14Y0fBEKrf9~{7 TU!lyvz`)??>gTe~DWM4fb~kd8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_shortcut_attendance.png b/app/src/main/res/drawable-xxxhdpi/ic_shortcut_attendance.png new file mode 100644 index 0000000000000000000000000000000000000000..7b9a68a708fc52785e7896b46ca261115317cc5b GIT binary patch literal 4892 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 YUYluI^;A%Rfq{X+)78&qol`;+07ldkTmS$7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_shortcut_exam.png b/app/src/main/res/drawable-xxxhdpi/ic_shortcut_exam.png new file mode 100644 index 0000000000000000000000000000000000000000..519c50abcbfa93d9f6ade9896a366d86e3a96997 GIT binary patch literal 5027 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_shortcut_grade.png b/app/src/main/res/drawable-xxxhdpi/ic_shortcut_grade.png new file mode 100644 index 0000000000000000000000000000000000000000..13c793d5eab438cebce711486cec63316f13b9bd GIT binary patch literal 5529 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_shortcut_message.png b/app/src/main/res/drawable-xxxhdpi/ic_shortcut_message.png new file mode 100644 index 0000000000000000000000000000000000000000..eaffa2dde91cb1975be6c8dfc982e1870a29b5f9 GIT binary patch literal 5994 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_shortcut_timetable.png b/app/src/main/res/drawable-xxxhdpi/ic_shortcut_timetable.png new file mode 100644 index 0000000000000000000000000000000000000000..03522e9a59f85db3e8a42e43eb2b10283eaeee0e GIT binary patch literal 5087 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 b{~64W3t1Yxp5V;Dz`)??>gTe~DWM4fTA*>r literal 0 HcmV?d00001 From e08abc1fc25fcd47f50566ad0762cd1b64150d1f Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Fri, 25 Sep 2020 15:45:07 +0200 Subject: [PATCH 0156/1526] Show subjects without grades in "Grades" (#947) --- .../data/repositories/preferences/PreferencesRepository.kt | 3 +++ .../ui/modules/grade/details/GradeDetailsPresenter.kt | 2 +- app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/scheme_preferences.xml | 6 ++++++ 7 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index 1d5e57f8a..a6c83fc91 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -80,6 +80,9 @@ class PreferencesRepository @Inject constructor( val showTimetableTimers: Boolean get() = getBoolean(R.string.pref_key_timetable_show_timers, R.bool.pref_default_timetable_show_timers) + val showSubjectsWithoutGrades: Boolean + get() = getBoolean(R.string.pref_key_subjects_without_grades, R.bool.pref_default_subjects_without_grades) + private fun getString(id: Int, default: Int) = getString(context.getString(id), default) private fun getString(id: String, default: Int) = sharedPref.getString(id, context.getString(default)) ?: context.getString(default) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index a36517938..3dfa0206d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -186,7 +186,7 @@ class GradeDetailsPresenter @Inject constructor( private fun createGradeItems(items: List): List { return items - .filter { it.grades.isNotEmpty() } + .let { if (!preferencesRepository.showSubjectsWithoutGrades) it.filter { it.grades.isNotEmpty() } else it.filter { true }} .sortedBy { it.subject } .map { (subject, average, points, _, grades) -> val subItems = grades diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index bc94b227f..486290587 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -359,6 +359,7 @@ Oznaczaj bieżącą lekcję na planie Pokazuj listę wykresów w ocenach klasy Pokazuj lekcje całej klasy + Pokazuj przedmioty bez ocen w Oceny Schemat kolorów ocen Język aplikacji Powiadomienia diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index a82b14eb7..5c6eb7d69 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -20,4 +20,5 @@ true no false + false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 6cb877ec2..1a0311b36 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -22,4 +22,5 @@ fill_message_content show_whole_class_plan timetable_show_timers + subjects_without_grades diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7df2b68a8..d461299da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -385,6 +385,7 @@ Mark current lesson in timetable Show chart list in class grades Show whole class lessons + Show subjects without grades in Grades Grades color scheme App language diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index 4cdb989c7..bbb2aaeb7 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -40,6 +40,12 @@ app:key="@string/pref_key_grade_statistics_list" app:singleLineTitle="false" app:title="@string/pref_view_grade_statistics_list" /> + Date: Fri, 25 Sep 2020 15:46:08 +0200 Subject: [PATCH 0157/1526] Different notification for notes and praises (#952) --- .../wulkanowy/services/sync/works/NoteWork.kt | 27 +++++++++++-- app/src/main/res/values-pl/strings.xml | 38 +++++++++++++++++++ app/src/main/res/values/strings.xml | 28 ++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt index 84b806795..b08896966 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt @@ -14,6 +14,9 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.note.NoteRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository +import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory +import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory.NEUTRAL +import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory.POSITIVE import io.github.wulkanowy.services.sync.channels.NewNotesChannel import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView @@ -41,8 +44,20 @@ class NoteWork @Inject constructor( private fun notify(notes: List) { notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewNotesChannel.CHANNEL_ID) - .setContentTitle(context.resources.getQuantityString(R.plurals.note_new_items, notes.size, notes.size)) - .setContentText(context.resources.getQuantityString(R.plurals.note_notify_new_items, notes.size, notes.size)) + .setContentTitle( + when (NoteCategory.getByValue(notes.first().categoryType)) { + POSITIVE -> context.resources.getQuantityString(R.plurals.praise_new_items, notes.size, notes.size) + NEUTRAL -> context.resources.getQuantityString(R.plurals.neutral_note_new_items, notes.size, notes.size) + else -> context.resources.getQuantityString(R.plurals.note_new_items, notes.size, notes.size) + } + ) + .setContentText( + when (NoteCategory.getByValue(notes.first().categoryType)) { + POSITIVE -> context.resources.getQuantityString(R.plurals.praise_notify_new_items, notes.size, notes.size) + NEUTRAL -> context.resources.getQuantityString(R.plurals.neutral_note_notify_new_items, notes.size, notes.size) + else -> context.resources.getQuantityString(R.plurals.note_notify_new_items, notes.size, notes.size) + } + ) .setSmallIcon(R.drawable.ic_stat_note) .setAutoCancel(true) .setDefaults(DEFAULT_ALL) @@ -52,7 +67,13 @@ class NoteWork @Inject constructor( PendingIntent.getActivity(context, MainView.Section.NOTE.id, MainActivity.getStartIntent(context, MainView.Section.NOTE, true), FLAG_UPDATE_CURRENT)) .setStyle(NotificationCompat.InboxStyle().run { - setSummaryText(context.resources.getQuantityString(R.plurals.note_number_item, notes.size, notes.size)) + setSummaryText( + when (NoteCategory.getByValue(notes.first().categoryType)) { + POSITIVE -> context.resources.getQuantityString(R.plurals.praise_number_item, notes.size, notes.size) + NEUTRAL -> context.resources.getQuantityString(R.plurals.neutral_note_number_item, notes.size, notes.size) + else -> context.resources.getQuantityString(R.plurals.note_number_item, notes.size, notes.size) + } + ) notes.forEach { addLine("${it.teacher}: ${it.category}") } this }) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 486290587..282044192 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -252,6 +252,44 @@ Masz %1$d nowych uwag Masz %1$d nowych uwag + + + %d pochwała + %d pochwały + %d pochwał + %d pochwał + + + Nowa pochwała + Nowe pochwały + Nowe pochwały + Nowe pochwały + + + Masz %1$d nową pochwałę + Masz %1$d nowe pochwały + Masz %1$d nowych pochwał + Masz %1$d nowych pochwał + + + + %d neutralna uwaga + %d neutralne uwagi + %d neutralnych uwag + %d neutralnych uwag + + + Nowa neutralna uwaga + Nowe neutralne uwagi + Nowe neutralne uwagi + Nowe neutralne uwagi + + + Masz %1$d nową neutralną uwagę + Masz %1$d nowe neutralne uwagi + Masz %1$d nowych neutralnych uwag + Masz %1$d nowych neutralnych uwag + Brak zadań domowych Wykonane diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d461299da..b917ad5d1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -249,6 +249,34 @@ You received %1$d notes + + + %d praise + %d praises + + + New praise + New praises + + + You received %1$d praise + You received %1$d praises + + + + + %d neutral note + %d neutral notes + + + New neutral note + New neutral notes + + + You received %1$d neutral note + You received %1$d neutral notes + + No info about homework From c6a99f10002ea8e030940da5d2249d2105f9db77 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sun, 27 Sep 2020 14:49:19 +0200 Subject: [PATCH 0158/1526] Add remembering the full screen mode in homework (#956) Co-authored-by: Faierbel --- .../preferences/PreferencesRepository.kt | 4 ++++ .../homework/details/HomeworkDetailsAdapter.kt | 4 ++++ .../homework/details/HomeworkDetailsDialog.kt | 17 +++++++++++++++-- .../details/HomeworkDetailsPresenter.kt | 10 +++++++++- .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index a6c83fc91..c76bcf1e7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -80,6 +80,10 @@ class PreferencesRepository @Inject constructor( val showTimetableTimers: Boolean get() = getBoolean(R.string.pref_key_timetable_show_timers, R.bool.pref_default_timetable_show_timers) + var isHomeworkFullscreen: Boolean + get() = getBoolean(R.string.pref_key_homework_fullscreen, R.bool.pref_default_homework_fullscreen) + set(value) = sharedPref.edit().putBoolean("homework_fullscreen", value).apply() + val showSubjectsWithoutGrades: Boolean get() = getBoolean(R.string.pref_key_subjects_without_grades, R.bool.pref_default_subjects_without_grades) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt index 5d6ee162a..cd9a7e851 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt @@ -29,6 +29,8 @@ class HomeworkDetailsAdapter @Inject constructor() : attachments = value?.attachments.orEmpty() } + var isHomeworkFullscreen = false + var onAttachmentClickListener: (url: String) -> Unit = {} var onFullScreenClickListener = {} @@ -67,6 +69,8 @@ class HomeworkDetailsAdapter @Inject constructor() : homeworkDialogSubject.text = homework?.subject homeworkDialogTeacher.text = homework?.teacher homeworkDialogContent.text = homework?.content + homeworkDialogFullScreen.visibility = if (isHomeworkFullscreen) GONE else VISIBLE + homeworkDialogFullScreenExit.visibility = if (isHomeworkFullscreen) VISIBLE else GONE homeworkDialogFullScreen.setOnClickListener { homeworkDialogFullScreen.visibility = GONE homeworkDialogFullScreenExit.visibility = VISIBLE diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt index 78abfffd0..aecaa394d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt @@ -62,12 +62,25 @@ class HomeworkDetailsDialog : BaseDialogFragment(), Homew homeworkDialogClose.setOnClickListener { dismiss() } } + if (presenter.isHomeworkFullscreen) { + dialog?.window?.setLayout(MATCH_PARENT, MATCH_PARENT) + } else { + dialog?.window?.setLayout(WRAP_CONTENT, WRAP_CONTENT) + } + with(binding.homeworkDialogRecycler) { layoutManager = LinearLayoutManager(context) adapter = detailsAdapter.apply { onAttachmentClickListener = { context.openInternetBrowser(it, ::showMessage) } - onFullScreenClickListener = { dialog?.window?.setLayout(MATCH_PARENT, MATCH_PARENT) } - onFullScreenExitClickListener = { dialog?.window?.setLayout(WRAP_CONTENT, WRAP_CONTENT) } + onFullScreenClickListener = { + dialog?.window?.setLayout(MATCH_PARENT, MATCH_PARENT) + presenter.isHomeworkFullscreen = true + } + onFullScreenExitClickListener = { + dialog?.window?.setLayout(WRAP_CONTENT, WRAP_CONTENT) + presenter.isHomeworkFullscreen = false + } + isHomeworkFullscreen = presenter.isHomeworkFullscreen homework = this@HomeworkDetailsDialog.homework } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt index a53d38e86..e485dd748 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.homework.details import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.repositories.homework.HomeworkRepository +import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler @@ -16,9 +17,16 @@ class HomeworkDetailsPresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, private val homeworkRepository: HomeworkRepository, - private val analytics: FirebaseAnalyticsHelper + private val analytics: FirebaseAnalyticsHelper, + private val preferencesRepository: PreferencesRepository ) : BasePresenter(errorHandler, studentRepository) { + var isHomeworkFullscreen + get() = preferencesRepository.isHomeworkFullscreen + set(value) { + preferencesRepository.isHomeworkFullscreen = value + } + override fun onAttachView(view: HomeworkDetailsView) { super.onAttachView(view) view.initView() diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 5c6eb7d69..bb9872718 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -20,5 +20,6 @@ true no false + false false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 1a0311b36..d948dc476 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -22,5 +22,6 @@ fill_message_content show_whole_class_plan timetable_show_timers + homework_fullscreen subjects_without_grades From d32ebd66de8b0969410437ecf637193c61d4e98c Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sun, 27 Sep 2020 16:28:39 +0200 Subject: [PATCH 0159/1526] Add subjects sorting in grades (#946) --- .../preferences/PreferencesRepository.kt | 4 ++++ .../ui/modules/grade/GradeSortingMode.kt | 10 ++++++++++ .../grade/details/GradeDetailsPresenter.kt | 17 +++++++++++++++-- .../main/res/values-pl/preferences_values.xml | 4 ++++ app/src/main/res/values-pl/strings.xml | 1 + .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/preferences_values.xml | 9 +++++++++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/scheme_preferences.xml | 8 ++++++++ 10 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSortingMode.kt diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index c76bcf1e7..fa12622ce 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -5,6 +5,7 @@ import android.content.SharedPreferences import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.grade.GradeAverageMode +import io.github.wulkanowy.ui.modules.grade.GradeSortingMode import javax.inject.Inject import javax.inject.Singleton @@ -77,6 +78,9 @@ class PreferencesRepository @Inject constructor( val showWholeClassPlan: String get() = getString(R.string.pref_key_timetable_show_whole_class, R.string.pref_default_timetable_show_whole_class) + val gradeSortingMode: GradeSortingMode + get() = GradeSortingMode.getByValue(getString(R.string.pref_key_grade_sorting_mode, R.string.pref_default_grade_sorting_mode)) + val showTimetableTimers: Boolean get() = getBoolean(R.string.pref_key_timetable_show_timers, R.bool.pref_default_timetable_show_timers) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSortingMode.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSortingMode.kt new file mode 100644 index 000000000..1e6b26e8c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSortingMode.kt @@ -0,0 +1,10 @@ +package io.github.wulkanowy.ui.modules.grade + +enum class GradeSortingMode(val value: String) { + ALPHABETIC("alphabetic"), + DATE("date"); + + companion object { + fun getByValue(value: String) = values().firstOrNull { it.value == value } ?: ALPHABETIC + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index 3dfa0206d..97b7b71c6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.grade.details +import android.annotation.SuppressLint import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.repositories.grade.GradeRepository @@ -10,6 +11,8 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage +import io.github.wulkanowy.ui.modules.grade.GradeSortingMode.ALPHABETIC +import io.github.wulkanowy.ui.modules.grade.GradeSortingMode.DATE import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource @@ -184,10 +187,20 @@ class GradeDetailsPresenter @Inject constructor( } } + @SuppressLint("DefaultLocale") private fun createGradeItems(items: List): List { return items - .let { if (!preferencesRepository.showSubjectsWithoutGrades) it.filter { it.grades.isNotEmpty() } else it.filter { true }} - .sortedBy { it.subject } + .let { gradesWithAverages -> + if (!preferencesRepository.showSubjectsWithoutGrades) { + gradesWithAverages.filter { it.grades.isNotEmpty() } + } else gradesWithAverages + } + .let { + when (preferencesRepository.gradeSortingMode) { + DATE -> it.sortedByDescending { gradeDetailsWithAverage -> gradeDetailsWithAverage.grades.firstOrNull()?.date } + ALPHABETIC -> it.sortedBy { gradeDetailsWithAverage -> gradeDetailsWithAverage.subject.toLowerCase() } + } + } .map { (subject, average, points, _, grades) -> val subItems = grades .sortedByDescending { it.date } diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 1d81fb586..c57d2be54 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -29,6 +29,10 @@ 0,5 0,75 + + Alfabetycznie + Według daty + Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 282044192..330174525 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -399,6 +399,7 @@ Pokazuj lekcje całej klasy Pokazuj przedmioty bez ocen w Oceny Schemat kolorów ocen + Sortowanie przedmiotów w "Oceny" Język aplikacji Powiadomienia Pokazuj powiadomienia diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index bb9872718..d42cfc324 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -19,6 +19,7 @@ 0.33 true no + alphabetic false false false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index d948dc476..e9f9054e0 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -20,6 +20,7 @@ grade_modifier_plus grade_modifier_minus fill_message_content + grade_sorting_mode show_whole_class_plan timetable_show_timers homework_fullscreen diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index 5824658c4..06a9d8c4a 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -75,6 +75,15 @@ 0.75 + + Alphabetic + By date + + + alphabetic + date + + Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b917ad5d1..073e77385 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -415,6 +415,7 @@ Show whole class lessons Show subjects without grades in Grades Grades color scheme + Subjects sorting in "Grades" App language Notifications diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index bbb2aaeb7..99cb33669 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -62,6 +62,14 @@ app:key="@string/pref_key_grade_color_scheme" app:title="@string/pref_view_grade_color_scheme" app:useSimpleSummaryProvider="true" /> + Date: Sun, 27 Sep 2020 16:33:36 +0200 Subject: [PATCH 0160/1526] Show groups next to subjects in timetable (#953) --- .../preferences/PreferencesRepository.kt | 3 +++ .../ui/modules/timetable/TimetableAdapter.kt | 5 ++++ .../ui/modules/timetable/TimetableFragment.kt | 3 ++- .../modules/timetable/TimetablePresenter.kt | 1 + .../ui/modules/timetable/TimetableView.kt | 2 +- app/src/main/res/layout/item_timetable.xml | 23 +++++++++++++++---- app/src/main/res/values-pl/strings.xml | 1 + .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/scheme_preferences.xml | 6 +++++ 11 files changed, 41 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index fa12622ce..da31751a1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -75,6 +75,9 @@ class PreferencesRepository @Inject constructor( val fillMessageContent: Boolean get() = getBoolean(R.string.pref_key_fill_message_content, R.bool.pref_default_fill_message_content) + val showGroupsInPlan: Boolean + get() = getBoolean(R.string.pref_key_timetable_show_groups, R.bool.pref_default_timetable_show_groups) + val showWholeClassPlan: String get() = getString(R.string.pref_key_timetable_show_whole_class, R.string.pref_default_timetable_show_whole_class) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index 58be38cec..f049f828e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -41,6 +41,8 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter() @@ -99,6 +101,7 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter(R.layout.fragme else false } - override fun updateData(data: List, showWholeClassPlanType: String, showTimetableTimers: Boolean) { + override fun updateData(data: List, showWholeClassPlanType: String, showGroupsInPlanType: Boolean, showTimetableTimers: Boolean) { with(timetableAdapter) { items = data.toMutableList() showTimers = showTimetableTimers showWholeClassPlan = showWholeClassPlanType + showGroupsInPlan = showGroupsInPlanType notifyDataSetChanged() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 8581b73c6..f924650a0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -143,6 +143,7 @@ class TimetablePresenter @Inject constructor( view?.apply { updateData( showWholeClassPlanType = prefRepository.showWholeClassPlan, + showGroupsInPlanType = prefRepository.showGroupsInPlan, showTimetableTimers = prefRepository.showTimetableTimers, data = it.data!! .filter { item -> if (prefRepository.showWholeClassPlan == "no") item.isStudentPlan else true } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt index fe34f1ee9..244120176 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt @@ -12,7 +12,7 @@ interface TimetableView : BaseView { fun initView() - fun updateData(data: List, showWholeClassPlanType: String, showTimetableTimers: Boolean) + fun updateData(data: List, showWholeClassPlanType: String, showGroupsInPlanType: Boolean, showTimetableTimers: Boolean) fun updateNavigationDay(date: String) diff --git a/app/src/main/res/layout/item_timetable.xml b/app/src/main/res/layout/item_timetable.xml index 4e278261a..ccef6e72d 100644 --- a/app/src/main/res/layout/item_timetable.xml +++ b/app/src/main/res/layout/item_timetable.xml @@ -74,7 +74,22 @@ app:layout_constraintBottom_toBottomOf="@+id/timetableItemNumber" app:layout_constraintStart_toEndOf="@+id/timetableItemTimeStart" tools:text="22" - tools:visibility="gone" /> + tools:visibility="visible" /> + + + tools:visibility="visible" /> diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 330174525..0923951ad 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -395,6 +395,7 @@ Motyw aplikacji Rozwiń oceny Oznaczaj bieżącą lekcję na planie + Pokazuj grupę obok przedmiotu na planie Pokazuj listę wykresów w ocenach klasy Pokazuj lekcje całej klasy Pokazuj przedmioty bez ocen w Oceny diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index d42cfc324..fb82e0ed6 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -18,6 +18,7 @@ 0.33 0.33 true + false no alphabetic false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index e9f9054e0..0cfa485e3 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -22,6 +22,7 @@ fill_message_content grade_sorting_mode show_whole_class_plan + show_groups_in_plan timetable_show_timers homework_fullscreen subjects_without_grades diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 073e77385..bf4727be6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -411,6 +411,7 @@ Application theme Expand grades Mark current lesson in timetable + Show groups next to subjects in timetable Show chart list in class grades Show whole class lessons Show subjects without grades in Grades diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index 99cb33669..3f24c787a 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -40,6 +40,12 @@ app:key="@string/pref_key_grade_statistics_list" app:singleLineTitle="false" app:title="@string/pref_view_grade_statistics_list" /> + Date: Sun, 27 Sep 2020 20:59:27 +0200 Subject: [PATCH 0161/1526] Migrate from gson to moshi (#969) --- app/build.gradle | 7 +++-- .../io/github/wulkanowy/data/db/Converters.kt | 30 ++++++++++++------- .../wulkanowy/data/pojos/Contributor.kt | 8 ++++- .../appcreator/AppCreatorRepository.kt | 11 +++---- .../main/res/layout/fragment_contributor.xml | 10 ++++--- app/src/main/res/layout/item_contributor.xml | 3 +- 6 files changed, 46 insertions(+), 23 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 11a82fbd0..c0a4e9f37 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -119,6 +119,7 @@ ext { room = "2.2.5" chucker = "3.2.0" mockk = "1.10.0" + moshi = "1.9.3" } configurations.all { @@ -126,7 +127,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.20.5" + implementation "io.github.wulkanowy:sdk:9364c2e" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' @@ -170,7 +171,9 @@ dependencies { implementation "com.ncapdevi:frag-nav:3.3.0" implementation "com.github.YarikSOffice:lingver:1.2.2" - implementation "com.google.code.gson:gson:2.8.6" + implementation "com.squareup.moshi:moshi:$moshi" + implementation "com.squareup.moshi:moshi-adapters:$moshi" + kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi" implementation "com.jakewharton.timber:timber:4.7.1" implementation "at.favre.lib:slf4j-timber:1.0.1" implementation "fr.bipi.treessence:treessence:0.3.2" diff --git a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt index b21c4834f..834a9636a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt @@ -1,8 +1,8 @@ package io.github.wulkanowy.data.db import androidx.room.TypeConverter -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime @@ -12,6 +12,16 @@ import java.util.Date class Converters { + private val moshi by lazy { Moshi.Builder().build() } + + private val integerListAdapter by lazy { + moshi.adapter>(Types.newParameterizedType(List::class.java, Integer::class.java)) + } + + private val stringMapAdapter by lazy { + moshi.adapter>(Types.newParameterizedType(MutableMap::class.java, String::class.java, String::class.java)) + } + @TypeConverter fun timestampToDate(value: Long?): LocalDate? = value?.run { Date(value).toInstant().atZone(ZoneOffset.UTC).toLocalDate() @@ -39,22 +49,22 @@ class Converters { fun intToMonth(value: Int?) = value?.let { Month.of(it) } @TypeConverter - fun intListToGson(list: List): String { - return Gson().toJson(list) + fun intListToJson(list: List): String { + return integerListAdapter.toJson(list) } @TypeConverter - fun gsonToIntList(value: String): List { - return Gson().fromJson(value, object : TypeToken>() {}.type) + fun jsonToIntList(value: String): List { + return integerListAdapter.fromJson(value).orEmpty() } @TypeConverter - fun stringPairListToGson(list: List>): String { - return Gson().toJson(list) + fun stringPairListToJson(list: List>): String { + return stringMapAdapter.toJson(list.toMap()) } @TypeConverter - fun gsonToStringPairList(value: String): List> { - return Gson().fromJson(value, object : TypeToken>>() {}.type) + fun jsonToStringPairList(value: String): List> { + return stringMapAdapter.fromJson(value).orEmpty().toList() } } diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt index e792bde46..d2338c281 100644 --- a/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt @@ -1,3 +1,9 @@ package io.github.wulkanowy.data.pojos -class Contributor(val displayName: String, val githubUsername: String) +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +class Contributor( + val displayName: String, + val githubUsername: String +) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt index d19565579..ff538969b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt @@ -1,7 +1,8 @@ package io.github.wulkanowy.data.repositories.appcreator import android.content.res.AssetManager -import com.google.gson.Gson +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types import io.github.wulkanowy.data.pojos.Contributor import io.github.wulkanowy.utils.DispatchersProvider import kotlinx.coroutines.withContext @@ -15,9 +16,9 @@ class AppCreatorRepository @Inject constructor( ) { suspend fun getAppCreators() = withContext(dispatchers.backgroundThread) { - Gson().fromJson( - assets.open("contributors.json").bufferedReader().use { it.readText() }, - Array::class.java - ).toList() + val moshi = Moshi.Builder().build() + val type = Types.newParameterizedType(List::class.java, Contributor::class.java) + val adapter = moshi.adapter>(type) + adapter.fromJson(assets.open("contributors.json").bufferedReader().use { it.readText() }) } } diff --git a/app/src/main/res/layout/fragment_contributor.xml b/app/src/main/res/layout/fragment_contributor.xml index 399ab5999..d913c5a4d 100644 --- a/app/src/main/res/layout/fragment_contributor.xml +++ b/app/src/main/res/layout/fragment_contributor.xml @@ -1,5 +1,6 @@ @@ -20,17 +21,18 @@ android:id="@+id/creatorRecycler" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="1" /> + android:layout_weight="1" + tools:listitem="@layout/item_contributor" /> diff --git a/app/src/main/res/layout/item_contributor.xml b/app/src/main/res/layout/item_contributor.xml index 36eb64ecc..9b1263438 100644 --- a/app/src/main/res/layout/item_contributor.xml +++ b/app/src/main/res/layout/item_contributor.xml @@ -15,7 +15,8 @@ android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" - android:contentDescription="@string/contributor_avatar_description" /> + android:contentDescription="@string/contributor_avatar_description" + tools:src="@tools:sample/avatars" /> Date: Sun, 27 Sep 2020 22:11:55 +0200 Subject: [PATCH 0162/1526] Version 0.21.0 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 11 ++++++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 45818739f..c2361d66c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.20.5 + - 0.21.0 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index c0a4e9f37..0dd315277 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 69 - versionName "0.20.5" + versionCode 70 + versionName "0.21.0" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -127,7 +127,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:9364c2e" + implementation "io.github.wulkanowy:sdk:0.21.0" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 62a71f437..09f44931d 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,10 @@ -Wersja 0.20.5 -- naprawiliśmy logowanie do koszalińskiego dziennika -- naprawiliśmy resetowanie hasła na gdańskim dzienniku +Wersja 0.21.0 +- naprawiliśmy logowanie do tarnowskiego dziennika +- naprawiliśmy wyświetlanie podsumowania punktów klasy +- dodaliśmy skróty aplikacji +- dodaliśmy opcję pokazywania nazwy grupy w planie lekcji na liście +- dodaliśmy opcję pokazywania w ocenach przedmiotów bez ocen +- dodaliśmy dodatkowe opcje sortowania ocen +- dodaliśmy rozróżnianie powiadomień dla pochwał i uwag Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From e5661098d9f9b293580cb41840520e134b36bdb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 29 Sep 2020 11:42:54 +0200 Subject: [PATCH 0163/1526] Fix string pair list type converter (#970) --- app/build.gradle | 2 +- .../io/github/wulkanowy/data/db/Converters.kt | 11 +-- .../data/db/adapters/PairAdapterFactory.kt | 68 +++++++++++++++++++ .../wulkanowy/data/db/ConvertersTest.kt | 25 +++++++ 4 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt create mode 100644 app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt diff --git a/app/build.gradle b/app/build.gradle index 0dd315277..440b665a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -127,7 +127,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.21.0" + implementation "io.github.wulkanowy:sdk:84c0703" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt index 834a9636a..def0b3715 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db import androidx.room.TypeConverter import com.squareup.moshi.Moshi import com.squareup.moshi.Types +import io.github.wulkanowy.data.db.adapters.PairAdapterFactory import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime @@ -12,14 +13,14 @@ import java.util.Date class Converters { - private val moshi by lazy { Moshi.Builder().build() } + private val moshi by lazy { Moshi.Builder().add(PairAdapterFactory).build() } private val integerListAdapter by lazy { moshi.adapter>(Types.newParameterizedType(List::class.java, Integer::class.java)) } - private val stringMapAdapter by lazy { - moshi.adapter>(Types.newParameterizedType(MutableMap::class.java, String::class.java, String::class.java)) + private val stringListPairAdapter by lazy { + moshi.adapter>>(Types.newParameterizedType(List::class.java, Pair::class.java, String::class.java, String::class.java)) } @TypeConverter @@ -60,11 +61,11 @@ class Converters { @TypeConverter fun stringPairListToJson(list: List>): String { - return stringMapAdapter.toJson(list.toMap()) + return stringListPairAdapter.toJson(list) } @TypeConverter fun jsonToStringPairList(value: String): List> { - return stringMapAdapter.fromJson(value).orEmpty().toList() + return stringListPairAdapter.fromJson(value).orEmpty() } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt b/app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt new file mode 100644 index 000000000..60ae37c9d --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt @@ -0,0 +1,68 @@ +package io.github.wulkanowy.data.db.adapters + +import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.JsonReader +import com.squareup.moshi.JsonWriter +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type + +object PairAdapterFactory : JsonAdapter.Factory { + + override fun create(type: Type, annotations: MutableSet, moshi: Moshi): JsonAdapter<*>? { + if (type !is ParameterizedType || List::class.java != type.rawType) return null + if (type.actualTypeArguments[0] != Pair::class.java) return null + + val listType = Types.newParameterizedType(List::class.java, Map::class.java, String::class.java) + val listAdapter = moshi.adapter>>(listType) + + val mapType = Types.newParameterizedType(MutableMap::class.java, String::class.java, String::class.java) + val mapAdapter = moshi.adapter>(mapType) + + return PairAdapter(listAdapter, mapAdapter) + } + + private class PairAdapter( + private val listAdapter: JsonAdapter>>, + private val mapAdapter: JsonAdapter>, + ) : JsonAdapter>>() { + + override fun toJson(writer: JsonWriter, value: List>?) { + writer.beginArray() + value?.forEach { + writer.beginObject() + writer.name("first").value(it.first) + writer.name("second").value(it.second) + writer.endObject() + } + writer.endArray() + } + + override fun fromJson(reader: JsonReader): List>? { + return if (reader.peek() == JsonReader.Token.BEGIN_OBJECT) deserializeMoshiMap(reader) + else deserializeGsonPair(reader) + } + + // for compatibility with 0.21.0 + private fun deserializeMoshiMap(reader: JsonReader): List>? { + val map = mapAdapter.fromJson(reader) ?: return null + + return map.entries.map { + it.key to it.value + } + } + + private fun deserializeGsonPair(reader: JsonReader): List>? { + val list = listAdapter.fromJson(reader) ?: return null + + require(list.size == 2 || list.isEmpty()) { + "pair with more or less than two elements: $list" + } + + return list.map { + it["first"].orEmpty() to it["second"].orEmpty() + } + } + } +} diff --git a/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt b/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt new file mode 100644 index 000000000..50741b7ab --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt @@ -0,0 +1,25 @@ +package io.github.wulkanowy.data.db + +import org.junit.Assert.assertEquals +import org.junit.Test + +class ConvertersTest { + + @Test + fun stringPairListToJson() { + assertEquals(Converters().stringPairListToJson(listOf("aaa" to "bbb", "ccc" to "ddd")), "[{\"first\":\"aaa\",\"second\":\"bbb\"},{\"first\":\"ccc\",\"second\":\"ddd\"}]") + assertEquals(Converters().stringPairListToJson(listOf()), "[]") + } + + @Test + fun jsonToStringPairList() { + assertEquals(Converters().jsonToStringPairList("[{\"first\":\"aaa\",\"second\":\"bbb\"},{\"first\":\"ccc\",\"second\":\"ddd\"}]"), listOf("aaa" to "bbb", "ccc" to "ddd")) + assertEquals(Converters().jsonToStringPairList("[]"), listOf>()) + } + + @Test + fun jsonToStringPairList_0210() { + assertEquals(Converters().jsonToStringPairList("{\"aaa\":\"bbb\",\"ccc\":\"ddd\"}"), listOf("aaa" to "bbb", "ccc" to "ddd")) + assertEquals(Converters().jsonToStringPairList("{}"), listOf>()) + } +} From d95a33787b39a1215efdf9f6a91cba9edb23df30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 29 Sep 2020 11:43:49 +0200 Subject: [PATCH 0164/1526] Version 0.21.1 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c2361d66c..a36c34cfe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.21.0 + - 0.21.1 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index 440b665a0..cee711d20 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 70 - versionName "0.21.0" + versionCode 71 + versionName "0.21.1" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -127,7 +127,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:84c0703" + implementation "io.github.wulkanowy:sdk:0.21.1" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 09f44931d..271eac7fd 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 0.21.0 +Wersja 0.21.1 - naprawiliśmy logowanie do tarnowskiego dziennika - naprawiliśmy wyświetlanie podsumowania punktów klasy - dodaliśmy skróty aplikacji From 1f0f6b3e512bd37513855d5bb35d855af29f4a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 29 Sep 2020 21:02:49 +0200 Subject: [PATCH 0165/1526] Fix string pair list type converter (#971) --- app/build.gradle | 2 +- .../wulkanowy/data/db/adapters/PairAdapterFactory.kt | 8 ++++---- .../java/io/github/wulkanowy/data/db/ConvertersTest.kt | 5 +++++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cee711d20..927f2e50d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -127,7 +127,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.21.1" + implementation "io.github.wulkanowy:sdk:7577fc9" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt b/app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt index 60ae37c9d..4a9b168dd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt @@ -56,11 +56,11 @@ object PairAdapterFactory : JsonAdapter.Factory { private fun deserializeGsonPair(reader: JsonReader): List>? { val list = listAdapter.fromJson(reader) ?: return null - require(list.size == 2 || list.isEmpty()) { - "pair with more or less than two elements: $list" - } - return list.map { + require(it.size == 2) { + "pair with more or less than two elements: $list" + } + it["first"].orEmpty() to it["second"].orEmpty() } } diff --git a/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt b/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt index 50741b7ab..3b0d7c841 100644 --- a/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt @@ -7,19 +7,24 @@ class ConvertersTest { @Test fun stringPairListToJson() { + assertEquals(Converters().stringPairListToJson(listOf("aaa" to "bbb", "ccc" to "ddd", "eee" to "fff")), "[{\"first\":\"aaa\",\"second\":\"bbb\"},{\"first\":\"ccc\",\"second\":\"ddd\"},{\"first\":\"eee\",\"second\":\"fff\"}]") assertEquals(Converters().stringPairListToJson(listOf("aaa" to "bbb", "ccc" to "ddd")), "[{\"first\":\"aaa\",\"second\":\"bbb\"},{\"first\":\"ccc\",\"second\":\"ddd\"}]") + assertEquals(Converters().stringPairListToJson(listOf("aaa" to "bbb")), "[{\"first\":\"aaa\",\"second\":\"bbb\"}]") assertEquals(Converters().stringPairListToJson(listOf()), "[]") } @Test fun jsonToStringPairList() { + assertEquals(Converters().jsonToStringPairList("[{\"first\":\"aaa\",\"second\":\"bbb\"},{\"first\":\"ccc\",\"second\":\"ddd\"},{\"first\":\"eee\",\"second\":\"fff\"}]"), listOf("aaa" to "bbb", "ccc" to "ddd", "eee" to "fff")) assertEquals(Converters().jsonToStringPairList("[{\"first\":\"aaa\",\"second\":\"bbb\"},{\"first\":\"ccc\",\"second\":\"ddd\"}]"), listOf("aaa" to "bbb", "ccc" to "ddd")) + assertEquals(Converters().jsonToStringPairList("[{\"first\":\"aaa\",\"second\":\"bbb\"}]"), listOf("aaa" to "bbb")) assertEquals(Converters().jsonToStringPairList("[]"), listOf>()) } @Test fun jsonToStringPairList_0210() { assertEquals(Converters().jsonToStringPairList("{\"aaa\":\"bbb\",\"ccc\":\"ddd\"}"), listOf("aaa" to "bbb", "ccc" to "ddd")) + assertEquals(Converters().jsonToStringPairList("{\"aaa\":\"bbb\"}"), listOf("aaa" to "bbb")) assertEquals(Converters().jsonToStringPairList("{}"), listOf>()) } } From 8a1a712d6d46b551b3093ca170ff80ee53663970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 29 Sep 2020 21:10:05 +0200 Subject: [PATCH 0166/1526] Version 0.21.2 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index a36c34cfe..24280c5f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.21.1 + - 0.21.2 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index 927f2e50d..566094662 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 71 - versionName "0.21.1" + versionCode 72 + versionName "0.21.2" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -127,7 +127,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:7577fc9" + implementation "io.github.wulkanowy:sdk:0.21.2" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 271eac7fd..7553e2cb7 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 0.21.1 +Wersja 0.21.2 - naprawiliśmy logowanie do tarnowskiego dziennika - naprawiliśmy wyświetlanie podsumowania punktów klasy - dodaliśmy skróty aplikacji From 7298d0d75a33aad1e6dbf76f402a550cc66b09d9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2020 19:33:22 +0000 Subject: [PATCH 0167/1526] Bump google-services from 4.3.3 to 4.3.4 (#978) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4205cce56..ec7f96ffa 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.android.tools.build:gradle:4.0.1' 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.4' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0' classpath "com.github.triplet.gradle:play-publisher:2.7.5" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0" From f21216286da6d5ecafe4e38d6ad126c6ae9d58f8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2020 19:34:13 +0000 Subject: [PATCH 0168/1526] Bump mockk from 1.10.0 to 1.10.2 (#977) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 566094662..3fe8de512 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -118,7 +118,7 @@ ext { work_manager = "2.4.0" room = "2.2.5" chucker = "3.2.0" - mockk = "1.10.0" + mockk = "1.10.2" moshi = "1.9.3" } From 613fa44c27f6f2386d5e4169c319c333a126d0a7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2020 19:34:53 +0000 Subject: [PATCH 0169/1526] Bump about_libraries from 8.3.0 to 8.3.1 (#975) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ec7f96ffa..c5cfaf99b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.4.10' - about_libraries = '8.3.0' + about_libraries = '8.3.1' hilt_version = "2.29.1-alpha" } repositories { From 43ed8c8fce7a7899b83dfd6a2047f8ff9eb64af0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2020 19:52:02 +0000 Subject: [PATCH 0170/1526] Bump firebase-messaging from 20.2.4 to 20.3.0 (#973) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3fe8de512..9c5070529 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -186,7 +186,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics:17.5.0' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.1.1' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.1.1" - playImplementation 'com.google.firebase:firebase-messaging:20.2.4' + playImplementation 'com.google.firebase:firebase-messaging:20.3.0' playImplementation 'com.google.firebase:firebase-crashlytics:17.2.1' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' From c479b31670934470f52bb6428756f112f347d095 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2020 20:01:45 +0000 Subject: [PATCH 0171/1526] Bump coil from 1.0.0-rc2 to 1.0.0-rc3 (#976) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 9c5070529..b0c1bf6c7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -179,7 +179,7 @@ dependencies { implementation "fr.bipi.treessence:treessence:0.3.2" implementation "com.mikepenz:aboutlibraries-core:$about_libraries" implementation 'com.wdullaer:materialdatetimepicker:4.2.3' - implementation "io.coil-kt:coil:1.0.0-rc2" + implementation "io.coil-kt:coil:1.0.0-rc3" implementation "io.github.wulkanowy:AppKillerManager:3.0.0" implementation 'me.xdrop:fuzzywuzzy:1.3.1' From 112c1eb793942111f4536346cba28ade30b72a54 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2020 20:13:01 +0000 Subject: [PATCH 0172/1526] Bump moshi from 1.9.3 to 1.10.0 (#972) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b0c1bf6c7..605880691 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -119,7 +119,7 @@ ext { room = "2.2.5" chucker = "3.2.0" mockk = "1.10.2" - moshi = "1.9.3" + moshi = "1.10.0" } configurations.all { From 047e70ad46cf36ed91bd8cc63fcb96a9ef3dce33 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2020 20:13:18 +0000 Subject: [PATCH 0173/1526] Bump firebase-crashlytics from 17.2.1 to 17.2.2 (#974) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 605880691..9dffc3807 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,7 +187,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.1.1' playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.1.1" playImplementation 'com.google.firebase:firebase-messaging:20.3.0' - playImplementation 'com.google.firebase:firebase-crashlytics:17.2.1' + playImplementation 'com.google.firebase:firebase-crashlytics:17.2.2' playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From b91973aec374c9fbbf7b149aa261ae8035cf7d78 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2020 15:38:29 +0000 Subject: [PATCH 0174/1526] Bump chucker from 3.2.0 to 3.3.0 (#979) --- app/build.gradle | 2 +- .../main/java/io/github/wulkanowy/data/RepositoryModule.kt | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9dffc3807..6bcb9765a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -117,7 +117,7 @@ play { ext { work_manager = "2.4.0" room = "2.2.5" - chucker = "3.2.0" + chucker = "3.3.0" mockk = "1.10.2" moshi = "1.10.0" } diff --git a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt index 3370d0ac3..6486cab97 100644 --- a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt @@ -33,7 +33,11 @@ internal class RepositoryModule { setSimpleHttpLogger { Timber.d(it) } // for debug only - addInterceptor(ChuckerInterceptor(context, chuckerCollector), true) + addInterceptor(ChuckerInterceptor( + context = context, + collector = chuckerCollector, + alwaysReadResponseBody = true + ), true) } } From 40fc6ec2e07941931b2e72f02a0b44da09c7345a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 3 Oct 2020 01:08:57 +0200 Subject: [PATCH 0175/1526] Upgrade android sdk to 30 (#966) --- .travis.yml | 24 +++++++++------- app/build.gradle | 6 ++-- .../wulkanowy/ui/modules/main/MainActivity.kt | 4 +-- .../message/preview/MessagePreviewFragment.kt | 2 +- .../message/send/SendMessageActivity.kt | 6 ++-- .../io/github/wulkanowy/utils/LoggerUtils.kt | 28 +++++++++---------- 6 files changed, 38 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 24280c5f8..dc9df619e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,8 @@ jdk: oraclejdk8 env: global: - - ANDROID_API_LEVEL=29 - - ANDROID_BUILD_TOOLS_VERSION=29.0.3 + - ANDROID_API_LEVEL=30 + - ANDROID_BUILD_TOOLS_VERSION=30.0.2 cache: directories: @@ -28,22 +28,26 @@ android: - build-tools-$ANDROID_BUILD_TOOLS_VERSION # The SDK version used to compile your project - android-$ANDROID_API_LEVEL - # Additional components + # Additional components - extra-google-google_play_services - extra-google-m2repository - extra-android-m2repository - addon-google_apis-google-$ANDROID_API_LEVEL - # Android emulator + # Android emulator - android-22 - sys-img-armeabi-v7a-android-22 +before_install: + - yes | sdkmanager "platforms;android-30" + - yes | sdkmanager "build-tools;30.0.2" + before_script: - # Launch emulator before the execution - - echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a - - emulator -avd test -no-audio -no-window & - - android-wait-for-emulator - - adb shell input keyevent 82 & - - "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | sudo bash" + # Launch emulator before the execution + - echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a + - emulator -avd test -no-audio -no-window & + - android-wait-for-emulator + - adb shell input keyevent 82 & + - "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | sudo bash" script: - ./gradlew dependencies --stacktrace --daemon diff --git a/app/build.gradle b/app/build.gradle index 6bcb9765a..1cd3b9905 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,14 +10,14 @@ apply from: 'sonarqube.gradle' apply from: 'hooks.gradle' android { - compileSdkVersion 29 - buildToolsVersion '29.0.3' + compileSdkVersion 30 + buildToolsVersion '30.0.2' defaultConfig { applicationId "io.github.wulkanowy" testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 72 versionName "0.21.2" multiDexEnabled true diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 95b4aa77a..53ac16316 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -181,8 +181,8 @@ class MainActivity : BaseActivity(), MainVie analytics.setCurrentScreen(this, name) } - override fun onOptionsItemSelected(item: MenuItem?): Boolean { - return if (item?.itemId == R.id.mainMenuAccount) presenter.onAccountManagerSelected() + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return if (item.itemId == R.id.mainMenuAccount) presenter.onAccountManagerSelected() else false } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index 740f4927c..b35731cae 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -174,7 +174,7 @@ class MessagePreviewFragment : @RequiresApi(Build.VERSION_CODES.LOLLIPOP) override fun printDocument(html: String, jobName: String) { - val webView = WebView(activity) + val webView = WebView(requireContext()) webView.webViewClient = object : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest) = false diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt index 2267279c2..59944d41d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.message.send +import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.graphics.Rect @@ -74,6 +75,7 @@ class SendMessageActivity : BaseActivity Date: Sat, 3 Oct 2020 13:01:11 +0200 Subject: [PATCH 0176/1526] New Crowdin updates (#948) --- .../main/res/values-de/preferences_values.xml | 4 + app/src/main/res/values-de/strings.xml | 31 ++++++++ .../main/res/values-ru/preferences_values.xml | 8 +- app/src/main/res/values-ru/strings.xml | 73 +++++++++++++++---- .../main/res/values-uk/preferences_values.xml | 4 + app/src/main/res/values-uk/strings.xml | 43 +++++++++++ 6 files changed, 146 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 11935b49b..177a12a98 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -29,6 +29,10 @@ 0,5 0,75 + + Alphabetic + By date + Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7e2877674..c33c273ab 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -154,6 +154,8 @@ Entschuldigte Verspätung Unentschuldigte Verspätung Anwesend + Deleted + Unknown Lektion Nummer Keine Einträgen @@ -222,6 +224,32 @@ Du hast %1$d Eintrag bekommen Du hast %1$d Eintragen bekommen + + + %d praise + %d praises + + + New praise + New praises + + + You received %1$d praise + You received %1$d praises + + + + %d neutral note + %d neutral notes + + + New neutral note + New neutral notes + + + You received %1$d neutral note + You received %1$d neutral notes + Keine Informationen über Hausaufgaben Gemacht @@ -327,9 +355,12 @@ Thema der Anwendung Noten erweitern Aktuelle Lektion im Stundenplan markieren + Show groups next to subjects in timetable Liste der Diagramme in Klassenbewertungen anzeigen Unterricht der ganzen Klasse anzeigen + Show subjects without grades in Grades Farbschema der Noten + Subjects sorting in \"Grades\" App Sprache Benachrichtigungen Benachrichtigungen anzeigen diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index a41abf350..b8c7e4f64 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -29,6 +29,10 @@ 0,5 0,75 + + Alphabetic + By date + Dzienniczek+ Wulkanowy @@ -36,8 +40,8 @@ Средняя оценка со 2 семестра - Average of grades from both semesters - Average of grades from the whole year + Средняя оценка с двух семестров + Средняя оценок со всего года Не показывать diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7052fbc9c..a4870b847 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -108,16 +108,16 @@ Новые оценки - New predicted grade + Новая ожидаемая оценка New predicted grades New predicted grades - New predicted grades + Новые ожидаемые оценки - New final grade + Новая итоговая оценка New final grades New final grades - New final grades + Новые итоговые оценки Вы получили %1$d оценку @@ -126,16 +126,16 @@ Вы получили %1$d оценок - You received %1$d predicted grade - You received %1$d predicted grades + Вы получили %1$d ожидаемую оценку + Вы получили %1$d ожидаемые оценки You received %1$d predicted grades You received %1$d predicted grades - You received %1$d final grade + Вы получили %1$d финальную оценку You received %1$d final grades You received %1$d final grades - You received %1$d final grades + Вы получили %1$d финальные оценки Урок @@ -168,6 +168,8 @@ Опоздание по уважительным причинам Опоздание по неуважительным причинам Присутствие + Удалено + Неизвестно Урок № Данные не найдены @@ -204,8 +206,8 @@ Перенести в корзину Удалить навсегда Сообщение успешно удалено - Share - Print + Поделиться + Печать Тема Текст Сообщение успешно отправлено @@ -250,6 +252,44 @@ Вы получили %1$d предупреждений Вы получили %1$d предупреждений + + + %d praise + %d praises + %d praises + %d praises + + + New praise + New praises + New praises + New praises + + + You received %1$d praise + You received %1$d praises + You received %1$d praises + You received %1$d praises + + + + %d neutral note + %d neutral notes + %d neutral notes + %d neutral notes + + + New neutral note + New neutral notes + New neutral notes + New neutral notes + + + You received %1$d neutral note + You received %1$d neutral notes + You received %1$d neutral notes + You received %1$d neutral notes + Нет домашних заданий сделанный @@ -291,10 +331,10 @@ Выйти Вы точно хотите выйти из данного аккаунта? Выйти - Student account - Parent account - Mobile API mode - Hybrid mode + Профиль ученика + Профиль родителя + Режим Mobile API + Гибридный режим Версия приложения Разработчики @@ -353,11 +393,14 @@ Принудительно высчитать среднюю оценку через приложение Показывать присутствия в посещаемости Тема приложения - Больше оценок + Разворачивать оценки Отмечать текущий урок в расписании + Show groups next to subjects in timetable Показывать диаграммы в оценках класса Показать уроки всего класса + Show subjects without grades in Grades Схема цветов оценок + Subjects sorting in \"Grades\" Язык приложения Уведомления Показывать уведомления diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index 9942621a5..7e7d3cbff 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -29,6 +29,10 @@ 0,5 0,75 + + Alphabetic + By date + Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 15fe203d5..ed10d24d4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -168,6 +168,8 @@ Спізнення з поважних причин Спізнення з не поважних причин Присутність + Deleted + Unknown Номер уроку Брак записів @@ -250,6 +252,44 @@ %1$d нових зауважень %1$d нових зауважень + + + %d praise + %d praises + %d praises + %d praises + + + New praise + New praises + New praises + New praises + + + You received %1$d praise + You received %1$d praises + You received %1$d praises + You received %1$d praises + + + + %d neutral note + %d neutral notes + %d neutral notes + %d neutral notes + + + New neutral note + New neutral notes + New neutral notes + New neutral notes + + + You received %1$d neutral note + You received %1$d neutral notes + You received %1$d neutral notes + You received %1$d neutral notes + Брак домашніх завдань Позначити як зроблене @@ -355,9 +395,12 @@ Тема додатку Більше оцінок Позначити поточний урок у розкладі + Show groups next to subjects in timetable Показувати діаграми в оцінках класу Показати уроки всього класу + Show subjects without grades in Grades Схема кольорів оцінок + Subjects sorting in \"Grades\" Мова додатку Повідомлення Показувати повідомлення From da6d8a74fdb57446317fdf843ab6d87ce66b5636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 6 Oct 2020 23:34:27 +0200 Subject: [PATCH 0177/1526] New Crowdin updates (#981) --- app/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 0923951ad..44e981cbd 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -400,7 +400,7 @@ Pokazuj lekcje całej klasy Pokazuj przedmioty bez ocen w Oceny Schemat kolorów ocen - Sortowanie przedmiotów w "Oceny" + Sortowanie przedmiotów w \"Oceny\" Język aplikacji Powiadomienia Pokazuj powiadomienia From ca6dfbf2d048d21b9720adb8ffd6a2b9e7b2ed98 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2020 21:43:50 +0000 Subject: [PATCH 0178/1526] Bump core-ktx from 1.3.1 to 1.3.2 (#983) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 1cd3b9905..2d758dbc2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -134,7 +134,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9' - implementation "androidx.core:core-ktx:1.3.1" + implementation "androidx.core:core-ktx:1.3.2" implementation "androidx.activity:activity-ktx:1.1.0" implementation "androidx.appcompat:appcompat:1.2.0" implementation "androidx.appcompat:appcompat-resources:1.2.0" From 518387e7bbba258389229cd0365465517e7283f2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2020 21:43:56 +0000 Subject: [PATCH 0179/1526] Bump gradle from 4.0.1 to 4.0.2 (#982) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c5cfaf99b..dc45aea2e 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ buildscript { } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:4.0.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.4' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0' From d6f3c572930e6a442f1d2b8a80287bc0c38ad82c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2020 21:45:38 +0000 Subject: [PATCH 0180/1526] Bump moshi from 1.10.0 to 1.11.0 (#984) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 2d758dbc2..a83aa0eb7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -119,7 +119,7 @@ ext { room = "2.2.5" chucker = "3.3.0" mockk = "1.10.2" - moshi = "1.10.0" + moshi = "1.11.0" } configurations.all { From 2bd0c75055aa743d241d8df5b2680a5efc464973 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2020 21:56:46 +0000 Subject: [PATCH 0181/1526] Bump about_libraries from 8.3.1 to 8.4.2 (#985) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index dc45aea2e..37a3c899c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.4.10' - about_libraries = '8.3.1' + about_libraries = '8.4.2' hilt_version = "2.29.1-alpha" } repositories { From 26a69092cc47d3766475f38404290ff1d01d38e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 7 Oct 2020 11:19:34 +0200 Subject: [PATCH 0182/1526] Add AppGallery badge (#986) --- README.en.md | 9 ++++++--- README.md | 9 ++++++--- appgallery_badge.png | Bin 0 -> 56482 bytes 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 appgallery_badge.png diff --git a/README.en.md b/README.en.md index 28cce1c34..4c5e53da8 100644 --- a/README.en.md +++ b/README.en.md @@ -32,14 +32,17 @@ Unofficial android VULCAN UONET+ register client for both students and their par ## Download -You can download the current beta version from the Google Play or the F-Droid store +You can download the current beta version from the Google Play, F-Droid or Huawei AppGallery store [Get it on Google Play](https://play.google.com/store/apps/details?id=io.github.wulkanowy) + alt="Get it on Google Play" + height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy) [Get it on F-Droid](https://f-droid.org/packages/io.github.wulkanowy/) +[Explore it on AppGallery](https://appgallery.cloud.huawei.com/ag/n/app/C101440411?channelId=Badge&id=1b3f7fbb700849a9be0dba6b520b2282&s=EB1D3BF9ED9D1564D869B7B94B18016D3CABFCA5AEFB8E29F675FA04E0DC131D&detailType=0&v=) You can also download a [development version](https://wulkanowy.github.io/#download) that includes new features being prepared for the next release diff --git a/README.md b/README.md index 02e1900c8..9e29cdb6c 100644 --- a/README.md +++ b/README.md @@ -32,14 +32,17 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica ## Pobierz -Aktualną wersję beta możesz pobrać ze sklepu Google Play lub F-Droid +Aktualną wersję beta możesz pobrać ze sklepu Google Play, F-Droid lub Huawei AppGallery [Pobierz z Google Play](https://play.google.com/store/apps/details?id=io.github.wulkanowy) + alt="Pobierz z Google Play" + height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy) [Pobierz z F-Droid](https://f-droid.org/packages/io.github.wulkanowy/) +[Odkrywaj w AppGallery](https://appgallery.cloud.huawei.com/ag/n/app/C101440411?channelId=Badge&id=1b3f7fbb700849a9be0dba6b520b2282&s=EB1D3BF9ED9D1564D869B7B94B18016D3CABFCA5AEFB8E29F675FA04E0DC131D&detailType=0&v=) Możesz także pobrać [wersję rozwojową](https://wulkanowy.github.io/#download), która zawiera nowe funkcje przygotowywane do następnego wydania diff --git a/appgallery_badge.png b/appgallery_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8860758169eb6c425b9dbd8ca9e05a7d9381ea GIT binary patch literal 56482 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Ü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 literal 0 HcmV?d00001 From 721b4ac7973ab63bbeaf39ef9930b70aa4eb7c82 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Fri, 9 Oct 2020 21:24:58 +0200 Subject: [PATCH 0183/1526] Add support for night mode in account switcher dialog (#988) --- app/src/main/res/values/styles.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8f30e3457..58ad1640e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -23,7 +23,7 @@ @drawable/layer_splash_background - - From 3e3a080b701a93e19886d32c202a6c53d0753007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 1 Feb 2021 23:58:44 +0100 Subject: [PATCH 0298/1526] Add nick for student (#1119) --- .../31.json | 2 +- .../32.json | 2142 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 6 +- .../wulkanowy/data/db/dao/StudentDao.kt | 5 + .../wulkanowy/data/db/entities/Student.kt | 2 + .../wulkanowy/data/db/entities/StudentNick.kt | 16 + .../data/db/migrations/Migration32.kt | 12 + .../data/repositories/StudentRepository.kt | 76 +- .../TimetableNotificationSchedulerHelper.kt | 67 +- .../ui/base/WidgetConfigureAdapter.kt | 3 +- .../ui/modules/account/AccountAdapter.kt | 3 +- .../ui/modules/account/AccountPresenter.kt | 10 +- .../accountdetails/AccountDetailsFragment.kt | 49 +- .../accountdetails/AccountDetailsPresenter.kt | 82 +- .../accountdetails/AccountDetailsView.kt | 15 +- .../AccountEditDetailsDialog.kt | 38 - .../account/accountedit/AccountEditDialog.kt | 72 + .../accountedit/AccountEditPresenter.kt | 54 + .../account/accountedit/AccountEditView.kt | 14 + .../accountquick/AccountQuickPresenter.kt | 6 +- .../studentinfo/StudentInfoFragment.kt | 1 + .../TimetableWidgetProvider.kt | 11 +- .../wulkanowy/utils/StudentExtension.kt | 5 + ...it_details.xml => dialog_account_edit.xml} | 13 +- app/src/main/res/layout/fragment_account.xml | 2 +- .../res/layout/fragment_account_details.xml | 455 ++-- .../main/res/layout/fragment_login_form.xml | 2 - app/src/main/res/values/strings.xml | 7 + 28 files changed, 2857 insertions(+), 313 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/32.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/entities/StudentNick.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration32.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountEditDetailsDialog.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditDialog.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditPresenter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditView.kt create mode 100644 app/src/main/java/io/github/wulkanowy/utils/StudentExtension.kt rename app/src/main/res/layout/{dialog_account_edit_details.xml => dialog_account_edit.xml} (90%) diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/31.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/31.json index 55a51e042..4935a9018 100644 --- a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/31.json +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/31.json @@ -2133,4 +2133,4 @@ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd642512ffa5fe81ae9308c9c55612539')" ] } -} \ No newline at end of file +} diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/32.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/32.json new file mode 100644 index 000000000..3621be48a --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/32.json @@ -0,0 +1,2142 @@ +{ + "formatVersion": 1, + "database": { + "version": 32, + "identityHash": "9531cdc8b3f0e62db5ab6ebe66837a28", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `scrapper_base_url` TEXT NOT NULL, `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "semester_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `unread_by` INTEGER NOT NULL, `read_by` INTEGER NOT NULL, `content` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `recipient_name` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `removed` INTEGER NOT NULL, `has_attachments` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "recipient", + "columnName": "recipient_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "removed", + "columnName": "removed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `one_drive_id` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`real_id`))", + "fields": [ + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "oneDriveId", + "columnName": "one_drive_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "real_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ReportingUnits", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `short` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `roles` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "senderName", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roles", + "columnName": "roles", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` TEXT NOT NULL, `name` TEXT NOT NULL, `real_name` TEXT NOT NULL, `login_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `role` INTEGER NOT NULL, `hash` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "realName", + "columnName": "real_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginId", + "columnName": "login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "role", + "columnName": "role", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hash", + "columnName": "hash", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `first_guardian_full_name` TEXT NOT NULL, `first_guardian_kinship` TEXT NOT NULL, `first_guardian_address` TEXT NOT NULL, `first_guardian_phones` TEXT NOT NULL, `first_guardian_email` TEXT NOT NULL, `second_guardian_full_name` TEXT NOT NULL, `second_guardian_kinship` TEXT NOT NULL, `second_guardian_address` TEXT NOT NULL, `second_guardian_phones` TEXT NOT NULL, `second_guardian_email` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9531cdc8b3f0e62db5ab6ebe66837a28')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index d1f99e3e8..806f0c9d1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -83,6 +83,7 @@ import io.github.wulkanowy.data.db.migrations.Migration29 import io.github.wulkanowy.data.db.migrations.Migration3 import io.github.wulkanowy.data.db.migrations.Migration30 import io.github.wulkanowy.data.db.migrations.Migration31 +import io.github.wulkanowy.data.db.migrations.Migration32 import io.github.wulkanowy.data.db.migrations.Migration4 import io.github.wulkanowy.data.db.migrations.Migration5 import io.github.wulkanowy.data.db.migrations.Migration6 @@ -128,7 +129,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 31 + const val VERSION_SCHEMA = 32 fun getMigrations(sharedPrefProvider: SharedPrefProvider): Array { return arrayOf( @@ -161,7 +162,8 @@ abstract class AppDatabase : RoomDatabase() { Migration28(), Migration29(), Migration30(), - Migration31() + Migration31(), + Migration32() ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt index d7237ea8a..e9c5f157e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt @@ -6,7 +6,9 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy.ABORT import androidx.room.Query import androidx.room.Transaction +import androidx.room.Update import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentNick import io.github.wulkanowy.data.db.entities.StudentWithSemesters import javax.inject.Singleton @@ -20,6 +22,9 @@ interface StudentDao { @Delete suspend fun delete(student: Student) + @Update(entity = Student::class) + suspend fun update(studentNick: StudentNick) + @Query("SELECT * FROM Students WHERE is_current = 1") suspend fun loadCurrent(): Student? diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt index 0b37b1e98..6b60c8146 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt @@ -79,4 +79,6 @@ data class Student( @PrimaryKey(autoGenerate = true) var id: Long = 0 + + var nick = "" } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentNick.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentNick.kt new file mode 100644 index 000000000..71f48f7a3 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentNick.kt @@ -0,0 +1,16 @@ +package io.github.wulkanowy.data.db.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey +import java.io.Serializable + +@Entity +data class StudentNick( + + val nick: String + +) : Serializable { + + @PrimaryKey + var id: Long = 0 +} diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration32.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration32.kt new file mode 100644 index 000000000..508485e08 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration32.kt @@ -0,0 +1,12 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +class Migration32 : Migration(31, 32) { + + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE Students ADD COLUMN nick TEXT NOT NULL DEFAULT \"\"") + } +} + diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index 5b80035ba..558214799 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -5,6 +5,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.dao.StudentDao import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentNick import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.exceptions.NoCurrentStudentException import io.github.wulkanowy.data.mappers.mapToEntities @@ -25,49 +26,70 @@ class StudentRepository @Inject constructor( private val sdk: Sdk ) { - suspend fun isStudentSaved(): Boolean = getSavedStudents(false).isNotEmpty() + suspend fun isStudentSaved() = getSavedStudents(false).isNotEmpty() - suspend fun isCurrentStudentSet(): Boolean = studentDb.loadCurrent()?.isCurrent ?: false + suspend fun isCurrentStudentSet() = studentDb.loadCurrent()?.isCurrent ?: false - suspend fun getStudentsApi(pin: String, symbol: String, token: String): List { - return sdk.getStudentsFromMobileApi(token, pin, symbol, "").mapToEntities() - } + suspend fun getStudentsApi( + pin: String, + symbol: String, + token: String + ): List = + sdk.getStudentsFromMobileApi(token, pin, symbol, "").mapToEntities() - suspend fun getStudentsScrapper(email: String, password: String, scrapperBaseUrl: String, symbol: String): List { - return sdk.getStudentsFromScrapper(email, password, scrapperBaseUrl, symbol).mapToEntities(password) - } + suspend fun getStudentsScrapper( + email: String, + password: String, + scrapperBaseUrl: String, + symbol: String + ): List = + sdk.getStudentsFromScrapper(email, password, scrapperBaseUrl, symbol) + .mapToEntities(password) - suspend fun getStudentsHybrid(email: String, password: String, scrapperBaseUrl: String, symbol: String): List { - return sdk.getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol).mapToEntities(password) - } + suspend fun getStudentsHybrid( + email: String, + password: String, + scrapperBaseUrl: String, + symbol: String + ): List = + sdk.getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol).mapToEntities(password) - suspend fun getSavedStudents(decryptPass: Boolean = true) = withContext(dispatchers.backgroundThread) { - studentDb.loadStudentsWithSemesters().map { - it.apply { - if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) student.password = decrypt(student.password) + suspend fun getSavedStudents(decryptPass: Boolean = true) = + withContext(dispatchers.backgroundThread) { + studentDb.loadStudentsWithSemesters().map { + it.apply { + if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { + student.password = decrypt(student.password) + } + } } } - } suspend fun getStudentById(id: Int) = withContext(dispatchers.backgroundThread) { studentDb.loadById(id)?.apply { - if (Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) + if (Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) { + password = decrypt(password) + } } } ?: throw NoCurrentStudentException() - suspend fun getCurrentStudent(decryptPass: Boolean = true) = withContext(dispatchers.backgroundThread) { - studentDb.loadCurrent()?.apply { - if (decryptPass && Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) - } - } ?: throw NoCurrentStudentException() + suspend fun getCurrentStudent(decryptPass: Boolean = true) = + withContext(dispatchers.backgroundThread) { + studentDb.loadCurrent()?.apply { + if (decryptPass && Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) { + password = decrypt(password) + } + } + } ?: throw NoCurrentStudentException() suspend fun saveStudents(studentsWithSemesters: List): List { semesterDb.insertSemesters(studentsWithSemesters.flatMap { it.semesters }) return withContext(dispatchers.backgroundThread) { studentDb.insertAll(studentsWithSemesters.map { it.student }.map { - if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.API) it.copy(password = encrypt(it.password, context)) - else it + if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.API) { + it.copy(password = encrypt(it.password, context)) + } else it }) } } @@ -79,7 +101,7 @@ class StudentRepository @Inject constructor( } } - suspend fun logoutStudent(student: Student) { - studentDb.delete(student) - } + suspend fun logoutStudent(student: Student) = studentDb.delete(student) + + suspend fun updateStudentNick(studentNick: StudentNick) = studentDb.update(studentNick) } diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt index c0eba2f92..c5a5590b9 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt @@ -27,6 +27,7 @@ import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companio import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_NAME import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.DispatchersProvider +import io.github.wulkanowy.utils.nickOrName import io.github.wulkanowy.utils.toTimestamp import kotlinx.coroutines.withContext import timber.log.Timber @@ -41,17 +42,23 @@ class TimetableNotificationSchedulerHelper @Inject constructor( 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() - private fun getUpcomingLessonTime(index: Int, day: List, lesson: Timetable): LocalDateTime { - return day.getOrNull(index - 1)?.end ?: lesson.start.minusMinutes(30) - } + private fun getUpcomingLessonTime( + index: Int, + day: List, + lesson: Timetable + ) = day.getOrNull(index - 1)?.end ?: lesson.start.minusMinutes(30) suspend fun cancelScheduled(lessons: List, studentId: Int = 1) { withContext(dispatchersProvider.backgroundThread) { lessons.sortedBy { it.start }.forEachIndexed { index, lesson -> val upcomingTime = getUpcomingLessonTime(index, lessons, lesson) - cancelScheduledTo(upcomingTime..lesson.start, getRequestCode(upcomingTime, 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") @@ -61,13 +68,18 @@ class TimetableNotificationSchedulerHelper @Inject constructor( private fun cancelScheduledTo(range: ClosedRange, requestCode: Int) { if (now() in range) cancelNotification() - alarmManager.cancel(PendingIntent.getBroadcast(context, requestCode, Intent(), FLAG_UPDATE_CURRENT)) + alarmManager.cancel( + PendingIntent.getBroadcast(context, requestCode, Intent(), FLAG_UPDATE_CURRENT) + ) } - fun cancelNotification() = NotificationManagerCompat.from(context).cancel(MainView.Section.TIMETABLE.id) + fun cancelNotification() = + NotificationManagerCompat.from(context).cancel(MainView.Section.TIMETABLE.id) suspend fun scheduleNotifications(lessons: List, student: Student) { - if (!preferencesRepository.isUpcomingLessonsNotificationsEnable) return cancelScheduled(lessons, student.studentId) + if (!preferencesRepository.isUpcomingLessonsNotificationsEnable) { + return cancelScheduled(lessons, student.studentId) + } withContext(dispatchersProvider.backgroundThread) { lessons.groupBy { it.date } @@ -82,13 +94,28 @@ class TimetableNotificationSchedulerHelper @Inject constructor( val intent = createIntent(student, lesson, active.getOrNull(index + 1)) if (lesson.start > now()) { - scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_UPCOMING, getUpcomingLessonTime(index, active, lesson)) + scheduleBroadcast( + intent, + student.studentId, + NOTIFICATION_TYPE_UPCOMING, + getUpcomingLessonTime(index, active, lesson) + ) } if (lesson.end > now()) { - scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_CURRENT, lesson.start) + scheduleBroadcast( + intent, + student.studentId, + NOTIFICATION_TYPE_CURRENT, + lesson.start + ) if (active.lastIndex == index) { - scheduleBroadcast(intent, student.studentId, NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION, lesson.end) + scheduleBroadcast( + intent, + student.studentId, + NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION, + lesson.end + ) } } } @@ -99,7 +126,7 @@ class TimetableNotificationSchedulerHelper @Inject constructor( private fun createIntent(student: Student, lesson: Timetable, nextLesson: Timetable?): Intent { return Intent(context, TimetableNotificationReceiver::class.java).apply { putExtra(STUDENT_ID, student.studentId) - putExtra(STUDENT_NAME, student.studentName) + putExtra(STUDENT_NAME, student.nickOrName) putExtra(LESSON_ROOM, lesson.room) putExtra(LESSON_START, lesson.start.toTimestamp()) putExtra(LESSON_END, lesson.end.toTimestamp()) @@ -109,13 +136,23 @@ class TimetableNotificationSchedulerHelper @Inject constructor( } } - private fun scheduleBroadcast(intent: Intent, studentId: Int, notificationType: Int, time: LocalDateTime) { - AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, RTC_WAKEUP, time.toTimestamp(), + private fun scheduleBroadcast( + intent: Intent, + studentId: Int, + notificationType: Int, + time: LocalDateTime + ) { + AlarmManagerCompat.setExactAndAllowWhileIdle( + alarmManager, RTC_WAKEUP, time.toTimestamp(), PendingIntent.getBroadcast(context, getRequestCode(time, studentId), intent.also { it.putExtra(NOTIFICATION_ID, MainView.Section.TIMETABLE.id) it.putExtra(LESSON_TYPE, notificationType) }, FLAG_UPDATE_CURRENT) ) - Timber.d("TimetableNotification scheduled: type: $notificationType, subject: ${intent.getStringExtra(LESSON_TITLE)}, start: $time, student: $studentId") + Timber.d( + "TimetableNotification scheduled: type: $notificationType, subject: ${ + intent.getStringExtra(LESSON_TITLE) + }, start: $time, student: $studentId" + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt index cefe6ed75..8e6130fbf 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.databinding.ItemAccountBinding import io.github.wulkanowy.utils.getThemeAttrColor +import io.github.wulkanowy.utils.nickOrName import javax.inject.Inject class WidgetConfigureAdapter @Inject constructor() : RecyclerView.Adapter() { @@ -28,7 +29,7 @@ class WidgetConfigureAdapter @Inject constructor() : RecyclerView.Adapter() { @@ -84,7 +85,7 @@ class AccountAdapter @Inject constructor() : RecyclerView.Adapter 1 && isAccountQuickDialogMode with(binding) { - accountItemName.text = "${student.studentName} ${diary?.diaryName.orEmpty()}" + accountItemName.text = "${student.nickOrName} ${diary?.diaryName.orEmpty()}" accountItemSchool.text = studentWithSemesters.student.schoolName accountItemAccountType.setText(if (student.isParent) R.string.account_type_parent else R.string.account_type_student) accountItemAccountType.visibility = if (isDuplicatedStudent) VISIBLE else GONE diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt index 349561f82..366793b6d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt @@ -62,10 +62,16 @@ class AccountPresenter @Inject constructor( } private fun loadData() { - flowWithResource { studentRepository.getSavedStudents() } + flowWithResource { studentRepository.getSavedStudents(false) } .onEach { when (it.status) { - Status.LOADING -> Timber.i("Loading account data started") + Status.LOADING -> { + Timber.i("Loading account data started") + view?.run { + showProgress(true) + showContent(false) + } + } Status.SUCCESS -> { Timber.i("Loading account result: Success") view?.updateData(createAccountItems(it.data!!)) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt index bdd4946ae..f4b2c833d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt @@ -9,13 +9,16 @@ import androidx.appcompat.app.AlertDialog import androidx.core.view.get import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.databinding.FragmentAccountDetailsBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.account.accountedit.AccountEditDialog import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.studentinfo.StudentInfoFragment import io.github.wulkanowy.ui.modules.studentinfo.StudentInfoView +import io.github.wulkanowy.utils.nickOrName import javax.inject.Inject @AndroidEntryPoint @@ -43,22 +46,19 @@ class AccountDetailsFragment : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) - arguments?.let { - presenter.studentWithSemesters = - it.getSerializable(ARGUMENT_KEY) as StudentWithSemesters - } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding = FragmentAccountDetailsBinding.bind(view) - presenter.onAttachView(this) + presenter.onAttachView(this, requireArguments()[ARGUMENT_KEY] as StudentWithSemesters) } override fun initView() { + binding.accountDetailsErrorRetry.setOnClickListener { presenter.onRetry() } + binding.accountDetailsErrorDetails.setOnClickListener { presenter.onDetailsClick() } binding.accountDetailsLogout.setOnClickListener { presenter.onRemoveSelected() } binding.accountDetailsSelect.setOnClickListener { presenter.onStudentSelect() } - binding.accountDetailsSelect.isEnabled = !presenter.studentWithSemesters.student.isCurrent binding.accountDetailsPersonalData.setOnClickListener { presenter.onStudentInfoSelected(StudentInfoView.Type.PERSONAL) @@ -76,24 +76,31 @@ class AccountDetailsFragment : override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { menu[0].isVisible = false + inflater.inflate(R.menu.action_menu_account_details, menu) } override fun onOptionsItemSelected(item: MenuItem): Boolean { return if (item.itemId == R.id.accountDetailsMenuEdit) { - showAccountEditDetailsDialog() - return true + presenter.onAccountEditSelected() + true } else false } - override fun showAccountData(studentWithSemesters: StudentWithSemesters) { + override fun showAccountData(student: Student) { with(binding) { - accountDetailsName.text = studentWithSemesters.student.studentName - accountDetailsSchool.text = studentWithSemesters.student.schoolName + accountDetailsName.text = student.nickOrName + accountDetailsSchool.text = student.schoolName } } - override fun showAccountEditDetailsDialog() { - (requireActivity() as MainActivity).showDialogFragment(AccountEditDetailsDialog.newInstance()) + override fun enableSelectStudentButton(enable: Boolean) { + binding.accountDetailsSelect.isEnabled = enable + } + + override fun showAccountEditDetailsDialog(student: Student) { + (requireActivity() as MainActivity).showDialogFragment( + AccountEditDialog.newInstance(student) + ) } override fun showLogoutConfirmDialog() { @@ -127,6 +134,22 @@ class AccountDetailsFragment : ) } + override fun showErrorView(show: Boolean) { + binding.accountDetailsError.visibility = if (show) View.VISIBLE else View.GONE + } + + override fun setErrorDetails(message: String) { + binding.accountDetailsErrorMessage.text = message + } + + override fun showProgress(show: Boolean) { + binding.accountDetailsProgress.visibility = if (show) View.VISIBLE else View.GONE + } + + override fun showContent(show: Boolean) { + binding.accountDetailsContent.visibility = if (show) View.VISIBLE else View.GONE + } + override fun onDestroyView() { presenter.onDetachView() super.onDestroyView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt index da437429e..7b93d3d87 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.account.accountdetails +import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.repositories.StudentRepository @@ -9,6 +10,7 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.studentinfo.StudentInfoView import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -19,14 +21,74 @@ class AccountDetailsPresenter @Inject constructor( private val syncManager: SyncManager ) : BasePresenter(errorHandler, studentRepository) { - lateinit var studentWithSemesters: StudentWithSemesters + private lateinit var studentWithSemesters: StudentWithSemesters - override fun onAttachView(view: AccountDetailsView) { + private lateinit var lastError: Throwable + + private var studentId: Long? = null + + fun onAttachView(view: AccountDetailsView, studentWithSemesters: StudentWithSemesters) { super.onAttachView(view) - view.initView() - Timber.i("Account details view was initialized") + studentId = studentWithSemesters.student.id - view.showAccountData(studentWithSemesters) + view.initView() + errorHandler.showErrorMessage = ::showErrorViewOnError + Timber.i("Account details view was initialized") + loadData() + } + + fun onRetry() { + view?.run { + showErrorView(false) + showProgress(true) + } + loadData() + } + + fun onDetailsClick() { + view?.showErrorDetailsDialog(lastError) + } + + private fun loadData() { + flowWithResource { studentRepository.getSavedStudents() } + .map { studentWithSemesters -> + Resource( + data = studentWithSemesters.data?.single { it.student.id == studentId }, + status = studentWithSemesters.status, + error = studentWithSemesters.error + ) + } + .onEach { + when (it.status) { + Status.LOADING -> { + view?.run { + showProgress(true) + showContent(false) + } + Timber.i("Loading account details view started") + } + Status.SUCCESS -> { + Timber.i("Loading account details view result: Success") + studentWithSemesters = it.data!! + view?.run { + showAccountData(studentWithSemesters.student) + enableSelectStudentButton(!studentWithSemesters.student.isCurrent) + showContent(true) + showErrorView(false) + } + } + Status.ERROR -> { + Timber.i("Loading account details view result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + } + .afterLoading { view?.showProgress(false) } + .launch() + } + + fun onAccountEditSelected() { + view?.showAccountEditDetailsDialog(studentWithSemesters.student) } fun onStudentInfoSelected(infoType: StudentInfoView.Type) { @@ -97,4 +159,14 @@ class AccountDetailsPresenter @Inject constructor( view?.popView() }.launch("logout") } + + private fun showErrorViewOnError(message: String, error: Throwable) { + view?.run { + lastError = error + setErrorDetails(message) + showErrorView(true) + showContent(false) + showProgress(false) + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsView.kt index f1001fd78..652f0c1aa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.account.accountdetails +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.modules.studentinfo.StudentInfoView @@ -8,9 +9,9 @@ interface AccountDetailsView : BaseView { fun initView() - fun showAccountData(studentWithSemesters: StudentWithSemesters) + fun showAccountData(student: Student) - fun showAccountEditDetailsDialog() + fun showAccountEditDetailsDialog(student: Student) fun showLogoutConfirmDialog() @@ -18,8 +19,18 @@ interface AccountDetailsView : BaseView { fun recreateMainView() + fun enableSelectStudentButton(enable: Boolean) + fun openStudentInfoView( infoType: StudentInfoView.Type, studentWithSemesters: StudentWithSemesters ) + + fun showErrorView(show: Boolean) + + fun setErrorDetails(message: String) + + fun showProgress(show: Boolean) + + fun showContent(show: Boolean) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountEditDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountEditDetailsDialog.kt deleted file mode 100644 index be0af7df1..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountEditDetailsDialog.kt +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.wulkanowy.ui.modules.account.accountdetails - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.DialogFragment -import io.github.wulkanowy.databinding.DialogAccountEditDetailsBinding -import io.github.wulkanowy.utils.lifecycleAwareVariable - -class AccountEditDetailsDialog : DialogFragment() { - - private var binding: DialogAccountEditDetailsBinding by lifecycleAwareVariable() - - companion object { - - fun newInstance() = AccountEditDetailsDialog() - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setStyle(STYLE_NO_TITLE, 0) - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return DialogAccountEditDetailsBinding.inflate(inflater).apply { binding = this }.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - binding.accountEditDetailsCancel.setOnClickListener { dismiss() } - } -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditDialog.kt new file mode 100644 index 000000000..89f23e29f --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditDialog.kt @@ -0,0 +1,72 @@ +package io.github.wulkanowy.ui.modules.account.accountedit + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.databinding.DialogAccountEditBinding +import io.github.wulkanowy.ui.base.BaseDialogFragment +import javax.inject.Inject + +@AndroidEntryPoint +class AccountEditDialog : BaseDialogFragment(), AccountEditView { + + @Inject + lateinit var presenter: AccountEditPresenter + + companion object { + + private const val ARGUMENT_KEY = "student_with_semesters" + + fun newInstance(student: Student) = + AccountEditDialog().apply { + arguments = Bundle().apply { + putSerializable(ARGUMENT_KEY, student) + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, 0) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View = DialogAccountEditBinding.inflate(inflater).apply { binding = this }.root + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + presenter.onAttachView(this, requireArguments()[ARGUMENT_KEY] as Student) + } + + override fun initView() { + with(binding) { + accountEditDetailsCancel.setOnClickListener { dismiss() } + accountEditDetailsSave.setOnClickListener { + presenter.changeStudentNick(binding.accountEditDetailsNickText.text.toString()) + } + } + } + + override fun showCurrentNick(nick: String) { + binding.accountEditDetailsNickText.setText(nick) + } + + override fun popView() { + dismiss() + } + + override fun recreateMainView() { + activity?.recreate() + } + + override fun onDestroyView() { + super.onDestroyView() + presenter.onDetachView() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditPresenter.kt new file mode 100644 index 000000000..7830605c6 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditPresenter.kt @@ -0,0 +1,54 @@ +package io.github.wulkanowy.ui.modules.account.accountedit + +import io.github.wulkanowy.data.Status +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentNick +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.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource +import kotlinx.coroutines.flow.onEach +import timber.log.Timber +import javax.inject.Inject + +class AccountEditPresenter @Inject constructor( + errorHandler: ErrorHandler, + studentRepository: StudentRepository +) : BasePresenter(errorHandler, studentRepository) { + + lateinit var student: Student + + fun onAttachView(view: AccountEditView, student: Student) { + super.onAttachView(view) + this.student = student + + with(view) { + initView() + showCurrentNick(student.nick.trim()) + } + Timber.i("Account edit dialog view was initialized") + } + + fun changeStudentNick(nick: String) { + flowWithResource { + val studentNick = + StudentNick(nick = nick.trim()).apply { id = student.id } + studentRepository.updateStudentNick(studentNick) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Attempt to change a student nick") + Status.SUCCESS -> { + Timber.i("Change a student nick result: Success") + view?.recreateMainView() + } + Status.ERROR -> { + Timber.i("Change a student result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + } + .afterLoading { view?.popView() } + .launch() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditView.kt new file mode 100644 index 000000000..b25eec6c8 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditView.kt @@ -0,0 +1,14 @@ +package io.github.wulkanowy.ui.modules.account.accountedit + +import io.github.wulkanowy.ui.base.BaseView + +interface AccountEditView : BaseView { + + fun initView() + + fun popView() + + fun recreateMainView() + + fun showCurrentNick(nick: String) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountquick/AccountQuickPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountquick/AccountQuickPresenter.kt index 87b14c53f..43cc8bc77 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountquick/AccountQuickPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountquick/AccountQuickPresenter.kt @@ -52,9 +52,9 @@ class AccountQuickPresenter @Inject constructor( errorHandler.dispatch(it.error!!) } } - }.afterLoading { - view?.popView() - }.launch("switch") + } + .afterLoading { view?.popView() } + .launch("switch") } private fun loadData() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt index fb7f8d285..767d31a45 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt @@ -109,6 +109,7 @@ class StudentInfoFragment : listOf( getString(R.string.student_info_first_name) to studentInfo.firstName, getString(R.string.student_info_second_name) to studentInfo.secondName, + getString(R.string.student_info_last_name) to studentInfo.surname, getString(R.string.student_info_gender) to getString(if (studentInfo.gender == Gender.MALE) R.string.student_info_male else R.string.student_info_female), getString(R.string.student_info_polish_citizenship) to getString(if (studentInfo.hasPolishCitizenship) R.string.all_yes else R.string.all_no), getString(R.string.student_info_family_name) to studentInfo.familyName, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 938be98da..1d63f0943 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -27,6 +27,7 @@ import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AnalyticsHelper 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 kotlinx.coroutines.GlobalScope @@ -151,8 +152,14 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { val remoteView = RemoteViews(context.packageName, layoutId).apply { setEmptyView(R.id.timetableWidgetList, R.id.timetableWidgetEmpty) - setTextViewText(R.id.timetableWidgetDate, date.toFormattedString("EEEE, dd.MM").capitalize()) - setTextViewText(R.id.timetableWidgetName, student?.studentName ?: context.getString(R.string.all_no_data)) + setTextViewText( + R.id.timetableWidgetDate, + date.toFormattedString("EEEE, dd.MM").capitalize() + ) + setTextViewText( + R.id.timetableWidgetName, + student?.nickOrName ?: context.getString(R.string.all_no_data) + ) setRemoteAdapter(R.id.timetableWidgetList, adapterIntent) setOnClickPendingIntent(R.id.timetableWidgetNext, nextNavIntent) setOnClickPendingIntent(R.id.timetableWidgetPrev, prevNavIntent) diff --git a/app/src/main/java/io/github/wulkanowy/utils/StudentExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/StudentExtension.kt new file mode 100644 index 000000000..fdd0610a0 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/StudentExtension.kt @@ -0,0 +1,5 @@ +package io.github.wulkanowy.utils + +import io.github.wulkanowy.data.db.entities.Student + +inline val Student.nickOrName get() = if (nick.isBlank()) studentName else nick diff --git a/app/src/main/res/layout/dialog_account_edit_details.xml b/app/src/main/res/layout/dialog_account_edit.xml similarity index 90% rename from app/src/main/res/layout/dialog_account_edit_details.xml rename to app/src/main/res/layout/dialog_account_edit.xml index 0b13e0427..b65f85ac3 100644 --- a/app/src/main/res/layout/dialog_account_edit_details.xml +++ b/app/src/main/res/layout/dialog_account_edit.xml @@ -18,7 +18,7 @@ android:layout_marginStart="24dp" android:layout_marginTop="24dp" android:layout_marginEnd="24dp" - android:text="Modify data" + android:text="@string/account_edit_header" android:textSize="21sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" @@ -34,16 +34,21 @@ android:layout_marginStart="24dp" android:layout_marginTop="28dp" android:layout_marginEnd="24dp" - android:hint="Nick" + android:hint="@string/account_edit_nick_hint" + app:endIconMode="clear_text" app:errorEnabled="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/accountEditDetailsHeader"> + + + android:inputType="textPersonName" + android:maxLength="20" /> diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index 306dc2190..5d3d81e2e 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -45,7 +45,7 @@ android:orientation="vertical" android:visibility="invisible" tools:ignore="UseCompoundDrawables" - tools:visibility="visible"> + tools:visibility="gone"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + android:layout_height="match_parent" + android:gravity="center" + android:orientation="vertical" + android:visibility="invisible" + tools:ignore="UseCompoundDrawables" + tools:visibility="visible"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_login_form.xml b/app/src/main/res/layout/fragment_login_form.xml index 412502b52..fb0e138e9 100644 --- a/app/src/main/res/layout/fragment_login_form.xml +++ b/app/src/main/res/layout/fragment_login_form.xml @@ -237,9 +237,7 @@ android:layout_gravity="center_vertical" android:layout_marginTop="48dp" android:layout_marginEnd="24dp" - android:layout_marginBottom="16dp" android:text="@string/login_sign_in" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/loginFormHostLayout" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f48179890..e41f2f28c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -412,6 +412,12 @@ Phones Male Female + Last name + + + + Nick + Add nick @@ -444,6 +450,7 @@ Search… Yes No + Save From 42f95942101617fae8610f903c5f4c3d3e13ae0d Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Tue, 2 Feb 2021 00:11:34 +0100 Subject: [PATCH 0299/1526] Fix empty message bug (#1122) --- .../ui/modules/message/preview/MessagePreviewPresenter.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index 55b9631af..702e54676 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -70,6 +70,7 @@ class MessagePreviewPresenter @Inject constructor( this@MessagePreviewPresenter.attachments = it.data.attachments view?.apply { setMessageWithAttachment(it.data) + showContent(true) initOptions() } analytics.logEvent( From aff40df707f06fab9f35fd4164d508dbddfe508d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 2 Feb 2021 00:25:27 +0100 Subject: [PATCH 0300/1526] New Crowdin updates (#1095) --- app/src/main/res/values-cs-rCZ/strings.xml | 71 ++++++++++++---- app/src/main/res/values-de/strings.xml | 53 ++++++++++-- app/src/main/res/values-pl/strings.xml | 45 +++++++++- app/src/main/res/values-ru/strings.xml | 95 ++++++++++++++++------ app/src/main/res/values-sk-rSK/strings.xml | 91 +++++++++++++++------ app/src/main/res/values-uk/strings.xml | 67 ++++++++++++--- 6 files changed, 334 insertions(+), 88 deletions(-) diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index e2e7bdac0..fc01584b5 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -17,7 +17,10 @@ Nová zpráva Poznámky a úspěchy Domácí úkoly - Vyberte účet + Manažer účtů + Vyberte účet + Manažer účtů + Informace o žáku Semestr %1$d, %2$d/%3$d @@ -44,11 +47,11 @@ Neplatný e-mail Místo e-mailu použijte přiřazené přihlašovací údaje Neplatný symbol - Student nebyl nalezen. Zkontrolujte správnost symbolu a vybrané varianty deníku UONET+ + Žák nebyl nalezen. Zkontrolujte správnost symbolu a vybrané varianty deníku UONET+ Toto pole je povinné - Vybraný student je již přihlášen + Vybraný žák je již přihlášen Symbol najdete na stránce deníku v  Uczeń →  Dostęp Mobilny →  Zarejestruj urządzenie mobilne.\n\nUjistěte se, že jste na předchozí obrazovce nastavili správnou variantu deníku do pole Variace deníku UONET+. Wulkanowy v tuto chvíli nezjistí předškolní studenty - Vyberte studenty, kteří se mají do aplikace přihlásit + Vyberte žáky, kteří se mají do aplikace přihlásit Jiné možnosti V tomto režimu nefungují následující: šťastné číslo, statistiky třídy, shrnutí docházky, ospravedlnění nepřítomnosti, absolvované lekce, informace o škole a prohlížení seznamu registrovaných zařízení Tento režim zobrazuje stejná data, která se zobrazují na webových stránkách deníka @@ -63,7 +66,7 @@ Zapomněl jsem své heslo Obnovte svůj účet Obnovit - Student je již přihlášen + Žák je již přihlášen Manažer účtů Přihlásit se @@ -84,17 +87,21 @@ Bez průměru Předpovězeno: %1$s Konečná: %1$s - Celkem bodů + Součet bodů Konečná známka Předpokládaná známka Vypočítaný průměr Konečný průměr - Souhrn + Shrnutí Třída Označit jako přečtené Částečně Semestr Body + Vysvětlivky + Průměr: %1$s + Třída + Žák %d známka %d známky @@ -139,7 +146,7 @@ Lekce - Pokoj + Učebna Skupina Hodiny Změny @@ -164,10 +171,10 @@ Zobrazit další lekce Žádné informace o dalších lekcích - Souhrn docházky + Shrnutí docházky Nepřítomen ze školních důvodů Omluvená nepřítomnost - Neomluvená absence + Neomluvená nepřítomnost Osvobození Omluvené zpoždění Neomluvené zpoždění @@ -189,7 +196,7 @@ Ospravedlnit Účast - Celkový + Společně Tento týden žádné testy Typ @@ -215,7 +222,7 @@ Téma Obsah Zpráva úspěšně odeslána - Message does not exist + Zpráva neexistuje Musíte vybrat alespoň 1 příjemce Obsah zprávy musí mít alespoň 3 znaky @@ -337,12 +344,19 @@ Přidat účet Odhlásit se - Chcete se odhlásit z aktivního studenta? - Odhlášení studentů - Studentský účet + Chcete se odhlásit z aktivního žáka? + Odhlášení žáků + Žákův účet Rodičovský účet Režim Mobilního API Hybridní režim + Upravit data + Manažer účtů + Vyberte žáka + Rodina + Kontakt + Údaje o adresách + Osobní údaje Verze aplikace Tvůrci @@ -366,6 +380,30 @@ Avatar Zobrazit více na GitHub + + Žádné informace o žácích + Jméno + Druhé jméno + Pohlaví + Polské občanství + Rodinné jméno + Jména matky a otce + Telefon + Mobilní telefon + E-mail + Adresa bydliště + Registrovaná adresa + Korespondenční adresa + Příjmení a jméno + Stupeň příbuznosti + Adresa + Telefony + Muž + Žena + Příjmení + + Přezdívka + Přidat přezdívku Sdílejte protokoly Obnovit @@ -390,6 +428,9 @@ Další Hledat Hledat… + Ano + Ne + Uložit Žádné lekce Vybrat motiv diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7ba35734c..8d0bf3e98 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -17,7 +17,10 @@ neue Nachricht Eintragen und Erfolgen Hausaufgaben - Wählen Sie ein Konto + Konten-Manager + Konto auswählen + Kontodetails + Schülerinfo Semester %1$d, %2$d/%3$d @@ -95,6 +98,10 @@ Partiell Semester Punkte + Legende + Durchschnitt: %1$s + Klasse + Schüler %d Note %d Noten @@ -146,9 +153,9 @@ Abwesenheit Ressourcen - Additional lessons - Show additional lessons - No info about additional lessons + Zusätzliche Lektionen + Zusätzliche Lektionen anzeigen + Keine Infos zu zusätzlichen Lektionen Übersicht über die Schulbesuch Aus schulischen Gründen abwesend @@ -199,7 +206,7 @@ Thema Inhalt Nachricht erfolgreich gesendet - Message does not exist + Nachricht existiert nicht Sie müssen mindestens 1 Empfänger auswählen. Der Inhalt der Nachricht muss mindestens 3 Zeichen lang sein. @@ -297,12 +304,19 @@ Konto hinzufügen Abmelden - Wollen Sie sich von einem aktiven Studenten abmelden? + Wollen Sie diesen Schüler abmelden? Abmeldung von Student Studentenkonto Elternkonto Mobiler API Modus Hybrid Modus + Daten bearbeiten + Konten-Manager + Schüler auswählen + Familie + Kontakt + Wohnungsdetails + Persönliche Information Version der App Mitarbeiter @@ -326,6 +340,30 @@ Benutzerbild Sehen Sie mehr auf GitHub + + Keine Informationen über Schüler + Name + Zweite Name + Geschlecht + Polnische Staatsbürgerschaft + Familienname + Namen von Mutter und Vater + Telefonnummer + Mobiltelefonnummer + E-Mail + Wohnadresse + Adresse der Registrierung + Korrespondenzadresse + Nachname und Vorname + Verwandtschaftsgrad + Adresse + Telefonnummern + Mann + Frau + Nachname + + Nick + Nick hinzufügen Logs teilen Aktualisieren @@ -350,6 +388,9 @@ Nächste Suchen Suchen… + Ja + Nein + Speichern Keine Lektionen Thema wählen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 19e312bab..2f849bc1b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -17,7 +17,10 @@ Nowa wiadomość Uwagi i osiągnięcia Zadania domowe - Wybierz konto + Menadżer kont + Wybierz konto + Szczegóły konta + Informacje o uczniu Semestr %1$d, %2$d/%3$d @@ -95,6 +98,10 @@ Cząstkowe Semestralne Punkty + Legenda + Średnia: %1$s + Klasa + Uczeń %d ocena %d oceny @@ -337,12 +344,19 @@ Dodaj konto Wyloguj - Czy chcesz wylogować aktualnego ucznia? + Czy chcesz wylogować tego ucznia? Wylogowanie ucznia Konto ucznia Konto rodzica Tryb API mobilne Tryb hybrydowy + Edytuj dane + Menadżer kont + Wybierz ucznia + Rodzina + Kontakt + Dane adresowe + Dane osobowe Wersja aplikacji Twórcy @@ -366,6 +380,30 @@ Awatar Zobacz więcej na GitHub + + Brak informacji o uczniu + Imię + Drugie imię + Płeć + Obywatelstwo polskie + Nazwisko rodowe + Imiona matki i ojca + Telefon + Telefon komórkowy + E-mail + Adres zamieszkania + Adres zameldowania + Adres korespondencyjny + Nazwisko i imię + Stopień pokrewieństwa + Adres + Telefony + Mężczyzna + Kobieta + Nazwisko + + Pseudonim + Dodaj pseudonim Udostępnij logi Odśwież @@ -390,6 +428,9 @@ Następny Szukaj Szukaj… + Tak + Nie + Zapisz Brak lekcji Wybierz motyw diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9c4efa450..158c91bc0 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -8,7 +8,7 @@ Тесты Расписание Настройки - Другое + Ещё О приложении Просмотр журнала Разработчики @@ -17,7 +17,10 @@ Новое сообщение Предупреждения и свершения Домашние задания - Выберите аккаунт + Менеджер аккаунтов + Выбор учетной записи + Данные аккаунта + Информация о студенте %1$d семестр, %2$d/%3$d @@ -27,10 +30,10 @@ Электронная почта Логин, PESEL или электронная почта Пароль - Разновидностью бревна UONET+ - Mobile API + UONET + вариант регистрации + Мобильный API Scraper - Hybrid + Гибрид Token PIN Ключ API @@ -39,15 +42,15 @@ Слишком короткий пароль Данные для входа неверны. Убедитесь, что в поле ниже выбран правильный вариант регистра UONET+ Неправильный PIN - Неправильный token - Токен просрочен + Неверный token + Token просрочен Неверный адрес электронной почты Используйте назначенный логин вместо электронной почты - Неправильный symbol + Неправильный символ Студент не найден. Подтвердите символ и выбранный вариант регистра UONET+ - Обязательное поле + Это обязательное поле Данный ученик уже авторизован - Этот символ можно найти на странице регистрации в  Uczeń →  Dostęp Mobilny →  Zarejestruj urządzenie mobilne.\n\nУбедитесь, что вы установили соответствующий вариант регистра в поле Разновидностью бревна UONET+ на предыдущем экране. Wulkanowy на данный момент не обнаруживает дошкольников + Этот символ можно найти на странице регистрации в  Ученик →  Телефонный доступ →   Зарегистрируйте мобильное устройство.\n\nУбедитесь, что вы установили соответствующий вариант регистра в поле Разновидностью бревна UONET+ на предыдущем экране. Вулкановый на данный момент не обнаруживает дошкольников Выберите учеников для авторизации в приложении Другие варианты В этом режиме не работают: счастливый номер, статистика класса по оценкам, статистика посещаемости и уроков, информация о школе и список зарегистрированных устройств @@ -60,7 +63,7 @@ Отправить письмо Опишите детали проблемы: Убедитесь, что вы выбрали правильный вариант регистра UONET+! - Забыли пароль? + Я забыл свой пароль Восстановите свой аккаунт Восстановить Студент уже вошел в систему @@ -68,7 +71,7 @@ Менеджер аккаунтов Войти Сеанс истёк - Сеанс истёк, пожалуйста, авторизируйтесь ещё раз + Сеанс истёк, пожалуйста, войдите ещё раз Оценка Семестр %d @@ -95,6 +98,10 @@ Частичные За семестр Баллы + Легенда + Средняя: %1$s + Класс + Студент %d оценка %d оценки @@ -132,7 +139,7 @@ Вы получили %1$d ожидаемых оценок - Вы получили %1$d финальную оценку + Вы получили %1$d итоговою оценку Вы получили %1$d итоговых оценки Вы получили %1$d итоговых оценок Вы получили %1$d финальные оценки @@ -143,7 +150,7 @@ Группа Часы Изменения - Нет уроков в данный день + Нету уроков в данный день %s мин %s сек %1$s осталось @@ -160,9 +167,9 @@ Отсутствие Ресурсы - Additional lessons - Show additional lessons - No info about additional lessons + Дополнительные уроки + Показать дополнительные уроки + Нет информации о дополнительных уроках Итоговая посещаемость Отсутствие по школьным причинам @@ -215,7 +222,7 @@ Тема Текст Сообщение успешно отправлено - Message does not exist + Сообщения не существует Вы должны выбрать как минимум одного получателя Текст сообщения должен содержать как минимум 3 знака @@ -237,7 +244,7 @@ Вы получили %1$d новых сообщений - Нет данных о предупреждениях + Нет информации о заметках Баллы %d предупреждение @@ -297,19 +304,19 @@ Нет домашних заданий - сделанный - Не сделано + Отметить как выполненное + Отметить как невыполненное Вложения Счастливый номер - Сегодняшний счастливый номер + Сегодняшний счастливый номер это Нет данных о счастливом номере Сегодняшний счастливый номер - Сегодняшний счастливый номер: %d + Сегодняшний счастливый номер это: %d Мобильные устройства Нет устройств - Удалить + Отменить регистрацию Устройство удалено QR-код Token @@ -323,8 +330,8 @@ Название школы Адрес школы Телефон - Директор - Педагог + Имя директора + Имя педагога Показать на карте Позвонить @@ -343,10 +350,17 @@ Профиль родителя Режим Mobile API Гибридный режим + Изменить данные + Менеджер аккаунтов + Выберите Студента + Семья + Контакт + Детали проживания + Персональные данные Версия приложения Разработчики - Список разработчиков \"Wulkanowy\" + Список разработчиков \"Вулкановый\" Возникла ошибка? Сообщить о ошибке FAQ @@ -366,6 +380,30 @@ Aватар Страница проекта на GitHub + + Нет информации о студенте + Имя + Фамилия + Пол + Польское гражданство + Фамилия + Имена матери и отца + Телефон + Сотовый телефон + Эл. почта + Адрес проживания + Адрес регистрации + Адрес переписки + Фамилия и имя + Степень родства + Адрес + Телефоны + Муж + Женская + Фамилия + + Ник + Добавить ник Поделиться логами Обновить @@ -390,6 +428,9 @@ Следующий Поиск Поиск… + Да + Нет + Сохранить Нет уроков Выбрать тему diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 54012b1ff..b5c0116ec 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -17,7 +17,10 @@ Nová správa Poznámky a úspechy Domáce úlohy - Vyberte účet + Accounts manager + Select account + Account details + Student info Semester %1$d, %2$d/%3$d @@ -44,11 +47,11 @@ Neplatný e-mail Namiesto e-mailu použite priradené prihlasovacie údaje Neplatný symbol - Študent nebol nájdený. Skontrolujte správnosť symbolu a vybrané varianty denníka UONET+ + Žiak nebol nájdený. Skontrolujte správnosť symbolu a vybrané varianty denníka UONET+ Toto pole je povinné - Vybraný študent je už prihlásený + Vybraný žiak už je prihlásený The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the previous screen. Wulkanowy does not detect pre-school students at the moment - Vyberte studenty, kteří se mají do aplikace přihlásit + Vyberte žiakov, ktorí sa majú do aplikácie prihlásiť Iné možnosti In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices This mode displays the same data as it appears on the register website @@ -84,17 +87,21 @@ Bez priemeru Predpovedané: %1$s Konečná: %1$s - Celkom bodov + Súčet bodov Konečná známka Predpokladaná známka Vypočítaný priemer Konečný priemer - Súhrn + Zhrnutie Trieda Označiť ako prečítané - Čiastočne + Čiastočné Semester Body + Legenda + Average: %1$s + Trieda + Žiák %d známka %d známky @@ -109,27 +116,27 @@ Nová predpokladaná známka - Nové predpovedanej známky - Nové predpovedanej známky - Nové predpovedanej známky + Nové predpokladané známky + Nové predpokladané známky + Nové predpokladané známky Nová konečná známka - Nové konečnej známky - Nové konečnej známky - Nové konečnej známky + Nové konečné známky + Nové konečné známky + Nové konečné známky Máte %1$d novú známku Máte %1$d nové známky - Máte %1$d nové známky - Máte %1$d nové známky + Máte %1$d nových známok + Máte %1$d nových známok Máte %1$d novú predpokladanú známku Máte %1$d nové predpokladané známky - Máte %1$d nové predpokladané známky - Máte %1$d nové predpokladané známky + Máte %1$d nových predpokladaných známok + Máte %1$d nových predpokladaných známok Máte %1$d novú konečnú známku @@ -139,7 +146,7 @@ Lekcia - Room + Učebňa Skupina Hodiny Zmeny @@ -158,9 +165,9 @@ No info about completed lessons Téma Neprítomnosť - Resources + Zdroje - Additional lessons + Ďalší lekcie Show additional lessons No info about additional lessons @@ -171,11 +178,11 @@ Exemption Excused lateness Unexcused lateness - Present + Prítomnosť Deleted - Unknown + Neznámy Number of lesson - No entries + Žiadne položky %1$d absence %1$d absences @@ -183,7 +190,7 @@ %1$d absences Absence reason (optional) - Send + Poslať Absence excused successfully! You must select at least one absence! Excuse @@ -337,12 +344,19 @@ Add account Logout - Do you want to log out of an active student? + Do you want to log out this student? Student logout Student account Parent account Mobile API mode Hybrid mode + Edit data + Accounts manager + Select student + Family + Contact + Residence details + Personal information App version Contributors @@ -366,6 +380,30 @@ Avatar See more on GitHub + + No info about student + Name + Second name + Gender + Polish citizenship + Family name + Mother\'s and father\'s names + Phone + Cellphone + E-mail + Address of residence + Address of registration + Correspondence address + Surname and first name + Degree of kinship + Address + Phones + Male + Female + Last name + + Nick + Add nick Share logs Refresh @@ -390,6 +428,9 @@ Next Search Search… + Yes + No + Save No lessons Choose theme diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a1511d9fe..3c4b44360 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -17,11 +17,14 @@ Нове повідомлення Нотатки та досягнення Домашні завдання - Оберіть аккаунт + Менеджер аккаунтів + Виберіть обліковий запис + Деталі облікового запису + Інформація про учня %1$d семестр, %2$d/%3$d - Авторизуйтеся за допомогою аккаунта учня або батька + Авторизуйтеся за допомогою аккаунта учня або батьків Введіть символ зі сторінки реєстру Ім\'я користувача Електронна пошта @@ -43,11 +46,11 @@ Минув термін дії токену Недійсна адреса електронної пошти Використовуйте призначений логін замість електронної пошти - Неправильний symbol + Неправильний симбвол Студента не знайдено Перевірте символ та обраний варіант реєстру UONET+ Обов\'язкове поле Даного учня вже авторизовано - Символ можна знайти на сторінці реєстру в   Uczeń →   Dostęp Mobilny →   Zarejestruj urządzenie mobilne .\n\nПереконайтесь, що ви встановили відповідний варіант реєстру в полі UONET + варіант реєстрації на попередньому екрані. На даний момент Wulkanowy не виявляє учнів дошкільних закладів + Символ можна знайти на сторінці реєстру в   Учень →   Мобільний доступ →   Додайте мобільне приладдя .\n\nПереконайтесь, що ви встановили відповідний варіант реєстру в полі UONET + варіант реєстрації на попередньому екрані. На даний момент Wulkanowy не виявляє учнів дошкільних закладів Виберіть учнів для авторизації в додатку Інші варіанти У цьому режимі не працюють: щасливий номер, статистика класу по оцінкам, статистика відвідуваності і уроків, інформація про школу і список зареєстрованних пристроїв @@ -61,7 +64,7 @@ Опишіть деталі помилки: Переконайтеся, що ви вибрали правильний варіант реєстрації UONET+! Забули пароль? - Відновіть свій аккаунт + Відновіть свій обліковий запис Відновити Учень вже увійшов до системи @@ -73,15 +76,15 @@ Оцінка %d семестр Змінити семестр - Брак оцінок + Оцінки відсутні Вартість Вартість: %s Коментар - Брак нових оцінок + Нові оцінки відсутні Кількість нових оцінок: %1$d Середня оцінка: %1$.2f - точок: %s - Брак середньої оцінки + Балів: %s + Відсутність середньої оцінки Очікувана оцінка: %1$s Підсумкова оцінка: %1$s Сума балів @@ -95,6 +98,10 @@ Поточні Семестрові Бали + Умовні позначення + Середня оцінка: %1$s + Клас + Учень %d оцінка %d оцінки @@ -160,9 +167,9 @@ Відсутність Ресурси - Additional lessons - Show additional lessons - No info about additional lessons + Додаткові уроки + Показати додаткові уроки + Немає інформації про додаткових уроків Підсумок відвідуваності Відсутність зі шкільних причин @@ -215,7 +222,7 @@ Тема Зміст Повідомлення було успішно відправлено - Message does not exist + Такого повідомлення не існує Необхідно обрати принаймні 1 адресата Зміст повідомлення мусить складатися принаймні з 3 знаків @@ -343,6 +350,13 @@ Головний рахунок Режим мобільного API Гібридний режим + Редагувати дані + Менеджер аккаунтів + Виберіть учня + Сім\'я + Контакт + Деталі проживання + Особиста інформація Версія додатка Розробники @@ -366,6 +380,30 @@ Аватар Сторінка проекту на GitHub + + Брак інформації про учня + Ім\'я + Друге ім\'я + Стать + Польське громадянство + Прізвище + Імена батька і матері + Номер телефону + Мобільний телефон + Електронна пошта + Місця проживання + Адреса реєстрації + Адреса для кореспонденції + Прізвище та ім\'я + Ступінь спорідненості + Адреса + Телефони + Чоловіча + Жінка + Прізвище + + Псевдонім + Додати псевдонім Поділитися логами Оновити @@ -390,6 +428,9 @@ Наступний Пошук Пошук… + Так + Ні + Зберегти Брак уроків Увібрати тему From dfa10883d32958f4b6b7f9db2f3de210e67bd1d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 2 Feb 2021 00:47:30 +0100 Subject: [PATCH 0301/1526] Version 0.25.0 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 12 +++++------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0d42ad711..f2efb4218 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 30 - versionCode 81 - versionName "0.24.3" + versionCode 82 + versionName "0.25.0" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -129,7 +129,7 @@ play { serviceAccountCredentials = file('key.p12') defaultToAppBundles = false track = 'alpha' - updatePriority = 5 + updatePriority = 3 } ext { @@ -142,7 +142,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:b7576e86" + implementation "io.github.wulkanowy:sdk:0.25.0" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 1af17e0e5..e33059d83 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,9 +1,7 @@ -Wersja 0.24.3 -- naprawiliśmy odczytywanie wiadomości -- naprawiliśmy niekończące się ładowanie w ocenach na drugim semestrze -- naprawiliśmy ciemny motyw na MIUI 12 -- dodaliśmy automatyczne odświeżanie danych w aplikacji -- naprawiliśmy wysyłanie wiadomości kiedy uczeń zalogowany był/jest przez konto ucznia i rodzica -- dodaliśmy zakładkę lekcji dodatkowych (na górnym pasku w planie lekcji) +Wersja 0.25.0 +- naprawiliśmy przełączanie semestrów przy przełączaniu uczniów +- naprawiliśmy błąd przy odświeżaniu ocen gdy włączony był inny niż domyślny tryb liczenia średniej +- dodaliśmy menadżer kont, gdzie można podejrzeć informacje o uczniu oraz zmienić pseudonim +- zmieniliśmy ikonę planu lekcji oraz kolor animacji odświeżania w ciemnym motywie Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From a063aabc7ca26c13a1928ae7829e2c83bc5d6485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 3 Feb 2021 20:59:24 +0100 Subject: [PATCH 0302/1526] Ignore webview init exceptions (#1124) --- app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index 0e6055aac..223224e2d 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -86,7 +86,11 @@ class WulkanowyApp : Application(), Configuration.Provider { private fun fixWebViewLocale() { //https://stackoverflow.com/questions/40398528/android-webview-language-changes-abruptly-on-android-7-0-and-above - WebView(this).destroy() + try { + WebView(this).destroy() + } catch (e: Exception) { + //Ignore exceptions + } } override fun getWorkManagerConfiguration() = Configuration.Builder() From bad0776cab3f0caf5b575d0e45f16ea7387d93c2 Mon Sep 17 00:00:00 2001 From: MRmlik12 <44818681+MRmlik12@users.noreply.github.com> Date: Fri, 5 Feb 2021 10:50:35 +0100 Subject: [PATCH 0303/1526] Add final average grades calculation with modifiers (#1125) --- .../modules/grade/summary/GradeSummaryAdapter.kt | 11 +++++++++-- .../io/github/wulkanowy/utils/GradeExtension.kt | 16 +++++++++++++--- .../github/wulkanowy/utils/GradeExtensionTest.kt | 9 +++++---- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt index ccebe94f0..edc2a9e19 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt @@ -5,14 +5,21 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.ItemGradeSummaryBinding import io.github.wulkanowy.databinding.ScrollableHeaderGradeSummaryBinding +import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.calcAverage +import io.github.wulkanowy.utils.changeModifier import java.util.Locale import javax.inject.Inject -class GradeSummaryAdapter @Inject constructor() : RecyclerView.Adapter() { +class GradeSummaryAdapter @Inject constructor( + private val preferencesRepository: PreferencesRepository +) : RecyclerView.Adapter() { private enum class ViewType(val id: Int) { HEADER(1), @@ -49,7 +56,7 @@ class GradeSummaryAdapter @Inject constructor() : RecyclerView.Adapter value.average != 0.0 } .map { values -> values.average } diff --git a/app/src/main/java/io/github/wulkanowy/utils/GradeExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/GradeExtension.kt index 9aa4fcac0..6facb5ef6 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/GradeExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/GradeExtension.kt @@ -16,10 +16,20 @@ fun List.calcAverage(): Double { } @JvmName("calcSummaryAverage") -fun List.calcAverage() = asSequence() +fun List.calcAverage(plusModifier: Double, minusModifier: Double) = asSequence() .mapNotNull { - if (it.finalGrade.matches("[0-6]".toRegex())) { - it.finalGrade.toDouble() + if (it.finalGrade.matches("[0-6][+-]?".toRegex())) { + when { + it.finalGrade.endsWith('+') -> { + it.finalGrade.removeSuffix("+").toDouble() + plusModifier + } + it.finalGrade.endsWith('-') -> { + it.finalGrade.removeSuffix("-").toDouble() - minusModifier + } + else -> { + it.finalGrade.toDouble() + } + } } else null } .average() diff --git a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt index e1693d523..958b9169b 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt @@ -33,12 +33,13 @@ class GradeExtensionTest { @Test fun calcSummaryAverage() { - assertEquals(2.5, listOf( - createGradeSummary("5"), - createGradeSummary("-5"), + assertEquals(3.5, listOf( + createGradeSummary("4"), + createGradeSummary("5+"), + createGradeSummary("5-"), createGradeSummary("test"), createGradeSummary("0") - ).calcAverage(), 0.005) + ).calcAverage(0.5, 0.5), 0.005) } @Test From 87facd266362842463effd8bfbc546d7f9d8241a Mon Sep 17 00:00:00 2001 From: MRmlik12 <44818681+MRmlik12@users.noreply.github.com> Date: Fri, 5 Feb 2021 16:49:29 +0100 Subject: [PATCH 0304/1526] Add MRmlik12 to contributors (#1126) --- app/src/main/assets/contributors.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/assets/contributors.json b/app/src/main/assets/contributors.json index 54b47350b..75043b00a 100644 --- a/app/src/main/assets/contributors.json +++ b/app/src/main/assets/contributors.json @@ -34,5 +34,9 @@ { "displayName": "Mateusz Idziejczak", "githubUsername": "Luncenok" + }, + { + "displayName": "MRmlik12", + "githubUsername": "MRmlik12" } ] From 23411a608f534020384d68b3024f12deabf3ce72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 6 Feb 2021 16:19:50 +0100 Subject: [PATCH 0305/1526] Fix nullable student guardians (#1128) --- app/build.gradle | 2 +- .../33.json | 2142 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 6 +- .../wulkanowy/data/db/entities/StudentInfo.kt | 4 +- .../data/db/migrations/Migration33.kt | 45 + .../data/mappers/StudentInfoMapper.kt | 4 +- .../studentinfo/StudentInfoFragment.kt | 44 +- .../studentinfo/StudentInfoPresenter.kt | 8 +- .../ui/modules/studentinfo/StudentInfoView.kt | 5 +- .../main/res/layout/fragment_student_info.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 11 files changed, 2231 insertions(+), 33 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/33.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration33.kt diff --git a/app/build.gradle b/app/build.gradle index f2efb4218..b3eaef237 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -142,7 +142,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:0.25.0" + implementation "io.github.wulkanowy:sdk:31fa6d26" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/33.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/33.json new file mode 100644 index 000000000..255c196e5 --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/33.json @@ -0,0 +1,2142 @@ +{ + "formatVersion": 1, + "database": { + "version": 33, + "identityHash": "c024cc4e19e009a03303e2bfe5c34b48", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `scrapper_base_url` TEXT NOT NULL, `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "semester_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `unread_by` INTEGER NOT NULL, `read_by` INTEGER NOT NULL, `content` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `recipient_name` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `removed` INTEGER NOT NULL, `has_attachments` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "recipient", + "columnName": "recipient_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "removed", + "columnName": "removed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `one_drive_id` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`real_id`))", + "fields": [ + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "oneDriveId", + "columnName": "one_drive_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "real_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ReportingUnits", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `short` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `roles` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "senderName", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roles", + "columnName": "roles", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` TEXT NOT NULL, `name` TEXT NOT NULL, `real_name` TEXT NOT NULL, `login_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `role` INTEGER NOT NULL, `hash` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "realName", + "columnName": "real_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginId", + "columnName": "login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "role", + "columnName": "role", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hash", + "columnName": "hash", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c024cc4e19e009a03303e2bfe5c34b48')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 806f0c9d1..beec3ff70 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -84,6 +84,7 @@ import io.github.wulkanowy.data.db.migrations.Migration3 import io.github.wulkanowy.data.db.migrations.Migration30 import io.github.wulkanowy.data.db.migrations.Migration31 import io.github.wulkanowy.data.db.migrations.Migration32 +import io.github.wulkanowy.data.db.migrations.Migration33 import io.github.wulkanowy.data.db.migrations.Migration4 import io.github.wulkanowy.data.db.migrations.Migration5 import io.github.wulkanowy.data.db.migrations.Migration6 @@ -129,7 +130,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 32 + const val VERSION_SCHEMA = 33 fun getMigrations(sharedPrefProvider: SharedPrefProvider): Array { return arrayOf( @@ -163,7 +164,8 @@ abstract class AppDatabase : RoomDatabase() { Migration29(), Migration30(), Migration31(), - Migration32() + Migration32(), + Migration33() ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentInfo.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentInfo.kt index 70d00194f..7366e547f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentInfo.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentInfo.kt @@ -59,10 +59,10 @@ data class StudentInfo( val email: String, @Embedded(prefix = "first_guardian_") - val firstGuardian: StudentGuardian, + val firstGuardian: StudentGuardian?, @Embedded(prefix = "second_guardian_") - val secondGuardian: StudentGuardian + val secondGuardian: StudentGuardian? ) : Serializable { diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration33.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration33.kt new file mode 100644 index 000000000..4a57880d4 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration33.kt @@ -0,0 +1,45 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +class Migration33 : Migration(32, 33) { + + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("DROP TABLE IF EXISTS StudentInfo") + + database.execSQL( + """CREATE TABLE IF NOT EXISTS StudentInfo ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + student_id INTEGER NOT NULL, + full_name TEXT NOT NULL, + first_name TEXT NOT NULL, + second_name TEXT NOT NULL, + surname TEXT NOT NULL, + birth_date INTEGER NOT NULL, + birth_place TEXT NOT NULL, + gender TEXT NOT NULL, + has_polish_citizenship INTEGER NOT NULL, + family_name TEXT NOT NULL, + parents_names TEXT NOT NULL, + address TEXT NOT NULL, + registered_address TEXT NOT NULL, + correspondence_address TEXT NOT NULL, + phone_number TEXT NOT NULL, + cell_phone_number TEXT NOT NULL, + email TEXT NOT NULL, + first_guardian_full_name TEXT, + first_guardian_kinship TEXT, + first_guardian_address TEXT, + first_guardian_phones TEXT, + first_guardian_email TEXT, + second_guardian_full_name TEXT, + second_guardian_kinship TEXT, + second_guardian_address TEXT, + second_guardian_phones TEXT, + second_guardian_email TEXT) + """ + ) + } +} + diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/StudentInfoMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/StudentInfoMapper.kt index ebdf9de2e..9e8533901 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/StudentInfoMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/StudentInfoMapper.kt @@ -25,8 +25,8 @@ fun SdkStudentInfo.mapToEntity(semester: Semester) = StudentInfo( phoneNumber = phoneNumber, cellPhoneNumber = phoneNumber, email = email, - firstGuardian = guardians[0].mapToEntity(), - secondGuardian = guardians[1].mapToEntity() + firstGuardian = guardianFirst?.mapToEntity(), + secondGuardian = guardianSecond?.mapToEntity() ) fun SdkStudentGuardian.mapToEntity() = StudentGuardian( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt index 767d31a45..6a80b2b95 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt @@ -15,6 +15,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.StudentGuardian import io.github.wulkanowy.data.db.entities.StudentInfo import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.enums.Gender @@ -75,7 +76,11 @@ class StudentInfoFragment : with(binding) { studentInfoSwipe.setOnRefreshListener(presenter::onSwipeRefresh) studentInfoSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) - studentInfoSwipe.setProgressBackgroundColorSchemeColor(requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh)) + studentInfoSwipe.setProgressBackgroundColorSchemeColor( + requireContext().getThemeAttrColor( + R.attr.colorSwipeRefresh + ) + ) studentInfoErrorRetry.setOnClickListener { presenter.onRetry() } studentInfoErrorDetails.setOnClickListener { presenter.onDetailsClick() } } @@ -135,11 +140,14 @@ class StudentInfoFragment : @SuppressLint("DefaultLocale") override fun showFamilyTypeData(studentInfo: StudentInfo) { updateData( - listOf( - studentInfo.firstGuardian.kinship.capitalize() to studentInfo.firstGuardian.fullName, - studentInfo.secondGuardian.kinship.capitalize() to studentInfo.secondGuardian.fullName - ).map { - if (it.second.isBlank()) it.copy(second = getString(R.string.all_no_data)) else it + listOfNotNull( + studentInfo.firstGuardian?.let { it.kinship.capitalize() to it.fullName }, + studentInfo.secondGuardian?.let { it.kinship.capitalize() to it.fullName }, + ).map { (title, value) -> + val updatedValue = value.ifBlank { getString(R.string.all_no_data) } + val updatedTitle = title.ifBlank { getString(R.string.all_no_data) } + + updatedTitle to updatedValue } ) } @@ -156,28 +164,28 @@ class StudentInfoFragment : ) } - override fun showFirstGuardianTypeData(studentInfo: StudentInfo) { + override fun showFirstGuardianTypeData(studentGuardian: StudentGuardian) { updateData( listOf( - getString(R.string.student_info_full_name) to studentInfo.firstGuardian.fullName, - getString(R.string.student_info_kinship) to studentInfo.firstGuardian.kinship, - getString(R.string.student_info_guardian_address) to studentInfo.firstGuardian.address, - getString(R.string.student_info_phones) to studentInfo.firstGuardian.phones, - getString(R.string.student_info_email) to studentInfo.firstGuardian.email + getString(R.string.student_info_full_name) to studentGuardian.fullName, + getString(R.string.student_info_kinship) to studentGuardian.kinship, + getString(R.string.student_info_guardian_address) to studentGuardian.address, + getString(R.string.student_info_phones) to studentGuardian.phones, + getString(R.string.student_info_email) to studentGuardian.email ).map { if (it.second.isBlank()) it.copy(second = getString(R.string.all_no_data)) else it } ) } - override fun showSecondGuardianTypeData(studentInfo: StudentInfo) { + override fun showSecondGuardianTypeData(studentGuardian: StudentGuardian) { updateData( listOf( - getString(R.string.student_info_full_name) to studentInfo.secondGuardian.fullName, - getString(R.string.student_info_kinship) to studentInfo.secondGuardian.kinship, - getString(R.string.student_info_guardian_address) to studentInfo.secondGuardian.address, - getString(R.string.student_info_phones) to studentInfo.secondGuardian.phones, - getString(R.string.student_info_email) to studentInfo.secondGuardian.email + getString(R.string.student_info_full_name) to studentGuardian.fullName, + getString(R.string.student_info_kinship) to studentGuardian.kinship, + getString(R.string.student_info_guardian_address) to studentGuardian.address, + getString(R.string.student_info_phones) to studentGuardian.phones, + getString(R.string.student_info_email) to studentGuardian.email ).map { if (it.second.isBlank()) it.copy(second = getString(R.string.all_no_data)) else it } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoPresenter.kt index a1a48be17..d5f84dc21 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoPresenter.kt @@ -84,7 +84,7 @@ class StudentInfoPresenter @Inject constructor( when (it.status) { Status.LOADING -> Timber.i("Loading student info $infoType started") Status.SUCCESS -> { - if (it.data != null) { + if (it.data != null && !(infoType == StudentInfoView.Type.FAMILY && it.data.firstGuardian == null && it.data.secondGuardian == null)) { Timber.i("Loading student info $infoType result: Success") showCorrectData(it.data) view?.run { @@ -94,7 +94,7 @@ class StudentInfoPresenter @Inject constructor( } analytics.logEvent("load_item", "type" to "student_info") } else { - Timber.i("Loading student info $infoType result: No school info found") + Timber.i("Loading student info $infoType result: No student or family info found") view?.run { showContent(!isViewEmpty) showEmpty(isViewEmpty) @@ -122,8 +122,8 @@ class StudentInfoPresenter @Inject constructor( StudentInfoView.Type.CONTACT -> view?.showContactTypeData(studentInfo) StudentInfoView.Type.ADDRESS -> view?.showAddressTypeData(studentInfo) StudentInfoView.Type.FAMILY -> view?.showFamilyTypeData(studentInfo) - StudentInfoView.Type.SECOND_GUARDIAN -> view?.showSecondGuardianTypeData(studentInfo) - StudentInfoView.Type.FIRST_GUARDIAN -> view?.showFirstGuardianTypeData(studentInfo) + StudentInfoView.Type.SECOND_GUARDIAN -> view?.showSecondGuardianTypeData(studentInfo.secondGuardian!!) + StudentInfoView.Type.FIRST_GUARDIAN -> view?.showFirstGuardianTypeData(studentInfo.firstGuardian!!) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoView.kt index 70c3eb5e0..2f0c6753a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.studentinfo +import io.github.wulkanowy.data.db.entities.StudentGuardian import io.github.wulkanowy.data.db.entities.StudentInfo import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.ui.base.BaseView @@ -24,9 +25,9 @@ interface StudentInfoView : BaseView { fun showFamilyTypeData(studentInfo: StudentInfo) - fun showFirstGuardianTypeData(studentInfo: StudentInfo) + fun showFirstGuardianTypeData(studentGuardian: StudentGuardian) - fun showSecondGuardianTypeData(studentInfo: StudentInfo) + fun showSecondGuardianTypeData(studentGuardian: StudentGuardian) fun openStudentInfoView(infoType: Type, studentWithSemesters: StudentWithSemesters) diff --git a/app/src/main/res/layout/fragment_student_info.xml b/app/src/main/res/layout/fragment_student_info.xml index 7943b2db8..5970e2fc4 100644 --- a/app/src/main/res/layout/fragment_student_info.xml +++ b/app/src/main/res/layout/fragment_student_info.xml @@ -36,7 +36,7 @@ android:padding="10dp" android:visibility="gone" tools:ignore="UseCompoundDrawables" - tools:visibility="gone"> + tools:visibility="visible"> - No info about student + No info about student or student family Name Second name Gender From dcac138ff81a1e5fe9c1131757777c969869cc43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 6 Feb 2021 16:54:17 +0100 Subject: [PATCH 0306/1526] Version 0.25.1 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b3eaef237..12e6b9a5e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 30 - versionCode 82 - versionName "0.25.0" + versionCode 83 + versionName "0.25.1" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -142,7 +142,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:31fa6d26" + implementation "io.github.wulkanowy:sdk:0.25.1" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index e33059d83..dc5ed9181 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,7 @@ -Wersja 0.25.0 +Wersja 0.25.1 - naprawiliśmy przełączanie semestrów przy przełączaniu uczniów - naprawiliśmy błąd przy odświeżaniu ocen gdy włączony był inny niż domyślny tryb liczenia średniej +- do średniej końcowej wliczają się teraz również oceny z plusami i minusami - dodaliśmy menadżer kont, gdzie można podejrzeć informacje o uczniu oraz zmienić pseudonim - zmieniliśmy ikonę planu lekcji oraz kolor animacji odświeżania w ciemnym motywie From 61de1de532f84b8103f5be9f367da2b73cf77df4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 7 Feb 2021 13:01:34 +0100 Subject: [PATCH 0307/1526] New Crowdin updates (#1129) --- app/src/main/res/values-cs-rCZ/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sk-rSK/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index fc01584b5..cadf41458 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -381,7 +381,7 @@ Avatar Zobrazit více na GitHub - Žádné informace o žácích + Žádné informace o žáků nebo rodině žáka Jméno Druhé jméno Pohlaví diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8d0bf3e98..1acbdacbf 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -341,7 +341,7 @@ Benutzerbild Sehen Sie mehr auf GitHub - Keine Informationen über Schüler + Keine Informationen über Schüler- oder Studentenfamilie Name Zweite Name Geschlecht diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 2f849bc1b..52134613d 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -381,7 +381,7 @@ Awatar Zobacz więcej na GitHub - Brak informacji o uczniu + Brak informacji o uczniu lub rodzinie ucznia Imię Drugie imię Płeć diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 158c91bc0..0de20ea91 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -381,7 +381,7 @@ Aватар Страница проекта на GitHub - Нет информации о студенте + Нет информации об ученике или семье ученика Имя Фамилия Пол diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index b5c0116ec..1e85cfedc 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -381,7 +381,7 @@ Avatar See more on GitHub - No info about student + No info about student or student family Name Second name Gender diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 3c4b44360..843c36161 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -381,7 +381,7 @@ Аватар Сторінка проекту на GitHub - Брак інформації про учня + Немає інформації про учня або сім\'ю учня Ім\'я Друге ім\'я Стать From 2492a9c204588a3b6c6f057465d94e6c16052757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 7 Feb 2021 23:08:39 +0100 Subject: [PATCH 0308/1526] Update screenshots (#1130) --- .../play/listings/pl-PL/full-description.txt | 2 +- .../graphics/phone-screenshots/1-grades.png | Bin 324808 -> 0 bytes .../graphics/phone-screenshots/1-start.jpg | Bin 0 -> 349651 bytes .../phone-screenshots/2-timetable-dialog.png | Bin 257464 -> 0 bytes .../pl-PL/graphics/phone-screenshots/2.jpg | Bin 0 -> 455924 bytes .../graphics/phone-screenshots/3-exams.png | Bin 181338 -> 0 bytes .../phone-screenshots/3-timetable-dialog.jpg | Bin 0 -> 371438 bytes .../graphics/phone-screenshots/4-exams.jpg | Bin 0 -> 276565 bytes .../phone-screenshots/4-timetable-widget.png | Bin 393889 -> 0 bytes .../graphics/phone-screenshots/5-messages.png | Bin 230716 -> 0 bytes .../phone-screenshots/5-timetable-widget.jpg | Bin 0 -> 480600 bytes .../phone-screenshots/6-account-switcher.png | Bin 257487 -> 0 bytes .../phone-screenshots/6-class-grades.jpg | Bin 0 -> 354200 bytes .../phone-screenshots/7-account-switcher.jpg | Bin 0 -> 300110 bytes .../phone-screenshots/7-class-grades.png | Bin 239825 -> 0 bytes .../graphics/phone-screenshots/8-themes.jpg | Bin 0 -> 424342 bytes 16 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/1-grades.png create mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/1-start.jpg delete mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/2-timetable-dialog.png create mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/2.jpg delete mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/3-exams.png create mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/3-timetable-dialog.jpg create mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/4-exams.jpg delete mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/4-timetable-widget.png delete mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/5-messages.png create mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/5-timetable-widget.jpg delete mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/6-account-switcher.png create mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/6-class-grades.jpg create mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/7-account-switcher.jpg delete mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/7-class-grades.png create mode 100644 app/src/main/play/listings/pl-PL/graphics/phone-screenshots/8-themes.jpg diff --git a/app/src/main/play/listings/pl-PL/full-description.txt b/app/src/main/play/listings/pl-PL/full-description.txt index 641b7706d..7da51da2d 100644 --- a/app/src/main/play/listings/pl-PL/full-description.txt +++ b/app/src/main/play/listings/pl-PL/full-description.txt @@ -4,7 +4,7 @@ Wyróżnione cechy i funkcje: - obliczanie średniej ważonej, - procentowy podgląd frekwencji, - szczęśliwy numerek, -- podgląd lekcji zrealizowanych, +- podgląd lekcji dodatkowych i zrealizowanych, - ciemny motyw. - brak reklam, - tryb offline, diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/1-grades.png b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/1-grades.png deleted file mode 100644 index 56768bf575bf8a603ba9cd1f5ddbaec95e383482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324808 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

=XX5$ss!I-m9DknU~M?S!w>IeW=a+u= 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%0D-rv==tNguO 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℘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[x93~l_96*U-4kNh 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%0A18g>7#et3=k<*brI+2Vv~Hd{MaVc=OsuUt;^+Ro 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≥Dk$`G;Aru*$p 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 z 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 diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/2.jpg b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f70e2c43b0b115ba465462c53189621aa41de731 GIT binary patch literal 455924 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

E2tP#6_8HQI1O!+<4m$_Z7U;H5GSyv(NA4 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∾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 U@6QtpyK4{F6|gsY>;K;b0LiN5N&o-= literal 0 HcmV?d00001 diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/3-exams.png b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/3-exams.png deleted file mode 100644 index f83a7af8b5e09e6073d0989aac6dfe40152c6b4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181338 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

-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 z∾^U%!5xerCqUqvG*%>i_+`dH=1i`Q0zS@BiNyzrU{hUgdN1{XfrwE*8(c{H&2( z?#E;K{}~UX9!&Dqt9-q7JD=^B3l9&sKkt+|D|_tmq4l>82Zx519^zED`FKRwU9R$p ze*MqWZ@1syw_}IJM2|VO-){Qbd~}(o|K{RicLA1eG2N`Z_Ev6jy~s^V!q>;$4Bo%z z&!^M%zb?-|b?Vf+ozLeTyI&t0dw1RLcfZc&*BL)g_gNam%F1e6{Vk_P?1Y$p(T9ia zpyvITozLgJzQ4czj(ho=jmPg*y(=?0k5)o(Vsmnp<-NC3@p{{LS8|NE=e>p>>& z|GxKq>i%;#HYT_8%imk(JNx0`_V=4k>%G0TRa;N*--pBe`a7RYQVTb@HRX0f@9n^! zv!iFe-4OUN?K;n5)#ABY3#P7KvnJ;GdeG()U-P?L4)a;t{QYwIX7`^jFE6WGKRcz!^8RI?fxw4)~kB4u-(t< z<&yaSzpm%+`J(_5SXh`@`nfrvy9w5RkYhRc>FMd`=jY$wn0(x4byC0Ww;O4* zbMMvteyhL#&!?@|<4&6#;x>j zw!hzQbC(`?y?%e)&!^MN-`)8MYQb)f-t)m>a`=;Dtuqf_iK_Z^Qhk2Sr<01#ZGS$` z|9?jB{k^@_#q*1gKKg2Zzv6MP+Wgq9Syvaf%ULBK>j{smRJD7>=4ep=?@xuuqZNUR zrPeRFur>R7iPhfQdApB(Uc9FHZu$M%*}2`{8eOYauWsj)t@`wdr8p1!^|JT!Ewdg7sJXMZF|?OtE}rGNP^36qR~ zvK8E6@#6D-wiG>|Th4dbpg6G3EjRZq$c*Rq|1JN?ff}~zLY;F=bHmq0iN^a)v%k*j zSa8PhIE&+l$MXMw{QtZEzj@`SCv&=)i);RTJRT@w8n?wfu3Yc)T>Fnlgb%m#pPy&2 ztN8i3k57^}r=9IuAAU1y_1d!Ax!W~^m-);vP<(#%Siih|?yW7L{z?A*eTANdg&)7~ z`@R=cFm!3J^H7^Sb1Dy?&4&Z;?(V){dOeok{!hXAdA6I^7ybP68MH!|omXm#?5ie) zh>c0D`{Od6hOLbfJ%7ot=*fvQOaA+I{oWK;@v!xn|K1;ux<3ZK(BAtMv{=VA@Ui5o zqP|7Fps|kMZ@2f0Z_fOavnQ&2x?b$IyJfe19%?S1W0ZeykGI~=B`04qgUXdhj~=Pd zt4Qj-oNc;%#flfz_kV+q{#w85)hYuXPz!lS&HumO^|iG@T^RYwCllY@-F>`si)E#o zciQ~)`4x{kD;oFtcrN#wd(QUzo&4I@(U+I`p4Q_Ji{}Sb0esSCIY+xhK}Cs?{?>$p zO`svF-EX&@j=ZpE(ITb#zs)i1CW`y6y`Ecs@8lUXF_wev@^wEhIP<5f?~N_L`?Z0Y zPr|;g=G=oh?Q&HwzTM9Me|`Ty(fN&D-rkpAe(~1dJ7w?r)akL?GA=GEdwc7trT0;P z-S~Yrbrok#uY-DK{5BsP_IOpydv8;Hb%z2+T;0#7_5VK4x4i!QZoy$*P!%Axed(jg zg?|kGDg69&TL1jI_F1!L{ZN|l=G}1x4p6b0dV1R3%I9-I)qI-X%t@0bfjYArkIPm6 zc-RgKpEvW4@yS}LOg{PjUUmMzKR;(4%DlYnZpmfeM2TG%a#5Qc zeSU4301K$zUBB;~hQ5A(|8`LN+jC-Sc%0<=o~nnf;$}aaK${1j%}8G6JG<

hvcz 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 literal 0 HcmV?d00001 diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/4-exams.jpg b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/4-exams.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f49e774a214400ea0aa9d305963793d2746f7db GIT binary patch literal 276565 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 @RN~ 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℘_<6nN7Ufw!tZB8rC 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

4MC+R4c6Nh+Fu!2B`i&7bP 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ⅅ_)I9cYAYKO?FEE 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 z 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μDqIIH>`n@rXU%^R20 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 diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/5-messages.png b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/5-messages.png deleted file mode 100644 index eadbf2db223e984e987018c7308e5d79158b83f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230716 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%0Dqdaj|=UUS=j} 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

a3b?J4vbwMed8imoRmWIdP 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 diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/5-timetable-widget.jpg b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/5-timetable-widget.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f68daaf1a1a1c37dc20e2e430381160a020a4dff GIT binary patch literal 480600 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

mJEvVQkO=XdidU6mPk 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

nu-mjk`3n?#j}8;>_2sF3!6( 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Ĺ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≧sPjtOFSA`z7+OdNb^;)$K;B6)OxE9tw4f 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 literal 0 HcmV?d00001 diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/6-account-switcher.png b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/6-account-switcher.png deleted file mode 100644 index 2a11a3db9a715a27750cc304174c159405eddcdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257487 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

tiD^EAsCH=8oVvO9?KCX4#6 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%0Ac?kahI#X3+L4fwC_jFBdm)Y@DKddNtqc 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 O)5@N%elF{r5}E*M`7Le$ diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/6-class-grades.jpg b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/6-class-grades.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca5446a243873841598bccd212595900a3827592 GIT binary patch literal 354200 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

b3XO7addD{bkeOFk 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 z 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

`scpb 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 literal 0 HcmV?d00001 diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/7-account-switcher.jpg b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/7-account-switcher.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca747aff04c52a60e58900b4c31a7c0c4709db87 GIT binary patch literal 300110 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℘vTw;7Yf&wB(p_-P~V$ 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

J*pLyx)ZQ9lE+eCQ>3f=mW z+qJ?dOXu+`7x#bDr#rNyxw)-tzU=Fe>Oa?Zb}#>AkBXz-R`we=eCWL3yF{pWMycWB z$C1u!m#VldE;Q4w`J$w3QYfF$5EXVWb^e^^mNk2B@A8@~%yzp*EcUUsYQduGd4}aV zn_Mjx`*W|DIMwFj%!xuFOXs!UV4M(Fapvl&eXm!#rDf$y7#qJdw%N4c%=ukuOwBnl zm7n(9j+|3<#OlfS!rT{X(g{8H3N^M*do#t%^SfI*FJBq=rWB?dm6iu9r<~pPTcbX) z{I~pVEvq~0tSja8&4f3lpV&6jTlCcL?_qaMJ7p}lzWJ&%Us7C{TS?dBE7#}3lj$as z`)Zq>-=4qkhgxQO>#d6?8})p=XI%4GwrGF%1kZI1g_;YuJnL8VzUq?FYWZ%;lz9tO z`!eLy_~&@1zAIvSwL)e8mQTr+8r>)V%vrlONpRx46-ND4k1DpjQLU2vb|AG|d9r_W zXuY{s)h;vZc(y}s-bx>4S#^BnQFTpudnjdTjttB8l~#T#mr|-EC3q@7FU@X9*|YFY zRL-9>Ugvo`cUAZwH!3hw-00T1#=CHPpO^OHqkTom`<3jY7JJStRG3oBplPok9e++P zc+(HrdzXu?dmcsC{E_C^60zv@yuv@3C&E6@+PrMmmgG;DpT4=FnYZ(I(wUP_=IxSX zSUubQl-Q3)HAk-GzkB{}o#dRz<&Q(3>R&&;y}!OJY{#3PI^|Qjp%+%4=;X-RF=dL- zg_AFjEMjyk;{Ox!vH$nwu76&t45z74#Bmv)(bLv8ym{u@GG?ubiCii*lUP#3g(s;b zubncVg2 zubDY7KID;qkW%jE%$RHsPPN~&weB3%UUA&aF0C@+_Nu7hNd~jSs-8@1`xtihdenB_ zY)ySHy^%+V81@z*mY3sk%E7aCu?d3s*I_oh2H_0+F0S~f6Txjy6m z6um!nmfM{_-21?))cRq^y+8M_3%smfXqW0X{kg?Io9Z>aiS>*te@n_oO_X@O4^+Cz zs(#irzxViF%s-8~r~3oCuPJuEmKMDnqZ`A@?qwUFkzCc!m3y;d)zSE_{@~kUId@W3 z-`?v{`|+3ay?8@l?9nL?z636@@>+HM;$dtfXV?lh%Yql>3--om6wAbgR~b!TUa|W9 zjFrcaiRtDq)=IDZ=NtQW&gB1eeiJF0tN<|37c~>qH0n! zwf$?=+~Q6$97~CF-Bh-7we7vC>-=F?78gIslMeBmnXqPIuEzCTxt%B2BW69Zh?MHg zGMbdB7QC`<37gAiohrG^&eR`M7X>}h*)6^I_|uO|rZoL{w9h5%UXV|JP`~OC%U=h? z)KBi$kle37b6Mz&Jl1ong<6LN`+Jg49aFn;rgXaemaNn>D^JdijGOUP$;2$6k2!MY z%9JWW!5K0C84P#l*6xwko}IhTP-~UwJCClE15+#hbX@h7Exp67{%7TnjZaUwi&U&q zDcH6)EX93cnM38DO}VlE&g3k!-?p=+%R0L1w9Y!;rk8gnT1^VkX}b6`_t>M^V$$cA z7Thad$juPcWK|hmweh{8Z3F*cl+Umr?g&f zGZoV<`02Y_^h9r{YxlivF543or+RP5n3T72+nJ6-k1CfxZJIw*r)u_!9oa(XH;SvQ z7d?5W>&*)8X4A~7GTVwHp5!`cEZM4 zaY2^5Zk*=c^)I%3U*{REcbR8Hq<`{;o_y`GYn#fgOOaP&E@{17am070k z%Q%`ISr$D#U-a#}$;s{2mEX%A7np17u5cAOwd=O!yGLijOkTzHe_XY6yR5jecCVCU z?u?I*4th<=P}Oux&{bDd*0)+_6eYKGYSNNLFHL6V+AKB-6i>A(cS!w$E!&VN#(rhR zrA2`y6DLkv;uhQQapJ^Dm%5qq2`AVrzwe)R+a_MAykOgB>16FA*Dcn*Gw56RlmCk4 zb&;7LrJH%LrAIz0zN0F+$m*0!P~>uFN0k#=%S6wqU3FWVwCcR{&fCiuDe~;~?+@9U z=yPzv7Nf4KSqbMem;CaWaL{Vf8>uM?Hnqo}ozLAAHB;g&AGdXJdgP`R8xx*}vYd_1 z+u@bFbqdp`Gfly3*L-zS7Uq6**`0e+g3Z3z%IwXnwm0vT?vI&u)8LM8n{NBQmQ}&V zTTPGbIU#MjE3j*?mU269R`8OwV(;1}dA9zLoCyZ6(rPCg+f6q9a^^q{1LMl|hWj;Q zfBY%VYk#=+0hcTH!@|8k_pejD^q&FL&eMmq^CS=bV-EhNWw%wy@Otf~{|weOR^HE| z^7kI!v-3^x(fo@q1&(~}?RdFQY#mec3+tl~CGIV5S$21Fi`Lcnu73BN$jyaQW^b=D znEm*R`kpvO*K)Do=8J9uFSTY@?BtU@KwL~Qp6-0mUcO*&;2E2B52in_KrID5!KL7B z|D*ExaxFivo!qnk;<>`_Y~`&Br@pD5TJoQvrfqNe`k$S9>ewg$oyHdm9%NJhetadK zA%3Rm`EHj3^80Q*kxrfDGdnuAY}e0;YqKX@-mImU`BbgccXHr;lZ}RgPgG7G6U+2o zyViB3T$`iHr>~nT%T5O03VQPU^u)Y9>WhNIl0&Zx%xw*C4Y^dA6xr%@rCVG4w#&Aq zs(fZ{ZIh-29&*3QSO6NHQn9^wyr^e?-ljjv9H(Lq8U0>$?9taOP>r_82 z@U?Qvv)&VLbl0ivy(m0yW){=MomEc`z0UdWe57Y8D zF148)$78=o|1+-s<^K%S0ok+jPVhqcwGzv=Hz!%;x2|qHe*VaN@w4BKnXh=LxjW^d zTx#^{j{!P6cPzQP`(n#|`GvNRK5$v@*wka!Ww6VA)+!6K)8>!Wzt-o3JbuhAx4C8I z+~+?{%OQP_YH$rL2dkm)iM548YG|p?_x3+i`}jl5|67C=Wcq3TeYxj7Kd*P5;6L>| zWAAU%KXaZwc(^%$xV%E1Dqi2p-k(nIk3XJWV$b`YAxI;hyZ8OszlD6$e+fSe$*e2x ze|&t`iG89UxaK`^`?pca=z8t7{|r6%{!RYbH~W3zd%bFr7w)g!)YsUJB_Y{`~j}doK}-Z>S`6 zg_zcB*Tea5e(m2F__b4T+WvRb|D=5{nSTa6W?KAX;Wxow2RmO&^Ik4C*?uGZPtEy| z@7=c~o-J?6z40uQYkNf9Q~9+Yy3O)5>k1QD@`%;$MABB)l-yBCS%eCCw@@Sll;e ztKrp`6yJv2JRM7z@V8&!Q*T~)uj#9MMrG_legBW*U*m3a&8bODzE)+lti1lo)%*60 z-0SA|Uw!Ppd;enX)O-Ffo}2$}wm)>?)HnN6yXyBj$6H_jbL8%S2IiCR4a%U6UOPK~ ztc_kQPN0&I)U40apIYztA2)kZCw-4$Nx(jF>HD*PJ(AV`qJCz@r9aO>b7vD{jQ`FJ z|E6UJ%2j_afpXP5TGl5)@nkf) z?495Gd+cWjzt*JMx7!YcizkTs_(+5T}ho)^&R_HeLDearm1a8o zcE9Sg{1-Jy^}iKX{eOd0|I_x|c`GRYZ#J~C=FU_dC&0(@ZSUlt3uHLoR;zz@un@lW z&Hq_Lf%?`r^UpFo@Xx+!Ka26eyz86lO_&>P*Qfl;U}vh1JNf6rsJ77{AwQKoWL&wQ zn0~$JVf&k3>ysA07E;!&zpMY_-tX!vSm)_Y@Iu)yJpK_k@@7BG->`$HekrIiZ@u!t z>@t6*wP6)2-m4$d*}3DC&+X-#Y)&5RYx%x+p=-HVXj}3`2`jCnq;<~iRYc$YS17X! zOLL1IZyRuW{gd-o|1&Jo+hMWz?d^-vYLKS7=09+^D&+FtPg39SZGWZ*%B$ZZY@yw% zcm?%A*{zx<`S1Md-=gx*E-BlVgQKGASMW2d{7&xqN38^ZT?9APYjnSfGxq;wuK>0G zEWC1W)=GrVIxi~w8=kk(%?sP%Wh z>i&$~`yW)=-%R)#XS8p{AEnxwhIz)%y_CKzE`}(E-jFB{3}9CZv4wL$RDascN}@l+VnOcmeGhNz}3=yja<% z=iI)4NWauFJgTsgeW4#x);{%)(3k%Vg76+``eLoj@_#;m<9{i=Ztk+XyH|8mzWSHq z*?$ksf0zN9vh=mTueiSUbzRcC{|t>!{xhUDUxidhUq3NHsw4E3V=pHvnOJ;E^PMau zq7k^nXSP}LTi13j5w~!)n3F~GgCu*!bjqeY?$dRdqNtWuCBW@D_56B`k18j+o_%mD zEu2@_x?5QI?9!u!zB(6{9-DH^W?RaJ#eOTIcrGn@k$S^GR(}3_jrrFe)*r0A|EYla z^WUe!zwYS&(6|2Q$52wgB;=k+HKh_<+|Kl-)QZAq#+cDUp|cWvu|3vPT}Gafy$s3Ow6^ehRvYoA^8^4G38pve^^`sdb7 z^-eC6)vc$krrq%u%&5^b*{bS#VabXUzu6KDsyA-XDm$IO@$QBDeBqkg+Y>iydwcY} z6D^s&&1g>0sZA$eRZdj#Ty{bsTw%{Ly|pe|Qm1%$x8!(w?U=-@E1kNbrX^p`WX|@S zvcvhCcBOpvm=n0>bH%qWMX`=L3!a4ZKh2!)ZO|FpRB9VMS9fjZn}(T1b)l8&hYWx7 zY&O0XyW?nK*OEzV^z-$LEkfT&PFs=49Tu`Y^-T4`9d8tm-?cj=kj5--J*Ri=y@G9U0@|nc8=P z`@`piwOLOqkF3p(ioP3jm3OIk(4;t5$h%}m z=#4io92Guuo)zso``+zz?%f)#l@Z?pmG-5*JUg57ryr+Iq_cY6;+w+ifPk++t?&%m$OS<^I4kZRB_EM_1&aP{&D6!drxs{e(d?8#CWYw zJlcF_;Y^;Tu~GASej7zPxBq7d+n&7k*oEhpW=?E)GG(R9W~J}C3+@!ArA#rqRg*3g z)iddK=9eprl@!GK&z^gjcDp)oV{w7cyfnMWyq}LPmcH3F)p5evd)AhlKfP+7U)kBS z&Un?E)vHX_^uOp}ePDNT&Q4x~n==)kpVV-a+7X?b^?s%*r{2l=jtp(?+-p}}i%E0# z2vj_tY;$GW?Z_{R$0edWa?^iJm6YIL=`^iMQEjoY%B0|%K~rj*yaM80x~0Dql;Cf1 zSzM_R?Wbkes>*9~`J9`vosg#PmaXe7XYH1IGx;Xt_l95Z)gEP^+F^BG`Sq+%=hpk_ zZ9ehi&+^p|-+U~{T%N*yNI7s)kXu@si;L^Zne!7mI(Dn2CD<*s$=h*AJK_gLn= z4{~01a{leVvkqwo=1w|w?Cna`)Za@do~+!uTyi4+s!g-IABn6r@|g1ZWa3M<$1V3$ zE^IrrW2shY%CrkvQCHtZ=c=Wp)jPFJ7uqd1vCN^+oqKM6$YcH4@*FZ~ObC-ZWFY{(1c4t9FrP%WnSh{l0A4`G&vu=0w%X z?M>ftfz^Y^f(t_#kuy%hhaoM~Ket@c*Zp4lpF#S5e!N%Bao>-M#Xpui*+&`LCMWL7 zZ{2t3f#H9K1@FbT7@l?K^xdt$m}_(7qs4pXb8Jq1tZAJ8P%h=cai{8g7Z&aA);Rn^ zncdZ=koY6eL4C%97v4KoE#3l}bXxwS``7xMRzEv~jjwGbgT42EN`LjA;i7nqOyIY- zFV;@3v|l{u{yUNX4BXDzH~uqdW&ZogTm3%zvv~O*e)Zova*z!M{_7_QAH%vhb6;`x zr>JM_A9L;hzV&08TDj*|n!nl&7E2%ZnOvp&o*bFWmQt2_aIWB+O+~TYW-?Q(rDD>9 zsx-F?Esh*hvrRP1VQCIMMwf*&LnMxz+6?tX5 zv{;^;TvhJmS<1o`d32}CJ-fsr4(W;Kz9pI#D(qN#A*WB*%7(*qt*XmZ^R%Z{cb6So zbjoDrjw`J8iHd4&PulvO7^`+K?oa;Ft{1(r`%y?~#4*$0Ez*5gQ+Z{~9)vkNKKw4@ z<;*L#Zr{UiVV~Q!&#^moZSk9it^H=~Cu{#R9NU-q@A07nDK?Ol!8+-kxAwuEPoLhm z$Ys03`|wav?cCipJrhp7eIU{q@t+}Xt;dcZOOC31nfal-n$dl&f$}rQeYKyz&Hl7m zZPDAfD;_4AHhgamdz_4$&U%-(Cg@$(?VMg)wU^WVQ&`g8Jm>w)yM0gR!@xOSbMD*jtz}6;(G3vdF`N6P*$hx^jJI9H62qjf|yQEol^93d-cQ9Uyo~A#x7BL zy7Nnpa!J98b7}t>s?2}PJ$N|Fw0q*G8*7fo9Im|1shxOq%`}gaPBphI?w0#pFK>T5 zE2n+hbn4xwZkLm+>)yS5=UQf;^3~S0f*L^tkx`!*wGq=8Tf7;=*C)S_RUL13By3(?D)|y4u z%P#%eezSPfq@YrR^>+^KE!`7y;=!G@h7)2Q{jS*)bi3qx;h&=7t>u-zA(4}!mmj&c zIpx=jsh`3{Z4*^`rYt|}rTpp=)13GB&OWYL`6$q`?djvkYvgV->{;lS-nm+N=gy_5a@n=(gmLpG|PBcl1Wr@zp2r4?=_1JOA;|M=X z6_>|pQ%$DsygDl+)1#}TSm*Io8IyOHeXL;rKvYEB#guOVtGd@1Ap7D_?!ipK^)Vy=A!_w|C4myOg$M+EgWFJw?4&eWF{k9JrpIRdbvfd#~s} z!|AzZuIj=Y?^{1lerFchyYhyyQ$pDXdTaGg$1-{+piL{%vAQ zJwHP|3U68T&H1@c=1#k3aj{%JPxaK~t=8>wIv%qd+r6f1Ip3JNIph$y0Ks0C&#k_?hzBpR8wZoF(|3|B;TyA2w!1(DDfe1_qt`^K9xBrf=DC zt+xHT-_|o`<;8_QuexMYG{eNWb8p&SRU*>nR}V{i zsR)I5U3O-S+Ie8*w#}!1x|FS3cIoV@eF>}8qpYK&%?|E5p%Us5a$EFp;**1IlkHBg znyS5lEpLk-dkZ8f~N&5vz^XOxuK;N^~_?4 z-Ick)YSz8GmI#Hcc-CjKmiLv&{u=YN`<0vJqSk-pU3_QN-!%ufAL^=k^Iq}rvdjB3 zvke|>dlI!LO{e_L%>^qO4&9lU@GIzeOv){vp52O(<+u1kH^-cKEOQ|!Dg5U>_Qcjx zx9;9vd1TStdCtz9MpK^Z1#@kj6nxEKmdduY)I|c@LZ)ikCW$b07mM$@y!~mk)ZAUS z&R&k=?auF$&Mlq$WJc*+X}w!kpQ8GGLtU0ViSpg@3?tPF}W@IN1S4yrSMX>{Kx*~skw&V zE@kF!eiXRH!%=e0Sw;JI|EvxBaxJxf%vyHM&${bkS}1>{``VdGtRWVq?eP(_Ge6!e zlCAD{@0n}$baAKqjq5>-$LCAU&YrvecE^>gX4{1%?#J$*^{1-q=C=HeT!vA4F2`>+ z9ch>BI+=OoQO5+gl&DuJZla54R|M-?R^IOrov0dles0ShLoU&h^5s4=K2Kg$U@B%3 zV)dt8#C4^R(Bca{zc^U;Jl`EWFD+(6(b&v`g_@p>@-se{JIwu3NO1?O5(JZ~awkigr!he#c~o+pQQQ$2Aw`DF}uS71)qDe zxII2mbH^(r(`1I@lb9+~2*YZ=alE5q39tnYZ`u&8OtI z2PxdxbHq>Wwv&jb>CBZXTZN(nitklr@07X!DKz1Zv~)yC&$Esb`VX#nYgKHTvu4_* zr@pn*=C=EsdFhs&x_pl3QZA)8FIRA1hqPBoCkJhZN8VI6TTh#9VI>G{|pbF zoBwVFE#25=IsX`F?MB@1Ycu{cEG(}-@TvNYyf%1ew*UJH##lQ}>{F{Iovx3CtdOJUi@|hAfvEfl#mT^$eSuf+Dp7X)R##hdq`K^|g#yo3YY3{a5 zcME+@S8lm9ZK>IP@!qQo&RpuPwdG*kJ~v~Uuhrv}R~52q*Omx({B=61=Cb8m75@h2 z$9WbPKbmaawwBk%BXGeF|D{$-PJFTVX(;;{vnXngrv9XB_d}LWUMDo=`oE4dQ`~a@ z>O1gF(aqJEc5BM5%j>!vXN5#fYhO66EouVaeXYqyvOl$-bi27JOFhgjS9{a4t*YX0 z(`q$eFkYIf$>lX+vD2iK%pjjjOJX$rkEbFORwvwq)CL{_blEJ(Kpydk5JvNL5}7$x6L06*MU$Xjath zz=ctTDreQ)GHtC@FEDqBZJRb-I%;+le~2!Zi7s0#+f z;PfWvJ_2sdt7F&hBym)-&@3pyi9ZDw7l$4a5IPsNRY_qanv+|do zhO(V%&MP05evk2-FSs;M( zudS}ffl_D+AibC&YC%{hbV1m^TqWb{poP4>@3*gCYL~q1_nqp~^N#Xw=)czE9cgqU zZuX3&`ws1Y{QOaQ_brKgi_#{|E{p7o2wipfy9Q|5@8+_s$!0&hobnTXbH1;3>UueA zQ;)Gs$6a@?Q_Iw}p00Sb>B}0a))cB?i#}N_AtKMepa?pDQVd$K^z)z6?|(N|9Y2}^ zS|TnK6Fi!ajF`#d<0U5g&2u zHwJnN!y`8UKctmxtn{5|$+oz&1 z>U!t%I~T4ltXSbSZLQE$$uwEZWoK93{Seu9bLO@eyJ`XjkEI`#`>Wiub@9Hv&vS2D z@4IU%JuSNM_H@=8YdYt*PFDRam^;l~dfmL6OA5B>?aIvEY}lG?>vMivTHTI$@v6(W zW$lS`s0+7teSdTPljr*EytBy8R>VXy`aX82A2E=9?E5dwH(Kodc@F5%7MBm_ztx7{ zSn;31Y@+1re=qBgeZPJ6(tN|qweM`7o_jQx<8Q{1(%#mW=fqZjgG@MrmML!rO*pQ$ z38~wDDCzv{E+53Y+1R5~62Ay81}%-@TL>e+t!zJr`?^Ozs<<~&pVIq_49cu)_#tDcP(CO z_t*E<<`sWar@dA4oHyfQe3`E9MtimwolAc{voTMbvBqEGxLEWtwX}wwiJa@Dk@iL% z$f4_LPuS-oRom(}uiAIi{hEqf)qjRv@gMho`&zObyrj2C+`4OK2Dtp@ZGCy-O>6xE zqwk=3Yx5O-Cw*tD_$r2Fi^OQW`M3N~(%D&RE6wvdm#BRciBjMEvf8QZ#jH&|hBh7d zl-~ADnd;+m^>oMXQt~{f9Zz@8SiJDEF85WL!>3+$ss4Nx!~Onu(rS6p$&rSq?NS#MM^CqI%UPD4 zEP6Sswnc5@3vRz9TlUr~&N_Z4GxetP#@F{NudLXuvP5j|#MvcvU8c9+@q`~Oyj^bd zb4_2yH?<_?n_1T{g|9LySza=G-+te6z3p}qmy>5a7SGD>3HR}D$~|7@{isGbCwOb) z!42oTA8;Q-K8pc-kPC8dr7oMODy8G${5P-GZ=CpbrQovN@3#NEef830c|}lhbRy=S z?uF~GYZrEATWphF_Pl+=`YY@=^7npbvt03E+1W`+6IPqH#b`ilmD$^Uf`qHtqM*x; z!R-K#l8_@uW40<@eMxHEVZ^vaUo4iu!B-a~*@uE%ivt z#gz3E<#To&6RKMec(wdotI}za1&}+xg$@%KYPZ*i-a?bf|7 zyODUscm31_gD~b2_rH0yf8)fjOO#{F@8*BrzIbUJxCz%i=V(pX{>TT4poo)S_QQRi z=(py7>o4Atc(%A@+1~yGt3~H&*+)M#Oh0>6E%%P1`Nj+LzHiZ3_vnu-xj{8%&Vyj#tgqRIpR85aKHKW1wG;8~c; zzqkJxbW{F_z2AQ9!v1C7e?%|(ckkd|@rc70X3Oh1i1#9Ia-q>tThK&AWN%#HaQ)4z z^~uVwJ=}J^-*x|azPs0-8VUE4;hkhIFx9or87el5WtK}QR zvxo?a#D4gN%nrzUESbZn-f`B|ckKJmuuW^@$4Jw8JwInW`P}%Q!TF1PPgecG zGiyBm-u@SL@`vvI{N9E2zVAP5cm2D!`Ip|t_JwA45e@o-t}0V(`_Hg>)xTrz*CzCq z-Y?yM?q1(i@HV1%dc~q2qyDBhw5hInbfa$eL%E9ZTl~NFyMq_j%=%`}v?i=#1+?(N z(WH$dvc1ROe!;TPMwai3_$tfxsdt3_{AUoX{m+mSn*3-}wyor6!;{aM|Fyrcm$>qu zp?PM+Y@Pfedf$C%r+>5WKg{d?UCsU_Hksckr)DEVoH^1Ow+7H@I}8k8R4iUy zyX~`Sp85RBYd881@w!YZ{C+P;GL>zqVAfK>tdv+aCh^By>$lJN&+y05``;eMkFDXi z&(!}@So)tKj`7Bo6+$x3f@?LO+P&)3b?+_=*YZAX*J3PZvt6z-{iUj=u>rB$C!y(| zNQ$^6bQ1Z$t=7LusmL|NnZcNMS@U^KIFh!b>L$O*;Trct^EO^xx}{LAeNn~Ko3;!I#dFtX8_Fdv&0Tl( z?cQzqq5Vfrzj>4=qaC%Quhpd)Dp9wCM`Q2g&xYX4H8YS zvbhl*ye&F&*UzJ2uku8f{M~oNsHSfhYb&4G5o<{kAFDSNmt%W1{f&;aDs*P$^t!|{ zXr^n;%fGw-8FNxn-qC;ca{{70cbwA>4R-hTG~241G;y&<;uVkCiaWguzwArNcl#1~tB=gXUKGJZdK|3AZpoxhoXHdr|@ zFjQRMsb<}Mq~BhB|FYu>r{~J8Q@MRxV``vk(_@2srL)4wI9mW}xV0|WmOx778?OHOp0>9~>-~BLnZ{m|mdslj6yoMKRpoS$(VGc8=9R}ktT7ilyECy~^oXHP?C+k*>Q#5& zGwqHYO4i#fCZaL%!jsORC02{P1X@;l8NU(W33+Qj`}fTKd$eX-&wV~~ zOJ$ti&TGG88#iWW>#nIg_I!2K(>rasDwo>3&g{!&Ient9^So4v&yuAqxf23wmS>dn zr|dMipQBy$@n*!=Tb7eyK|05o&3)BRV1`XZKJQYGu5rz-2aX-i&3wHhC+TzxC&wf?#TzLLkdXWUaf zUbxHm%%Qg%u0A=LYm;_YX6KO|la{WPnk5-DVY`Wu->UBlT5_-R+3w}cvp5&H<9gSM zX0sx#l@FZTm9G6(*cPekxpwig4tKTU7hWg*wC`-Y(OKQ`E0tu?d;vR^P3-U zVVxR~I`#L}ZP)XXBEP9;cHBF)*z(dMtye2&i=DGwTdcop+Pz>sO`q8vk3EG>97ypm z-JYKRt!T=p+{62PO>0i8Tn#zgE9ATMony|&S64$>RYa`K&SfsYt1-!??NZfR&nsKG z;+u*?x7@rJAK&mHUBWE2>~`PdDbdqgZ#`W1cKp?{l*l}f-)t`b8IFpG zu85hQ>>kvqXS0uO(&C58rezG?(Wz(FUC*26tIobMF1$N^V#3ahh_Hu`wnfxAT5Vhu zG;em$kx$WL9*J9|?l{T37P?s|}^Ts=F6RWcJFqYBunw!z?O$0 z!bNMA{(7=9^T#RI5?Nt3;Z?aV7k6!0dr#P8$tAZ1V$-e53}PQVx1SolN2}y{-*m}4 zyLy_YeVbQiKl!oPsn%58Rljd}tIeLudQ(tNJu5wEER=wzB=>lt04O$I~B4CWZ+vnV!nG?WB#F!OX{cTW&^8yC^9&`S802r{^+f z-#ojM`aMD|zB-p#Yss=@yMHW`vrf%d`?&k7*{oH261%QF@!Yd#f?we(>)a)?GP$F! zc{=qpMI8Nk@`g?4n`yH1oXfYDRm?U1$-CF@d2*OVZTFOoXF1D4V=6r>%O+LK@l;ce zI#qBbhIjSm1vN)^9=#be-*D-{dvTR*x1SnK%{yoKZj)qIuMU}9 z`0{P~qzCIlCPxbU?ppTisH94N$B7=TBXchtNz7ZDclu1#C9}%nt}|y=Den#Yq`4+j z`?~7Rm%T+TKqAe z-L(8d=Eiwbg-h3+DbnufnL6?7X}{KmGqVIG`(7kT=(%s7G4=O1_lbE^U;lU~9UUI^ zw0pApF=sxns;t>jT&yK2o}N2?ZT0dFzU*YIFs(ek{@eMqXICzz2EWTSy8SI&tDo)A ziuBZ-tvza29)%`io9_y+WDzH+eEWzM>$Ii;=^}%pViDzozAtx=XAgtl3NT!waXQMq(j=}SuWY@ zelPu3_W8^DGh6Og_ZNwqcbAyn^Ek3~PBic3I@Y=czxckNfea2z?x~y_2i~wCEY@=; zDDLhd;c8j%i55?L-_2u%@Hq~*L-+r8tf4TgR-o^U-gnzwj65sgdPfNfu`0~E%=h4Yh zo{D-h02%IbFKHw@Po&z1{cy|e62?5r)#^JAZ#zSDE+)+uMR zFB@M?_FA>4TeeW=XkmA^zpf^GQOZ)O$jhtr4!*v@+mY*YIX7j=%%!f0CZGmm|0&rw z6Q`#%R30$=`P|ajE;L5j*vRiy!X4H12|HGO77lB@5H;U}d({p77obCDMWV}p=teND zf%ZGMy-WMPt?c~6ty?2voOj>LJ-^}i`CC4DRyB))rw5DO@w7Dl7OytU!qF=j9 z10Q{q{HQYR{jwUyM%PFoz-a?bq203IfZS!e0NjLt_xjx zo9mj)@9wv5ZF~IH$w9m@%&SXnSM@lYpEo+ug|JOX7QS547q-; zbl%Xd5%W8_?CgwlAB~>eV7qBCwP5DNV~&3rGi2=wI^Ou-mR+}XuI$QbrMurZx;Lh) zZmO%1_{P5{c(L1zhnnA#eP0RWZS#5%xlk>2rC`H~nnP(8d4@Z8+l$Fv`p;lfbMV~M zihpM>$#!KaCkNb&v@D-;`;K?;)~%vzcFXkK4d&bb+jAvbQ%(=-#$x~6{oAI=Y`^jD z9rreiHD31;3gh?wo}+HP{q!fbHOs7JgH}D2`E?`LZFOy1)zP)vL%b@t{GR-hG5q_w zW$W(G*9%v=9d>YYw=mzGXpfKS$FgG5)~s3<<+Wy3;61NfAss>!rbihoKPXgL^k$+2 zM_%on=&5tI+}g3!GM#;D|C0>|6{4$?Ke++uRkk{(EhA=JL0~WvFG;P72B7Y z?3_ORQq9sCtfoQnW)~$}P8gMMdMMrL*~)#V^Y>}{S?he)mRIxN-s5-FGR!~R*`D!q zuF=kErKg*(-MD`D)TVU}J1#ELePkvuxlsFc%nQ8&I2TzY!r8?A-kcZ3`D3*||jTyeE4Y~6uwL(?@2e(e(q5)%MvQ4)Cg(vSjXz6}~o0O!B0rv}m{V`*N_`_NUHi zp39fF>GmO)Ig44{BwHSyu9>vc;+v|H_T22PY>QqenkPOv;WX_&-;zhC(F`8?OB#LuXq*Fd6iDi z`g!MKKK9Jr_AGhEwY$$Mzw*Xh^1ixFayGxO*>YRnMAed^uQoA-uCCbt{=PJJ|Oy+vJo;G`q_)^$t1y4h{F%lOib8IQA7Gsv+M}{3y-BNd7KM!hGUl&t3qwaK$u9|b$XRp^$`C9j;n5S|~T4cA>Xkoy4Tc53g z(r!`HIT;pNCr`=GwmJ1VdG_0D7asjyJkkA}(t}TLi*gUR$tSlZPwm}z*H=`eJlUgW zb*}Our#aDSO@9|msCre^8gaBxFR3Ul>%-fR=ggYLZ)=xzYPLUH$NsmM|GNakx6kbxt<1IZt(8Q!N&hR| zVDh!!t#V1B)@oxTf2j*oK1vF{h&>?gxWWE{-tm7L+unbO+Q1qKi9*IC%YOYo$4@^q z`_E8su=mi-%asD+eYtmd4=gyjKK|gwPGgmEQidraRs{_{ZKV@fEcXb^GalW9y^e z`zO4!d-ryeeu2)t$tnvD8m{7AwRcay6idIx<}DlMbxeA%yXjN4e77Yb+eUlY_- zTOfLS2JeKOckVQE+~wVTI{EFr&$&G>&p)yh?NPlMcq{mp#daOTn0d;Yg~wON2d^v8 znO)K`uaL`eY1I;qvL{9F&pi8aB{_9h^v11U&p(QsW;^ln!wNV1%Gi$6KlTO1ZrO2S ztz5s>tz%yeqt#a5a84DRxAAb$q%=3Cjrs3RJd=EvxqbKHEi>n)3GS{=>b4Mhm$LO- z*wO`+cTVIS z{rC0i+Y~PDSzh4=x;GZw(N?{ucGP2jWI(g`*028=#9gN?+F0tos_K$+R2i@9B_{K- zvbOgH+jmc2dvVS79T_AKka#&N`2?HUcPuc@S#b?rVAH6n%lkx zs`zd=nKLK)^i-|-pjN3!PmN2H8EcL&TfS^p_KoYy{k`K}aC_Y0?Yi@7@14!}<6?__ z{6$Z1`jt@D%Z;??m1Jc6wYQmc5XfPNJLInUw`)H z#Qo9X`=b}`ismx?N%`tL#)&R^HOyk{we^BZRpUk9wJ&p7W$zvW(B{_34Ky zf|ER09`3A`p0m0{aNlpGtt6W!W81rc0L`nUcHge(qJ@)->VXC?ESTbLJg$ zT{-1;_N0qiIaB-uEm|bkw{BU$^45Qg_|!Y+pGCj%_nx7sWmqInwKB>t<>c?W3}BpUB7tlr>Delr|$jsU{eTv2POEbSPJUw&m+`aeH?p}Gg{3}t$FGd*1uVm%Q|U-+a^y)z2vxM?;YJuy<4Yz z572*CaChP2U5)ky>Y+Q9Cmh+gdB;QFQcJ7Fre+uCb84K`{WwXiVMp)V+aAAnZ>ce2n^XWa8DbzZ!hb6e*+q;`b&52Uw=y9XwK5rtkDOwnY|;fs%D2uY<2G5oZ89qN2BH8t`_x`jw>}CS4>{P zVe>rkyV(5Fb>^q1=iHY%Vk~oNmu}jVhclms?2Zw(w6J02dzrP)>v>r0wrQ8Lf;>9z z_)CRNj_!=`vrcc#zhw0M^WHairL;x2di>>8yZ*K}X4TxiEuH>9UAk`{e;csc`}P-2 zO^sJqI_L7=o#k_Z>A|q5#(%DO);H%;7Nr*rfo=~0T~jn2GHGQ}VpR(|60d#gbzh-B zpTBd151NcDooq7A^3MbJ{|pDA{c0_tazwwn{BlwD-LmfA)%;&_llhafYqnsUtYqC# z?0)K*;hBG?{b9FKgg5+|&o|dBPj||}w%ICfc^3_XGow=@RvKK@6IpsN@rv&9S(Vdg zDyvF`ESV8G^XG=o%Erde_A4428ynk%{Q$2^PM?>Rmd5=2M`D`&z1<4`8Cvt}rzhBL zf3{_AqLQ*?zR^$BcXpjQ_K6Y4v`vMUm|Pc>pJhIzVMyXvyI7bOz*jGF|>^rJ5+M#eENpcj8@^4eaLuf9LdVUKrfHn~5YsgLzw+wAvo!V>xAxd^uKjcc z%Pb9~*+vVJs0p+Qf6V{R4gY3jw^7LyGJ#gPD;he1HYa-Fx=*$XyRv?4<6rhi?$Evq z^;f^|OE_*SqiXtQ9>39=u!`Pa^90k+9t9uhPC;Y-2g<20axCu!<3rze&B<2V+_LfP zbEbbC8qoCy0h4#{fUP%h{x^I6LwFW$%C6apEeq2kWWi>Vm;=_pazNfRNDk0T2lbTt zGm>WQ(`|mapMAsnE%IM$;hm-CGpj}CDc3D;0j&q9E?>;Kw-0)plt0NwrP!gIV#MBP zeI)#9b<%RFlWQL86jvg;N+Bxm5M8DJ49lK_`$~uZN=F=iFzdeVU|f~N4_lQa1X}o| z|9SiDrTbDrYxlcn9^EDNUip^9vi02wzw!^h0WV6be#TQAcqlmTRqG=AK?CAJvqo#8cv~A+On{Y8?VEyH+O*NoH zTGy;f?w;_7_!}_gLF>4un^1MxHjV|k$cw`FNp<^8Sh8crEGt=~3wr}^DP?`yrPj|> zIGt2c!Erk_#ja~LzoNtZ&7}%R~&F9nks}GZx&;QTx zqOJX7xBn08DV_Ga`%g#Ov+jQTaf|cIo%a8_x5VGRVZZ3LM1yej(*;Z)cOqT4$~Fkj zhf}O5KcMyRsQ)#AUeo>H#@v*dKgDK0a^J~4^XQ(Ce;bl^fvU2TZ??w0;6L)dI#c4= z@}6aTC#6kT^);F&25x0Ju!`Om=p1)A;~ain`yo&OA`%WmgL>)g@l6u!IQu;!e-JMz|92few@ zy3%mbT7#thO3L~tUaKy@v-aBM!z*WXJBV5HpQ}C1Gc)k+_)gFH32aW8PmZ5hrL~Et_Q~A~_pUqdSh91i_onQ% zS!*I(Rv16Dn|5MuziKzcyXh&v)0RvMirs9i zq#(vTv+{&x>fue%IVsPcOFD14bhlCKvBY>j(iC3x@KCBw7+lD^UE9HCYFMP(m-J38OU`}ST5-;2MvUwPjW2`^0fQ7b~) zX_1g_*~{{ydjA==Si6h&-jQQ@FA6DftBk)^M7((ZpW&C{!aqru|M5LlLRvy62x?;e z0yQ<_4C>F6M5_?E9Ra-Vu;$ zu_n5!CUCXw$;>rn+?Sqh>N<97&4#?4TedvritAC;{k`vC_6n|^_p|>q%$(vr?a|K5 z+k+%qO}`6%-1oZf)@?z#%47b~wmkE4+2);3-hA^7!{V6!hdWCDGic7aA9Mea#L};4 zb!}I@%+vdLDmyzWb#cz8pB}NUQ(H8Jv&A}n7G5$FYgQMST5(cYVfT6L$4}Wb?y5+g z_aZ*$iDjAA`NBCxa*_F*r?%f(oz+)AX-fEw9YN=8W@>-B_BCUYmwxHZ?`q7q&u-S@ z-E+i9=e1T{NKU@!+SsjEIs)!&n07|&PUg~eHeyqztL*Tuw0qLCTWa1e0ggS?t=~P~?2YGFFGDY3j?um}cEuyUm1^q$e%3N_*pehl*Nm^Iz@Ln)9S?T%lUQ?HsEQwb=0GU}#P=ISwbJej%AZD;R=q^UxAZ?DJm-j+PdrOqGuWJ2WM zP2R_rP82FtQnC$6nPjZ+wEbzx&3o#-&u+YWy3=v$FgW!6l~fcbjc zjE^2l$+Y$Oa;4`|N}8|)0|Qs?%y;L+8=lTCY)$Ep-delsx=_Z3FX5NHH#R-_G0(?u z>Y5u*a<6U5o_15HXUZZy)tSN>K^K?UkvUg8OC*EV6plsgi!6*+3%FF8SN?KQ`Xe?e$L7&yC-A zzxPl3BmTelKFL34_#|iF|Igq*gZ9VxT@OChf139^-iIx{(&wk{r@uFq|1&(ew0*&e z{|vvE=ihi!m7x7(e#6bbCw9DiQ~%v4g15>t@R@U#+4SjgDc|m!&!6aa>bu#tLwZU_ z!|XpUEooo!V5cg#Yii=hmiX>TWnno>&aW0xY7Re zRDx*w?D>=a{i?qsdH+u&3#;tPyKClWZaY2EIJYbH?Y2ju4|iA3^PSD-ylt!S+RP+v z*}37CJ9#(qE{_TBESQ^{vN_+$$oNWA#P{B}w0%H_8^zFhlR_V!(? znyB-~BjL-hPvvO~HhcDBvHL{PqhAG7jF#y4x2o**>Gx$Qyxa4+in}0l+w7zbtFEtE z7QA!9lj!X`O20kdE^)LdCP?|(LD%e**>`3o2_7r#ylnR4!aUZjtqLk@qRYOoXS?^t zJNakh`h$A@#V_-8x7{x^dnG&7#M4+KXzTeU`;Nbv@;u<-*e+pNku2-rnS|jWdALjRSV|} zpWW7W=4`fym+|)1GiCSR-P?OB_QG+qYsu0xr=4o}_Be6vts4Ic7dA_O`}LxvjBm5P z_^FrAghF0TzwSO!@`)y=va*3_SlGLiGsVTO8#7y-Dq5$Vi%!qKskJxjlwdCBNw+&@ zxmBN>OSxi7G;>PRk5tWDQpK=SW!frFdB>UJ>k@P~rb?3MwpS_Zl&|Y=jqym9Uo}~ApU8^I??jJGGPe*}AX=Pgeyr@d`MgKFn|n7myt{V( zmfq^3k28wG6T_b@Iekg-sm0^dK}+`fC(Bu#nH@B3$@=!zEawgbk#x4ZaXFSv3%1<( zJGFb$kFeXTKE0aEvGn|-n7EXmRV!3P%I|OA+O+LKa`&9AOEvvE)TXTW<$Nt7TA#mt zy~f!xZRhtMy66Qk`yz&#$H@TuFahSe+;GEnqpPnxE;l z)lPx!emCByzJ0Gw_@lsvdn)29_*4{tbok254%Qf||(nRgD=ozdE?8Wzqk*>`;U$@TSm=AM&I zDqWkn;u1T4fdv-8{uJ%j$@M>PP(r108T}6ezdE)jx+bF@emD9D(y<2VH*t;`k zx7(h6m6|8lPMlZ}zEXdcNUQc*mDy<-1z!{%N1vHiZ9Yl!&xv(%dXaasep~h&@y*%t z=ue>0e};|-b8WxE(feoXkS+Kpq;p%Q<(E8gx@lVQ8#z1H1CHBY+zCRf*S1O3#PCAW*kyF(mW z^X}cflallJ+mYQ-9hIUst>KZOrMzbe~45)S3eBj5xCHU zF=)H`%ro_(H|MaIY}gfPId|X3{jPyqW>ok6)al;S_NSvyb@!UWol^EW8f~~kLe%=g^c@lN?i|^*>U6=cm78v~{hjK%=Wvzk zugtp>Twc!9-6|p(d{}!zVEeGBx`_ALQl@!;Q$~AD0=GF7xzm#Ad8t7!xy5BXqLcenB zTYu@ly#v}3#K1Z#T1Tg9^2X~E~yR$HwP%tZnSytNn z?71hOlHJZ7{LH_3r^pM5mfLKF*}qP%TsJ2)IMvep#6qvRQm$gbZbfmWFN$W=ZdKgQ zyZMoq#{}WD`sYeJ?q+$%Zhv|?t=Rpu&AEMPree1)UdvmnHDgy|>8B-E0+KhTEPUxbaXRwf=d z;X`L43LY!&_?Wz9z9@%RQ0%%Bd>Z(qFdYgx9`oaM=uE#G*ixJ`aDfm1(Y(Shee=Vz=vw<-5%^3Jv^ zkN)gQJU!{stSXz$#}+=hIdw@=*ph>*%_kk|^?Wl?ee=2&Chw=)H8(`` z=d5_M%rSE2ltl%d*2}fN)v?BXoYXPlP20+Bsq$_=rJ&H;woIGz*nDT^%{SRpnU!5) zWV`sF;oWWPfun$0)a^v>$p{;HLsSAVh`n^z=ST9V0ib;r_cnmSf%MHYW&bl)VS z&wu+}S!K-8jdu^7`8<1>x9050ht7U}8TqtNZ)fObu7z#al{dPq4wEjt>aHvHoKe?P z>2koT+l6Lw^5>@;TKx0)ExIjweN)0sHHJ6Oqx)vR5am6l`L%T2o+XMuc{JO5W;xEf zvSPK8vXO#}<&>Sv%V*_zZCsYCU_asNbMtT4rmXSIe9d+0wZs~?^;45&w`vwlw0zMw z*|WISTkT3pl-L5L9Q%(7N9v!>SN_jnX~X(S`MCd8^+OIi>C^b9#M|8Of;3HhS}Q(%g$nrY~DMkzwJV2`N*4 z`s+$($NN3j+^QnaMWM;W*)0|p!yCUyt(uAASCj}5N{| zQ_s0$&&~y}7hbrMbmgr%R}81wq+sC_laIaL_fpHNG*BRL&$>;A(q{{2s&n|PTgFMBZYddks_2^5T)gpJP}Tf|9yU)So6kHmH<$mObkE!49B=xz zZ{H>ssplju+Aw3&F_lF+al6-EK7GpjW&e|-tB?F=cw1xRx`3xBP;mOJsykEMCTmHb z^*HUU{IBrzhSZmm3@3W|zX*o@=yiYcGC?OiqyEFLllJ1(Q-8R9;8(BFNQ2!*)p+WyRJ%UYMr+@q@QH?FYe|GA@?UohP` z`MLg#*|Iyg9>2G3@`ST@qDmicGQ3$Z?aBF`r~gc^On$H|og%r`=#%HQ zQoEH^%i|94rbYib`()1a>a*xXw#^3Tbwggi?C!d7&p-3f z>eOvB1LsekxM!=$%NI+9JeoS*rLni=?l+mU_;JYW$@8A=G@kipxAiNZ_XSU%8ymj* zu3RcQS-M+MWtQk|yLOLDHQF_^lpj9yl;Bx3-}C$VL*OmRkP?~*lDK&mL&XIAxlkMHE3adc0}zs-jXW8=jRmfXLw`Y!v0^1WMn%7c%Z=Imn) zTm3Qco_Xr{ph{_Enjl?v3Hzx zA76jY11?7HgfxGoH z{M~c+>1u~QG4n4xE-cEkbgFzpO|l&2hHtLf@4hfr6S`CM!Bloaj|w z_#*X&(Un~u>;fP!GcYiS{4O$Eo@d_FyQaA4qt=~u>x@rNjVU_&<66jP8Ar37Q?`AW z+n*e+nxUjBohKCL65|=xx*(WGdP-gVw(pAV(}Erbz1`%sUErA?EpHM0d5xZ2)(8f!k`*=9k#kd|AwO`oc@&*)dYx-n8_ zy5ZH?IzrOsVp&F4Sk~|Qv+u3kw^hsh9z8m}aoa+#*-KBn(#U(bgo*5}-TPyYL#k(bOe$Kh4 zHlAEFciNMlrN^Z*CV0%q&fFq3Y05;+s8+paeb*C~K8ZMHc&6-D8hhtfzuh&_H5vttnRqTkFpcVD5%(rAj&T!G6OrP*FWO{Oc1OrG6*sP`_$ z_F>T~r|m*)hRQshWnsmqv@7mxE_vc;l~n!cxNPK}^|yQXZQ1%pKB2)srAkt=Wa6v1 z1)Th%w{_GxPa2=uFS%+Wv*MlG5!);GT+dZMmv!r$P>P!I$A_mXPh8D#O5M3i!b@na zchDOF&M!SDK-<)MdU`;Nugc1LCnY7g^Um#bzrlOtq>j<+H)geE&LwGU+REgo#65ib zq&sltj<0XDB7L0Zs^0bQJ;$=PYUYZwZfS{88`kIx-L5IyE_9&q)g6E76~TQDt5#(C zn%rrh=I1f%_c_gz#yYB2lY-ap*}7}9(v>etN?g2CK4qR>7F(M+$@kEjmpS=yMZUi! z%3>!x3i)0X7jFhUmAi0LKE=C5rzw0hm*-BPzBJqm-v?GA3gmUk++Yr@j`;$lmp*!`@xRj6ri-)OdIxm@47 zyN8$0?%&=MYxDO>q{ud-RPWjG317SJO}1VB#J4bN$Ks$;Jz+hO7h>{f`1NN?o<4Wu z_B%PwZAaA}-rm&{C-P_4dF68jXV)}NKT*eeuI8AmQPzW%XQ~9(pPce2Ms11Jtz8~l zxu@S=^7b6#X=R-^TcrPfyS=Aac3-!D)Ra}e+ny{~Bi}v6~nO?CboucdkqPrE8toX`8CKyG6D&DlHt zhy+ERQWyHT&dXxf-<4{Mb(y|xi%xj#@YG-6#@xH>imG%p;>sv3mB- z^66)e_^O=PFlRnrQ&W4#wJ&97r>yjyx$9AMAj2u!Yl_`*$-xEDce46U^G#8YydQaeF}TlmT2=|08^Yfffu$h>B}Vu@0m zHMiEOPdv+-<)&S_^rX^M#O$;Dy3`k4PQH_)WYl(eJ6-8G5GJ!aw_wk0jRT*3X07vW z^WGNrNq@u4x3~P;?uKqz+*hRP*)I9)an#Z}ul_o?AIop@RJwYq!~>(%5nr(DeMdg|t^@7-tgNJ%v-O{i5}vu5Ap`BnWv z5Bd&nIc$`YW^z-=Nc-xOPeyK+E=kX=t$A|PZ(rZ(oJoPAUu9BMt}e2@w3WNZ*i>@G zmn&z^e9`3&w)J=V(!oyBY$tI`AlF#`oge;9t8PO}_S)Y||CN3EviwZRe+JOzV8iZ; zm4DM)Knok1Uhdx*zKeeWXkEj*VTr%QElje>Yu!=W_WQ--#1{1H>89(r+4H`7L)a zBklly1GMsnQkFtjJPP+6npM%MZ?t9Uu{h5X)n{Q|nOCM~x}-23U7V51>Fi^=KIE|O zw!^%IWuaFME(Kh!algD!Y=H&bBuQ1zD6zJ?xkog&M^$dSm-_7bjc9+PS7DdWuDV zPOF+`8eO=wv!!XumYH&GZku%(z^4hnbw0Oko`}U3^-zsYwbVt^=CQ7{Um0}qhOsWs z=?%3FvP3R>fO;HEnVLQ`f6BdIzAyK}AM-to9#}6}RE#M94Z2|QZz9L_XwbH~r=aT< z|ADs6C5wFw{&k+?XlYF}>*e~S^(FF-pc(VK{vua5{Sb{>f7HEV@5b~qleWEg6RxRi z`ZeiWEAO31J9$?LE6`H8SJ-x;*U0Qx!w|-x%^=#qMey3uUyMi21YUqF;V71g3-<|p z;P)~7zNp1D-;_U+;FjlaaLZE@+VU(WvE>O4CK?cUoA%W&>x%myAK!HXvuVGJn5O+^ z*)BvTx32jk;rkJJwL-*;Rh?Zs`D9-c6~tTzSQC#Fp5<#Oc3?MQAfEV9%RDcm&_-78 z$I|=X+6_xWpO&*X+8>Rt2}#~17Ms495uK$+({F^&--L9I6I@+9fKY3soNu)tULXE^Iv;T?9-=F>Kk!=1K^)ufu*E~Ak zFZWu}q8_vq%^kiJEe?88p3^hKd{NskJmKNCYa3sl-}rg;RrU+z-G?Ujy-MF|^5!0E z*cwPzZF4NAw&Nk;ntJb7uAdDsId~v@0z9o`dO=P;d?lqm=w`-t1aCyTXXqg=cgmrs4;L&%23+t1hL@ zu3YJHGF_%p_phI~+U>_jg+1SPdL?b`8PKzU+8tyh~}jl#;(}58m|RyZUjFkIp`J z6X)J~yEpRk%&OVEhNXPByI!x|H+N>C>qYa#lMmmlx!d=C31`Zdd!G73m?cc zP5B=d{{6Xso#M6s3{ExYYt7H;{P_58lVJOQ2JlU`*Cv3Mv_3YU4m~$^!p@$U)2+6X zeld2wmS(;@NB8sUvz*g+yqWHvziVROtE6DRvkyY64(o}Oc`w*&_hWNfr)LzO!0g2{ z%dAx&eLE_8QD-qfOB^UklrCAN+&vA#+C7WTNd=l5Ut-(JzyR5F10HF*c=T~Odo!d? zi7cJh^Yialvt9og)bw`M>9Ci5QO(_b@UPsn`a(6(RRJe|`m^6xTz~iFzvR6C42@5| z&j^OxBt9=*IUVZ-TF6<4x@@%CKX8$;=S1+;6OwXmZn11`v6GD04UL5(-b_9H=HH7o z&kr0kQWr}3G+AoZ*(lZ6qA%VC%jPF)n};rnEDQ#I=Kk%(pAx45s~9lo?rc6;=b z4`(X(7``>*-*xWe`nh>>bMLR~inp0j?4R=4KXu2aik~~8%jL3MudYp2+_Amu{_7eR zW!vN`tMZm=uFuY2?3TB**{<-l*1z#{YS{LLc6~QCr+P-$bNF8TtG`kt+^EM!FnQG? zi=9|^nqUhj=y8Ea%N=?CGl`k*{gnU%vcj@9ux>lkX+^Lhd53tm&OMuy>KWIn;VhX;sY#T$*VV6f)Ul zrIzQbsj99ECr+H6a41Pl(?;fY>9xD!(Z=E~*VHVIY~S*u`12c+HnDTLrfLUEZs$=hal|%-pQ<+x&LPPw`+#OewC&nRoh|U25ps7ygU4>D&woyMIWy1l&G2vzVVH z;?)Y$?=c@H5Y08Qk}OxS#W%q5rS8 z)t41@?N>fbIB3ed?PlHaGpn}l<@{21bheh)?H`cpbrDkaimm5@E$yQ=r}EI6Q_HT$ zKRJ5c|7gRzdo63XSJ*GUbN-#meePth$#eF|fDhVcy!QL!BloFh(QRie1fJgTtC@T($8mkno0ID& zac|n3rp+DBS?2G{khsa+-sZ~FoV4A0xBj+t)}MZc>z8fm&2x*(ZslnBuhet5X;2_(vFqPhdbiZ~@U+q*J%QVk zml#T}DE`cPX7$FplJ+HLQ+LKoZd1~IcIi>=rHaEk(a}3Xtv7G`;rA@iZ6e!xvxP}7 zyMAVSZ_19>6iSE;v-u>{;t^WAM*OC_r>1&PQ(Wu126d7~Ot6JKHZinT`eFqJqnW4G zzl3-GXL#FxNIFrlH2rDM{k6Zn6FU~XsV?~7_Y>LQtLkUm-v6M|_L&Ie#vAqN zCvHBrD}98#4a)*_)dln6Q$|@f+L9+W>Mo?Nk1x6QHIl4q6k#MRmoA)Q=lRy@;{ zf|pFnop$2HozhItG9NZwg`bxqicX5n)YmuvSeAC}TrRU^NOonB?$RweD}@#JtPGvF z(OdI5>rv?sGbUWRaBGXY|1pDwJHo2ItL(h_G@|?Y?mbhA89qN{I%XUf;LfSL=g2K> ziOrLitt@wDZ%*2=&9s=4b8}nj(RVUVH~FK>$^&+;of~-Sz4q0uyK7H}ah*)LxhylC zwPKrbymQE_H#whq)+|{uwLfvk=TEVfGv4ng)>*z%D_rK0Z{|2e`Uw_eSS4*eh0!g1OTc=&_ z2xnX3vV68vz*ebVM%BCd=?1r1?WMOq^Xtzk@?CK<|3R|wcJZuzW@~3QMctfrna$79 zHUCi1D%l{PD_fSbW#rayKlW5itmQ~N?s4U$@Y~;$z1Pf-xOHjEq}$QidWU8gvUz!a zk@D$bzuc>+X{tGOQc%>2Gh3AOZZ^Dj&W_Z%G}&a^Jay3vZI{>0@zeR@oq7GTu@XaY zwpYMr-ROdz+l6Z0nTM1woZT*v<@CjFF3%Un8-Xd3f|Iq4jFgp?uJrV5RaSmCfsfDR zbyR6bkj2)^9b2yZ&9$y#_~o;sHawx@{`D1JQ>N(t<#&E1uvO^3k=^kf%5NH82l=XH z21Ph(woaZQrhX@kjCALY8dn&y38xFd4j)lYv*XXHL}ww5}%Fy%*RO7yls zwwx;mH*F5_e7pN&i>0AlQ8MfAq_c~R!&7#YUSN&BV{Se(RKj?-IXm~pO;zt@>TQ01 zt$Ze#&t1n-zAp9hSMKbtoBq1)H?C$XE9Y|Ada#B>r@p(BF|F{|Vdw0?vXbi|LSJ44 zE@2nSO>4FAG?W+_C~+OwyZd{H254Zs{eJ zS(6WV7u?EU6BPYA*7L=(S&vP=t`nT!HP?q-j&;(n%}$-?^q3tdPU?($c_`EFq(=WG z#-pAlnx26LE7ejK*-bKfsmyrhX34Z^XSr0@`-%L@di3J*_7(hlotGZ)^5@*KId@Ui zq~^*a^SYc>Hhb>bWOr~=znT+$%3H&E@BCZWw)=8;w=eHXU%}t) zbUU28Ge~q%=%S7jXSH;L7F}PerF^A-!3pNo@myjx8qVFXZbx@JdlnvgnY+|t$>ct< zeOjdktY(j5%%-(2JQS#MJIGgCRo=;0OUcOY1pn&H-2V(yl=6dvg8Vc!OjpWTMXO3m zFYB$gv3mKk;fL?)hP$=`7d0m2?bu>+QRlZx-`1n5GHJ1_>y|O`UAf;LUGP%q#$>T+ z_oBH>UTmA+AFkz-e#uK&`9bNHwN?|CeED*Mb<3yh`DxMfPhZoV`TY8&O*N~IeK%+~ zdzLJ)_{3znZ69w;eY0}biw%zi-TEduRYWTry)-rucX^zh8N;V?VK2v7tv4DSUoV`s zRb4l41|Kw^6GfqoqPjUSq#952f3aTpKf`VL7PCW2ug;&A+#mgI+P?n3a{n0)*KYo2 z|7FeVOACL=2On}~xng!Z^|!pys%u}=FWwf*S*e}>kaL&)(yvNg&jQ<FC87k*#V;$iBw z*bnLF->=+y@!vJQT@`N=the503cI_9{XfIOcj@1S@>@4fd9#1YhuTk4{~7L0`Oomq z?EMcp|H@X^ic`N9f9QPp$qM^5Y|EtYMt8;J?0a)Hy=;@lhMl)-Cn>A#?l?Zxd&Sx$ zp{0vXsl*+h=G|#!tex8HeM(kk>&n7cjy?6}A$wjIl&vo)YcDFe)w6o4L~s1*-;Ym= z-Bro*?qr+!tzcD(uIp3X6&=g%Rryp;xlg`6rRC#SKUU7Cr&LVeAA6S*cUyJs^QUY- ze@jMB_*eBXdB;;dLAP7ehIKT z(#hLyOZmD#RkoRR^y*mz7VoZH8?)3r<6ONiZ`e-0)2u01Kh`q0ica?b<*0Bi zEvNO;`^7@v>?d`ddgrH^kP>Y>H|SJ$$@U_l+Z#?VzZ_+Bw{+^%vzZ3dql#W0mua=V zy5zD$i-?KIdHEQo2Q~LiD_YaFW+;8+4qtoj+GXW!r{yNfpSagNYrm3CbXC6EYuQV- zF%kh6PVb3-sVfzC(WZuz`ywQfFs56t-CVubaSz{T>C;>185`?uIkxc8?bdCPE9XS{ zJX^M5wu`0dw3oq|jah9G89QPMo4tFM=I*>1B_bD_ZW3|#>QlcA5A*EBiBBCdFT{J&yRp8*1n>Tn|G8we*fm~ zwOh|Ocjd)@Yr67kW99eAWxh54-ska_OL}hU|9E8SA~V&Hl`>w=nHQg^F3~ufx5I;L zbG6^TjLNxp)^0wNw@IT~|MXW~VPS(iMeovVB9B#1+_++>Io*!3_or*l?b}S`y^P{|J_fji!Znqh}?l`hs!zf2_cE8T7 zFU_?s{zm>Poh(b_g+wMfc-(%xVa~eTI`x_F#U7{^TTStvnY8NF+gqm}?49&9-2cQ> zZka`GSFRYH{x&&ekyk*B;Nqp;_C>u66?=9kgwNTS!}cnFUD@5;J6r$h>ziihzj?QI zZQ{clUyI}>wmsSuw{4BN?x~~F}=bL=a2RGO!=`Bc%{lczL3cSujTsCe^iO!Bm%nY~7B1}(>zsX3h;Z+(+ql)cxTHhm7N7wzWsVTnO{p~`J>rqESb2%4nI5G zJNwLv{v%;4uWw$qK<(_Kn6-PKdnaywHh;=J>)oa|(@v$V(TaW=)_u&k_+zG4OZF$T zC;F$Ponloc{b$Iso21O>uzhwx(T$i(iz`+yJLz`y)9qQgeW#yIl&-zvJXgK=@$J=m zleS&h)b}a#Nu*JG$d*}?wrueC(G3v)3#;q4e(FJ#>R~IPcbde6LZ{u=jhG-x-V|e+;RD1 zkKpvweQz`>>_om#TzbM#JIE4%ge z*xkNYH)^-42KIMOzZE2tdDco~va*8M$*p&mCEQ-S(LyYAS7g}Z)SKrVw~J0*X(W<1 zJ>MJ+Siilr~+Oef~%gtSHme~Bc?t9c?k!cq5>h$6{%S}I5=b6q6EKkg@ z?@fx{*={<)bJF)?mtJpNX0@tPC|!77$j*<8PN?mA9JwnqS1rp}*CAG3vv0TZ^xEbs z=XED*-*9#2+bbU3_xW_l%oy*=>r=MN27bGeR>iQZ%@gz8IaBSy6Y0$G z%=qc6ZT2?J@i;fTuWz%=f^J1qo~uD7r!!1;-R}1?3c3?7wN+vA&$wF>Hs^Bw=4GC7 zi=O+=YGrP2*>~P0*?K#Utv0-sz%htt!J%Wx8sDq(Hi~ff408-G5P!FaH~ghCQogr?pY7rgT;rtKZY^m};s_ z3S7dvJ$Ie&X}<55{qEZ3nIBWW-8n5fYG?5Fm*huooGFZ7=b7y+-W}7FuzI6|G?vi+RJ|N}jw%J|5PdqnmI-tKIcWSWg zYxSU`&F6zpwjR3N?In|QZOd|(r7DgVpDIuPv(9YHsr&uxXI<&E^uWR&-+tUYd*YdC zZ{igm(Wx~)b)rlhw>D*VusrU!R?Lb%za#67px8pEkG=<Ied5wYC z=hN?gJW<~`+xyhBlTl#~_ud}ccRo0KYSg|fRd?4PO}le?(%ac8uR6;tYkQ;pExD{! zwo5w-O>+BmTZw0RuG!V(X!F+a#E8q^$~^kg^sTVxIwq=cIvE8Kc|Lm`3)LDny;fWci+1cz8B9ge&s59 z;grGM8{Jn*7cJ6zTXdz+eYxR^fM=#$GGt$dH1h+tnSYEGnfy%kUHg8lIJW7vt>ow5 zuX0QO`NVGd6T$cPh1c!v&A)8V{Cnj4VVhC!^iT8n_c<}V_x>zj{)b=vw~p3o$erE% z6F(oTd41#w`_tkraert1^DFvLaB~F%1Ix^v61HW}-aaebE_Ufj__gO2XZtMm4k>4r z`PNTUE)sRuQ?Ej_w|$Ky&-{CVpcn`3s^?vhx`cVK&^RrKV< zl+feRW~y_(Jv$Y>wIFfhtn+2;fgtOfd+&zD0>?nKpXwAnHtLGg$XY)<^fvLsy zsN0J6u1}3;%~6)xv-oLn#j4`GxbjUcOHIPcORnVa?nyPM+G?BYJK=athS<4a`zM#4 zUeR7(Y2#s{aLIRxk^QNE$CRh%&RKN3JU4RBF5li|o|A7KabA1f<3!#m<)Y-PieDCf zUbn6}Ud~D;Dq#7QTXRhoO!HLO0oudOz`!7uJR{HU%^ST>X_j)8q4VD5>qQ=k`u@@L zMrm;+%i5W{63##7T6sk<;O?ZCOIKWRdAQPLS?^Xww=FxGxy;YVy>NT>n{WAzy?qBZ z|LHq*-RRi+wZ?l^^KU#-7`uDz(kV;NZY(9ea|&AmJK>@h>_HPdQhxQwobE46i*rj!ePz2~;-yUa8{T^U~K zjPRX>Rjtmq=cSwRO%oH|x$pch?c6v0{_N`(ep5}>S6O9t!}A@FcqeODWqnzf z^y;m^tzLfhprCj?*^pb4n3g<eDX8blgoqAl#f47-umfs%r1<`G{-Y>hAQ+Dt2 z+vUc$ofF&MiQRR{7cF}_cX{iyz~>hgS6+LWuT_*Wflp^;Sz)K{%w5m=byXIHtuk4n z=f@VgJ6xK7((~EQo3`AJ-m%`d>M`2^qgB7IJxTp>MLeoV<#$(A^P(TK)%Pq9`ZLX> z-P3nZ%S4R}k9=6y=d*n-`n`8|eyRI}H*60g^UrRxdmEc({^$Hn$I~y(SzkProEf+| zW1^H&E7zT0kE8o^?)1J3>r*yX`1Z5^$akUDXTNqPNzM-2$@ch)e)gj$y{+oUf_GrqQT&AMuG_`Tqo-dxE-?G0(d@2#(1Gqb4I?Y$lzabu@=&9`eI+g?BL zp0i`(;sY(qpPcpyi?!Hz>w!_worj*<8`te^5cQrL6L((W=IKA}G9AU6&aOQ3@$Idn zvlH7@PgbR=mQ7bX)^(;%{k~=CCh;R}e=nVs?K{9#y4Bj$-s&l{@$pSBj*FW;)6=Wm zxl@0t!DFMur#pL|ul*Qeb7qtG8T*jX3!a(cfpsZ1-pyYA@gERmEW*KXJ9p4%3+X5icBRx`R=gLGm$Ejiu6J*p4mHPpOB|!{+&~`ZdGO84nqCL6PKKMdc0pT{c>X&S>`2245C9k0L1sw059I z+o#Tm9sRU_XQQ2WXrJqe>jwjwwpH%Ax##yO6@#Xz6W97gC4y_`FF$en3G>WXuWici zZCBWEqCD`@!m?fE)8};VuX-mfuy~zSN`y(fuZMT9s%Jdo%o4fA`q^x!-xU4bBKX8m z$z)pDZ28O=n`Ts*ER*vUnzT&CwU+lp;uq}=8Bsx-><&&_ppifO8*6L2?uSJ;ub*Et z{m+wk($9s?iLCmWa;94&&*;^nGnws|Zm+N}N}J2?tT)M)`P_}3%-go_pC4NFig$`s z&3?_*tFo#uq#B&rAvR^&*P_&G`+oawObG0J9M-$i^@eVVs^E;E-Z^JC`bBN~7i_x}|2J9+NbF3THXiLotnZe^XSSzYkr_VJ~q<;8|x9lDXBOP;Uv=sJAt(>$k> zzTZ5fTHc>>Nq_w_^Tvy?f~T%^cI-kXKZI_SschRiH>LeXW&4HOXDpUYsVY?2&E|d~ zh3VqAYsclDsvS4K)%)W%=XHsiIfvfs-r9R->Fu!1w_eYw`})M@nSI`lg0ve4HmxsI zNxAjKZ2Gk&7d#$BHN7&MZ@uPD$L#*ft~XQ8?m3v0JWcdRUukh)=p*yp&5E~X3vW-- z(>lWO-B5Gkj%ia4zti>IxA@`1*W50xb94B0M6KtZJgSseeOqM}3vJT-JX&b?4duuV%>|cVskk=LY@q?$k16eN*&$_x0Hu+dQ(Zj^`BWUOV`# z_Dx&9qM$HOp+D}v?4XOz3f@Dbs z#wq(E?H8R1{?Cw8CvdByd$qmxv%mSbqJCL_ss7KvXLkMvxTV(oqWa!V9`T^tv7qa6 zptIahJ+13eX1N!UGRqCUf>aN(+zqrcp%Kf*+3AYg|6WmUNS0*r&Fa6mMn&tjG zO*Hhe_N)Fw>g^|fVx7`qU|tjx;@_Mc^ZJ}y*11imR^HSRTYog~98U+ISHf1^_?}L- zN8CZ*JryMMj(l4`UoJj#yYck7>u(3mj@((EBfWcf-?fi>-g*~236b;lJV z!uBkRN?R)Qu(ZE4?Q)+~LupKIxxI;Wc=pLRZ`ZrkH{Oc9a%#aDW%nQdwl(Q!i@iPB zQ*0LVqBP`7-wnaFt_hdqdc13Szh;(t8l3SvmiuJylAC+C-u9Lj%U$!~PHfj{Z;n&Z z6XiBfG|S!ETo6;JQF!Y|(3`L$rL%&vQVr__f@{o9uY<~ zrAuaQx!iH7Ri!sd+=K6EWQ4Ak)AO@IVw1ftt@K~1<<;%%H7VOD$Y+JWtXUJ} zGHJssPfwvBSItjKUfxbhO2tk}N*5YRZS`WNEHzT~sMWMnS^9iVsb=7`wk4CUEK)Xl zlf`t?vi)}MxpQyJk~MFae>h!P?Kv|t)$f7zM73jPl9PO9$8>~ln>454%;ZmhDxa*p z7PLfgQqPoIoh~U0c2qr$TDNOw`KgxGR}Zx9KD;)h_1fG+i?@~4i|y3^t9$A{gO2G} zt@3Y|^PR(YU148UtU6OtX8QS%(zM#FuV!B^uQts-lKb+D)eGje)93YVDs7KVJ*2Eu zI9=q{i78PUof#%8I!-TPTz)U*TF#!=ZjVITd6$dbT+8)w!e-CuLZUAxe&bmBtOr{U@8pMkAbH5)iFE8fXc`xdWw9qZy`KOmZ zlPELnzO!0k#~qtVM)!KVV^g}K`^_VTwrQFw`e@8H*^%uOkhVF<>4V5pO}C|zE4_?^ zrlhZ2=~gv!=KPd1XV|ak=IZj9Z8dwGrK)&D~i#$y}?s~ZEqH-Kl?%{AL zPOEvdBr}*-W(Ri%cLz<|y5ic_HD|qpdcK-!x}{|W&RbG3|B1iy7V$V^oHHu=Eq zbBZ!CH7uJSJpLQ09w!uDzJy)4^m6e!a~bm;owb>3-JVO9dDc{YEEN1z^@{m%pT(;y zk5@HL`XxXW~H)>}}>_3vYzoWJK%$h5mrLVI~Lym}@q)@u&336-phn!w*(dOZA^ z#iKjL8{b`9s#*8^=y$iYy61k!GZ?SWtxbFUZpY^?B~^=8S00_|*rH^*=B%4bEQ8&S z-|tnoSbbi%aLR{G?J`l9F8Mn>1i4$?>4h#sDYVQciW;DToqtwe#%nUJB1WB7sWE=T zD&u>%Z@T}T>Gii{7g@)d$KLp$K7S`@@pJ3!$nt~p?e{Ia?*7g;u=MirY{t9meh6** z`@sGmf3f|J$u+t?%Txa>Z+<_a!TQqtzsK+XXJ9`0?=;sc$O@3%Pg=0A03j+|$x(!U zK7|njvu4ev{|v4(mjAo)M{%p5d{|xh*)>mH@0M2{P5!AsCA!ACtx z-qZU1@4|{>o3kyvX2({{Tfa>YR5zD?NzMHYs+;2r)qX@t!s_Plpt`w^ee&OFqEjJt zbNNY0>~%9aAxxAW=HR&Gx`5pue>}U(f4KU9ND2d6(9YC<-G=^uH~w(WQLDl1e(EX3?{?+3{H0$L zU5nL0tH^P#U3q=wcbc{JC0_q+2|=_Yn2j$lIe6qq;Dwj-Im`T)-;!P2ee6Y-jpVT! z?KkuNw`duzxpkt;YfjAko%Z2}^k!IW;Jtm}TiD&*$Nw`N{FeS*sJwOIl$`sZiAVu{ z(9)Rg4=U|%CZL+AYxE4MuJm>WJg~s1) z=X*Z`HBNn}A6PYYS(WmpTDhCuZXuHwbUfW^cHH<)ng3CdaHASS5!Y9>n`J`<1;cgy zwg6MSk@v6r&W>(xk_~6{f@cZ9d-7F)w&QX8$ zVddWQU3KeQVhwz*%D=nUzG>UvyZ`z(+wYjXN0(=L>ij?F+3zbdd9Gdm^{E}bzzUE-lE4Ap%O+Q5a zwl9=@|L0-)X`@Lca=j}-Q~dS@fp?8ge)!*Jxrhg#^zn^fB zefcjr?|$Qx{|u?EQ!7rrpWosS8u$(GKEZ$LdB)z~rhn!e}~yX5(CuyX^FXP^)__<@-OkF4pqA zP-V94#lPuS{v3oBby~QV={=_IRWB3HZxAUo_m$vlafH`u*?1 z;6CfH*wo9OpMSq9EUJ4Lx4xzIJi8e4uJZ@JMeKgIyDHYQ*lf4tB#+EZUPV9OtmyUI zu{rnI3yDJYcLFzsLN!irS}JLh<}y8KW%=T5(v`Y*zZQO2{;tsOy3K!v&A;_Uj-T^i za=v<|dg$!kee+KGgni526n!i$vm|rvd=~eVXEWZ;oN+Xw<7DnNDHXSA`qC5Rr=Gi5 z{Vn^a<>>>UMT1m{N34cm%S$^m?Ei7YGLzlvKWibG>HWobnRkzY*I@dkKEE)(`<{MA z!mPGiIh$>}mPggLeBZlStY@Wq{>-QSM!9{p^1+{3MK7HEaM#53l~rJ%xNpo>nZWzA ze4W}&X0`HVnsUip%A)8NpC6V5SiA&Y$2lFej?>NB`Pe^xrt+?R{~5Mu8GZzna_8T# zko)lTY(j-t=yWTOpp{yw9$mNRKe@lL$5Usl*)C?$aXiPx#l1;+ zlj2A9$kkU~f2}ONb^6`OHD@QinSQ@K=Wgw1^VpK}eXp0L)of~$z4H1P@??*+DYEB( zq`6*7u$XoFl5TB-jMe>>U;kCGN8j~de3jvK^~x_*3uN<4?fOHQ*S=eR@l`|V-YdUs z1NgS@n(w}f@!I#`7hfH$?!Bs&TQRDI4k5ViK2b*EEvPEvgf!TXA5FVf zFyDUPhP=u(v8|gkdT#Y<>^S{Wd%lvfp4qIVQ#U51zMN?kT7AT8^BYG8>!HLs3yUjv{J0vHy?xKR z{AuZJ_uW73l36sFc~h+E6+Kh4nOlp}WK4aV9$l!7e&M<0rMQsDk{1bT{b%&&{bzWW zd&c|^%YTMnH~8nz2)F&uaOeJv`X8L{zb=rkH`rJGpJC^AgZm$Z|1-Q!ke?9`lD|D8 z{|D!PhOZm=(F|aJCVsyDyV*18e@yj%bC^GKKi~g*b}{dN21fgT+Zcbge!l|`#QhJ{|1(@WU_Wa4Xt0kaI2>6G zmRE1jDEiOvg!6q~1p6~laORWw&+wC}`qnfirrVR`$~Cfe^xo}sdd9bF-ZGhPX>WG3 zPp7;C5}Y&rPfvSo5U!VWtM8D=*3#UyE|ZKeu&&?qOV%r_RcO*8RaH;BgA>2m+MSf! zH}RXtZ#E`FEoHs;E$l|ddi~Lt7;jA#{Qld)5>c|FkDf7#Gx6-U+^D@^(@J5r6Imu{ zfsZXdpH@+{U8L*3DgB1hoB0VPCnue;cz1eIX6nYs`6^mlqICTpuQ|Hl;!X2cpX0?M za|&m#o8?m1^P%JIykoIu$0n}HmtDLl(`C!m>qk1a3q=W^-*&Uo`AL-6+?wW~{|qsT zxwiwY*80V|{GEH*E@OR4wcw3kopu zEPMIpwB7CUZ|i>US#+yYVoS&Ok8_JQ?PJy1v0d$&r<`f0T28n6EM+A#|C4`D?bvZr zF^-{hZQR7F{RZqoQx7>Dm~j)dt4MWZ_z1&Js#`zMn=%?%+LP}&i@&lvvzNIk;`}d)%RYP zW4X6g_f8Lf@Mv4|Hl5D5&t|;Y^>fMP2S;3d?_A&5Q=NH)+Aiw*Dr{z*WBYpE{XuM1Lk*3itD=KIhu6THF0@DV@ z2!=I;4_mS5i-iXUf*}vy+vp8CDq^wh!pHUO&DKZb>u-r#{8)4AobdDSH@-Z-{!4Aq zpTy8Q{-;VvSxEd>R(+e5{@XjC8zwzC7k*~Il7rB0G2zO7_Hw%JI)AgP+m?Fdvexf7 z=8^kcpy|5)ob*LOiSwE#i_A}$mA*!L zqTa4uF()Ha(o;Mvax{J&_LTa;>*l(yLCfyi=gPB_@0`g!cchqq`;2)S?@Dr1Uw9r* zy_^#8dd-5H9xHZrYMOt`S=+C=h7pE;yZ15nl%-yc)l7N2)wfOkB?w?UVUMU z-u+F?=S}}JEWQ4#{@1nTasL^P6*AP#xoF2N{idw`>=G6-&h$Y<5Ca1P|GECTrvDj! zyezJ~^DMg3`>M{Z>$e#5-mdmLC|`Y>QOtd1_UrEl$`!uqTE{WSzObA0)u9Y-09q}g z)c#?`zhC{}(+J#Z&e!UnEBsUOJ(A%_9b@D-!`eiS+tJ^n|Ga(hGJnR)f8XUEJ=xgT zQhxa@PjvX9;O~9~{WjI7-aCJ>4~n~Ryp(f(+HcX|wJ-duZyRQunq>B$!OiC6Hv6St z?F|C&fCt37Ivzc-AmJb?i+OxVop3g2C%h2a3E%kg{Q57xu0IZ~`XhhJW$NAYPv^{U zj{WxImj0J3{~35n;&1P$Uz{y5LD=~j1C}m;?&sO@ldc=scW3@*c%M}uviQ1QsWoq^}O;aLY!M!{j-8*v>jIFc|7S7k}1oc6+t=xp*y& zkCrp$J$`E&vU+y5#*SpIbGS>t zY3IDywq5+lws)8Mno{rF*u4JrCrPpOmenb5mn=C^#^xR`>bvFlv1vadJtvu5IrCdV zYx$3L@3;SFkcf8weR*2F_JR0tl|8r8?_Aiwd+X0-wjDvsd5$RF2(5j2ct_utlj2@m z*H^CW+`MDk>wqbn=B=5nqTL%Mw`(H9k#@Z~kMrDhL@d*E+aFt`?x|VyY1gB(kty8U zpBrYW`aHnfLtK<~uUmX0;xeaHU=$W`U-xrIpX$_@CkA-gWzKaMz~B&9A<#%=p5rO1|3p0!wDe z^qK}2^(DI>Si?7+XJwzsKP6sgFLQh0kNgUziOxSl>TBJv3%sshY?r=o`g4naHq~ny zlI$7Q{Fd0ap(S_i@3sHRK9p>SoWNID6mi_i`sKGa-PI2@e=oOipJ)5DeBm$omHHXU zyIRg~uI*ZR?Th-}w==e+dP>(XMy{SKl#aWCW&&)n_*JIV@Y=emlY_aahNmAkzEB)4 zZ0zp6tVZ?zx1O@j%6MbWbme?N!|!7U>{qYd@$dYG^A8O8_vA4D+I74C&2OH6 z%#1Iu1tx##DlM^iX5O#osAv>(yzo^NyQ=C^saq~fFCT1KsgatNx)lH-$FH?w_jqUF`Fx)Pxy5GmYd5-L}h3RQ#1LSNmKnEi38@Xgx?;f|B;fIbn<3 zr(RC7s8u<)Hs@!lntI=5Kebq0*_371!d#~K?3#2j?-(Y-hSNCN1GUlTd{~0d5{ypug)xTdZ-+I_zF;lS^fB5sNZRO49+&j-) z`!fAMgTB}S-Ji|Z{obFseu(*U&TrdKKO2<27wkU5q_N9;Uz~vK16W!@+o9zl}zRwXmYdD7*eyS2gRNl!Y)zv2Gt+J#-Oo_E#1 zJo#q(jqogC`{H~08OgUgeRi9iKloW|YUaGo_tj}SKT}oSezw{8%=hA%-{7J7OD8{^ zxhTG}Z)=Fl*_f?{*VcWdYEnLU7)yb{e)xsV4p_^;vVH0wIiB~T;I#et(WciH{`2oA z-=6RPVpjLZ*5DuZQ#y@z&p&Mmx!g4SKc{byMEsye|Y{GTZMyRH7eFG=uU;Zi@CT-$g4=az;J z1_lPket8S^IiIKAH%n!^{#53|$vYk*)w?G=kyxi_&3s_Z<|%XES^6FQazkvz+RE+P zb0&s8y4#nfDtxl<-K+u$?m15v&*~dn+=9#jy=clG`lRnyc@XUvk+eQ0>Zd(Uh z=9^53ymBJw-n#j6F6GjtOC@KCHS78>VYA;^_xWy-=$ZSL;x*lG?PBNOeBZ0)y4zyq zy32X*G&guxubnzEUEZSCdB*921-F(?UOHpP>RcJ4**#lTz9?PMOP+6Up|2;G`*-2O zd*{;D8FlS3RzLr8+og$fjKyZpOfmjcy=(UE9d9?g$2?NiV#zvF6ue3Pqom66xKkZ0 zUr!!4ul79eum7XnSX%5}>Yr=Ri;FU5Y&r8*aWtx2y&<8pE+^!v&H~wuk9Pd+eSdVR#f>Qe z=gKFP#%6AL9)A4jp|vIk2lHo6KELMu-2H{$yYufnt$f?4yW)0@bphASvv>PexqGRy-1%KUB2PFF57oI7X!j^C*}r4LSj zKlNK+bnCK>6Bog{CVNFJ3S4u5)XdV%9F>5&vGh z=Gfck<~6(Dyf=;xC|BKHeY^4E^B=1%MeC1-e|Wua@z<_(yViSOit5db)Z}xonN|AC z_gc@b!eeK(1Hv~zvaZy_{N?lixt;!b%kV#g>Bpi)&)lv)`}ij8@_z=~qkAU4x-7DN zS-aTo(C_z{wtdQ8FJ}Jz2jDssuM=m)YMqtSi47$YP43(S`oBn zt**{eL$+Ppc5(B0&91Qe>qft03xNp~^Nw;&CTv@E7Y#_wPyjR+K*Si~rTW@dN zHha=nZ$Z_l%?-~h_9eYd$$a)I;lze~*{vI6)YLRvCwmu6n$FAh(D=fE5UA539>7M* z&ylyfuRE`xdd|7`{tu6C{GFh|EzA1imw?>tTFv*>4$9pNb{~DfC=#oBU!MbZuL%PK z+8HiO0{)50-w*tH#OnTw^E2Ns{dvy5U+&d^hL7?MVYPkp*Lw7B1>N#__uaIg)8@Y~ zeCPCJV_(~UhUf

((Ed|Esul-=SR>{_l8HEmw@FeK8TIXU4P=f|MSmbF`mm(d!PTG zgFxSx>^t_!{~0v+E&nyyyT}O`lvei9lzjSlbw2q@M1sfLFCCC*n zd|;Qzd+Cl%-zDj+CspnyTUVv!Y$|yi`snIq^TmSQifct4^W4}x+vG^v79*pJ8gDWj zOxAs_%sW?kI^B9s=jYB@hj*+wmiKd6)7yK|Dwk$NhGd^vwVdbvGsVagflA&p-q_wT zjj&j2;rr-%u&E&1+4yDAdpmn#`rpWihwUtgym$8B&Zf3&kLJ0ShKk*N(tjPBGWGhNsSBG^qYH$CH?AftVb>uk*$ z=iE=S9XsyxOqZXVEOqKIce23J?epg)eO_}jNhNdhM{A#|8gV(bnd&ipSr6Rys7M4o znS6eG>GSMEKhNKuQ#^V0-^qu*?Vf!1>>ZiaMf&A=yNyy;{xq|#^=^51HZc6b7VW&} z3cY-%lBVo*3B0+spjXROg>Ct~DhdNm07p-!ZR!PJdqcAzF+Ll+au@Ci!465>D3=Cw>$BP5=U)Y zx>v29zH#?$)7lTtJ3nRexR+_?Z96G^H?u&cS+izkvG2yqHg}@s&pw@J+*!2x^sUN_ zqvcs{3U7WrN&Kz4?ZZa3oXZYZZgs7i!5{YMtKiADU?E|*?@R%w)wZg#Nu9}i{<6ur z*lOSUr{xoMb{B8EE>rlEFYR{c+*^+#S@+r8K6YEu`-h+O_MNYH=*nDC^vW$44*2Bl zw{_XoBQ0%3doIgW&5Pah`by+fKk?oaY3qHvv*Tkc=jO~y&Wx-y_~>29&b8h8V9~B= zkFPzuk$jCMFus<@bvjej?7Wb&&KIvM4BO}ao4W2oF2C`f6K~|+7A>5eeB-+QPP5+$ zAIsV0?wp#l=yc)c*yY>iyLTo}*^z#))Jx;;o!J&{^R?z?%qV$VXz{z-t6K5pr{BMP zE^jZNu&?yzv)xaHcFERj{@%Jdx;l80K4$rKmYqM@Oc?nE6p# zI3?d?{``mQt@;grZaWb6sdsYDo*en~H{0XR+f3gT`txscR`0aO5o^=T&3N+!`={ot zz8dFIr@ijv-;Ji{Re9I9dO75TFn^x;eDZ&WONS5CKj)q}|A6m$#!caK+rPAJQ$IU% z_l@)VJDy#M{%pUOFKlD&&K=Vf=Y%H(mMvQLa@%R1HG4Lf%bl9L<-BottoMc&i;rt& zHZ6N%k*R4I@FQij&~vvq?h{}7$}HdB?$|ReB=}*_c6HO+bDE9*6%^U-IjW+$es5RK ztk^V5r`2Y_3)~*8{SNtb2)fk!lkD|$vaKk9`EN$ znsjEz8R>~vJ|thBasN{BExVAP|L)fLmCv4bXV&E0vUtmSk#m*ptM5cyPnX(gohxqH zUL3o%;6wBF4bzhgQ-v1p$lT;9Jc;w`o@tjBDQwKFU#6_LxhSco_}S}onq_%K7xjeJ zna7G+pHJ>yc`5t-ywwt0Zoi1IU3GS=@X5BLmmaSUN?HCb~ zbLvi~{yF>BeU5)dxjWPGO*v^kuaa-u#9Q4wo$QxBD`b1ulhdzWOwZe^H`ns z*|kq*i7vIE9xMT~nIp5Kojc>g zl0$#QN$dU$cwKb&{5f6a8%{?RW6rdE3_p~nbK7$5@zN_B+C2Hz7`)v4pJ5qm)VWG; z-?RBjKijS(h_7>=u;+5VadpnF-}1+w?D8nrDrPvd?KktLGloAp3b~`V3eBy}cw{!S zG)5yJ&wIOccXQr1=C*g!Zl;P#uDh2fX6ip9u`-uu(scic$>AR&H?7#VzNS+vq;kR& z#S|~E7{{4QGrc-4Ia)z#QC#Go2S2ar|7Vb$SFn4}x%Zy`89u$w{mc*`W+e=2sVq*t zsrRtvf#A{$v5y!<=1qFv@E&Fm`mBK~|HHt)U*$oE|MvWx_bYzR;~yX2t^dy;_=7e5 z#>-zK{MS2x{pZ_4DsHzCFJjJc7CsG=e%4Jc8PE_uG$Kre7|DMo{Z-@33F=T4JKG z_cIPGBd8GTE!H2k4?g6eIQ`Bz_xc0l80515a=xG6z~1qn;n0G=*H->#sB&if z)#&m=Cx7G3{|sgm1VMUr>*vnx?L2c_L+0!oo*kYWY;WJVd-{;}W9i&o^>TNU%5st? z3EW;8oK+?JpJB31lhNhgO^iQli)Npz|7`kf!sq3m*5($4>|FPs;pv}c>Qc)}zq(DB z5nL4QlRv}MxpL{`NvfA0-L4g!>2cwUAPc{;^`DmOu>DZPDmprd*DGj^ukuCJtB1cV@b;lD`M9gQ~KFmJ%_<7Xl zgonDfwG~&M-j+V0ck`*cc|prIM^89c`1aN_wSA6Gk1amERMk3VbNEf6rKC-i*etf! z`|A1v=RD^>TYV-?*g0sn?V($zJmwtC4dzgK?QM8-sqJKs^&Krsu08%KCw6zQleAk` zrFhvDTCZ49iL>J!rGRGhWqWzUaHo;Hu#2-F;7rkdz@@%Tyf-?bCKn}LD5fs`0M^I znq&6w)Gm|TJ^`CzP8~9H*;5tLVzI0J-J@&Av%J?7SiRO2PFu$u6e4H-vO0I3`1Y9B zpFZ!N;aZz!J~uC2Km1zdmM)Ent8?-`>8?H>9VR>{(pFH{UR}BA=*`1fSzoJHHOtDR z`Ivcf&-<&bGwrs?Q|q&`Gw!d<-g{bbUdndwk}aiS*LN##+cr(BpnHRN$VqSGcMYAN zr$7Ixruj=pE>Fj;tF(vf?5*`rg}Ki139rsFou?Vz{G_^Jmv$V}!?Jy+{xfhlEZwrc z=;0=ps)o({Ci!!@XT~{I`nlct^!r)moqcKA=FEC$ih1tO_!G3dRK9=r=4ZFhtnQ3f zJ1lwQ&7*a(e$4*7yVR7-(|+@;Qa)vNyY?kZBJZ=(Lzasdet!M-yurnv($Dy(*3P-N z=kbhbpLo>5&gHEYyYeZaw%ZZ5Q5qKjwj7o>^ema>X@q8`o>T z{v^TURmRe?PG_sp6r0xVM_Somyli@tcJgg)?NPUzZ@yj2y&LALCUT}}Gwba)-a_m5 zPLDe1wr*-6SJR?>rgLTpcCSv&Uz(LE_f*aG2ICU@mjab1^(|-L+tqKPuW0dGvgNkU zw`P|6J7?FkZFo~&ToJpe*I4@LcKHpR5*Lmcw?rOGyKFr7+R|l9k7@Kv=N#Ce&Ybq2 z!T9^E{|wBZV~aM1ZwriFeQNvlf~nE7ixqbjJe=%x#+>8zrNb3}rQfTczIA)=-o8(- zGm@<`jkDLy*mhAZr^(>d1OC&W&o}PAS*|~?UiatywfiRq^V{C+xjxy z>b}Rxa{KAuw@3WCRdapjp_$eSXV-lfUDLSi&C+*&W0|I>cDYQsrEKz~QahD%s@Psl zo|pe-*gZ}yiCOq*@z$$(-su8&`BK#))8;x&>)0&5ZFg8MAv+Y*c z3QL38#eQm+QY4N3%JX*II=kz$Q_-3|)ndovXYRAEPTcu>d&big$)Mstt8Mn|ot#w} zz0T}qjCpw2=a4s>{xb;Y9BOOxRB=g3Tp6w^D*9(Z-ISiYi*96`T6TNd&JEAlQywRq zyfO(5ds|k${d?t!dpYF&nwlH+n}*e7h>$?2ER%ZBSpRwBMu zJJxD?8t1Y(hU~d=>50c*3G<-Ot0JAAa?g_}^mI$VaxCd|?b&I8D`!rUHl5e{lHthr z7l|uf=N4~hGJasY{OL}&`5srgd5^2iujx#G-LOTr`Kad3bAL7W9NIj?g7?XkHJ>M+ zNxjn(Y?#?yb(>?(#w5!U-o=M?wAXUJ*sPIl_fc!Dfb;Emi23SdGOQC=fwYyXj+SbyAzvMnvJIh}AQS)*-=s-f~9L46Rk5K1lV-WMRh{-{ivltj^ zuIx^I-IobH!=2uD4fMCAF88c@=n1-bWM;wilwH-ehh-P3KCNeOwm98dJL&81ro}S8 zVX^6)zxL=<7r#iU_H|wOpW*u<{LPw4G-}o`*lV6Ew7I>%Ix+?F@M)bvbjh zUBR1=XOxRF%YyCaZabUX_9>5t`&d!h=MIU-H>xe(Y4@e^tA#XAnej%ny0g^NWVORz z&YBl7i;mv!H+46@vnuy3*V8l2r(1SdyZ0YlKQY-d((T-p>rbnbef^pCZuOa%to53^ zmA7q%zjRl5L&r%sH>u2jz2ypXj=OxGml%C~@1HIC^Ugn%R@^ju{tf{>^X~NT?0H(t zo>#U+_3k>Z`Re)8A5UFt=Q)aP*V!^-$JrgrZ~4S+Z+Cg+_{(VDVWAmSCexxON;&%( zDp|i>_)I?WiFDqk&wfI)OP5CnF7*tQ)aZA9!| z{-W%2I`8rck2jj_uh(1k>5SCb>$8Holq>oer_OpJG{x;!)|I7_*(=#!xz5W~HM{=F zefFEU8y8Q<@-d#e7r1qXm~}Ys$!Yr6lcNLeMUTB&=-71W-t1)689Ce9ZaK}Ve462s z6~KRP^I6lr%4aoq&cA0jyR-9?`mV?}>)wYIV)x%~JNsVl{JT2M`dP{1>*8XQZ<;ao z?f3Sa8*jaRT8Yv0Os&S<;@UIk-1Khw?62s{8nWree#`SO`F|e#cG>>^zZj#x?YCsA z%(NSxOX{56b@qeonwz!V$KO9qwVcXkp1Z-;Pc++y~)9we`n6h(|lyozI{h&s`zo9B$4m_ z!3XP4^md${d|-OW#ieSCJsb9U%{M#RZx_G#{%L--%0Jb$bMHybi~8oSa!@6G$KR*2 z({8?>cQ?>|ZqN2P$->Gm``5283!1-bXU~p*VP`nc&yq5q)G{Nx_LRECzUuded(Glc zmARgnmbzOyr)Sr<{|rLMiq;4hZ~9{{yMO1byp-wImV0j7hffT-_h4u4B2nAWNdk-W zvd`PKxRn0nh{zFrmikQjeDm3Qqv);sZQkXE%AG1oo}L)6;GuQ;%!F^znUj)l*7~%| zAAg#&PB*VpxZMkF0>}<8wDl6`^B$rM6yxXQsPw#7<%g$Ui=9g1)eS%l0P1zh& z%DZyUm)md8#_R9PpL^$YrS5^xIj?8vOsmu1wqw?}*L){F-?_}zI6rDxzv7)a#p1`b z*6FCnCQdoGTTQyp_{ql9ul{?Fw4LSVW%_gX)1N2va?d{B`;0r+=DPIZJ-4@~_WB+D z_-1qM&g5rhpVAoR{v}T~_C6C>@z>Y->5TLk&!ltLyzWlhvFx*FP@tBlg>*sXvOTZn zmHHK0Zizehx${KU&f=R#a{W@LFE8{@w(Pq7&Su}F)6(6ZeSbf^tC?O{|2JLiQt&)K z*Qb78rMBPjI*@aV`SYje>!;-Yx-{@Jt(~&@ zsHVZ$E!ip)Yp2$}IeSPgIaFwYMK`OxVqiqDw)3+XEd_DuU!LMH1#U{_&1#>1{J9R5IPkTbHi*}EBnL*npYf0hP0#~kGX|c=s>A3mowhJlT zUuyPTin%3j9yxuk@%%sD8V5FKZYo#$on!F!c*ohe7wOi^_pCo_d+=V*Z4tk9i6$2^ zbJY$mUNfaFZEYBz-LmBEQsyyYGiMhaJaec2($w}n8-M2A|0!)Xuj<=(<*;{#o1?ql zU00Xs-fU8!nxb`wCAsU!sV6l#H{wOvfp&R z^`8}$M-_kG_;YuLoc}J<@0EZ3zCJav;1%h)Z+0v9Rb#*|n_H#(ZXYWwpLy^6yM0!- zyEa%I*{dY|S$)%IpDj-^*~IG4@mtKRx^I_ezWvU^YnA&y`EEI)@Vvw_Eu2~M_T4K- z3bp^NntQmjFU5N4uIQ7o{@zUwDoTE?^Z&7TdfbF3i*mCm3f3sY2!51~YFWG)(%YO#YMUARGk{Nv`Yx$QM z#>N!--?ct;KQT6=XYcuxUEG)7^OOe*-+u0M8$8gn<+RH;@5S5i8fKgp4uKB#oY^fq z>0@>6L)Q{-^}`3nSC*Z=E~}~4@#ratB@+~T)_Ysrjv(itx6{{&OaQgYT2)N-ZdN_? zi-6r(h*_&5R=Bh0TN&Ql$KT~WEuhr4H zo*KVh@*@}8eiqU%|CucJ^Q2Aw!P<>)Z~kkv=5THvpI&m#F>PkWV`+YM ztG1jxqA4VLb$-h2sL~6jmp@BYuKxM-?9V^v|Gbtf`lGLW;PWxHXWq-M>kma8(x_2exc!O;N@4sBps?|3}_$<2+~ZJ{x(-*|o~-!!;%{_;g-rJJUkx93@y zZagge(fH}MYQ6rnn=_nhUzO~$+wx-V>7}27^sc^Kx9#LSv8P?}Z7)AXPrI!*U&TP( zNM_Z~Neg@vPh3toStqmO-162NpB7s!OEGv=*LrNO<5Jg`lDs{~YiH*4%y_0Qdr??e zPGa7T=|_3vrUx&$ntI{2&ThH&eBNvJo!+f>`_0U4uhVRVbB-MOnaE?k@_H}w-fOcg znAaJP)@lBlC&b7DS%O&*tp|dbpq2)4n3k%(8{alJJ$W!nedp0 zzw}G({0qsCRa*RE@w;L>d484u44dCpEUGK6RjponGHZ?*V)dS2g!6`(pV<*cgTI{!P` z``>oY<1;w0J#$`sYM%A(KMvqyc()j>o&2e9{`-mV7ubDK+snV({Xc{A$@c~))=S2I z{?K{xQ&PpLkChl#K!F2!n3W0}ng265tobdwA6~QEn?C<1cnB+|O|R~${hALw(cwq! zzP$MsZI@cQ$X@)FoArthKQEh|wVn92VyfGg-<)5nvc%@>339t{e42Bc<(FFjGa}*6 zYKKcMim!O->Jn=TI)=H9dXew_;3<5R4jd&A0&#C4WIwa!J?**gXJ{FIY@Ho>DCE`i zBjNS84T}#RlaPD+V(sbj`VPtIcOoG-J_TO>`^okT=e_o4Zf}36`B%1uR)BBU040R; zb1UXF{8?AleSdTO$#ZdhkZt;lqyO&Rab3SUv2vHPVXCHoNd-9_|jJtWvm3L;Ba;KfoS37Cia_{Z4 zClf_x?o5?!`R!tz9Cr4Z-R;7en;OoDrG#(SovCRXmll(%GIikuuKB0TO}^S(Oq?!! zXIZ+$xed=B96Mw9W0KtDh{s~B%8yq6QeQIbsoJ)pM^?9cY?khp{8I37Ew@uc>;yjT zkN#IaOyEfUQnl}5Lu>isE8z|7v;H$URX=~g_{jdl3j5Mk_4g(ms9O+7#oaX0bN#2C zw}}62zBj%dwCuL8<(FLx`>MYA!M7Czk6w!X^r4~Cy(eyc!vVz5C{g<+!oPOZFl~NQ z_HQeb#r4`t{~4^yt>T|Wfmhv5IA-JWZ}TC;+IW$_m+$rNgS4S~z=dAy^p@H<)j-hY zf0sdp-o!6*J!&VQr=6(bJ=h77EKy1DVHWL(!z{SUyPj7+v;VCGLL`Oi?(U&~a!@aM$cb)1v$B~FE$zEn~(1IOu0 zy5e)swx6hMy75xtnvC!MnU8Mr$efp2S>+rkbwak2t2TA6RLZ_>kBzNDOS|TD<*n3+ zezSCQP}Mmlo}#C}H=n(3P#xa?Y4*=Ow?gh1tO@JaIF)iSrPOOSJBOLn@}eVaZ*=x2 z^%y?!*=gh-wd}51|7!2d$R&r?7VmF)GJ{<^W>3+>uH>C|g~|R(DyM(HDVEu`ZRMw) zx=k^eybFJ9Trwwo?I)ftr$m*{mb<#})J`KE*)6*}vR-RHz3o%FDam-H_uEY;*QU(dsKTu3K>pM>g9h8*&;F;+ z>xlS1vHrZfqU`qJNzFyOMDI?toN!lA)5B=t(bX5tRrXvwA{A1ow8z6<;zU$=?Dvct zAFJM85A5gNd`NG8tG(Ebwb!c!HQ5(fuY51QSGVTvUB=C?%WbZm)!!{T<#7Mu-|MQM z-LcqhoqR22+r~p{T%O-wVtgu9r1kjiyBqH7o_5YQ`IE3p%0_JKm+69~6TLNer9HX4 zQv7Fzk6imof&Q(v?{g%U&GM02^YQW1Z7052u3Nu7$DDile}>De_nxh@IC&*{-O+8a zhA*n_>{|W!WciAt7XKNNr#+e7T{p4s;Q48nE2ryK-|adS)H8QxXlmorbw=|{CWQpt z+Os@*NrrLYMD3u@As%HK6>uH0(beHL@d|K?@HmB)X%_nz6mE$?R4*a10_bzMOWxhLeKTj`8J{$7ligf&*P($O&EVUcA*Zk7i!)!I><(di8 zR=qSzdoa!6(Uo-v!*&}7z4=n+mbMy=S7u`}wBZgJ*x;tQ-Gc z|Hbk9;Uz!x?pUo(J6m@=C9HIo_u8v3bNgj~7M#7e%IbeZC|4 z=9JrACq35*7nOVo*r9R$%?$J(BH>bO5j`4?|ehGWMVy2<#c7q+4ue(-U z_+2$!$U8td0yTG|^7zk$k3(Fgf>INcy2FO|>POS_X5($sCZ8(Ehx< z^7i6SYqiq#|Lk5jTjiOai^luZNR@99+mD$A?K@@Z(Xd@OaDy&cy!687qg4fw?DjJ65GwI*S#rneYtK- zck#^U8fSI42kz#Mw#trnS9<#AbbjvAJ-2RtQeN?A)poJ(+*{AgTW2Di*&5PuRbc9& zOY{1dbGlUPdzZ>bzRJ6PX4%m0$ex#M!OYZ<4<4e%^d@B`YF<|>1~+yA7M$$eOo^k9o$;KBE0UGuj}@AJGRNzO;djuS=ME6 z=J=$)wm+7sA2pe;{J#kD>u1+HGVWKuVa5N~FS%jAH*s`lNyuQQHYt=;$H+Kabu=S4g{n`>h;b;hoF z*6Opr>YjgB{_^VG`4v@rs`6b-(Y{gtO(Y-zToT{V8(WS2piWZ>Rf2=VkBCKl-4r@^P6x%b7pg zHpYgsGuB_qe-XOzYhQQpwYwKG4RinIcirCf?DmEukxTC=&ADt9t^6S2>Y1?DI-6#g z8hdQJQ>oXvKmSItQpAz&#CR=}7s87TjYMwbZ&gz{F)7OX<5Jg2ho+tBxFi`B*1FJb z>XH*D&h+HyZjY|rSUXubCvT|J-ZhrB_$#;yM1=@a%TIIn#2koc;K$z09z8 z(e0?ojd830O#G>La{I1Xr>3&YA6xM{`TPl^HGKzlb}UP{er&R4Ms8j~f!S6So$b@~ zZO_kMJ)8Hzk{hyn@4lHVaL;C!(Xs>yzVC1Sp60ZkdvesL{F(IZn!Trv6~6kj^6Qbl z<>Z>AdWh<^^IUT&r;LG(p&W0CWulC~6HJ|Qp_kOnaEZr~1D@$(c ze%-nL&YPDFQ|9ClHD6y_i?bSi?J_|D zi8BPGu2&u?p7U(}mlm5dH$v@-XI)OLbh}=xZ>(`R%jiwlYQd9FuLa%`&Hkxo%yi0D z_VW4XQi+^5|4F%|X*6yEe?yAV%_!sBBe z5p5UiCe+VbUb$Ue__mf@!n;Ck-ox9{x^q6gy?)F0+O4^p?##|CmTrz`=f6|)USP?Q zWxF#KpDfdl*D^}c^z`Dnwq(g+Md{7w-1TQm@3-0W>E7a-ryEG-(O?N(dlwFxu93b`#aiw0o`wKKeTC+NIQp zb;7I6Ip-~%c01@!lu%T|@;%Rg9<8){!qhLe?OA(y!b7v2Uyi^2_MTzc(i6pNFW%AI zC~`>6v@Q3TXn6JX*o~Y;v%EhAiYzjCymsO7pzYFLO>R#PpWAriKZD&(yXftE_T`<~ z{ym+!t!!r5nLIb~8E^I81qV&u7-9W1A-dJuu{_c3_T>oYO$!$}2VVQ_@^M?<)?*T@ z4`B?@$k1M`giJ5%V^?4G0W7(aHDZ+-cIyrK# zoSvpG^2GezEw2l1i?|-1Ty8gKMe%=z?b~)wKQ-;$rFW%b=6Q3=M)sf=;EHObc^XYHZf8pYQ07dN=prrrN}>8VuW_2cey!)Hkr zrxa`yoU*X(De=#{i>%L7X5Qr(=}OoYs=j< zuQN9S9%=EUJv!WX*;jd$7tdj(2PV~jmGjDWHr)SHJmc-Yr}D){vD=@{KD)Da+r-K> zcjpM}p4@P|_wuvlGN~ny?YuMpSO;`oNZEwPu<%; z!D*UjjUL}z=3VgEb)%BnwU>o#Po)!g+*tM@cia7U$2e2&9uwZVBhGMslG$3#txAWb zPp?djzjRtTGjE$$-LC4aK%xFtx776sEZBxo85n3dnff!+mF!3F{cl0zd(SdHJg-<+HSfZT;}0UgPBxip zx$~pws~&tlJEgZjm}z?> zaV})|q^xE(_TdxFXYUfS?%J-tBfG_QmB#eBkNqE?++C#fMtZgR(!*1q<~ip6Sm)za zGr8r0-?sFlmv1okc=em^E9^f$QLK4ZXGme{nmJRY77LtsoqV!TQ)TH%o#`Hs)@RCu{a2(tVElY>qoKi`MU`J}tXr zvawN?ne5i9!X8(}ZWnD@w@b|E&bE_UueDe8ZeO!ZedAF+?j>$+DTedb-GBRXZ@1Y~ zk-7e9f-h z)_L7-m-%6ox+&9R+Twk=a-RBs9_~4wvVHdE!s_C!H&SPnGtbaD6mrsY-<_Jx8ncxS z?dR}4?e(eSTji2%^Jk|05^FuWGSPR-vTJ{e{q}ze_j&s2@3TL^@>1Jp5S8>`!v}}a)%`@D@h0UK7w3ny zKh585d?i=&{rUB;de2vP%wE4M|Lpw0c|SUy?RvTP`jdSxy3Tw%vt`+{_2*j8zPFjZ zX^(iqdUI=*+uXl*hC~N$k+%IfMfT7g4whHvc<-fV_Ac1e?VY`%@Umg(8IP<@E1Mq{ z%!!hjur}-duE#5?7RP^zUH0b37W2Dij}EtOoUBrzw=efcu(9l(jfS}!k8O^u-Suw% zi_Lf57uqUIf3L7G+gl&<@@8^?uJ+-Z0# z%6nh=HgCD4g(ogc#2fyo4d%>ScZqk&wnW1{qF2`{%i?2XJTx@+j}?3{W9HvW^QP2jzU`cOuYbYuOWuXoUT-Lu zzAn|hIl6T6kJ*8fvTLVD=G?U|{eC|8#`|qI=gOPs=}ffHo#!*-?WPSsn|Geva>sVx zsY=H?+~sSEe5bDLo}6pj+R|KC+IP`!Ug@R6a=CK%c-!rJYG-`h(VOKP^Wv=Fq~z}Y zQd#%9&7PB&Z!Pz|x#il?8_O!rY0mQ9|KZ&d_g8t_Y$Pqo7eUhM|ap)hMfyc43x|>SGp!<_hiX!@3o0JYo`6qS-E5uPp|93hU@uXmhZO9 zd1LQ4|Gf9qTJFpCf8TFD_wU z-IJZ4{XD;O>F1i<^P2G$c7^jIp1$4oIl1QA!{0A=PLX82=c>#1_LtU19(9?}*f?)K zp{0H^&ioV zBYrOX)D; zzc&8MDCW1BKWjGUlhZm2Z@)_^?(KbM&U5?j@sq)lq1J`+>hqcATb>UKN{W!5p0vAM z>sE|Wnn|a-;kGU--p@HF)Zo=b@|6G3F*FMMnH4W)^_I#F2on*0H zX78TcYlI8ba*kCzxoYM1b@EI#xvROYU008+WR=XDFF0?3I=_|Q`8$=jEZ02`jE>a1 zc53n2!e{RfZD*f;n(O5HqaEwY&DZ7H8%NBY5}c`>7TYatx_#=^=b|;4S)tuol`0vY z5@CDJ*R9&~X3vYd{&U75Ek1`{Z}a-kaBkz?(%wz^4$Zag7eXFHm-<_A1qBL({C@dy ziLg1(rP!#+2Wny)cHJxZzJGe`y3fm!wVtk@81s4ld~0W$oosYV1M~+F=(sse>pZ?D)`x*h%Vs9OF!&)%K8 zPiJqeJ$!uI@7cDU^{k8Prv7mk{{6FOSI+UgrTZ22x5hHLNBmN9^=_3doV2~^LCy8u ztDk**W<2L#!S?T|Wz|(XLq0d(eJs(Ze=c8F`fhyncF7QpP$O-rTwlQ?&dSw{w2+JKL1{C>W*b!-kw(wuPZ%!`oy0ncOJbt zBDSVj$2qOszu?i^Ke_Xc%$|~ww{f-73eBB7H=g{N+^T2e&T05mT9~<3`t8Q2pVMou z-R|GMXXWLjkU6_AeM;V?_g34&`R%!5Z#KNnU3g;ct4$VVFUp)}a^JKT?mGBeeQuR& z_or~h>oSE$H4a_b@AmmW1Is!m`*&;)>tf1X*!Mp_^Ld8b=iE;Xt7E(sk84zRJ(K%c zt$F%rU#!BTq#b$w#RA>R_iXk>9-DDnV%hnCQ$Mag`D!GpR(QDoibebMLsCaSzdtj5 zRzJgM-uplI{xo_no?qF1zjNohYw0()oH~-)_k8#3-9_7jrO$3(UixnN{lFudm)~6H z3Rz?+G^fZk#!Xo@TP<)!?&58B#pirC**Thr&we}i-W>1pZHuS&ZrGS#n747e&cnm) zvl3?K`cBqo4c>0L^;}J5)@%>K8!Cz!!Ix)wYFtTkkvdYj>dy zc&g3ep9i<)PaQIcR)Sa^0G*{=)?d!Ka$rR*2IlJoM zlPzvjCQXqH{VSfArM=yKQqAuvE5oOkoB!#~yXLyhV#=FUlk)T@-~aS=#;rR~cS}yZ z{Wx6LWzW(np;_}Ic1((Jo^Ubda$5Qg18F0yQ%Vef9`3yIGv{;be+J{~t3L{JnC{Pb z;lKEWL)D6xUu`!r%7D*L;h0i!^wkd@cK8hjXqRjRNzCW!f4}0_BU$|~>StD5`tw}= zczl@ej_1z`=af> zw;=tk{|q;KmZ$t#y!`hQ1-~!$M&|hkjjFe8xUya{KBP|2%FgG!vG7~bK=Vs`hIM^?zh@?o6EoFxznG{w>cA;TXXTOzsbbG7iqMMIDteYcq@!`|$M^4?JIXQK8S^WgtMH^k1Iw$2z<(5y^uRV5K z(}w#z)I;3Y;lumKIegao&3S?VQ`Y{QYY+X9vez|M4t;e)HQ% zu_LC&FIQf>HE-iD$9$>EljpbPT<*`ie8lIH?&aIR*BmM6+#g(*{cd@m_Q7JAe@Q>> zGEdr@{MaXT`IAv}ZSNg7Z6#OxFEd|d%g$Ew%}G-BT;)1NO(v03@6?osf@MB&yEe1c z`un{8kh$7&-K8f>+$Db)8_S(3Q|4d%?)BC;bAOa9d%f3p+uIrCZ)NV6-s_!uHg{vq zPn}&!Kj*W!MlG!D`+hs=TlDPc*|v{&EIc}Kr*ud~+^zJR$`cm`20qzTB(*xT%p5FZ~s&Mbr)u%W7d0(+^ySm`%ja_T9?(O?lC+h9^ z^ws{;y30a$>#p+H{OYOR)@gBt+ts!5I-G9j9#yt}A6{|G=*_m=9iNg<@3=eb^xN(< zz1h0k_FO-6v@$8FGD&^gyS#HJW@YtX;NRW%u|)QHR@LqB#n&>djQMV^xcvO&Y}p@c zt~@<`^3{gqZ9ldZ-A(;=EPLHHwL5{`4}D@wHcJNhBf1vuu#MHn@2bGerV*E zEUEx>yS6!l?&d%AU zH{)BH@_9b{EA2(MH-B%vJljut?cD3$8{^9|`pj<551sZ$?C#UqNv|JSe7Z0Eu&o9}(ZgOa*V9Jt}Hb#nGQC0lDE?ZY#esuNa z`%BOJawK(T=k?2OcU7}pS@Z4Y_S$;?_foOnvrbxUw-sA1S7Ux$+UU_fqsWrVb=y=I zxhs~H&skA<(QGk)mD8+hvHO1xPdhX7WwyzjHT4SHcHUmH+u;21PcwbPeU-wUPdM!g zGEHBqe|kgdvHAYSx6{`BHNE=bcF8%r`{~o(+saq{{&(qx_3d9edAH9_J92Z?%eQu) zn{Ly|?kL zzV)0Hms2A`P4hlnj*QKD_9@pc>g=w!-=3QmwRW0+;rsf%_@Z1++T8DA`hs8e6gzoZ zmp}iPf8Xl(oX;iSnAGPoD?D{h-0A%EeQ9CutBp^;PnF(#_?%JfpF1{&MNg9D>muv& zxr8OYX|mqb&dha>y7#Gkp32ti7I$VmER!pFZ{BZo`}f{Ii;C}_nD^}MJI-_Vs*{Un zL~PUF^HF!nTfVn%&pken#uwlGWO7Et^um7s$&$+#Z`PdFtLHxNSIA>N#rE4gRmHQP zefa#S^61CfnP+x3->LI9+gEq6n19Ret&K(fTdw_{{O3l>`^4?;){1vxFW&S1Q?7LK zd0Obzwd>?;{h9VZIwrMo((Cu7N17NXugkF%y!ZG0=T$$qT3$Z<{Oz0Ag-^95?!TIQ zb=|)GJKN`+p1JeKs+Akh?>UuGakka=dCuc)OF4rUi`I$G2=@Z0=nQ2c%KIm1o9 zn6lT&I@|tj`kiHY{>Hupqw;d0Z_k>xzLC$JI!W)Bu1!}=zFJ+J%cr%GpVDMA+hUZ$ zg-=}A%5#|Eu)JAJ!~1F9D{ud~Q}glRw(4^Ew4DJ5%U4U?`Stqs?-h|xZr*N>G*XrN z$mKEPY_IE@vU!zq0V~Z6rratuS(@hJCNB8g@pEZz|D5AfduAtYjdwz2?1qX8Yvw zZSQnWc%0n$hMV)utHk6P!oOR&tp02blJ}Cxyt-kYn#eX;o{LZaOwakcUfEJ#QR19E z-{jQipPuKRo@VW@s;arGC-sl)AG3Km(>WK%?AH3KxwFs1M7r;^_Q%{jxajsD zH=&^RhueHC6|YUo_VUc)GJV$i**2{%?_B!M$Ml`bZqhF*Sb$g!wt4w{p+%?;d zPZN13SGjBTA^iup0zwWQUnUkj{g|Wc`ns6ZO2%DFXWd~uJo}xa<=@--7Hg-^d4G2L z^c*$s`FZEgJiaY@rd;pOdC!xX8}=M)7N}$T7&D*yjG@%evXZiZ$Q5n=Mq3S*>=d~& zT{bWHjEctE^4az0PVc%`c+a`!(Vgq>`L!*5{!ZL=rz_|7^t~(nio4#vJNPy(x$D&8 ze(}uw{EYQRybteK|CXMv79SD2GvH)Ryp)Nv8K+vqKA-prYu_#V{ODc!oVeI&_f{ut z`scp!UaZ!unfrFeJ>5P(O?$Oi*gcJev$mf-C-jP==SCnJ?-r5 z&kZ^2&AwI#?zo|EzUTgD*4-Bkd8)2G);XU0t-4}iSlFU=d8u%9TkMelr+K zKA-wI?}^NZPn3oHWQ&fK=UCbu+wuI1rS9vzCo`5wPrP?v zqS~UJ&t|J7tzKvP)jKFUs)uFobI;F}`Nu8h%z5)(<<5S&^SNzz)1`NA7T$S$Pt~zH zi6?(&-#%%w?PjPMuWx7KAaRg>*Y{?TU~ zEj3^I=t`}PXX+M7S?!n_GNnLb&8oFs_m&@&;^A1krRmG0NeU9Jc24D&b8Wu7t30&L z>wNy~8*+)2naOFEhYr2hf4k~)Jhidqb)e0P zi^uX*)g-5an!Om9IvYU@?Vv|D#=r2N83;YP@!v-IZ?*Y1PW(F3@i_K-^q)_6_f7jb zZ}ubio!ouL?3%wW7Q4Fq-rR?Bhjv^nQQrHR&3?sW&Dp7sxfaJhT7K~*x1FC6bPeo< z#XBb_Jm``Q#kJ@k!&eLp4EzgZ{MnrmcN(;tFRWX>#r93));X$v>uj8VE&kBGjL+^c z)7`zIyYjAoWHXEz(Y_z`jTuZ2zPEB7glk8QS8( zC&-3Z*}7IRRIdM`zORl!PWe9rSM&F%<$quDu)ktOIYIdHG4~^?So_ z(|>br%@P0ZxI1B+lF`Fgk+c7loLqAGQ~1f>bH99xHYj4P44zozda8D<;6nuy|fBaWme}_Fj8_&86hcV!D^TPfu3!DT_Xxe(FPf>Eya- z-Hz=~CDuPXDKclqvtLhkT`^PtQuA}^Nh6NJ?~B!M%k~|(HRJa5tV3(LZO`f`PHw-x zvF~tqczAEP?}SSwK0DXj%y_mbeDa=@OflZoyL`W!Mf9HfBNeM#C$94A^fUWlLBSlK zAJ5X}X?oXI|66$XYVPjZpH|x5yYhGcxoOz_)U0N*Z|apdbFRlu`g8rZ@Nqfo+~-Se zQ>U)ZwViM?cGuI}Ss(V!ywxT4@eDu9N>^XiN~@hlbBzm62EWZsxBgu__3qW4_SCbJ zp6{Nh`gF~&63yQ^w@a$+n&oaU*gV<0>sGW(`f+39hr3>`IrAeeEnaEY^R>Sw@5x(p z?d$rmSL(t0Uw`)V*?xK2jW^vn$NO%)*(_$Qbf@A?-)Ws~x09Pzb$wI2(5)F&yx&Im z&__$ztRi`fvyqoiwJh0r?N8{Quc}F}xx6M#er%N)Q#iw?!pfQo{XTIDQvON(~ zX81*Zt;Dvqc3(g@vK;GPDEoef;a_)2pWFHpp;GTf?fN|;KNU{tU+^W-%>7%d?3vl@ zEVysQWA1qRJd$Be1C9$|Q75Jqzc6>sT)Ysn_3^@|eQEuC`A&cRGpcWF&Q{CRDlL2@ zU-L&rZ->Qi9`3T4Pp0mAcl{%~5xDG1`K|s`M!u$n7qq|R^$$7!vTIUTA(vdcpInLO zl56I!KfzyZRG1`d<<@UWP>g-?RrCSlv;7z5{rtgD(f>z_|8Ca&?@J8iSBUsG9s4ai z|8pjz00RSa%>7GpHzF(5F6C@D{Bj}W_iWE;kq;_YzcF~deq(!HR)X5HW8NLAinCsw zxzs1kZJOb-TV>uZu_oE~)mgjE?k~Gncr@LAQqKNIDNEJQir*Ie_570lmlv=9Sm%eo zuf6rUsOa|YmpWH77o{nw2QGU4b(%{>{(j%-svrH?B)iI%>l;irEtxr8cc#0ZWat^K zKkKJ!ew$u$_WV>SC6zbF!V~pA@$Sy9%zeo%c;c!5`e|F`S;G9(1t(fe48H64w>x;# z{mtpSlmi#f+@)=@PI_5h=jX_hyE#7=Pd~Qlul?@j*K_th%d9?itKiAWEnn5F4O3?8 z&fZzBBNpBDrr2YC>x#p9IyW9!=kLBAq?SA7;933o>!$UHr({8`t?Z4$_+4jKv zbQ6C)jrpoyX6~DOeA>-^(bM&%@eXpIb{+O^uYAuQ+P$o7&PH)JnHkUR9+pnN{b9?+ zGV7AhrF*v>tJ!v6^hdDrLk^hW`AgK+urFnG^OOZ{0|J$QTJ@u>TKHBI zQ}0=^t)-du(ldJ_RHdpiu13lGJ1jeVZ+dv*KHIb!N#!rwA8phAEx9dx?eQ1lUn=gD zZ2!}rb9c-1;CDMre-^p!i%Q#WI`#9nN=dC7`j^yK%(PNqy9_4g}#=}kMd1Mnj0^g zalbV+5@vbbZ_<=mYnI~U9e3URl( zuC;4+(v%fH&hC2dzxk$7)9!7zjo$4IPg}2l==iek&GF^0-mQszbN0IL{k7At?q7C3 zCc}#T#earXFaPdK=38HLvOVY0qpmQM9Z6?q^_{kp^v-y*DALE@@qfJ^V z4pCi4m3^i>{?L7<(|-v+3(2f2?tgrI*Zw))f9FSkGqT&NWO2Rr+IySr>7b3KKPK$B zlfH2OwcpO-S3mmiwSIAY!#a~#j`uYO`(Ig{O1rsyo2c9FqyCF8iS^7$RnAbW1Q+I_ zXQs296?9&;OfBn)MLChBwu0ych%Zq{_QNmOg%4hO-xd3xA>(*P#r=a1&%TIX`If6& zEH|Aqcy+(P@8=H{OAfxQ=HV{;qMEmR>mSE6`yQSB&#+n2?c`5)_WO#=-xvOzxa%ML z|Be|~muXMBrgM_3Zre4Z$2;DH z?+973P2i5ne#tM>rG=!OJ1=@Fi&VF@`|f

Fux6m0xzQnVr|Ka=iJd;W71tCez$6 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%0An<`+82|^pI1F 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ℑpG<;i^i%HN#EDiPirCMq4uZ8?5t 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 literal 0 HcmV?d00001 From e29c211cf2b022fbab9e728a0c8bf81e00f63753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 7 Feb 2021 23:48:32 +0100 Subject: [PATCH 0309/1526] Version 1.0.0 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 14 ++++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 12e6b9a5e..a822c367c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 30 - versionCode 83 - versionName "0.25.1" + versionCode 84 + versionName "1.0.0" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -142,7 +142,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:0.25.1" + implementation "io.github.wulkanowy:sdk:1.0.0" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index dc5ed9181..1d18f5751 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,8 +1,10 @@ -Wersja 0.25.1 -- naprawiliśmy przełączanie semestrów przy przełączaniu uczniów -- naprawiliśmy błąd przy odświeżaniu ocen gdy włączony był inny niż domyślny tryb liczenia średniej -- do średniej końcowej wliczają się teraz również oceny z plusami i minusami -- dodaliśmy menadżer kont, gdzie można podejrzeć informacje o uczniu oraz zmienić pseudonim -- zmieniliśmy ikonę planu lekcji oraz kolor animacji odświeżania w ciemnym motywie +Wersja 1.0.0 + +Pierwsza produkcyjna wersja Wulkanowego 🎉 + +Dziękujemy wszystkim użytkownikom za testowanie dotychczasowej wersji będącej we wczesnym dostępie +jak i programistom, którzy w wolnych chwilach pomagali rozwijać aplikację i naprawiać znalezione błędy. + +Bez was wszystkich niemożliwe byłoby to dzieło! Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 7900ad913f9f929b86095a3cb4d084c0ab53f6a3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 11 Feb 2021 12:20:45 +0000 Subject: [PATCH 0310/1526] Bump kotlin_version from 1.4.21 to 1.4.30 (#1139) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5ab0182bb..f67d2be97 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.4.21' + kotlin_version = '1.4.30' about_libraries = '8.7.0' hilt_version = "2.31.2-alpha" } From 53584026dcdaa5a5557719de31d8b7fc02e1768d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 12 Feb 2021 09:11:52 +0000 Subject: [PATCH 0311/1526] Bump about_libraries from 8.7.0 to 8.8.2 (#1135) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f67d2be97..f93399978 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.4.30' - about_libraries = '8.7.0' + about_libraries = '8.8.2' hilt_version = "2.31.2-alpha" } repositories { From 6b8b7c9143a739b8ffea798f64f1132a0bedfd19 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 12 Feb 2021 10:12:35 +0100 Subject: [PATCH 0312/1526] Bump material from 1.3.0-rc01 to 1.3.0 (#1137) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a822c367c..d89cc2d5f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -163,7 +163,7 @@ dependencies { implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.constraintlayout:constraintlayout:2.0.4" implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0" - implementation "com.google.android.material:material:1.3.0-rc01" + implementation "com.google.android.material:material:1.3.0" implementation "com.github.wulkanowy:material-chips-input:2.1.1" implementation "com.github.PhilJay:MPAndroidChart:v3.1.0" From cac76857c4cd2b5b72e515888edf94fed6e1390e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 12 Feb 2021 18:05:33 +0000 Subject: [PATCH 0313/1526] Bump fragment-ktx from 1.2.5 to 1.3.0 (#1138) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d89cc2d5f..8e206f9d3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -153,7 +153,7 @@ dependencies { implementation "androidx.activity:activity-ktx:1.1.0" implementation "androidx.appcompat:appcompat:1.2.0" implementation "androidx.appcompat:appcompat-resources:1.2.0" - implementation "androidx.fragment:fragment-ktx:1.2.5" + implementation "androidx.fragment:fragment-ktx:1.3.0" implementation "androidx.annotation:annotation:1.1.0" implementation "androidx.multidex:multidex:2.0.1" From 4841a0439d72f0d3b1fd5afeeb98bf9dd4bbc4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 12 Feb 2021 19:07:36 +0100 Subject: [PATCH 0314/1526] New Crowdin updates (#1131) --- app/src/main/res/values-cs-rCZ/strings.xml | 14 +-- app/src/main/res/values-sk-rSK/strings.xml | 116 ++++++++++----------- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index cadf41458..874dbe287 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -19,7 +19,7 @@ Domácí úkoly Manažer účtů Vyberte účet - Manažer účtů + Detaily účtu Informace o žáku Semestr %1$d, %2$d/%3$d @@ -195,7 +195,7 @@ Musíte vybrat alespoň jednu nepřítomnost! Ospravedlnit - Účast + Docházka Společně Tento týden žádné testy @@ -228,8 +228,8 @@ %d zpráva %d zprávy - %d zprávy - %d zprávy + %d zpráv + %d zpráv Nová zpráva @@ -442,7 +442,7 @@ Výchozí zobrazení Výpočet koncoročního průměru Vynutit průměrný výpočet podle aplikace - Zobrazit přítomnost v účasti + Zobrazit přítomnost v docházce Motiv aplikace Rozbalit známky Označte aktuální lekci v plánu lekce @@ -454,7 +454,7 @@ Předměty seřazené v \"Známky\" Jazyk aplikace Oznámení - Ukázat notifikace + Ukázat oznámení Ukázat nadcházející oznámení o lekci Opravte problémy se synchronizací a upozorněním Ve vašem zařízení mohou nastat problémy se synchronizací dat a oznámenímii.\n\nChcete-li je opravit, přidejte Wulkanowy do funkce Autostart a vypněte optimalizaci/úsporu baterie v nastavení systému telefonu. @@ -491,7 +491,7 @@ Červený Modrý Zelený - Nachový + Fialový Žádná barva Zkopírováno diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 1e85cfedc..5ac7dcfc1 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -17,10 +17,10 @@ Nová správa Poznámky a úspechy Domáce úlohy - Accounts manager - Select account - Account details - Student info + Manažér účtov + Vyberte účet + Detaily účtu + Informácie o žiakovi Semester %1$d, %2$d/%3$d @@ -81,7 +81,7 @@ Váha: %s Komentár Žiadne nové známky - Number of new ratings: %1$d + Počet nových známok %1$d Priemer: %1$.2f Body: %s Bez priemeru @@ -99,7 +99,7 @@ Semester Body Legenda - Average: %1$s + Priemer: %1$s Trieda Žiák @@ -152,7 +152,7 @@ Zmeny Žiadne lekcie tento deň %s min - %s sec + %s sek %1$s left in %1$s Lekcia skončila @@ -161,17 +161,17 @@ Later: %s Completed lessons - Show completed lessons - No info about completed lessons + Zobraziť dokončené lekcie + Žiadne informácie o dokončených lekciách Téma Neprítomnosť Zdroje Ďalší lekcie - Show additional lessons - No info about additional lessons + Zobraziť ďalšie lekcie + Žiadne informácie o ďalších lekciách - Attendance summary + Zhrnutie dochádzky Absent for school reasons Excused absence Unexcused absence @@ -193,49 +193,49 @@ Poslať Absence excused successfully! You must select at least one absence! - Excuse + Ospravedlniť Attendance Total No exams this week - Type + Typ Entry date Inbox - Sent - Trash + Odoslané + Kôš (no subject) - No messages + Žiadne správy An error occurred while downloading message content From: To: Date: %s - Reply - Forward - Delete - Move to trash + Odpoveď + Poslať ďalej + Vymazať + Presunúť do koša Delete permanently Message deleted successfully Share Print Subject - Content - Message sent successfully - Message does not exist + Obsah + Správa úspešne odoslaná + Správa neexistuje You need to choose at least 1 recipient The message content must be at least 3 characters - %d message - %d messages - %d messages - %d messages + %d správa + %d správy + %d správ + %d správ - New message - New messages - New messages - New messages + Nová správa + Nové správy + Nové správy + Nové správy You received %1$d message @@ -318,18 +318,18 @@ No devices Deregister Device removed - QR code + QR kód Token Symbol PIN School and teachers - School + Škola No info about school - School name - School address - Telephone + Názov školy + Adresa školy + Telefón Name of headmaster Name of pedagogue Show on map @@ -361,11 +361,11 @@ App version Contributors List of Wulkanowy developers - Report a bug + Nahlásiť chybu Send a bug report via e-mail FAQ Read Frequently Asked Questions - Discord server + Server Discord Join the Wulkanowy community Facebook fanpage Like our facebook fanpage @@ -398,8 +398,8 @@ Degree of kinship Address Phones - Male - Female + Muž + Žena Last name Nick @@ -416,12 +416,12 @@ Description No description Teacher - Date + Dátum Entry date - Color + Farba Details Category - Close + Zavrieť No data Subject Prev @@ -453,8 +453,8 @@ Grades color scheme Subjects sorting in \"Grades\" App language - Notifications - Show notifications + Oznámenia + Zobraziť upozornenia Show upcoming lesson notifications Fix synchronization & notifications issues Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. @@ -473,7 +473,7 @@ Manual sync doesn\'t refresh app views. \nTo see the synced data relaunch the app after syncing. - Other + Iné Value of the plus Value of the minus Reply with message history @@ -487,29 +487,29 @@ Upcoming lessons Debug - Black - Red - Blue - Green - Purple - No color + Čierny + Červený + Modrý + Zelený + Fialový + Žiadna farba - Copied + Skopírované Undo Download of updates has started… An update has just been downloaded. - Restart + Reštartovať Update failed! Wulkanowy may not function properly. Consider updating - No internet connection + Žiadne internetové pripojenie Connection to register failed. Servers can be overloaded. Please try again later Loading data failed. Please try again later Register password change required Maintenance underway UONET + register. Try again later Unknown UONET + register error. Try again later Unknown application error. Please try again later - An unexpected error occurred - Feature disabled by your school + Došlo k neočakávanej chybe + Funkcia deaktivovaná vašej školou Feature not available. Login in a mode other than Mobile API From bfe558d88727ffda22c26eb94fae7c06d368ff95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 12 Feb 2021 19:14:45 +0100 Subject: [PATCH 0315/1526] Update README (#1143) --- README.en.md | 11 +++++++++-- README.md | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/README.en.md b/README.en.md index accc36082..0f2885cfd 100644 --- a/README.en.md +++ b/README.en.md @@ -12,7 +12,7 @@ Unofficial android VULCAN UONET+ register client for both students and their par ## Features -* logging in using the email and password OR using token and pin +* logging in using the email and password * functions from the register website: * grades * grade statistics @@ -25,15 +25,19 @@ Unofficial android VULCAN UONET+ register client for both students and their par * homework * notes * lucky number + * additional lessons + * school conferences + * student and school information * calculation of the average independently of school's preferences * notifications, e.g. about a new grade +* support for multiple accounts with the ability to rename students * dark and black (AMOLED) theme * offline mode * no ads ## Download -You can download the current beta version from the Google Play, F-Droid or Huawei AppGallery store +You can download the current version from the Google Play, F-Droid or Huawei AppGallery store [Get it on Google Play Date: Sat, 13 Feb 2021 11:58:01 +0100 Subject: [PATCH 0316/1526] Revert "Bump fragment-ktx from 1.2.5 to 1.3.0 (#1138)" (#1144) This reverts commit cac76857c4cd2b5b72e515888edf94fed6e1390e. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 8e206f9d3..d89cc2d5f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -153,7 +153,7 @@ dependencies { implementation "androidx.activity:activity-ktx:1.1.0" implementation "androidx.appcompat:appcompat:1.2.0" implementation "androidx.appcompat:appcompat-resources:1.2.0" - implementation "androidx.fragment:fragment-ktx:1.3.0" + implementation "androidx.fragment:fragment-ktx:1.2.5" implementation "androidx.annotation:annotation:1.1.0" implementation "androidx.multidex:multidex:2.0.1" From 5e3b89636fc3cb9c83720738549f9f493196f4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 13 Feb 2021 12:33:53 +0100 Subject: [PATCH 0317/1526] Add checking vulcan average from both semesters (#1140) --- .../ui/modules/grade/GradeAverageProvider.kt | 35 +++++++++++-------- .../modules/grade/GradeAverageProviderTest.kt | 13 +++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index 36c3c4f87..7e9b56b94 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -86,7 +86,11 @@ class GradeAverageProvider @Inject constructor( return@combine firstSemesterGradeSubject } - val isAnyAverage = secondSemesterGradeSubject.data.orEmpty().any { it.average != .0 } + val isAnyVulcanAverageInFirstSemester = + firstSemesterGradeSubject.data.orEmpty().any { it.average != .0 } + val isAnyVulcanAverageInSecondSemester = + secondSemesterGradeSubject.data.orEmpty().any { it.average != .0 } + val updatedData = secondSemesterGradeSubject.data?.map { secondSemesterSubject -> val firstSemesterSubject = firstSemesterGradeSubject.data.orEmpty() .singleOrNull { it.subject == secondSemesterSubject.subject } @@ -94,7 +98,7 @@ class GradeAverageProvider @Inject constructor( val updatedAverage = if (averageMode == ALL_YEAR) { calculateAllYearAverage( student = student, - isAnyAverage = isAnyAverage, + isAnyVulcanAverage = isAnyVulcanAverageInFirstSemester || isAnyVulcanAverageInSecondSemester, gradeAverageForceCalc = gradeAverageForceCalc, secondSemesterSubject = secondSemesterSubject, firstSemesterSubject = firstSemesterSubject @@ -102,7 +106,7 @@ class GradeAverageProvider @Inject constructor( } else { calculateBothSemestersAverage( student = student, - isAnyAverage = isAnyAverage, + isAnyVulcanAverage = isAnyVulcanAverageInFirstSemester || isAnyVulcanAverageInSecondSemester, gradeAverageForceCalc = gradeAverageForceCalc, secondSemesterSubject = secondSemesterSubject, firstSemesterSubject = firstSemesterSubject @@ -116,11 +120,11 @@ class GradeAverageProvider @Inject constructor( private fun calculateAllYearAverage( student: Student, - isAnyAverage: Boolean, + isAnyVulcanAverage: Boolean, gradeAverageForceCalc: Boolean, secondSemesterSubject: GradeSubject, firstSemesterSubject: GradeSubject? - ) = if (!isAnyAverage || gradeAverageForceCalc) { + ) = if (!isAnyVulcanAverage || gradeAverageForceCalc) { val updatedSecondSemesterGrades = secondSemesterSubject.grades.updateModifiers(student) val updatedFirstSemesterGrades = @@ -133,20 +137,23 @@ class GradeAverageProvider @Inject constructor( private fun calculateBothSemestersAverage( student: Student, - isAnyAverage: Boolean, + isAnyVulcanAverage: Boolean, gradeAverageForceCalc: Boolean, secondSemesterSubject: GradeSubject, firstSemesterSubject: GradeSubject? - ) = if (!isAnyAverage || gradeAverageForceCalc) { - val secondSemesterAverage = - secondSemesterSubject.grades.updateModifiers(student).calcAverage() - val firstSemesterAverage = firstSemesterSubject?.grades?.updateModifiers(student) - ?.calcAverage() ?: secondSemesterAverage + ): Double { val divider = if (secondSemesterSubject.grades.any { it.weightValue > .0 }) 2 else 1 - (secondSemesterAverage + firstSemesterAverage) / divider - } else { - (secondSemesterSubject.average + (firstSemesterSubject?.average ?: secondSemesterSubject.average)) / 2 + return if (!isAnyVulcanAverage || gradeAverageForceCalc) { + val secondSemesterAverage = + secondSemesterSubject.grades.updateModifiers(student).calcAverage() + val firstSemesterAverage = firstSemesterSubject?.grades?.updateModifiers(student) + ?.calcAverage() ?: secondSemesterAverage + + (secondSemesterAverage + firstSemesterAverage) / divider + } else { + (secondSemesterSubject.average + (firstSemesterSubject?.average ?: secondSemesterSubject.average)) / divider + } } private fun getGradeSubjects( diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index 0da02cf52..f3d92d2ee 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -198,6 +198,19 @@ class GradeAverageProviderTest { assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) } + @Test + fun `calc both semesters average with no grade in second semester but with average in first semester`() { + every { preferencesRepository.gradeAverageForceCalc } returns false + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS + + coEvery { gradeRepository.getGrades(student, semesters[1], false) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier } + coEvery { gradeRepository.getGrades(student, semesters[2], false) } returns flowWithResource { emptyList() to listOf(getSummary(24, "Język polski", .0))} + + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, false).getResult() } + + assertEquals(3.49, items.single { it.subject == "Język polski" }.average, .0) + } + @Test fun `force calc average on no grades`() { every { preferencesRepository.gradeAverageForceCalc } returns true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1c4bcc29e..25d326531 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 000cbd11a2247b63308d8be93b66ff4d03b22aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 13 Feb 2021 20:39:52 +0100 Subject: [PATCH 0318/1526] Fix EOF error in messages (#1145) --- .../34.json | 2142 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 6 +- .../data/db/migrations/Migration34.kt | 13 + 3 files changed, 2159 insertions(+), 2 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/34.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration34.kt diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/34.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/34.json new file mode 100644 index 000000000..6a56ac64e --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/34.json @@ -0,0 +1,2142 @@ +{ + "formatVersion": 1, + "database": { + "version": 34, + "identityHash": "c024cc4e19e009a03303e2bfe5c34b48", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `scrapper_base_url` TEXT NOT NULL, `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "semester_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `unread_by` INTEGER NOT NULL, `read_by` INTEGER NOT NULL, `content` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `recipient_name` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `removed` INTEGER NOT NULL, `has_attachments` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "recipient", + "columnName": "recipient_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "removed", + "columnName": "removed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `one_drive_id` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`real_id`))", + "fields": [ + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "oneDriveId", + "columnName": "one_drive_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "real_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ReportingUnits", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `short` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `roles` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "senderName", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roles", + "columnName": "roles", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `real_id` TEXT NOT NULL, `name` TEXT NOT NULL, `real_name` TEXT NOT NULL, `login_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `role` INTEGER NOT NULL, `hash` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "realName", + "columnName": "real_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginId", + "columnName": "login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "role", + "columnName": "role", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hash", + "columnName": "hash", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c024cc4e19e009a03303e2bfe5c34b48')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index beec3ff70..ab89b84cb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -85,6 +85,7 @@ import io.github.wulkanowy.data.db.migrations.Migration30 import io.github.wulkanowy.data.db.migrations.Migration31 import io.github.wulkanowy.data.db.migrations.Migration32 import io.github.wulkanowy.data.db.migrations.Migration33 +import io.github.wulkanowy.data.db.migrations.Migration34 import io.github.wulkanowy.data.db.migrations.Migration4 import io.github.wulkanowy.data.db.migrations.Migration5 import io.github.wulkanowy.data.db.migrations.Migration6 @@ -130,7 +131,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 33 + const val VERSION_SCHEMA = 34 fun getMigrations(sharedPrefProvider: SharedPrefProvider): Array { return arrayOf( @@ -165,7 +166,8 @@ abstract class AppDatabase : RoomDatabase() { Migration30(), Migration31(), Migration32(), - Migration33() + Migration33(), + Migration34() ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration34.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration34.kt new file mode 100644 index 000000000..2c57eb00a --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration34.kt @@ -0,0 +1,13 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +class Migration34 : Migration(33, 34) { + + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("DELETE FROM ReportingUnits") + database.execSQL("DELETE FROM Recipients") + } +} + From de8e9bde498714579d8cb11066c839addb568daf Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 14 Feb 2021 12:13:21 +0000 Subject: [PATCH 0319/1526] Bump mockk from 1.10.5 to 1.10.6 (#1149) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d89cc2d5f..b1501b223 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -137,7 +137,7 @@ ext { work_hilt = "1.0.0-alpha03" room = "2.3.0-beta01" chucker = "3.4.0" - mockk = "1.10.5" + mockk = "1.10.6" moshi = "1.11.0" } From c18302b81295d743f9d275dc9a19c5e3b419274f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 14 Feb 2021 12:14:28 +0000 Subject: [PATCH 0320/1526] Bump junit from 4.13.1 to 4.13.2 (#1150) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b1501b223..6d4f40dd2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -214,7 +214,7 @@ dependencies { debugImplementation "com.github.ChuckerTeam.Chucker:library:$chucker" debugImplementation "com.amitshekhar.android:debug-db:1.0.6" - testImplementation "junit:junit:4.13.1" + testImplementation "junit:junit:4.13.2" testImplementation "io.mockk:mockk:$mockk" testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.2' testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" From 17aa77ad41d92311e507373ff7c5c8fd043e57a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 16 Feb 2021 12:12:35 +0100 Subject: [PATCH 0321/1526] New Crowdin updates (#1152) --- .../res/values-cs-rCZ/preferences_values.xml | 6 +- app/src/main/res/values-cs-rCZ/strings.xml | 138 ++--- app/src/main/res/values-de/strings.xml | 8 +- app/src/main/res/values-pl/strings.xml | 2 +- .../res/values-sk-rSK/preferences_values.xml | 6 +- app/src/main/res/values-sk-rSK/strings.xml | 506 +++++++++--------- 6 files changed, 333 insertions(+), 333 deletions(-) diff --git a/app/src/main/res/values-cs-rCZ/preferences_values.xml b/app/src/main/res/values-cs-rCZ/preferences_values.xml index bcb690e54..e70abcb16 100644 --- a/app/src/main/res/values-cs-rCZ/preferences_values.xml +++ b/app/src/main/res/values-cs-rCZ/preferences_values.xml @@ -45,8 +45,8 @@ Průměr známek z celého roku - Neukaž - Ukázat vše - Ukázat menší + Nezobrazovat + Zobrazit vše + Zobrazit menší diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 874dbe287..02ee382a0 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -19,7 +19,7 @@ Domácí úkoly Manažer účtů Vyberte účet - Detaily účtu + Podrobnosti účtu Informace o žáku Semestr %1$d, %2$d/%3$d @@ -43,17 +43,17 @@ Přihlašovací údaje jsou nesprávné. Ujistěte se, že je v poli níže vybrána správná variace deníku UONET+ Neplatný PIN Neplatný token - Platnost tokenu vypršela + Token vypršel Neplatný e-mail Místo e-mailu použijte přiřazené přihlašovací údaje Neplatný symbol Žák nebyl nalezen. Zkontrolujte správnost symbolu a vybrané varianty deníku UONET+ Toto pole je povinné - Vybraný žák je již přihlášen - Symbol najdete na stránce deníku v  Uczeń →  Dostęp Mobilny →  Zarejestruj urządzenie mobilne.\n\nUjistěte se, že jste na předchozí obrazovce nastavili správnou variantu deníku do pole Variace deníku UONET+. Wulkanowy v tuto chvíli nezjistí předškolní studenty + Vybraný žák je už přihlášen + Symbol najdete na stránce deníku v  Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne.\n\nUjistěte se, že jste na předchozí obrazovce nastavili správnou variantu deníku do pole Variace deníku UONET+. Wulkanowy v tuto chvíli nezjistí předškolní żaków Vyberte žáky, kteří se mají do aplikace přihlásit Jiné možnosti - V tomto režimu nefungují následující: šťastné číslo, statistiky třídy, shrnutí docházky, ospravedlnění nepřítomnosti, absolvované lekce, informace o škole a prohlížení seznamu registrovaných zařízení + V tomto režimu nefungují následující: šťastné číslo, statistiky třídy, shrnutí docházky, ospravedlnění nepřítomnosti, dokončené lekce, informace o škole a prohlížení seznamu registrovaných zařízení Tento režim zobrazuje stejná data, která se zobrazují na webových stránkách deníka Kombinace nejlepších vlastností ostatních dvou režimů. Funguje rychleji než scraper a poskytuje funkce, které nejsou k dispozici v režimu Mobile API. Je to v experimentální fázi Zásady ochrany osobních údajů @@ -66,12 +66,12 @@ Zapomněl jsem své heslo Obnovte svůj účet Obnovit - Žák je již přihlášen + Žák je už přihlášen Manažer účtů Přihlásit se - Platnost relace vypršela - Vaše relace vypršela, přihlaste se prosím znovu + Relace vypršela + Relace vypršela. Přihlaste se prosím znovu Známka Semestr %d @@ -85,7 +85,7 @@ Průměr: %1$.2f Body: %s Bez průměru - Předpovězeno: %1$s + Předpokládaná: %1$s Konečná: %1$s Součet bodů Konečná známka @@ -129,20 +129,20 @@ Máte %1$d novou známku Máte %1$d nové známky - Máte %1$d nové známky - Máte %1$d nové známky + Máte %1$d nových známek + Máte %1$d nových známek Máte %1$d novou předpokládanou známku Máte %1$d nové předpokládané známky - Máte %1$d nové předpokládané známky - Máte %1$d nové předpokládané známky + Máte %1$d nových předpokládaných známek + Máte %1$d nových předpokládaných známek Máte %1$d novou konečnou známku Máte %1$d nové konečné známky - Máte %1$d nové konečné známky - Máte %1$d nové konečné známky + Máte %1$d nových konečných známek + Máte %1$d nových konečných známek Lekce @@ -153,11 +153,11 @@ Žádné lekce tento den %s min %s sek - dosud %1$s + ještě %1$s za %1$s - Lekce skončila - Nyní: %s - Okamžik: %s + Ukončila + Teď: %s + Za chvíli: %s Později: %s Dokončené lekce @@ -172,14 +172,14 @@ Žádné informace o dalších lekcích Shrnutí docházky - Nepřítomen ze školních důvodů + Neprítomnosť zo školských dôvodov Omluvená nepřítomnost Neomluvená nepřítomnost Osvobození Omluvené zpoždění Neomluvené zpoždění Přítomnost - Smazáno + Odstraněno Neznámý Číslo lekce Žádné položky @@ -205,7 +205,7 @@ Doručená pošta Odesláno Koš - (žádné téma) + (žádný předmět) Žádné zprávy Při stahování obsahu zprávy došlo k chybě Od: @@ -213,13 +213,13 @@ Datum: %s Odpověď Poslat dále - Vymazat + Odstranit Přesunout do koše - Trvale smazat - Zpráva byla úspěšně smazána - Podíl + Odstranit natrvalo + Zpráva byla úspěšně odstraněna + Sdílet Vytisknout - Téma + Předmět Obsah Zpráva úspěšně odeslána Zpráva neexistuje @@ -240,8 +240,8 @@ Máte %1$d novou zprávu Máte %1$d nové zprávy - Máte %1$d nové zprávy - Máte %1$d nové zprávy + Máte %1$d nových zpráv + Máte %1$d nových zpráv Žádné informace o poznámkách @@ -249,8 +249,8 @@ %d poznámka %d poznámky - %d poznámky - %d poznámky + %d poznámek + %d poznámek Nová poznámka @@ -261,15 +261,15 @@ Máte %1$d novou poznámku Máte %1$d nové poznámky - Máte %1$d nové poznámky - Máte %1$d nové poznámky + Máte %1$d nových poznámek + Máte %1$d nových poznámek %d chvála %d chvály - %d chvály - %d chvály + %d chvál + %d chvál Nová chvála @@ -280,8 +280,8 @@ Máte %1$d novou chválu Máte %1$d nové chvály - Máte %1$d nové chvály - Máte %1$d nové chvály + Máte %1$d nových chvál + Máte %1$d nových chvál @@ -297,10 +297,10 @@ Nové neutrální poznámky - Máte %1$d novou neutrální pozornost - Máte %1$d nové neutrální pozornosti - Máte %1$d nové neutrální pozornosti - Máte %1$d nové neutrální pozornosti + Máte %1$d novou neutrální poznámku + Máte %1$d nové neutrální poznámky + Máte %1$d nových neutrální poznámek + Máte %1$d nových neutrální poznámek Žádné informace o domácích úkolech @@ -317,7 +317,7 @@ Mobilní přístup Žádná zařízení Zrušit registraci - Zařízení odstraněno + Zařízení odstranění QR kód Token Symbol @@ -333,17 +333,17 @@ Jméno ředitele Jméno pedagoga Zobrazit na mapě - Volání + Volat Učitelé Žádné informace o učitelích Žádný předmět Setkání - Žádné informace o setkání + Žádné informace o setkáních Přidat účet - Odhlásit se + Odhlásit Chcete se odhlásit z aktivního žáka? Odhlášení žáků Žákův účet @@ -360,19 +360,19 @@ Verze aplikace Tvůrci - Seznam vývojářů Wulkanowy + Seznam vývojářů Wulkanového Nahlásit chybu Odeslat zprávu o chybě e-mailem FAQ Přečtěte si často kladené otázky Server Discord - Připojte se ke komunitě Wulkanowy + Připojte se ke komunitě Wulkanového Facebooková fanpage Stejně jako naše facebooková fanpage Zásady ochrany osobních údajů Pravidla pro shromažďování osobních údajů Domovská stránka - Navštivte web a pomozte s vývojem aplikace + Navštivte stránku a pomozte s vývojem aplikace Licence Licence knihoven použitých v aplikaci @@ -405,21 +405,21 @@ Přezdívka Přidat přezdívku - Sdílejte protokoly + Sdílet protokoly Obnovit Zkontrolovat aktualizace Před hlášením chyby zkontrolujte, zda je k dispozici aktualizace s opravou chyb Obsah - Zkuste to znovu + Zkusit znovu Popis - Bez popisu + Žádný popis Učitel Datum Datum vstupu Barva - Detaily + Podrobnosti Kategorie Zavřít Žádná data @@ -445,27 +445,27 @@ Zobrazit přítomnost v docházce Motiv aplikace Rozbalit známky - Označte aktuální lekci v plánu lekce - Ukázat skupiny vedle předmětů v plánu lekce - Ukázat seznam grafů ve třídních známkách - Ukázat lekce pro celou třídu - Ukázat předměty bez známek v \"Známky\" + Označit aktuální lekci v plánu lekce + Zobrazit skupiny vedle předmětů v plánu lekce + Zobrazit seznam grafů v známkách třídy + Zobrazit lekce pro celou třídu + Zobrazit předměty bez známek v \"Známky\" Známky barevné schéma - Předměty seřazené v \"Známky\" + Třídění předmětů v \"Známky\" Jazyk aplikace - Oznámení - Ukázat oznámení - Ukázat nadcházející oznámení o lekci + Upozornění + Zobrazit upozornění + Zobrazit upozornění o nadcházející lekci Opravte problémy se synchronizací a upozorněním - Ve vašem zařízení mohou nastat problémy se synchronizací dat a oznámenímii.\n\nChcete-li je opravit, přidejte Wulkanowy do funkce Autostart a vypněte optimalizaci/úsporu baterie v nastavení systému telefonu. + Vaše zařízení může mít problémy se synchronizací dat as upozorněními.\n\nChcete-li je opravit, přidejte Wulkanového do funkce Autostart a vypněte optimalizaci/úsporu baterie v nastavení systému telefonu. Přejít do nastavení - Ukázat oznámení o ladění + Zobrazit upozornění o ladění Synchronizace Automatická aktualizace Pozastaveno na dovolené Interval aktualizací Pouze Wi-Fi - Synchronizovat nyní + Synchronizovat teď Synchronizováno! Synchronizace selhala Probíhá synchronizace @@ -478,14 +478,14 @@ Hodnota mínusu Odpovědět s historií zpráv - Nové položky v deník + Nové položky v deníku Nové známky Šťastné číslo Nové zprávy Nové poznámky - Push oznámení + Push upozornění Nadcházející lekce - Debug + Ladění Černý Červený @@ -509,7 +509,7 @@ Probíhá údržba UONET+ deník. Zkuste to později znovu Neznámá chyba denika UONET+. Prosím zkuste to znovu později Neznámá chyba aplikace. Prosím zkuste to znovu později - Došlo k neočekávané chybě - Funkce deaktivována vaší školou + Vyskytla se neočekávaná chyba + Funkce je deaktivována přes vaší školou Funkce není k dispozici. Přihlaste se v jiném režimu než Mobile API diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1acbdacbf..0cf67fa46 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -383,7 +383,7 @@ Kategorie Schließ Keine Daten - Thema + Schulfach Zurück Nächste Suchen @@ -406,12 +406,12 @@ Thema der Anwendung Noten erweitern Aktuelle Lektion im Stundenplan markieren - Zeige Gruppen neben Themen im Zeitplan + Gruppen neben Schulfächer im Zeitplan anzeigen Liste der Diagramme in Klassenbewertungen anzeigen Unterricht der ganzen Klasse anzeigen - Zeigen Sie Themen ohne Noten in Noten + Schulfächer ohne Noten in \"Noten\" anzeigen Farbschema der Noten - Themen sortieren in \"Noten\" + Schulfächer sortieren in \"Noten\" App Sprache Benachrichtigungen Benachrichtigungen anzeigen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 52134613d..f45886b77 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -451,7 +451,7 @@ Pokazuj lekcje całej klasy Pokazuj przedmioty bez ocen w Ocenach Schemat kolorów ocen - Sortowanie przedmiotów w Ocenach + Sortowanie przedmiotów w \"Oceny\" Język aplikacji Powiadomienia Pokazuj powiadomienia diff --git a/app/src/main/res/values-sk-rSK/preferences_values.xml b/app/src/main/res/values-sk-rSK/preferences_values.xml index d57e603b1..3275166dc 100644 --- a/app/src/main/res/values-sk-rSK/preferences_values.xml +++ b/app/src/main/res/values-sk-rSK/preferences_values.xml @@ -45,8 +45,8 @@ Priemer známok z celého roka - Neukaz - Zobrazit vše - Zobrazit menší + Nezobrazovať + Zobraziť všetko + Zobraziť menšie diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 5ac7dcfc1..f0b8591af 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -11,7 +11,7 @@ Viac O aplikácii Prehliadač protokolov - Tvorcovia + Prispievatelia Licencie Správy Nová správa @@ -19,7 +19,7 @@ Domáce úlohy Manažér účtov Vyberte účet - Detaily účtu + Podrobnosti účtu Informácie o žiakovi Semester %1$d, %2$d/%3$d @@ -50,12 +50,12 @@ Žiak nebol nájdený. Skontrolujte správnosť symbolu a vybrané varianty denníka UONET+ Toto pole je povinné Vybraný žiak už je prihlásený - The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the previous screen. Wulkanowy does not detect pre-school students at the moment + Symbol nájdete na stránke denníka v  Uczeń→ Dostęp Mobilny → Zarejestruj urządzenie mobilne.\n\nUistite sa, že ste na predchádzajúcu obrazovke nastaviť správny variant denníka do poľa Variácie denníka UONET+. Wulkanowy v túto chvíľu nezistí predškolské żaków Vyberte žiakov, ktorí sa majú do aplikácie prihlásiť Iné možnosti - In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices - This mode displays the same data as it appears on the register website - The combination of the best features of the other two modes. It works faster than scraper and provides features not available in the Mobile API mode. It is in the experimental phase + V tomto režime nefungujú nasledovné: šťastné číslo, štatistiky triedy, zhrnutie dochádzky, ospravedlnenie neprítomnosti, dokončené lekcie, informácie o škole a prezeranie zoznamu registrovaných zariadení + Tento režim zobrazuje rovnaké dáta, ktoré sa zobrazujú na webových stránkach denníka + Kombinácia najlepších vlastností ostatných dvoch režimov. Funguje rýchlejšie ako scraper a poskytuje funkcie, ktoré nie sú k dispozícii v režime Mobilne API. Je to v experimentálnej fáze Zásady ochrany osobných údajov Problémy s prihlásením? Napíšte nám! Email @@ -66,12 +66,12 @@ Zabudol som heslo Obnovte svoj účet Obnoviť - Študent je už prihlásený + Žiak je už prihlásený Manažér účtov Prihlásiť sa - Platnosť relácie vypršala - Vaša relácia vypršala, prihláste sa prosím znovu + Relácia vypršala + Relácia vypršala. Prihláste sa prosím znovu Známka Semester %d @@ -85,7 +85,7 @@ Priemer: %1$.2f Body: %s Bez priemeru - Predpovedané: %1$s + Predpokladaná: %1$s Konečná: %1$s Súčet bodov Konečná známka @@ -98,7 +98,7 @@ Čiastočné Semester Body - Legenda + Vysvetlivky Priemer: %1$s Trieda Žiák @@ -140,9 +140,9 @@ Máte %1$d novú konečnú známku - You received %1$d final grades - You received %1$d final grades - You received %1$d final grades + Máte %1$d nové konečnej známky + Máte %1$d nových konečných známok + Máte %1$d nových konečných známok Lekcia @@ -153,14 +153,14 @@ Žiadne lekcie tento deň %s min %s sek - %1$s left - in %1$s - Lekcia skončila - Now: %s - Next: %s - Later: %s + ešte %1$s + za %1$s + Ukončila + Teraz: %s + Za chvíľu: %s + Neskôr: %s - Completed lessons + Dokončené lekcie Zobraziť dokončené lekcie Žiadne informácie o dokončených lekciách Téma @@ -172,59 +172,59 @@ Žiadne informácie o ďalších lekciách Zhrnutie dochádzky - Absent for school reasons - Excused absence - Unexcused absence - Exemption - Excused lateness - Unexcused lateness + Neprítomnosť zo školských dôvodov + Ospravedlnená neprítomnosť + Neospravedlnená neprítomnosť + Oslobodenie + Ospravedlnenie meškanie + Neospravedlnenie meškanie Prítomnosť - Deleted + Odstránené Neznámy - Number of lesson + Číslo lekcie Žiadne položky - %1$d absence - %1$d absences - %1$d absences - %1$d absences + %1$d neprítomnosť + %1$d neprítomnosti + %1$d neprítomnosti + %1$d neprítomnosti - Absence reason (optional) + Dôvod neprítomnosti (voliteľný) Poslať - Absence excused successfully! - You must select at least one absence! + Neprítomnosť úspešne ospravedlnená! + Musíte vybrať aspoň jednu neprítomnosť! Ospravedlniť - Attendance - Total + Dochádzka + Spoločne - No exams this week + Tento týždeň žiadne testy Typ - Entry date + Dátum vstupu - Inbox + Doručená pošta Odoslané Kôš - (no subject) + (žiadny predmet) Žiadne správy - An error occurred while downloading message content - From: - To: - Date: %s + Pri sťahovaní obsahu správy došlo k chybe + Od: + Komu: + Dátum: %s Odpoveď Poslať ďalej - Vymazať + Odstrániť Presunúť do koša - Delete permanently - Message deleted successfully - Share - Print - Subject + Odstrániť natrvalo + Správa bola úspešne odstránená + Zdieľať + Vytlačiť + Predmet Obsah Správa úspešne odoslaná Správa neexistuje - You need to choose at least 1 recipient - The message content must be at least 3 characters + Musíte vybrať aspoň 1 príjemca + Obsah správy musí mať aspoň 3 znaky %d správa %d správy @@ -238,254 +238,254 @@ Nové správy - You received %1$d message - You received %1$d messages - You received %1$d messages - You received %1$d messages + Máte %1$d novú správu + Máte %1$d nové správy + Máte %1$d nových správ + Máte %1$d nových správ - No info about notes - Points + Žiadne informácie o poznámkach + Body - %d note - %d notes - %d notes - %d notes + %d poznámka + %d poznámky + %d poznámok + %d poznámok - New note - New notes - New notes - New notes + Nová poznámka + Nové poznámky + Nové poznámky + Nové poznámky - You received %1$d note - You received %1$d notes - You received %1$d notes - You received %1$d notes + Máte %1$d novú poznámku + Máte %1$d nové poznámky + Máte %1$d nových poznámok + Máte %1$d nových poznámok - %d praise - %d praises - %d praises - %d praises + %d chvála + %d chvály + %d chvál + %d chvál - New praise - New praises - New praises - New praises + Nová chvála + Nové chvály + Nové chvály + Nové chvály - You received %1$d praise - You received %1$d praises - You received %1$d praises - You received %1$d praises + Máte %1$d novú chválu + Máte %1$d nové chvály + Máte %1$d nových chvál + Máte %1$d nových chvál - %d neutral note - %d neutral notes - %d neutral notes - %d neutral notes + %d neutrálny poznámka + %d neutrálne poznámky + %d neutrálne poznámky + %d neutrálne poznámky - New neutral note - New neutral notes - New neutral notes - New neutral notes + Nová neutrálny poznámka + Nové neutrálne poznámky + Nové neutrálne poznámky + Nové neutrálne poznámky - You received %1$d neutral note - You received %1$d neutral notes - You received %1$d neutral notes - You received %1$d neutral notes + Máte %1$d novú neutrálny poznámku + Máte %1$d nové neutrálne poznámky + Máte %1$d nových neutrálne poznámok + Máte %1$d nových neutrálne poznámok - No info about homework - Mark as done - Mark as undone - Attachments + Žiadne informácie o domácich úlohách + Označiť ako hotové + Nevyrobené + Prílohy - Lucky number - Today\'s lucky number is - No info about the lucky number - Lucky number for today - Today\'s lucky number is: %d + Šťastné číslo + Dnešné šťastné číslo je + Žiadne informácie o šťastnom čísle + Šťastné číslo pre dnešok + Dnes je šťastným číslom: %d - Mobile devices - No devices - Deregister - Device removed + Mobilný prístup + Žiadne zariadenia + Zrušiť registráciu + Zariadenie odstránenie QR kód Token Symbol PIN - School and teachers + Škola a učitelia Škola - No info about school + Žiadne informácie o škole Názov školy Adresa školy Telefón - Name of headmaster - Name of pedagogue - Show on map - Call + Meno riaditeľa + Meno pedagóga + Zobraziť na mape + Volať - Teachers - No info about teachers - No subject + Učitelia + Žiadne informácie o učiteľoch + Žiadny predmet - Conferences - No info about conferences + Stretnutie + Žiadne informácie o stretnutiach - Add account - Logout - Do you want to log out this student? - Student logout - Student account - Parent account - Mobile API mode - Hybrid mode - Edit data - Accounts manager - Select student - Family - Contact - Residence details - Personal information + Pridať účet + Odhlásiť + Chcete sa odhlásiť z aktívneho žiaka? + Odhlásenie žiakov + Zakov účet + Rodičovský účet + Režim Mobilného API + Hybridný režim + Upraviť dáta + Manažér účtov + Vyberte žiaka + Rodina + Kontakt + Údaje o adresách + Osobné údaje - App version - Contributors - List of Wulkanowy developers + Verzia aplikácie + Prispievatelia + Zoznam vývojárov Wulkanového Nahlásiť chybu - Send a bug report via e-mail + Odoslať správu o chybe e-mailom FAQ - Read Frequently Asked Questions + Prečítajte si často kladené otázky Server Discord - Join the Wulkanowy community - Facebook fanpage - Like our facebook fanpage - Privacy policy - Rules for collecting personal data - Homepage - Visit the website and help develop the application - Licenses - Licenses of libraries used in the application + Pripojte sa ku komunite Wulkanového + Facebooková fanpage + Rovnako ako naše facebooková fanpage + Zásady ochrany osobných údajov + Pravidlá pre zhromažďovanie osobných údajov + Domovská stránka + Navštívte stránku a pomôžte s vývojom aplikácie + Licencie + Licencia knižníc použitých v aplikácii - License + Licencia Avatar - See more on GitHub + Zobraziť viac na GitHub - No info about student or student family - Name - Second name - Gender - Polish citizenship - Family name - Mother\'s and father\'s names - Phone - Cellphone + Žiadne informácie o žiakov alebo rodine žiaka + Meno + Druhé meno + Pohlavie + Poľské občianstvo + Rodinné meno + Mená matky a otca + Telefón + Mobilný telefón E-mail - Address of residence - Address of registration - Correspondence address - Surname and first name - Degree of kinship - Address - Phones + Adresa bydliska + Registrovaná adresa + Korešpondenčná adresa + Priezvisko a meno + Stupeň príbuznosti + Adresa + Telefóny Muž Žena - Last name + Priezvisko - Nick - Add nick + Prezývka + Pridať prezývku - Share logs - Refresh + Zdieľať protokoly + Obnoviť - Check for updates - Before reporting a bug, check first if an update with the bug fix is available + Skontrolovať aktualizácie + Pred hlásením chyby skontrolujte, či je k dispozícii aktualizácia s opravou chýb - Content - Retry - Description - No description - Teacher + Obsah + Skúsiť znova + Popis + Žiadny popis + Učiteľ Dátum - Entry date + Dátum vstupu Farba - Details - Category + Podrobnosti + Kategória Zavrieť - No data - Subject - Prev - Next - Search - Search… - Yes - No - Save + Žiadne údaje + Predmet + Vráť + Ďalej + Hľadať + Hledať… + Áno + Nie + Uložiť - No lessons - Choose theme - Light - Dark - System Theme + Žiadne lekcie + Vybrať motív + Svetlý + Tmavý + Motív systému - Appearance - Default view - Calculation of the end-of-year average - Force average calculation by app - Show presence in attendance - Application theme - Expand grades - Mark current lesson in timetable - Show groups next to subjects in timetable - Show chart list in class grades - Show whole class lessons - Show subjects without grades in Grades - Grades color scheme - Subjects sorting in \"Grades\" - App language - Oznámenia + Vzhľad + Predvolené zobrazenie + Výpočet koncoročního priemeru + Vynútiť priemerný výpočet podľa aplikácie + Zobraziť prítomnosť v dochádzke + Motív aplikácie + Rozbaliť známky + Označiť aktuálne lekciu v pláne lekcie + Zobraziť skupiny vedľa predmetov v pláne lekcie + Zobraziť zoznam grafov v známkach triedy + Zobraziť lekcie pre celú triedu + Zobraziť predmety bez známok v \"Známky\" + Známky farebnú schému + Triedenie predmetov v \"Známky\" + Jazyk aplikácie + Upozornenia Zobraziť upozornenia - Show upcoming lesson notifications - Fix synchronization & notifications issues - Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. - Go to settings - Show debug notifications - Synchronization - Automatic update - Suspended on holidays - Updates interval - Wi-Fi only - Sync now - Synced! - Sync failed - Sync in progress - Synchronization - Manual sync doesn\'t refresh app views. - \nTo see the synced data relaunch the app after syncing. + Zobraziť upozornenia o nadchádzajúcej lekciu + Opravte problémy so synchronizáciou a upozornením + Vaše zariadenie môže mať problémy so synchronizáciou dát as upozorneniami.\n\nAk ich chcete opraviť, pridajte Wulkanového do funkcie Autostart a vypnite optimalizáciu/úsporu batérie v nastavení systému telefóne. + Prejsť do nastavení + Zobraziť upozornenia o ladení + Synchronizácia + Automatická aktualizácia + Pozastavený počas dovolenky + Interval aktualizácií + Iba Wi-Fi + Synchronizovať teraz + Synchronizovano! + Synchronizácia zlyhala + Prebieha synchronizácia + Synchronizácia + Ručná synchronizácia neobnoví zobrazenie aplikácie. + \nAk chcete zobraziť synchronizované údaje, reštartujte aplikáciu po synchronizácii. Iné - Value of the plus - Value of the minus - Reply with message history + Hodnota plusu + Hodnota mínusu + Odpovedať s históriou správ - New entries in register - New grades - Lucky number - New messages - New notes - Push notifications - Upcoming lessons - Debug + Nové položky v denníku + Nové známky + Šťastné číslo + Nové správy + Nové poznámky + Push upozornenia + Nadchádzajúce lekcie + Ladenie Čierny Červený @@ -495,21 +495,21 @@ Žiadna farba Skopírované - Undo + Vrátiť - Download of updates has started… - An update has just been downloaded. + Sťahovanie aktualizácií začalo… + Aktualizácia bola stiahnutá. Reštartovať - Update failed! Wulkanowy may not function properly. Consider updating + Aktualizácia zlyhala! Wulkanowy nemusí fungovať správne. Zvážte aktualizáciu Žiadne internetové pripojenie - Connection to register failed. Servers can be overloaded. Please try again later - Loading data failed. Please try again later - Register password change required - Maintenance underway UONET + register. Try again later - Unknown UONET + register error. Try again later - Unknown application error. Please try again later - Došlo k neočakávanej chybe - Funkcia deaktivovaná vašej školou - Feature not available. Login in a mode other than Mobile API + Nedá sa pripojiť ku denníku. Servery môžu byť preťažené. Prosím skúste to znova neskôr + Načítanie údajov zlyhalo. Skúste neskôr prosím + Je vyžadovaná zmena hesla pre denník + Prebieha údržba UONET+ denník. Skúste to neskôr znova + Neznáma chyba dennika UONET+. Prosím skúste to znova neskôr + Neznáma chyba aplikácie. Prosím skúste to znova neskôr + Vyskytla sa neočakávaná chyba + Funkcia je deaktivovaná cez vašou školou + Funkcia nie je k dispozícii. Prihláste sa v inom režime než Mobile API From 44ba0d76de532474b2dbf443dd1f163ab75d1fa4 Mon Sep 17 00:00:00 2001 From: Faierbel Date: Tue, 16 Feb 2021 12:44:24 +0100 Subject: [PATCH 0322/1526] Version 1.0.1 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 10 +++------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6d4f40dd2..f59dff039 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 30 - versionCode 84 - versionName "1.0.0" + versionCode 85 + versionName "1.0.1" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -142,7 +142,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:1.0.0" + implementation "io.github.wulkanowy:sdk:1.0.1" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 1d18f5751..3404b05b8 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,10 +1,6 @@ -Wersja 1.0.0 +Wersja 1.0.1 -Pierwsza produkcyjna wersja Wulkanowego 🎉 - -Dziękujemy wszystkim użytkownikom za testowanie dotychczasowej wersji będącej we wczesnym dostępie -jak i programistom, którzy w wolnych chwilach pomagali rozwijać aplikację i naprawiać znalezione błędy. - -Bez was wszystkich niemożliwe byłoby to dzieło! +- naprawiliśmy błąd podczas wysyłania wiadomości +- poprawiliśmy błędy w tłumaczeniach Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 3c438757e318e0550e99005421a1af17db6b27b0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 17 Feb 2021 11:31:05 +0000 Subject: [PATCH 0323/1526] Bump firebase-bom from 26.4.0 to 26.5.0 (#1151) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f59dff039..3810fd9b4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -197,7 +197,7 @@ dependencies { implementation "io.github.wulkanowy:AppKillerManager:3.0.0" implementation 'me.xdrop:fuzzywuzzy:1.3.1' - playImplementation platform('com.google.firebase:firebase-bom:26.4.0') + playImplementation platform('com.google.firebase:firebase-bom:26.5.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx' playImplementation "com.google.firebase:firebase-inappmessaging-ktx" From 021e9726c6d04f88431d980348872655466a7547 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 17 Feb 2021 11:38:33 +0000 Subject: [PATCH 0324/1526] Bump lifecycle-livedata-ktx from 2.2.0 to 2.3.0 (#1136) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3810fd9b4..889fd923e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -170,7 +170,7 @@ dependencies { implementation "androidx.work:work-runtime-ktx:$work_manager" playImplementation "androidx.work:work-gcm:$work_manager" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0" implementation "androidx.room:room-runtime:$room" implementation "androidx.room:room-ktx:$room" From 1ed0884dfd40d0e8989610d35be74e6b97824084 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 17 Feb 2021 11:38:51 +0000 Subject: [PATCH 0325/1526] Bump hilt_version from 2.31.2-alpha to 2.32-alpha (#1133) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f93399978..56b9504af 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.4.30' about_libraries = '8.8.2' - hilt_version = "2.31.2-alpha" + hilt_version = "2.32-alpha" } repositories { mavenCentral() From a320cf8f7c4c69a33db68abcae645571dae27402 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 17 Feb 2021 11:39:26 +0000 Subject: [PATCH 0326/1526] Bump fragment-ktx from 1.2.5 to 1.3.0 (#1148) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 889fd923e..04f745642 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -153,7 +153,7 @@ dependencies { implementation "androidx.activity:activity-ktx:1.1.0" implementation "androidx.appcompat:appcompat:1.2.0" implementation "androidx.appcompat:appcompat-resources:1.2.0" - implementation "androidx.fragment:fragment-ktx:1.2.5" + implementation "androidx.fragment:fragment-ktx:1.3.0" implementation "androidx.annotation:annotation:1.1.0" implementation "androidx.multidex:multidex:2.0.1" From 3adac154b44c385f4ea3bf0fd158ee480968138a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 17 Feb 2021 11:55:27 +0000 Subject: [PATCH 0327/1526] Bump firebase-crashlytics-gradle from 2.4.1 to 2.5.0 (#1147) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 56b9504af..93cf8ce78 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.5' classpath 'com.huawei.agconnect:agcp:1.5.0.200' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.4.1' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.5.0' classpath "com.github.triplet.gradle:play-publisher:2.8.0" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.1.1" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" From 4fceb854b31536697e490a0cbebb97f18ea3a245 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 17 Feb 2021 12:08:10 +0000 Subject: [PATCH 0328/1526] Bump activity-ktx from 1.1.0 to 1.2.0 (#1134) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 04f745642..82c1f3dbf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -150,7 +150,7 @@ dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2' implementation "androidx.core:core-ktx:1.3.2" - implementation "androidx.activity:activity-ktx:1.1.0" + implementation "androidx.activity:activity-ktx:1.2.0" implementation "androidx.appcompat:appcompat:1.2.0" implementation "androidx.appcompat:appcompat-resources:1.2.0" implementation "androidx.fragment:fragment-ktx:1.3.0" From ff425d6d2bc52217e7ab168db76e21e5c29e9557 Mon Sep 17 00:00:00 2001 From: Damian Czupryn <60961958+Daxxxis@users.noreply.github.com> Date: Thu, 18 Feb 2021 00:05:27 +0100 Subject: [PATCH 0329/1526] Change background color of navigation and notification bars (#1120) --- app/src/main/AndroidManifest.xml | 4 +-- .../github/wulkanowy/ui/base/ThemeManager.kt | 22 ++++++++++--- .../wulkanowy/ui/modules/main/MainActivity.kt | 18 +++++++--- app/src/main/res/values-night/styles.xml | 33 +++++++++++++++++-- app/src/main/res/values-v23/styles.xml | 14 ++++++++ app/src/main/res/values-v26/styles.xml | 15 +++++++++ .../res/{values-v27 => values-v28}/styles.xml | 6 ++-- app/src/main/res/values-v29/styles.xml | 17 ++++++++++ app/src/main/res/values/colors.xml | 5 +++ app/src/main/res/values/styles.xml | 4 +++ 10 files changed, 123 insertions(+), 15 deletions(-) create mode 100644 app/src/main/res/values-v23/styles.xml create mode 100644 app/src/main/res/values-v26/styles.xml rename app/src/main/res/{values-v27 => values-v28}/styles.xml (75%) create mode 100644 app/src/main/res/values-v29/styles.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ac8d3be4a..7b714fb26 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -56,7 +56,7 @@ android:name=".ui.modules.login.LoginActivity" android:configChanges="orientation|screenSize" android:label="@string/login_title" - android:theme="@style/WulkanowyTheme.NoActionBar" + android:theme="@style/WulkanowyTheme.Login" android:windowSoftInputMode="adjustResize" /> activity.setTheme(R.style.WulkanowyTheme_Black) + is LoginActivity -> activity.setTheme(R.style.WulkanowyTheme_Login_Black) + is SendMessageActivity -> activity.setTheme(R.style.WulkanowyTheme_MessageSend_Black) + } + } } } @@ -33,8 +42,13 @@ class ThemeManager @Inject constructor(private val preferencesRepository: Prefer } private fun isThemeApplicable(activity: AppCompatActivity): Boolean { - return activity.packageManager.getPackageInfo(activity.packageName, GET_ACTIVITIES) - .activities.singleOrNull { it.name == activity::class.java.canonicalName }?.theme - .let { it == R.style.WulkanowyTheme_Black || it == R.style.WulkanowyTheme_NoActionBar } + return activity.packageManager + .getPackageInfo(activity.packageName, GET_ACTIVITIES) + .activities.singleOrNull { it.name == activity::class.java.canonicalName } + ?.theme.let { + it == R.style.WulkanowyTheme_Black || it == R.style.WulkanowyTheme_NoActionBar + || it == R.style.WulkanowyTheme_Login || it == R.style.WulkanowyTheme_Login_Black + || it == R.style.WulkanowyTheme_MessageSend || it == R.style.WulkanowyTheme_MessageSend_Black + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 5d93c5944..da3863f4c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -11,6 +11,7 @@ import android.graphics.drawable.Icon import android.os.Build import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.P import android.os.Bundle import android.view.Menu import android.view.MenuItem @@ -194,6 +195,7 @@ class MainActivity : BaseActivity(), MainVie return true } + @SuppressLint("NewApi") override fun initView() { with(binding.mainToolbar) { if (SDK_INT >= LOLLIPOP) stateListAnimator = null @@ -233,12 +235,18 @@ class MainActivity : BaseActivity(), MainVie with(navController) { setOnViewChangeListener { section, name -> - binding.mainBottomNav.visibility = - if (section == MainView.Section.ACCOUNT || section == MainView.Section.STUDENT_INFO) { - View.GONE - } else { - View.VISIBLE + if (section == MainView.Section.ACCOUNT || section == MainView.Section.STUDENT_INFO) { + binding.mainBottomNav.visibility = View.GONE + if (appInfo.systemVersion >= P) { + window.navigationBarColor = getThemeAttrColor(R.attr.colorSurface) } + } else { + binding.mainBottomNav.visibility = View.VISIBLE + if (appInfo.systemVersion >= P) { + window.navigationBarColor = + getThemeAttrColor(android.R.attr.navigationBarColor) + } + } analytics.setCurrentScreen(this@MainActivity, name) presenter.onViewChange(section) diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index bf5cd7697..2641e7134 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -10,14 +10,43 @@ @color/colorSwipeRefreshDark ?colorSurface ?android:textColorPrimary - @android:color/black + + @color/colorNavigationBarLight + + + @color/colorStatusBarLight - @android:color/black false true + false + + + + + + + + diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml new file mode 100644 index 000000000..574e8488d --- /dev/null +++ b/app/src/main/res/values-v23/styles.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-v26/styles.xml b/app/src/main/res/values-v26/styles.xml new file mode 100644 index 000000000..55413c053 --- /dev/null +++ b/app/src/main/res/values-v26/styles.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v28/styles.xml similarity index 75% rename from app/src/main/res/values-v27/styles.xml rename to app/src/main/res/values-v28/styles.xml index d33f64228..ee77091d3 100644 --- a/app/src/main/res/values-v27/styles.xml +++ b/app/src/main/res/values-v28/styles.xml @@ -1,9 +1,10 @@ - + \ No newline at end of file diff --git a/app/src/main/res/values-v29/styles.xml b/app/src/main/res/values-v29/styles.xml new file mode 100644 index 000000000..ee77091d3 --- /dev/null +++ b/app/src/main/res/values-v29/styles.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 994567444..b8a0b0983 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,6 +6,11 @@ #ff5722 #e84853 + #2E2E2E + #1E1E1E + + #1C1C1C + #ffd54f #ff8f00 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index cf587cbf8..17550ae71 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -34,4 +34,8 @@ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b8a0b0983..b2e0dcef1 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,10 +6,11 @@ #ff5722 #e84853 - #2E2E2E + #2D2D2D #1E1E1E #1C1C1C + #0D0D0D #ffd54f #ff8f00 From af8108a649cb2bcbbdc7a7a7bd54c63a9c5695a8 Mon Sep 17 00:00:00 2001 From: MRmlik12 <44818681+MRmlik12@users.noreply.github.com> Date: Sun, 7 Mar 2021 20:17:03 +0100 Subject: [PATCH 0358/1526] Add lucky number history (#1184) --- .../wulkanowy/data/db/dao/LuckyNumberDao.kt | 3 + .../repositories/LuckyNumberRepository.kt | 4 + .../luckynumber/LuckyNumberFragment.kt | 7 + .../ui/modules/luckynumber/LuckyNumberView.kt | 2 + .../history/LuckyNumberHistoryAdapter.kt | 36 +++++ .../history/LuckyNumberHistoryFragment.kt | 134 ++++++++++++++++ .../history/LuckyNumberHistoryPresenter.kt | 151 ++++++++++++++++++ .../history/LuckyNumberHistoryView.kt | 36 +++++ .../main/res/layout/fragment_lucky_number.xml | 20 +++ .../layout/fragment_lucky_number_history.xml | 149 +++++++++++++++++ .../res/layout/item_lucky_number_history.xml | 43 +++++ app/src/main/res/values/strings.xml | 5 + 12 files changed, 590 insertions(+) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryAdapter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryPresenter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryView.kt create mode 100644 app/src/main/res/layout/fragment_lucky_number_history.xml create mode 100644 app/src/main/res/layout/item_lucky_number_history.xml diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt index 57f3005ad..d9aa24364 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt @@ -13,4 +13,7 @@ interface LuckyNumberDao : BaseDao { @Query("SELECT * FROM LuckyNumbers WHERE student_id = :studentId AND date = :date") fun load(studentId: Int, date: LocalDate): Flow + + @Query("SELECT * FROM LuckyNumbers WHERE student_id = :studentId AND date >= :start AND date <= :end") + fun getAll(studentId: Int, start: LocalDate, end: LocalDate): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt index 801292b42..4f2dcc542 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map +import java.time.LocalDate import java.time.LocalDate.now import javax.inject.Inject import javax.inject.Singleton @@ -33,6 +34,9 @@ class LuckyNumberRepository @Inject constructor( } ) + fun getLuckyNumberHistory(student: Student, start: LocalDate, end: LocalDate) = + luckyNumberDb.getAll(student.studentId, start, end) + suspend fun getNotNotifiedLuckyNumber(student: Student) = luckyNumberDb.load(student.studentId, now()).map { if (it?.isNotified == false) it else null }.first() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt index 3de235857..0a73fe15d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberFragment.kt @@ -9,6 +9,8 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.databinding.FragmentLuckyNumberBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.luckynumber.history.LuckyNumberHistoryFragment +import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getThemeAttrColor import javax.inject.Inject @@ -42,6 +44,7 @@ class LuckyNumberFragment : luckyNumberSwipe.setOnRefreshListener(presenter::onSwipeRefresh) luckyNumberSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) luckyNumberSwipe.setProgressBackgroundColorSchemeColor(requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh)) + luckyNumberHistoryButton.setOnClickListener { openLuckyNumberHistory() } luckyNumberErrorRetry.setOnClickListener { presenter.onRetry() } luckyNumberErrorDetails.setOnClickListener { presenter.onDetailsClick() } } @@ -79,6 +82,10 @@ class LuckyNumberFragment : binding.luckyNumberContent.visibility = if (show) VISIBLE else GONE } + override fun openLuckyNumberHistory() { + (activity as? MainActivity)?.pushView(LuckyNumberHistoryFragment.newInstance()) + } + override fun onDestroyView() { presenter.onDetachView() super.onDestroyView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberView.kt index a680c83eb..0c05a1566 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberView.kt @@ -24,4 +24,6 @@ interface LuckyNumberView : BaseView { fun enableSwipe(enable: Boolean) fun showContent(show: Boolean) + + fun openLuckyNumberHistory() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryAdapter.kt new file mode 100644 index 000000000..7c09c96fe --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryAdapter.kt @@ -0,0 +1,36 @@ +package io.github.wulkanowy.ui.modules.luckynumber.history + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.data.db.entities.LuckyNumber +import io.github.wulkanowy.databinding.ItemLuckyNumberHistoryBinding +import io.github.wulkanowy.utils.toFormattedString +import io.github.wulkanowy.utils.weekDayName +import java.util.Locale +import javax.inject.Inject + +class LuckyNumberHistoryAdapter @Inject constructor() : + RecyclerView.Adapter() { + + var items = emptyList() + + override fun getItemCount() = items.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + ItemLuckyNumberHistoryBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + @SuppressLint("DefaultLocale") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val item = items[position] + with(holder.binding) { + luckyNumberHistoryWeekName.text = item.date.weekDayName.capitalize() + luckyNumberHistoryDate.text = item.date.toFormattedString() + luckyNumberHistory.text = item.luckyNumber.toString() + } + } + + class ItemViewHolder(val binding: ItemLuckyNumberHistoryBinding) : RecyclerView.ViewHolder(binding.root) +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt new file mode 100644 index 000000000..6e991ba13 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt @@ -0,0 +1,134 @@ +package io.github.wulkanowy.ui.modules.luckynumber.history + +import android.os.Bundle +import android.view.View +import android.view.View.GONE +import android.view.View.VISIBLE +import androidx.recyclerview.widget.LinearLayoutManager +import com.wdullaer.materialdatetimepicker.date.DatePickerDialog +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.LuckyNumber +import io.github.wulkanowy.databinding.FragmentLuckyNumberHistoryBinding +import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.widgets.DividerItemDecoration +import io.github.wulkanowy.utils.SchooldaysRangeLimiter +import io.github.wulkanowy.utils.dpToPx +import io.github.wulkanowy.utils.getThemeAttrColor +import java.time.LocalDate +import javax.inject.Inject + +@AndroidEntryPoint +class LuckyNumberHistoryFragment : + BaseFragment(R.layout.fragment_lucky_number_history), LuckyNumberHistoryView, + MainView.TitledView { + + @Inject + lateinit var presenter: LuckyNumberHistoryPresenter + + @Inject + lateinit var luckyNumberHistoryAdapter: LuckyNumberHistoryAdapter + + companion object { + fun newInstance() = LuckyNumberHistoryFragment() + } + + override val titleStringId: Int + get() = R.string.lucky_number_history_title + + override val isViewEmpty get() = luckyNumberHistoryAdapter.items.isEmpty() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentLuckyNumberHistoryBinding.bind(view) + messageContainer = binding.luckyNumberHistoryRecycler + presenter.onAttachView(this) + } + + override fun initView() { + with(binding.luckyNumberHistoryRecycler) { + layoutManager = LinearLayoutManager(context) + adapter = luckyNumberHistoryAdapter + addItemDecoration(DividerItemDecoration(context)) + } + + with(binding) { + luckyNumberHistoryNavDate.setOnClickListener { presenter.onPickDate() } + luckyNumberHistoryErrorRetry.setOnClickListener { presenter.onRetry() } + luckyNumberHistoryErrorDetails.setOnClickListener { presenter.onDetailsClick() } + + luckyNumberHistoryPreviousButton.setOnClickListener { presenter.onPreviousWeek() } + luckyNumberHistoryNextButton.setOnClickListener { presenter.onNextWeek() } + + luckyNumberHistoryNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + } + } + + override fun updateData(data: List) { + with(luckyNumberHistoryAdapter) { + items = data + notifyDataSetChanged() + } + } + + override fun clearData() { + with(luckyNumberHistoryAdapter) { + items = emptyList() + notifyDataSetChanged() + } + } + + override fun showEmpty(show: Boolean) { + binding.luckyNumberHistoryEmpty.visibility = if (show) VISIBLE else GONE + } + + override fun showErrorView(show: Boolean) { + binding.luckyNumberHistoryError.visibility = if (show) VISIBLE else GONE + } + + override fun setErrorDetails(message: String) { + binding.luckyNumberHistoryErrorMessage.text = message + } + + override fun updateNavigationWeek(date: String) { + binding.luckyNumberHistoryNavDate.text = date + } + + override fun showProgress(show: Boolean) { + binding.luckyNumberHistoryProgress.visibility = if (show) VISIBLE else GONE + } + + override fun showPreButton(show: Boolean) { + binding.luckyNumberHistoryPreviousButton.visibility = if (show) VISIBLE else View.INVISIBLE + } + + override fun showNextButton(show: Boolean) { + binding.luckyNumberHistoryNextButton.visibility = if (show) VISIBLE else View.INVISIBLE + } + + override fun showDatePickerDialog(currentDate: LocalDate) { + val dateSetListener = DatePickerDialog.OnDateSetListener { _, year, month, dayOfMonth -> + presenter.onDateSet(year, month + 1, dayOfMonth) + } + val datePickerDialog = DatePickerDialog.newInstance(dateSetListener, + currentDate.year, currentDate.monthValue - 1, currentDate.dayOfMonth) + + with(datePickerDialog) { + setDateRangeLimiter(SchooldaysRangeLimiter()) + version = DatePickerDialog.Version.VERSION_2 + scrollOrientation = DatePickerDialog.ScrollOrientation.VERTICAL + vibrate(false) + show(this@LuckyNumberHistoryFragment.parentFragmentManager, null) + } + } + + override fun showContent(show: Boolean) { + binding.luckyNumberHistoryRecycler.visibility = if (show) VISIBLE else GONE + } + + override fun onDestroyView() { + presenter.onDetachView() + super.onDestroyView() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryPresenter.kt new file mode 100644 index 000000000..556dda759 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryPresenter.kt @@ -0,0 +1,151 @@ +package io.github.wulkanowy.ui.modules.luckynumber.history + +import io.github.wulkanowy.data.Status +import io.github.wulkanowy.data.repositories.LuckyNumberRepository +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.utils.AnalyticsHelper +import io.github.wulkanowy.utils.afterLoading +import io.github.wulkanowy.utils.flowWithResource +import io.github.wulkanowy.utils.isHolidays +import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.previousOrSameSchoolDay +import io.github.wulkanowy.utils.sunday +import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.onEach +import timber.log.Timber +import java.time.LocalDate +import javax.inject.Inject + +class LuckyNumberHistoryPresenter @Inject constructor( + errorHandler: ErrorHandler, + studentRepository: StudentRepository, + private val luckyNumberRepository: LuckyNumberRepository, + private val analytics: AnalyticsHelper +) : BasePresenter(errorHandler, studentRepository) { + + private lateinit var lastError: Throwable + + var currentDate: LocalDate = LocalDate.now().previousOrSameSchoolDay + + override fun onAttachView(view: LuckyNumberHistoryView) { + super.onAttachView(view) + view.run { + initView() + reloadNavigation() + showContent(false) + } + Timber.i("Lucky number history view was initialized") + errorHandler.showErrorMessage = ::showErrorViewOnError + loadData() + } + + private fun loadData() { + flowWithResource { + val student = studentRepository.getCurrentStudent() + luckyNumberRepository.getLuckyNumberHistory(student, currentDate.monday, currentDate.sunday) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Loading lucky number history started") + Status.SUCCESS -> { + if (!it.data?.first().isNullOrEmpty()) { + Timber.i("Loading lucky number result: Success") + view?.apply { + updateData(it.data!!.first()) + showContent(true) + showEmpty(false) + showErrorView(false) + showProgress(false) + } + analytics.logEvent( + "load_items", + "type" to "lucky_number_history", + "numbers" to it.data + ) + } else { + Timber.i("Loading lucky number history result: No lucky numbers found") + view?.run { + showContent(false) + showEmpty(true) + showErrorView(false) + } + } + } + Status.ERROR -> { + Timber.i("Loading lucky number history result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.afterLoading { + view?.run { + showProgress(false) + } + }.launch() + } + + private fun showErrorViewOnError(message: String, error: Throwable) { + view?.run { + if (isViewEmpty) { + lastError = error + setErrorDetails(message) + showErrorView(true) + showEmpty(false) + } else showError(message, error) + } + } + + private fun reloadView(date: LocalDate) { + currentDate = date + Timber.i("Reload lucky number history view with the date ${currentDate.toFormattedString()}") + view?.apply { + showProgress(true) + showContent(false) + showEmpty(false) + showErrorView(false) + clearData() + reloadNavigation() + } + } + + fun onRetry() { + view?.run { + showErrorView(false) + showProgress(true) + } + loadData() + } + + fun onDetailsClick() { + view?.showErrorDetailsDialog(lastError) + } + + private fun reloadNavigation() { + view?.apply { + showPreButton(!currentDate.minusDays(7).isHolidays) + showNextButton(!currentDate.plusDays(7).isHolidays) + updateNavigationWeek("${currentDate.monday.toFormattedString("dd.MM")} - " + + currentDate.sunday.toFormattedString("dd.MM")) + } + } + + fun onDateSet(year: Int, month: Int, day: Int) { + reloadView(LocalDate.of(year, month, day)) + loadData() + } + + fun onPickDate() { + view?.showDatePickerDialog(currentDate) + } + + fun onPreviousWeek() { + reloadView(currentDate.minusDays(7)) + loadData() + } + + fun onNextWeek() { + reloadView(currentDate.plusDays(7)) + loadData() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryView.kt new file mode 100644 index 000000000..331e4ff86 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryView.kt @@ -0,0 +1,36 @@ +package io.github.wulkanowy.ui.modules.luckynumber.history + +import io.github.wulkanowy.data.db.entities.LuckyNumber +import io.github.wulkanowy.ui.base.BaseView +import java.time.LocalDate + +interface LuckyNumberHistoryView : BaseView { + + val isViewEmpty: Boolean + + fun initView() + + fun updateData(data: List) + + fun clearData() + + fun showEmpty(show: Boolean) + + fun showErrorView(show: Boolean) + + fun setErrorDetails(message: String) + + fun updateNavigationWeek(date: String) + + fun showProgress(show: Boolean) + + fun showPreButton(show: Boolean) + + fun showNextButton(show: Boolean) + + fun showDatePickerDialog(currentDate: LocalDate) + + fun showContent(show: Boolean) + + fun onDestroyView() +} diff --git a/app/src/main/res/layout/fragment_lucky_number.xml b/app/src/main/res/layout/fragment_lucky_number.xml index f6de01e69..b2d4f40ab 100644 --- a/app/src/main/res/layout/fragment_lucky_number.xml +++ b/app/src/main/res/layout/fragment_lucky_number.xml @@ -67,6 +67,26 @@ android:textSize="20sp" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_lucky_number_history.xml b/app/src/main/res/layout/item_lucky_number_history.xml new file mode 100644 index 000000000..79a0fcb29 --- /dev/null +++ b/app/src/main/res/layout/item_lucky_number_history.xml @@ -0,0 +1,43 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b42ba2e25..574c21b04 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -306,6 +306,11 @@ No info about the lucky number Lucky number for today Today\'s lucky number is: %d + Show history + + + Lucky number history + No info about lucky numbers Mobile devices From f14346ff32b51355abda6e79a98a7dbfc53b38b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 7 Mar 2021 20:47:18 +0100 Subject: [PATCH 0359/1526] Fix duplicate items after running automatic and manual sync at the same time (#1197) --- .../data/repositories/AttendanceRepository.kt | 4 + .../AttendanceSummaryRepository.kt | 4 + .../CompletedLessonsRepository.kt | 4 + .../data/repositories/ConferenceRepository.kt | 4 + .../data/repositories/ExamRepository.kt | 4 + .../data/repositories/GradeRepository.kt | 31 ++- .../repositories/GradeStatisticsRepository.kt | 8 + .../data/repositories/HomeworkRepository.kt | 4 + .../repositories/LuckyNumberRepository.kt | 4 + .../data/repositories/MessageRepository.kt | 4 + .../repositories/MobileDeviceRepository.kt | 4 + .../data/repositories/NoteRepository.kt | 4 + .../data/repositories/SchoolRepository.kt | 4 + .../repositories/StudentInfoRepository.kt | 4 + .../data/repositories/SubjectRepository.kt | 4 + .../data/repositories/TeacherRepository.kt | 4 + .../data/repositories/TimetableRepository.kt | 4 + .../repositories/student/StudentRemote.kt | 0 .../io/github/wulkanowy/utils/FlowUtils.kt | 11 +- .../repositories/AttendanceRepositoryTest.kt | 2 + .../CompletedLessonsRepositoryTest.kt | 2 + .../data/repositories/ExamRemoteTest.kt | 2 + .../data/repositories/GradeRepositoryTest.kt | 9 +- .../repositories/LuckyNumberRemoteTest.kt | 2 + .../MobileDeviceRepositoryTest.kt | 2 + .../github/wulkanowy/utils/FlowUtilsKtTest.kt | 192 ++++++++++++++++++ 26 files changed, 308 insertions(+), 13 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt create mode 100644 app/src/test/java/io/github/wulkanowy/utils/FlowUtilsKtTest.kt 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 9a6528f39..ffccb059e 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 @@ -14,6 +14,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.sync.Mutex import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime @@ -27,9 +28,12 @@ class AttendanceRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "attendance" fun getAttendance(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester, start, end)) }, query = { attendanceDb.loadAll(semester.diaryId, semester.studentId, start.monday, end.sunday) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt index 4edb507be..cd4403c7d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt @@ -10,6 +10,7 @@ import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -20,9 +21,12 @@ class AttendanceSummaryRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "attendance_summary" fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) }, query = { attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt index 59aabdd54..99ef56f4b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt @@ -12,6 +12,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.sync.Mutex import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -23,9 +24,12 @@ class CompletedLessonsRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "completed" fun getCompletedLessons(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester, start, end)) }, query = { completedLessonsDb.loadAll(semester.studentId, semester.diaryId, start.monday, end.sunday) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt index befcf9e6b..0a839d27b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt @@ -10,6 +10,7 @@ import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -20,9 +21,12 @@ class ConferenceRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "conference" fun getConferences(student: Student, semester: Semester, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) }, query = { conferenceDb.loadAll(semester.diaryId, student.studentId) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt index bd6e7d2d6..a8912f100 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt @@ -12,6 +12,7 @@ import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.startExamsDay import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.sync.Mutex import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -23,9 +24,12 @@ class ExamRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "exam" fun getExams(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester, start, end)) }, query = { examDb.loadAll(semester.diaryId, semester.studentId, start.startExamsDay, start.endExamsDay) }, fetch = { 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 bab290f32..9880e4641 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 @@ -16,6 +16,7 @@ import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map +import kotlinx.coroutines.sync.Mutex import java.time.LocalDateTime import javax.inject.Inject import javax.inject.Singleton @@ -28,14 +29,20 @@ class GradeRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "grade" fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( - shouldFetch = { (details, summaries) -> details.isEmpty() || summaries.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) }, + mutex = saveFetchResultMutex, + shouldFetch = { (details, summaries) -> + val isShouldBeRefreshed = refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) + details.isEmpty() || summaries.isEmpty() || forceRefresh || isShouldBeRefreshed + }, query = { - gradeDb.loadAll(semester.semesterId, semester.studentId).combine(gradeSummaryDb.loadAll(semester.semesterId, semester.studentId)) { details, summaries -> - details to summaries - } + val detailsFlow = gradeDb.loadAll(semester.semesterId, semester.studentId) + val summaryFlow = gradeSummaryDb.loadAll(semester.semesterId, semester.studentId) + detailsFlow.combine(summaryFlow) { details, summaries -> details to summaries } }, fetch = { val (details, summary) = sdk.init(student) @@ -92,19 +99,27 @@ class GradeRepository @Inject constructor( } fun getUnreadGrades(semester: Semester): Flow> { - return gradeDb.loadAll(semester.semesterId, semester.studentId).map { it.filter { grade -> !grade.isRead } } + return gradeDb.loadAll(semester.semesterId, semester.studentId).map { + it.filter { grade -> !grade.isRead } + } } fun getNotNotifiedGrades(semester: Semester): Flow> { - return gradeDb.loadAll(semester.semesterId, semester.studentId).map { it.filter { grade -> !grade.isNotified } } + return gradeDb.loadAll(semester.semesterId, semester.studentId).map { + it.filter { grade -> !grade.isNotified } + } } fun getNotNotifiedPredictedGrades(semester: Semester): Flow> { - return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId).map { it.filter { gradeSummary -> !gradeSummary.isPredictedGradeNotified } } + return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId).map { + it.filter { gradeSummary -> !gradeSummary.isPredictedGradeNotified } + } } fun getNotNotifiedFinalGrades(semester: Semester): Flow> { - return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId).map { it.filter { gradeSummary -> !gradeSummary.isFinalGradeNotified } } + return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId).map { + it.filter { gradeSummary -> !gradeSummary.isFinalGradeNotified } + } } suspend fun updateGrade(grade: Grade) { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt index ab65fb141..9cd8e711d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt @@ -17,6 +17,7 @@ import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.sync.Mutex import java.util.Locale import javax.inject.Inject import javax.inject.Singleton @@ -30,11 +31,16 @@ class GradeStatisticsRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val partialMutex = Mutex() + private val semesterMutex = Mutex() + private val pointsMutex = Mutex() + private val partialCacheKey = "grade_stats_partial" private val semesterCacheKey = "grade_stats_semester" private val pointsCacheKey = "grade_stats_points" fun getGradesPartialStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean) = networkBoundResource( + mutex = partialMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(partialCacheKey, semester)) }, query = { gradePartialStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { @@ -71,6 +77,7 @@ class GradeStatisticsRepository @Inject constructor( ) fun getGradesSemesterStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean) = networkBoundResource( + mutex = semesterMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(semesterCacheKey, semester)) }, query = { gradeSemesterStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { @@ -112,6 +119,7 @@ class GradeStatisticsRepository @Inject constructor( ) fun getGradesPointsStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean) = networkBoundResource( + mutex = pointsMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(pointsCacheKey, semester)) }, query = { gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt index 7625dbbc8..068fd9a5c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt @@ -13,6 +13,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.sync.Mutex import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -24,9 +25,12 @@ class HomeworkRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "homework" fun getHomework(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester, start, end)) }, query = { homeworkDb.loadAll(semester.semesterId, semester.studentId, start.monday, end.sunday) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt index 4f2dcc542..b904b7dba 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map +import kotlinx.coroutines.sync.Mutex import java.time.LocalDate import java.time.LocalDate.now import javax.inject.Inject @@ -20,7 +21,10 @@ class LuckyNumberRepository @Inject constructor( private val sdk: Sdk ) { + private val saveFetchResultMutex = Mutex() + fun getLuckyNumber(student: Student, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it == null || forceRefresh }, query = { luckyNumberDb.load(student.studentId, now()) }, fetch = { sdk.init(student).getLuckyNumber(student.schoolShortName)?.mapToEntity(student) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index ea7b2b0e0..5f5554187 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -20,6 +20,7 @@ import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import kotlinx.coroutines.sync.Mutex import timber.log.Timber import java.time.LocalDateTime.now import javax.inject.Inject @@ -33,10 +34,13 @@ class MessageRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "message" @Suppress("UNUSED_PARAMETER") fun getMessages(student: Student, semester: Semester, folder: MessageFolder, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, student, folder)) }, query = { messagesDb.loadAll(student.id.toInt(), folder.id) }, fetch = { sdk.init(student).getMessages(Folder.valueOf(folder.name), now().minusMonths(3), now()).mapToEntities(student) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt index 7e83ef7d5..4b333bc6d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt @@ -13,6 +13,7 @@ import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -23,9 +24,12 @@ class MobileDeviceRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "devices" fun getDevices(student: Student, semester: Semester, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, student)) }, query = { mobileDb.loadAll(student.userLoginId.takeIf { it != 0 } ?: student.studentId) }, fetch = { 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 85789f098..85339dfa9 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 @@ -13,6 +13,7 @@ import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -23,9 +24,12 @@ class NoteRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "note" fun getNotes(student: Student, semester: Semester, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) }, query = { noteDb.loadAll(student.studentId) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt index 6b22b32c3..8b59cb589 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource +import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -16,8 +17,11 @@ class SchoolRepository @Inject constructor( private val sdk: Sdk ) { + private val saveFetchResultMutex = Mutex() + fun getSchoolInfo(student: Student, semester: Semester, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it == null || forceRefresh }, query = { schoolDb.load(semester.studentId, semester.classId) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt index e3deb447f..de66ad20f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource +import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -16,8 +17,11 @@ class StudentInfoRepository @Inject constructor( private val sdk: Sdk ) { + private val saveFetchResultMutex = Mutex() + fun getStudentInfo(student: Student, semester: Semester, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it == null || forceRefresh }, query = { studentInfoDao.loadStudentInfo(student.studentId) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt index ef07a1d47..b4bfef188 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -17,7 +18,10 @@ class SubjectRepository @Inject constructor( private val sdk: Sdk ) { + private val saveFetchResultMutex = Mutex() + fun getSubjects(student: Student, semester: Semester, forceRefresh: Boolean = false) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh }, query = { subjectDao.loadAll(semester.diaryId, semester.studentId) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt index 25da718ca..7135edbe9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -17,7 +18,10 @@ class TeacherRepository @Inject constructor( private val sdk: Sdk ) { + private val saveFetchResultMutex = Mutex() + fun getTeachers(student: Student, semester: Semester, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { it.isEmpty() || forceRefresh }, query = { teacherDb.loadAll(semester.studentId, semester.classId) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index fa1898f5b..927565b53 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -18,6 +18,7 @@ import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map +import kotlinx.coroutines.sync.Mutex import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -31,9 +32,12 @@ class TimetableRepository @Inject constructor( private val refreshHelper: AutoRefreshHelper, ) { + private val saveFetchResultMutex = Mutex() + private val cacheKey = "timetable" fun getTimetable(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean, refreshAdditional: Boolean = false) = networkBoundResource( + mutex = saveFetchResultMutex, shouldFetch = { (timetable, additional) -> timetable.isEmpty() || (additional.isEmpty() && refreshAdditional) || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester, start, end)) }, query = { timetableDb.loadAll(semester.diaryId, semester.studentId, start.monday, end.sunday) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt index 049e1d42a..5dd289677 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt @@ -13,8 +13,11 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.takeWhile +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock inline fun networkBoundResource( + mutex: Mutex = Mutex(), showSavedOnLoading: Boolean = true, crossinline query: () -> Flow, crossinline fetch: suspend (ResultType) -> RequestType, @@ -31,7 +34,7 @@ inline fun networkBoundResource( try { val newData = fetch(data) - saveFetchResult(data, newData) + mutex.withLock { saveFetchResult(query().first(), newData) } query().map { Resource.success(filterResult(it)) } } catch (throwable: Throwable) { onFetchFailed(throwable) @@ -44,11 +47,12 @@ inline fun networkBoundResource( @JvmName("networkBoundResourceWithMap") inline fun networkBoundResource( + mutex: Mutex = Mutex(), showSavedOnLoading: Boolean = true, crossinline query: () -> Flow, crossinline fetch: suspend (ResultType) -> RequestType, crossinline saveFetchResult: suspend (old: ResultType, new: RequestType) -> Unit, - crossinline onFetchFailed: (Throwable) -> Unit = { Unit }, + crossinline onFetchFailed: (Throwable) -> Unit = { }, crossinline shouldFetch: (ResultType) -> Boolean = { true }, crossinline mapResult: (ResultType) -> T ) = flow { @@ -59,7 +63,8 @@ inline fun networkBoundResource( if (showSavedOnLoading) emit(Resource.loading(mapResult(data))) try { - saveFetchResult(data, fetch(data)) + val newData = fetch(data) + mutex.withLock { saveFetchResult(query().first(), newData) } query().map { Resource.success(mapResult(it)) } } catch (throwable: Throwable) { onFetchFailed(throwable) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt index 4c6a11720..1c592c09f 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt @@ -87,6 +87,7 @@ class AttendanceRepositoryTest { coEvery { sdk.getAttendance(startDate, endDate, 1) } returns remoteList coEvery { attendanceDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.dropLast(1).mapToEntities(semester)), + flowOf(remoteList.dropLast(1).mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.mapToEntities(semester)) ) coEvery { attendanceDb.insertAll(any()) } returns listOf(1, 2, 3) @@ -114,6 +115,7 @@ class AttendanceRepositoryTest { coEvery { sdk.getAttendance(startDate, endDate, 1) } returns remoteList.dropLast(1) coEvery { attendanceDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester)), + flowOf(remoteList.mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.dropLast(1).mapToEntities(semester)) ) coEvery { attendanceDb.insertAll(any()) } returns listOf(1, 2, 3) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt index 461e18090..b116a623d 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt @@ -87,6 +87,7 @@ class CompletedLessonsRepositoryTest { coEvery { sdk.getCompletedLessons(startDate, endDate) } returns remoteList coEvery { completedLessonDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.dropLast(1).mapToEntities(semester)), + flowOf(remoteList.dropLast(1).mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.mapToEntities(semester)) ) coEvery { completedLessonDb.insertAll(any()) } returns listOf(1, 2, 3) @@ -114,6 +115,7 @@ class CompletedLessonsRepositoryTest { coEvery { sdk.getCompletedLessons(startDate, endDate) } returns remoteList.dropLast(1) coEvery { completedLessonDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester)), + flowOf(remoteList.mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.dropLast(1).mapToEntities(semester)) ) coEvery { completedLessonDb.insertAll(any()) } returns listOf(1, 2, 3) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt index 42a897072..ead6dc5d1 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt @@ -88,6 +88,7 @@ class ExamRemoteTest { coEvery { sdk.getExams(startDate, realEndDate, 1) } returns remoteList coEvery { examDb.loadAll(1, 1, startDate, realEndDate) } returnsMany listOf( flowOf(remoteList.dropLast(1).mapToEntities(semester)), + flowOf(remoteList.dropLast(1).mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.mapToEntities(semester)) ) coEvery { examDb.insertAll(any()) } returns listOf(1, 2, 3) @@ -115,6 +116,7 @@ class ExamRemoteTest { coEvery { sdk.getExams(startDate, realEndDate, 1) } returns remoteList.dropLast(1) coEvery { examDb.loadAll(1, 1, startDate, realEndDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester)), + flowOf(remoteList.mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.dropLast(1).mapToEntities(semester)) ) coEvery { examDb.insertAll(any()) } returns listOf(1, 2, 3) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt index 002c7ad71..8a19d6337 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt @@ -57,7 +57,7 @@ class GradeRepositoryTest { coEvery { gradeDb.deleteAll(any()) } just Runs coEvery { gradeDb.insertAll(any()) } returns listOf() - coEvery { gradeSummaryDb.loadAll(1, 1) } returnsMany listOf(flowOf(listOf()), flowOf(listOf())) + coEvery { gradeSummaryDb.loadAll(1, 1) } returnsMany listOf(flowOf(listOf()), flowOf(listOf()), flowOf(listOf())) coEvery { gradeSummaryDb.deleteAll(any()) } just Runs coEvery { gradeSummaryDb.insertAll(any()) } returns listOf() } @@ -76,7 +76,8 @@ class GradeRepositoryTest { coEvery { gradeDb.loadAll(1, 1) } returnsMany listOf( flowOf(listOf()), // empty because it is new user - flowOf(remoteList.mapToEntities(semester)) + flowOf(listOf()), // empty again, after fetch end before save result + flowOf(remoteList.mapToEntities(semester)), ) // execute @@ -114,6 +115,7 @@ class GradeRepositoryTest { ) coEvery { gradeDb.loadAll(1, 1) } returnsMany listOf( flowOf(localList.mapToEntities(semester)), + flowOf(localList.mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.mapToEntities(semester)) ) @@ -155,6 +157,7 @@ class GradeRepositoryTest { ) coEvery { gradeDb.loadAll(1, 1) } returnsMany listOf( flowOf(localList.mapToEntities(semester)), + flowOf(localList.mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.mapToEntities(semester)) ) @@ -184,6 +187,7 @@ class GradeRepositoryTest { ) coEvery { gradeDb.loadAll(1, 1) } returnsMany listOf( flowOf(localList.mapToEntities(semester)), + flowOf(localList.mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.mapToEntities(semester)) ) @@ -209,6 +213,7 @@ class GradeRepositoryTest { coEvery { gradeDb.loadAll(1, 1) } returnsMany listOf( flowOf(listOf()), + flowOf(listOf()), // after fetch end before save result flowOf(remoteList.mapToEntities(semester)) ) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt index 9cbad8ac5..a89aad35c 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt @@ -72,6 +72,7 @@ class LuckyNumberRemoteTest { coEvery { sdk.getLuckyNumber(student.schoolShortName) } returns luckyNumber coEvery { luckyNumberDb.load(1, date) } returnsMany listOf( flowOf(luckyNumber.mapToEntity(student).copy(luckyNumber = 6666)), + flowOf(luckyNumber.mapToEntity(student).copy(luckyNumber = 6666)), // after fetch end before save result flowOf(luckyNumber.mapToEntity(student)) ) coEvery { luckyNumberDb.insertAll(any()) } returns listOf(1, 2, 3) @@ -101,6 +102,7 @@ class LuckyNumberRemoteTest { coEvery { sdk.getLuckyNumber(student.schoolShortName) } returns luckyNumber coEvery { luckyNumberDb.load(1, date) } returnsMany listOf( flowOf(null), + flowOf(null), // after fetch end before save result flowOf(luckyNumber.mapToEntity(student)) ) coEvery { luckyNumberDb.insertAll(any()) } returns listOf(1, 2, 3) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt index 4a4f2c76e..e5b3d1015 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt @@ -82,6 +82,7 @@ class MobileDeviceRepositoryTest { coEvery { sdk.getRegisteredDevices() } returns remoteList coEvery { mobileDeviceDb.loadAll(1) } returnsMany listOf( flowOf(remoteList.dropLast(1).mapToEntities(semester)), + flowOf(remoteList.dropLast(1).mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.mapToEntities(semester)) ) coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3) @@ -109,6 +110,7 @@ class MobileDeviceRepositoryTest { coEvery { sdk.getRegisteredDevices() } returns remoteList.dropLast(1) coEvery { mobileDeviceDb.loadAll(1) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester)), + flowOf(remoteList.mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.dropLast(1).mapToEntities(semester)) ) coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3) diff --git a/app/src/test/java/io/github/wulkanowy/utils/FlowUtilsKtTest.kt b/app/src/test/java/io/github/wulkanowy/utils/FlowUtilsKtTest.kt new file mode 100644 index 000000000..375a24038 --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/utils/FlowUtilsKtTest.kt @@ -0,0 +1,192 @@ +package io.github.wulkanowy.utils + +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerifyOrder +import io.mockk.just +import io.mockk.mockk +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.test.TestCoroutineScope +import org.junit.Test +import kotlin.test.assertEquals + +@OptIn(ExperimentalCoroutinesApi::class) +class FlowUtilsKtTest { + + private val testScope = TestCoroutineScope() + + @Test + fun `fetch from two places with same remote data`() { + val repo = mockk() + coEvery { repo.query() } returnsMany listOf( + // initial data + flowOf(listOf(1, 2, 3)), + flowOf(listOf(1, 2, 3)), + + // for first + flowOf(listOf(1, 2, 3)), // before save + flowOf(listOf(2, 3, 4)), // after save + + // for second + flowOf(listOf(2, 3, 4)), // before save + flowOf(listOf(2, 3, 4)), // after save + ) + coEvery { repo.fetch() } returnsMany listOf( + listOf(2, 3, 4), + listOf(2, 3, 4), + ) + coEvery { repo.save(any(), any()) } just Runs + + // first + networkBoundResource( + showSavedOnLoading = false, + query = { repo.query() }, + fetch = { + val data = repo.fetch() + delay(2_000) + data + }, + saveFetchResult = { old, new -> repo.save(old, new) } + ).launchIn(testScope) + + testScope.advanceTimeBy(1_000) + + // second + networkBoundResource( + showSavedOnLoading = false, + query = { repo.query() }, + fetch = { + val data = repo.fetch() + delay(2_000) + data + }, + saveFetchResult = { old, new -> repo.save(old, new) } + ).launchIn(testScope) + + testScope.advanceTimeBy(3_000) + + coVerifyOrder { + // from first + repo.query() + repo.fetch() // hang for 2 sec + + // wait 1 sec + + // from second + repo.query() + repo.fetch() // hang for 2 sec + + // from first + repo.query() + repo.save(withArg { + assertEquals(listOf(1, 2, 3), it) + }, any()) + repo.query() + + // from second + repo.query() + repo.save(withArg { + assertEquals(listOf(2, 3, 4), it) + }, any()) + repo.query() + } + } + + @Test + fun `fetch from two places with same remote data and save at the same moment`() { + val repo = mockk() + coEvery { repo.query() } returnsMany listOf( + // initial data + flowOf(listOf(1, 2, 3)), + flowOf(listOf(1, 2, 3)), + + // for first + flowOf(listOf(1, 2, 3)), // before save + flowOf(listOf(2, 3, 4)), // after save + + // for second + flowOf(listOf(2, 3, 4)), // before save + flowOf(listOf(2, 3, 4)), // after save + ) + coEvery { repo.fetch() } returnsMany listOf( + listOf(2, 3, 4), + listOf(2, 3, 4), + ) + coEvery { repo.save(any(), any()) } just Runs + + val saveResultMutex = Mutex() + + // first + networkBoundResource( + mutex = saveResultMutex, + showSavedOnLoading = false, + query = { repo.query() }, + fetch = { + val data = repo.fetch() + delay(2_000) + data + }, + saveFetchResult = { old, new -> + delay(1_500) + repo.save(old, new) + } + ).launchIn(testScope) + + testScope.advanceTimeBy(1_000) + + // second + networkBoundResource( + mutex = saveResultMutex, + showSavedOnLoading = false, + query = { repo.query() }, + fetch = { + val data = repo.fetch() + delay(2_000) + data + }, + saveFetchResult = { old, new -> + repo.save(old, new) + } + ).launchIn(testScope) + + testScope.advanceTimeBy(3_000) + + coVerifyOrder { + // from first + repo.query() + repo.fetch() // hang for 2 sec + + // wait 1 sec + + // from second + repo.query() + repo.fetch() // hang for 2 sec + + // from first + repo.query() + repo.save(withArg { + assertEquals(listOf(1, 2, 3), it) + }, any()) + + // from second + repo.query() + repo.save(withArg { + assertEquals(listOf(2, 3, 4), it) + }, any()) + + repo.query() + repo.query() + } + } + + @Suppress("UNUSED_PARAMETER", "RedundantSuspendModifier") + private class TestRepo { + fun query() = flowOf>() + suspend fun fetch() = listOf() + suspend fun save(old: List, new: List) {} + } +} From cb1b467a2136d58b756cbc3fd9078651cfa81fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Studzi=C5=84ski?= <48914870+studzinskik@users.noreply.github.com> Date: Sun, 7 Mar 2021 21:31:14 +0100 Subject: [PATCH 0360/1526] Add studzinskik to contributors (#1198) --- app/src/main/assets/contributors.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/assets/contributors.json b/app/src/main/assets/contributors.json index d43461786..3b11c971c 100644 --- a/app/src/main/assets/contributors.json +++ b/app/src/main/assets/contributors.json @@ -42,5 +42,9 @@ { "displayName": "Damian Czupryn", "githubUsername": "Daxxxis" + }, + { + "displayName": "Kamil Studziński", + "githubUsername": "studzinskik" } ] From c0e1a5b401a9b63f91490ef9f39326761a2f8790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 7 Mar 2021 21:48:29 +0100 Subject: [PATCH 0361/1526] New Crowdin updates (#1167) --- .../main/res/layout/dialog_account_edit.xml | 6 +- .../preferences_values.xml | 0 .../preferences_values.xml | 0 .../{values-cs-rCZ => values-cs}/strings.xml | 46 +- app/src/main/res/values-de/strings.xml | 46 +- .../res/values-lt-v29/preferences_values.xml | 9 + .../main/res/values-lt/preferences_values.xml | 53 ++ app/src/main/res/values-lt/strings.xml | 535 ++++++++++++++++++ .../main/res/values-pl/preferences_values.xml | 2 +- app/src/main/res/values-pl/strings.xml | 46 +- app/src/main/res/values-ru/strings.xml | 46 +- .../preferences_values.xml | 0 .../preferences_values.xml | 0 .../{values-sk-rSK => values-sk}/strings.xml | 46 +- app/src/main/res/values-uk/strings.xml | 46 +- 15 files changed, 800 insertions(+), 81 deletions(-) rename app/src/main/res/{values-cs-rCZ-v29 => values-cs-v29}/preferences_values.xml (100%) rename app/src/main/res/{values-cs-rCZ => values-cs}/preferences_values.xml (100%) rename app/src/main/res/{values-cs-rCZ => values-cs}/strings.xml (93%) create mode 100644 app/src/main/res/values-lt-v29/preferences_values.xml create mode 100644 app/src/main/res/values-lt/preferences_values.xml create mode 100644 app/src/main/res/values-lt/strings.xml rename app/src/main/res/{values-sk-rSK-v29 => values-sk-v29}/preferences_values.xml (100%) rename app/src/main/res/{values-sk-rSK => values-sk}/preferences_values.xml (100%) rename app/src/main/res/{values-sk-rSK => values-sk}/strings.xml (93%) diff --git a/app/src/main/res/layout/dialog_account_edit.xml b/app/src/main/res/layout/dialog_account_edit.xml index ed64f25b9..9f617e440 100644 --- a/app/src/main/res/layout/dialog_account_edit.xml +++ b/app/src/main/res/layout/dialog_account_edit.xml @@ -89,7 +89,7 @@ Token vypršel Neplatný e-mail Místo e-mailu použijte přiřazené přihlašovací údaje + Použijte přiřazené přihlašovací nebo e-mail v @%1$s Neplatný symbol Žák nebyl nalezen. Zkontrolujte správnost symbolu a vybrané varianty deníku UONET+ Toto pole je povinné @@ -313,6 +314,10 @@ Žádné informace o šťastném čísle Šťastné číslo pro dnešek Dnes je šťastným číslem: %d + Zobrazit historii + + Historie šťastných čísel + Žádné informace o šťastných číslech Mobilní přístup Žádná zařízení @@ -404,6 +409,7 @@ Přezdívka Přidat přezdívku + Vybrat barvu avataru Sdílet protokoly Obnovit @@ -438,21 +444,21 @@ Tmavý Motiv systému - Vzhled + Vzhled a chování aplikací Výchozí zobrazení Výpočet koncoročního průměru Vynutit průměrný výpočet podle aplikace - Zobrazit přítomnost v docházce - Motiv aplikace + Zobrazit přítomnost + Motiv Rozbalit známky - Označit aktuální lekci v plánu lekce - Zobrazit skupiny vedle předmětů v plánu lekce + Označit aktuální lekci + Zobrazit skupiny vedle předmětů Zobrazit seznam grafů v známkách třídy Zobrazit lekce pro celou třídu - Zobrazit předměty bez známek v \"Známky\" + Zobrazit předměty bez známek Známky barevné schéma - Třídění předmětů v \"Známky\" - Jazyk aplikace + Třídění předmětů + Jazyk Upozornění Zobrazit upozornění Zobrazit upozornění o nadcházející lekci @@ -460,6 +466,7 @@ Vaše zařízení může mít problémy se synchronizací dat as upozorněními.\n\nChcete-li je opravit, přidejte Wulkanového do funkce Autostart a vypněte optimalizaci/úsporu baterie v nastavení systému telefonu. Přejít do nastavení Zobrazit upozornění o ladění + Synchronizace je vypnutá Synchronizace Automatická aktualizace Pozastaveno na dovolené @@ -469,14 +476,27 @@ Synchronizováno! Synchronizace selhala Probíhá synchronizace - Synchronizace - Ruční synchronizace neobnoví zobrazení aplikace. - \nChcete-li zobrazit synchronizovaná data, restartujte aplikaci po synchronizaci. - - Jiné Hodnota plusu Hodnota mínusu Odpovědět s historií zpráv + Pokročilé + Vzhled a chování + Upozornění + Synchronizace + Známky + Docházka + Plán lekce + Známky + Zprávy + Vzhled a chování + Jazyky, motivy, třídění předmětů + Upozornění aplikace, oprava problémů + Upozornění + Synchronizace + Automatická aktualizace, interval aktualizací + Hodnota plusu a mínusu, výpočet průměru + Pokročilé + Verze aplikace, tvůrci, sociální portály, licence Nové položky v deníku Nové známky diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0cf67fa46..a0994b422 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -46,6 +46,7 @@ Token ist nicht mehr gültig Ungültige email Den zugewiesenen Login anstelle von email verwenden + Benutze den zugewiesenen Login oder E-Mail in @%1$s Ungültige symbol Schüler nicht gefunden. Überprüfen Sie das Symbol und die gewählte Variation des UONET+ Registers Dieses Datenfeld ist erforderlich @@ -273,6 +274,10 @@ Keine Information über die Glücksnummer. Glücksnummer für heute Die heutige Glücksnummer ist: %d + Verlauf anzeigen + + Glücksnummerverlauf + Keine Information über die Glücksnummer Mobile Geräte Keine Geräte @@ -364,6 +369,7 @@ Nick Nick hinzufügen + Avatar-Farbe wählen Logs teilen Aktualisieren @@ -398,21 +404,21 @@ Dunkel Systemthema - Erscheinungsbild + Aussehen & Verhalten Standard Ansicht Berechnung des Jahresenddurchschnitts Mittelwertberechnung durch App erzwingen - Anwesenheit in Schulbesuch zeigen - Thema der Anwendung + Anwesendheit zeigen + Thema Noten erweitern - Aktuelle Lektion im Stundenplan markieren - Gruppen neben Schulfächer im Zeitplan anzeigen + Aktuelle Lektion markieren + Gruppen neben Schulfächen anzeigen Liste der Diagramme in Klassenbewertungen anzeigen Unterricht der ganzen Klasse anzeigen - Schulfächer ohne Noten in \"Noten\" anzeigen + Schulfächer ohne Noten anzeigen Farbschema der Noten - Schulfächer sortieren in \"Noten\" - App Sprache + Schulfachen sortieren + Sprache Benachrichtigungen Benachrichtigungen anzeigen Benachrichtigungen über bevorstehende Lektionen anzeigen @@ -420,6 +426,7 @@ Ihr Gerät hat möglicherweise Probleme mit der Datensynchronisierung und Benachrichtigungen.\n\nUm diese zu reparieren, fügen Sie Wulkanowy zum Autostart hinzu und deaktivieren Sie die Batterieoptimierung in den Systemeinstellungen des Geräts. Gehe zu den Einstellungen Debug-Benachrichtigungen anzeigen + Synchronisierung ist deaktiviert Synchronisierung Automatische Aktualisierung An Feiertagen suspendiert @@ -429,14 +436,27 @@ Synchronisiert! Synchronisierung fehlgeschlagen Synchronisierung läuft - Synchronisation - Die manuelle Synchronisierung aktualisiert die App-Ansichten nicht. - \nUm die synchronisierten Daten anzuzeigen, starten Sie die App nach der Synchronisierung neu. - - Andere Wert des Plus Wert des Minus Antwort mit Nachrichtenhistorie + Erweitert + Aussehen & Verhalten + Benachrichtigungen + Synchronisierung + Noten + Schulbesuch + Zeitplan + Noten + Nachrichten + Aussehen & Verhalten + Sprachen, Themen, Schulfachen sortieren + App-Benachrichtigungen, Probleme beheben + Benachrichtigungen + Synchronisierung + Automatisches Update, Synchronisierungsintervall + Plus und Minus Werte, Durchschnittsberechnung + Erweitert + App-Version, Mitarbeiter, soziale Portale, Lizenzen Neue Einträge im Klassenbuch Neue Noten diff --git a/app/src/main/res/values-lt-v29/preferences_values.xml b/app/src/main/res/values-lt-v29/preferences_values.xml new file mode 100644 index 000000000..18cbd4cf5 --- /dev/null +++ b/app/src/main/res/values-lt-v29/preferences_values.xml @@ -0,0 +1,9 @@ + + + + Sistemos tema + Šviesi + Tamsi + Juoda (AMOLED) + + diff --git a/app/src/main/res/values-lt/preferences_values.xml b/app/src/main/res/values-lt/preferences_values.xml new file mode 100644 index 000000000..fcb637d23 --- /dev/null +++ b/app/src/main/res/values-lt/preferences_values.xml @@ -0,0 +1,53 @@ + + + + Šviesi + Tamsi + Juoda (AMOLED) + + + Sistemos kalba + Polski + English + Pусский + Українська + Deutsch + Čeština + Slovenčina + + + 15 minučių + 30 minučių + 1 valandą + 2 valandas + 6 valandas + 12 valandas + 24 valandas + + + 0,00 + 0,25 + 0,33 + 0,5 + 0,75 + + + Pagal abėcėlę + Pagal datą + + + Dzienniczek+ + Wulkanowy + Laipsnio spalvos registre + + + Antrojo semestro laipsnių vidurkis + Abiejų semestrų laipsnių vidurkis + Visų metų laipsnių vidurkis + + + Nerodyti + Rodyti viską + Rodyti mažesnį + + diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml new file mode 100644 index 000000000..6542a5bc6 --- /dev/null +++ b/app/src/main/res/values-lt/strings.xml @@ -0,0 +1,535 @@ + + + + Login + Wulkanowy + Laipsnis + Attendance + Exams + Timetable + Nustatymai + Daugiau + Apie + Peržiūrėti žurnalą + Prisidėję + Licencijos + Žinutės + Nauja žinutė + Pastabos ir pasiekimai + Namų darbai + Paskyros valdymas + Pasirinkite paskyrą + Paskyros informacija + Studentų informacija + + Semestras %1$d, %2$d/%3$d + + Sign in with the student or parent account + Enter the symbol from the register page + Vartotojo vardas + El. paštas + Prisijunkite, PESEL arba el. paštas + Slaptažodis + UONET+ register variant + Mobile API + Scraper + Hibridas + Token + PIN + API raktas + Symbol + Prisijungti + Slaptažodis per trumpas + Login details are incorrect. Make sure the correct UONET+ register variation is selected in the field below + Netinkamas PIN kodas + Invalid token + Token expired + Neteisingas el. paštas + Use the assigned login instead of email + Use the assigned login or email in @%1$s + Netinkamas simbolis + Student not found. Validate the symbol and the chosen variation of the UONET+ register + This field is required + Selected student is already logged in + The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the previous screen. Wulkanowy does not detect pre-school students at the moment + Select students to log in to the application + Papildomi nustatymai + In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices + This mode displays the same data as it appears on the register website + The combination of the best features of the other two modes. It works faster than scraper and provides features not available in the Mobile API mode. It is in the experimental phase + Privatumo politika + Trouble signing in? Contact us! + El. paštas + Discord + Send email + Describe details of problem: + Make sure you select the correct UONET+ register variation! + I forgot my password + Recover your account + Atkurti + Student is already signed in + + Paskyros valdymas + Prisijungti + Sesijos laikas baigėsi + Sesijos laikas baigėsi, prašome prisijungti iš naujo + + Laipsnis + Semestras %d + Keisti semestrą + Jokių laipsnių + Svoris + Svoris: %s + Pastabos + Jokių naujų laipsnių + Number of new ratings: %1$d + Vidurkis: %1$.2f + Puantai: %s + Jokiu vidurkis + Numatomas: %1$s + Galutinis: %1$s + Bendras punktų skaičius + Galutinis laipsnis + Numatomas laipsnis + Calculated average + Final average + Summary + Class + Mark as read + Partial + Semester + Points + Legend + Average: %1$s + Class + Student + + %d grade + %d grades + %d grades + %d grades + + + New grade + New grades + New grades + New grades + + + New predicted grade + New predicted grades + New predicted grades + New predicted grades + + + New final grade + New final grades + New final grades + New final grades + + + You received %1$d grade + You received %1$d grades + You received %1$d grades + You received %1$d grades + + + You received %1$d predicted grade + You received %1$d predicted grades + You received %1$d predicted grades + You received %1$d predicted grades + + + You received %1$d final grade + You received %1$d final grades + You received %1$d final grades + You received %1$d final grades + + + Lesson + Room + Group + Hours + Changes + No lessons this day + %s min + %s sec + %1$s left + in %1$s + Finished + Now: %s + Next: %s + Later: %s + + Completed lessons + Show completed lessons + No info about completed lessons + Topic + Absence + Resources + + Additional lessons + Show additional lessons + No info about additional lessons + + Attendance summary + Absent for school reasons + Excused absence + Unexcused absence + Exemption + Excused lateness + Unexcused lateness + Present + Deleted + Unknown + Number of lesson + No entries + + %1$d absence + %1$d absences + %1$d absences + %1$d absences + + Absence reason (optional) + Send + Absence excused successfully! + You must select at least one absence! + Excuse + + Attendance + Total + + No exams this week + Type + Entry date + + Inbox + Sent + Trash + (no subject) + No messages + An error occurred while downloading message content + From: + To: + Date: %s + Reply + Forward + Delete + Move to trash + Delete permanently + Message deleted successfully + Share + Print + Subject + Content + Message sent successfully + Message does not exist + You need to choose at least 1 recipient + The message content must be at least 3 characters + + %d message + %d messages + %d messages + %d messages + + + New message + New messages + New messages + New messages + + + You received %1$d message + You received %1$d messages + You received %1$d messages + You received %1$d messages + + + No info about notes + Points + + %d note + %d notes + %d notes + %d notes + + + New note + New notes + New notes + New notes + + + You received %1$d note + You received %1$d notes + You received %1$d notes + You received %1$d notes + + + + %d praise + %d praises + %d praises + %d praises + + + New praise + New praises + New praises + New praises + + + You received %1$d praise + You received %1$d praises + You received %1$d praises + You received %1$d praises + + + + %d neutral note + %d neutral notes + %d neutral notes + %d neutral notes + + + New neutral note + New neutral notes + New neutral notes + New neutral notes + + + You received %1$d neutral note + You received %1$d neutral notes + You received %1$d neutral notes + You received %1$d neutral notes + + + No info about homework + Mark as done + Mark as undone + Attachments + + Lucky number + Today\'s lucky number is + No info about the lucky number + Lucky number for today + Today\'s lucky number is: %d + Show history + + Lucky number history + No info about lucky numbers + + Mobile devices + No devices + Deregister + Device removed + QR code + Token + Symbol + PIN + + School and teachers + + School + No info about school + School name + School address + Telephone + Name of headmaster + Name of pedagogue + Show on map + Call + + Teachers + No info about teachers + No subject + + Conferences + No info about conferences + + Add account + Logout + Do you want to log out this student? + Student logout + Student account + Parent account + Mobile API mode + Hybrid mode + Edit data + Accounts manager + Select student + Family + Contact + Residence details + Personal information + + App version + Contributors + List of Wulkanowy developers + Report a bug + Send a bug report via e-mail + FAQ + Read Frequently Asked Questions + Discord server + Join the Wulkanowy community + Facebook fanpage + Like our facebook fanpage + Privacy policy + Rules for collecting personal data + Homepage + Visit the website and help develop the application + Licenses + Licenses of libraries used in the application + + License + + Avatar + See more on GitHub + + No info about student or student family + Name + Second name + Gender + Polish citizenship + Family name + Mother\'s and father\'s names + Phone + Cellphone + E-mail + Address of residence + Address of registration + Correspondence address + Surname and first name + Degree of kinship + Address + Phones + Male + Female + Last name + + Nick + Add nick + Choose avatar color + + Share logs + Refresh + + Check for updates + Before reporting a bug, check first if an update with the bug fix is available + + Content + Retry + Description + No description + Teacher + Date + Entry date + Color + Details + Category + Close + No data + Subject + Prev + Next + Search + Search… + Yes + No + Save + + No lessons + Choose theme + Light + Dark + System Theme + + App appearance & behavior + Default view + Calculation of the end-of-year average + Force average calculation by app + Show presence + Theme + Expand grades + Mark current lesson + Show groups next to subjects + Show chart list in class grades + Show whole class lessons + Show subjects without grades + Grades color scheme + Subjects sorting + Language + Notifications + Show notifications + Show upcoming lesson notifications + Fix synchronization & notifications issues + Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. + Go to settings + Show debug notifications + Synchronization is disabled + Synchronization + Automatic update + Suspended on holidays + Updates interval + Wi-Fi only + Sync now + Synced! + Sync failed + Sync in progress + Value of the plus + Value of the minus + Reply with message history + Advanced + Appearance & Behavior + Notifications + Synchronization + Grades + Attendance + Timetable + Grades + Messages + Appearance & Behavior + Languages, themes, subjects sorting + App notifications, fix problems + Notifications + Synchronization + Automatic update, synchronization interval + Plus and minus values, average calculation + Advanced + App version, contributors, social portals, licenses + + New entries in register + New grades + Lucky number + New messages + New notes + Push notifications + Upcoming lessons + Debug + + Black + Red + Blue + Green + Purple + No color + + Copied + Undo + + Download of updates has started… + An update has just been downloaded. + Restart + Update failed! Wulkanowy may not function properly. Consider updating + + No internet connection + Connection to register failed. Servers can be overloaded. Please try again later + Loading data failed. Please try again later + Register password change required + Maintenance underway UONET + register. Try again later + Unknown UONET + register error. Try again later + Unknown application error. Please try again later + An unexpected error occurred + Feature disabled by your school + Feature not available. Login in a mode other than Mobile API + diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 20dd919e7..b25dc3e59 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -25,7 +25,7 @@ 24 godziny - 0,0 + 0,00 0,25 0,33 0,5 diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f45886b77..3f69d2a86 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -46,6 +46,7 @@ Token stracił ważność Niepoprawny adres email Użyj przydzielonego loginu zamiast emaila + Użyj przypisanego loginu lub adresu e-mail w @%1$s Niepoprawny symbol Nie znaleziono ucznia. Sprawdź poprawność symbolu i wybranej odmiany dziennika UONET+ To pole jest wymagane @@ -313,6 +314,10 @@ Brak informacji o szczęśliwym numerku Szczęśliwy numerek na dzisiaj Dziś szczęśliwym numerkiem jest: %d + Pokaż historię + + Historia numerków + Brak informacji o szczęśliwych numerach Dostęp mobilny Brak urządzeń @@ -404,6 +409,7 @@ Pseudonim Dodaj pseudonim + Wybierz kolor awatara Udostępnij logi Odśwież @@ -438,21 +444,21 @@ Ciemny Motyw systemu - Wygląd + Wygląd i zachowanie aplikacji Domyślny widok Obliczanie średniej końcoworocznej Wymuś obliczanie średniej przez aplikację - Pokazuj obecność we frekwencji - Motyw aplikacji + Pokazuj obecność + Motyw Rozwiń oceny - Oznaczaj bieżącą lekcję na planie - Pokazuj grupę obok przedmiotu na planie + Oznaczaj bieżącą lekcję + Pokazuj grupę obok przedmiotu Pokazuj listę wykresów w ocenach klasy Pokazuj lekcje całej klasy - Pokazuj przedmioty bez ocen w Ocenach + Pokazuj przedmioty bez ocen Schemat kolorów ocen - Sortowanie przedmiotów w \"Oceny\" - Język aplikacji + Sortowanie przedmiotów + Język Powiadomienia Pokazuj powiadomienia Pokazuj powiadomienia o nadchodzących lekcjach @@ -460,6 +466,7 @@ Na twoim urządzeniu mogą występować problemy z synchronizacją danych i powiadomieniami.\n\nBy je naprawić, dodaj Wulkanowego do autostartu i wyłącz optymalizację/oszczędzanie baterii w ustawieniach systemowych telefonu. Przejdź do ustawień Pokazuj powiadomienia debugowania + Synchronizacja jest wyłączona Synchronizacja Automatyczna aktualizacja Zawieszona na wakacjach @@ -469,14 +476,27 @@ Zsynchronizowano! Synchronizacja nie powiodła się Synchronizacja w trakcie - Synchronizacja - Ręczna synchronizacja nie odświeża widoków w aplikacji. - \nAby zobaczyć zsynchronizowane informacje, uruchom ponownie aplikację po zsynchronizowaniu. - - Inne Wartość plusa Wartość minusa Odpowiadaj z historią wiadomości + Zaawansowane + Wygląd i zachowanie + Powiadomienia + Synchronizacja + Oceny + Frekwencja + Plan lekcji + Oceny + Wiadomości + Wygląd i zachowanie + Języki, motywy, sortowanie przedmiotów + Powiadomienia aplikacji, naprawianie problemów + Powiadomienia + Synchronizacja + Automatyczna aktualizacja, interwał synchronizacji + Wartości plusa i minusa, obliczanie średniej + Zaawansowane + Wersja aplikacji, twórcy, media społecznościowe, licencje Nowe wpisy w dzienniku Nowe oceny diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0de20ea91..02407bbd0 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -46,6 +46,7 @@ Token просрочен Неверный адрес электронной почты Используйте назначенный логин вместо электронной почты + Использовать назначенный логин или email в @%1$s Неправильный символ Студент не найден. Подтвердите символ и выбранный вариант регистра UONET+ Это обязательное поле @@ -313,6 +314,10 @@ Нет данных о счастливом номере Сегодняшний счастливый номер Сегодняшний счастливый номер это: %d + Показать историю + + История удачных чисел + Нет информации о номерах удачи Мобильные устройства Нет устройств @@ -404,6 +409,7 @@ Ник Добавить ник + Выберите цвет аватара Поделиться логами Обновить @@ -438,21 +444,21 @@ Тёмная Тема системы - Вид + Внешний вид приложения & поведение Окно по умолчанию Способ определения средней годовой оценки Принудительно высчитать среднюю оценку через приложение - Показывать присутствия в посещаемости - Тема приложения + Показать присутствие + Тема Разворачивать оценки - Отмечать текущий урок в расписании - Показать группу возле предмета в расписании + Отметить текущий урок + Показать группы рядом с темами Показывать диаграммы в оценках класса Показать уроки всего класса - Показывать предметы без оценок в \"Оценках\" + Показать предметы без оценок Схема цветов оценок - Сортировка предметов в \"Оценках\" - Язык приложения + Сортировка уроков + Язык Уведомления Показывать уведомления Показывать уведомления о будущих уроках @@ -460,6 +466,7 @@ На вашем устройстве могут быть проблемы с синхронизацией данных и уведомлениями.\n\nЧтобы их исправить, вам необходимо добавить Wulkanowy в авто-старт и выключить оптимизацию/экономию батареи в настройках устройства. Перейти в настройски Показывать дебаг-уведомления + Синхронизация отключена Синхронизация Автоматическая синхронизация Приостановить синхронизации во время каникул @@ -469,14 +476,27 @@ Синхронизировано! Синхронизация не удалась Идёт синхронизация - Синхронизация - Ручная синхронизация не обновляет данные в приложении. - \nЧтобы увидеть обновлённые данные, перезапустите приложение. - - Другие Стоимость плюса Стоимость минуса Отвечать с историей сообщений + Расширенные + Внешний вид & Поведение + Уведомления + Синхронизация + Оценки + Посещаемость + Расписание + Оценки + Сообщения + Внешний вид & Поведение + Языки, темы, темы сортировки темы + Уведомления приложений, проблемы с устранением + Уведомления + Синхронизация + Автоматическое обновление, интервал синхронизации + Значения плюс и минус, средний расчет + Расширенные + Версия приложения, участники, социальные порталы, лицензии Новые данные в дневнике Новые оценки diff --git a/app/src/main/res/values-sk-rSK-v29/preferences_values.xml b/app/src/main/res/values-sk-v29/preferences_values.xml similarity index 100% rename from app/src/main/res/values-sk-rSK-v29/preferences_values.xml rename to app/src/main/res/values-sk-v29/preferences_values.xml diff --git a/app/src/main/res/values-sk-rSK/preferences_values.xml b/app/src/main/res/values-sk/preferences_values.xml similarity index 100% rename from app/src/main/res/values-sk-rSK/preferences_values.xml rename to app/src/main/res/values-sk/preferences_values.xml diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk/strings.xml similarity index 93% rename from app/src/main/res/values-sk-rSK/strings.xml rename to app/src/main/res/values-sk/strings.xml index f0b8591af..32bd8067e 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -46,6 +46,7 @@ Platnosť tokenu vypršala Neplatný e-mail Namiesto e-mailu použite priradené prihlasovacie údaje + Použite priradené prihlasovacie alebo e-mail v @%1$s Neplatný symbol Žiak nebol nájdený. Skontrolujte správnosť symbolu a vybrané varianty denníka UONET+ Toto pole je povinné @@ -313,6 +314,10 @@ Žiadne informácie o šťastnom čísle Šťastné číslo pre dnešok Dnes je šťastným číslom: %d + Zobraziť históriu + + História šťastných čísel + Žiadne informácie o šťastných číslach Mobilný prístup Žiadne zariadenia @@ -404,6 +409,7 @@ Prezývka Pridať prezývku + Vybrať farbu avataru Zdieľať protokoly Obnoviť @@ -438,21 +444,21 @@ Tmavý Motív systému - Vzhľad + Vzhľad a správanie aplikácií Predvolené zobrazenie Výpočet koncoročního priemeru Vynútiť priemerný výpočet podľa aplikácie - Zobraziť prítomnosť v dochádzke - Motív aplikácie + Zobraziť prítomnosť + Motív Rozbaliť známky - Označiť aktuálne lekciu v pláne lekcie - Zobraziť skupiny vedľa predmetov v pláne lekcie + Označiť aktuálne lekciu + Zobraziť skupiny vedľa predmetov Zobraziť zoznam grafov v známkach triedy Zobraziť lekcie pre celú triedu - Zobraziť predmety bez známok v \"Známky\" + Zobraziť predmety bez známok Známky farebnú schému - Triedenie predmetov v \"Známky\" - Jazyk aplikácie + Triedenie predmetov + Jazyk Upozornenia Zobraziť upozornenia Zobraziť upozornenia o nadchádzajúcej lekciu @@ -460,6 +466,7 @@ Vaše zariadenie môže mať problémy so synchronizáciou dát as upozorneniami.\n\nAk ich chcete opraviť, pridajte Wulkanového do funkcie Autostart a vypnite optimalizáciu/úsporu batérie v nastavení systému telefóne. Prejsť do nastavení Zobraziť upozornenia o ladení + Synchronizácia je vypnutá Synchronizácia Automatická aktualizácia Pozastavený počas dovolenky @@ -469,14 +476,27 @@ Synchronizovano! Synchronizácia zlyhala Prebieha synchronizácia - Synchronizácia - Ručná synchronizácia neobnoví zobrazenie aplikácie. - \nAk chcete zobraziť synchronizované údaje, reštartujte aplikáciu po synchronizácii. - - Iné Hodnota plusu Hodnota mínusu Odpovedať s históriou správ + Pokročilé + Vzhľad a správanie + Upozornenia + Synchronizácia + Známky + Dochádzka + Plán lekcie + Známky + Správy + Vzhľad a správanie + Jazyky, motívy, triedenie predmetov + Upozornenia aplikácie, oprava problémov + Upozornenia + Synchronizácia + Automatická aktualizácia, interval aktualizácií + Hodnota plusu a mínusu, výpočet priemeru + Pokročilé + Verzia aplikácie, prispievatelia, sociálne portály, licencie Nové položky v denníku Nové známky diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 843c36161..64e147e74 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -46,6 +46,7 @@ Минув термін дії токену Недійсна адреса електронної пошти Використовуйте призначений логін замість електронної пошти + Використовуйте призначений логін або електронну адресу в @% 1 $ s Неправильний симбвол Студента не знайдено Перевірте символ та обраний варіант реєстру UONET+ Обов\'язкове поле @@ -313,6 +314,10 @@ Брак інформації о щасливому номері Сьогоднішній щасливий номер Сьогоднішнім щасливим номером є %d + Показати історію + + Історія щасливих чисел + Немає інформації про щасливі номери Мобільні пристрої Брак пристроїв @@ -404,6 +409,7 @@ Псевдонім Додати псевдонім + Оберіть колір аватара Поділитися логами Оновити @@ -438,21 +444,21 @@ Темна Тема системи - Вигляд + Поява додатка & amp; поведінки Вікно за замовчуванням Спосіб облічування оцінки на кінець року Примусово розрахувати середню оцінку через додаток - Показувати присутність у відвідуваності - Тема додатку + Показати присутність + Тема Більше оцінок - Позначити поточний урок у розкладі - Покажіть групи поруч із предметами в розкладі + Позначити поточний урок + Показувати групи поруч з темами Показувати діаграми в оцінках класу Показати уроки всього класу - Показуйте предмети без оцінок у оцінках + Показати предмети без оцінок Схема кольорів оцінок - Сортування предметів за \"Оцінками\" - Мова додатку + Сортування предметів + Мова Повідомлення Показувати повідомлення Показувати повідомлення о наступних уроках @@ -460,6 +466,7 @@ На вашому пристрої можуть бути помилки з синхронізацією і повідомленнями\n\nЩоб виправити іх, вам необхідно додати Wulkanowy в авто-старт и вимкнути оптимізацію/экономію батареї в налаштуваннях пристрою. Перейти до налаштувань Показувати дебаг-повідомлення + Синхронізація вимкнена Синхронізація Автоматична синхронізація Призупинено на час канікул @@ -469,14 +476,27 @@ Синхронізовано! Синхронізація не вдалася Триває синхронізація - Синхронізація - Ручна синхронізація не оновлює дані в додатку. - \nЩоб побачити оновлені дані, перезавантажте додаток. - - Інші Вартість плюсу Вага мінуса Відповісти з історією повідомлень + Додатково + Вигляд & Поведінка + Повідомлення + Синхронізація + Оцінки + Відвідуваність + Розклад + Класи + Повідомлення + Вигляд & Поведінка + Мови, теми, тема сортування + Сповіщення додатку, виправляти проблеми + Повідомлення + Синхронізація + Автоматичне оновлення, інтервал синхронізації + Плюс і мінус значення, середні обчислення + Додатково + Версія програми, учасники, соціальні портали, ліцензії Нові дані в щоденнику Нові оцінки From be48791d51d1d0c03d1b0080dd673ce5493081d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 7 Mar 2021 21:58:14 +0100 Subject: [PATCH 0362/1526] Version 1.1.0 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 11 ++++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index dfbc26b2a..6af83ab09 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 30 - versionCode 85 - versionName "1.0.1" + versionCode 86 + versionName "1.1.0" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -133,7 +133,7 @@ play { serviceAccountEmail = System.getenv("PLAY_SERVICE_ACCOUNT_EMAIL") ?: "jan@fakelog.cf" serviceAccountCredentials = file('key.p12') defaultToAppBundles = false - track = 'alpha' + track = 'production' updatePriority = 3 } @@ -147,7 +147,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:1.0.1" + implementation "io.github.wulkanowy:sdk:1.1.0" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 3404b05b8..35320c1ea 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,11 @@ -Wersja 1.0.1 +Wersja 1.1.0 -- naprawiliśmy błąd podczas wysyłania wiadomości -- poprawiliśmy błędy w tłumaczeniach +- dodaliśmy wyświetlanie inicjałów imienia ucznia jako awatar widoczny w aplikacji +- dodaliśmy historię szczęśliwego numerka +- dodaliśmy język słowacki +- zmieniliśmy kolor górnego i dolnego paska systemowego lepiej dostosowując je do aplikacji +- zmieniliśmy wygląd ustawień dzieląc je na sekcje +- naprawiliśmy problem dublujących się czasem ocen +- naprawiliśmy kilka innych błędów i poprawiliśmy stabilność aplikacji Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From acb5e2afd4d97e030ec4a34576a0d7a08231d217 Mon Sep 17 00:00:00 2001 From: Damian Czupryn <60961958+Daxxxis@users.noreply.github.com> Date: Tue, 9 Mar 2021 17:49:24 +0100 Subject: [PATCH 0363/1526] Replace dash mark with no data string in SchoolFragment (#1203) --- .../schoolandteachers/school/SchoolFragment.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt index 03ad7ba09..fba2f0407 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt @@ -53,13 +53,14 @@ class SchoolFragment : BaseFragment(R.layout.fragment_sch override fun updateData(data: School) { with(binding) { - schoolName.text = data.name - schoolAddress.text = data.address.ifBlank { "-" } + val noDataString = getString(R.string.all_no_data) + schoolName.text = data.name.ifBlank { noDataString } + schoolAddress.text = data.address.ifBlank { noDataString } schoolAddressButton.visibility = if (data.address.isNotBlank()) VISIBLE else GONE - schoolTelephone.text = data.contact.ifBlank { "-" } + schoolTelephone.text = data.contact.ifBlank { noDataString } schoolTelephoneButton.visibility = if (data.contact.isNotBlank()) VISIBLE else GONE - schoolHeadmaster.text = data.headmaster - schoolPedagogue.text = data.pedagogue + schoolHeadmaster.text = data.headmaster.ifBlank { noDataString } + schoolPedagogue.text = data.pedagogue.ifBlank { noDataString } } } From ea4b299de64afa91e687f1087938b38a53c83586 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 12 Mar 2021 12:39:01 +0000 Subject: [PATCH 0364/1526] Bump firebase-bom from 26.6.0 to 26.7.0 (#1209) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6af83ab09..f4a9acae6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -203,7 +203,7 @@ dependencies { implementation "io.github.wulkanowy:AppKillerManager:3.0.0" implementation 'me.xdrop:fuzzywuzzy:1.3.1' - playImplementation platform('com.google.firebase:firebase-bom:26.6.0') + playImplementation platform('com.google.firebase:firebase-bom:26.7.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx' playImplementation "com.google.firebase:firebase-inappmessaging-ktx" From 495b84204ca2416ebfdc658cc8a95a2dd8a622a3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 12 Mar 2021 21:06:27 +0000 Subject: [PATCH 0365/1526] Bump work_hilt from 1.0.0-alpha03 to 1.0.0-beta01 (#1208) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f4a9acae6..417a3eade 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -139,7 +139,7 @@ play { ext { work_manager = "2.5.0" - work_hilt = "1.0.0-alpha03" + work_hilt = "1.0.0-beta01" room = "2.3.0-beta02" chucker = "3.4.0" mockk = "1.10.6" From b76032044d5ef8abefd97e32c7fb6a7290d3b203 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 12 Mar 2021 21:06:33 +0000 Subject: [PATCH 0366/1526] Bump activity-ktx from 1.2.0 to 1.2.1 (#1206) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 417a3eade..a3f305bbb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -155,7 +155,7 @@ dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2' implementation "androidx.core:core-ktx:1.3.2" - implementation "androidx.activity:activity-ktx:1.2.0" + implementation "androidx.activity:activity-ktx:1.2.1" implementation "androidx.appcompat:appcompat:1.2.0" implementation "androidx.appcompat:appcompat-resources:1.2.0" implementation "androidx.fragment:fragment-ktx:1.3.0" From 3d467c43ba9d7407a334999f8aaf8c92e95cf89b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 12 Mar 2021 22:07:27 +0100 Subject: [PATCH 0367/1526] Use new kotlin compiler backend (#1202) --- app/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/app/build.gradle b/app/build.gradle index a3f305bbb..b02ab153f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,6 +115,7 @@ android { } kotlinOptions { + useIR = true jvmTarget = "1.8" freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn", "-Xjvm-default=all"] } From fa2cfc842794b5d4eda2d20e03d1048869157232 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 12 Mar 2021 21:33:30 +0000 Subject: [PATCH 0368/1526] Bump room from 2.3.0-beta02 to 2.3.0-beta03 (#1207) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b02ab153f..af4e4af78 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -141,7 +141,7 @@ play { ext { work_manager = "2.5.0" work_hilt = "1.0.0-beta01" - room = "2.3.0-beta02" + room = "2.3.0-beta03" chucker = "3.4.0" mockk = "1.10.6" moshi = "1.11.0" From 94957850c3e40e22cac5110e4f52538e5fb42317 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 12 Mar 2021 21:50:59 +0000 Subject: [PATCH 0369/1526] Bump fragment-ktx from 1.3.0 to 1.3.1 (#1205) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index af4e4af78..0470ffb1d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -159,7 +159,7 @@ dependencies { implementation "androidx.activity:activity-ktx:1.2.1" implementation "androidx.appcompat:appcompat:1.2.0" implementation "androidx.appcompat:appcompat-resources:1.2.0" - implementation "androidx.fragment:fragment-ktx:1.3.0" + implementation "androidx.fragment:fragment-ktx:1.3.1" implementation "androidx.annotation:annotation:1.1.0" implementation "androidx.multidex:multidex:2.0.1" From 8d7110735d3d6f3e980e4db1cd481d97f946ba19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 13 Mar 2021 20:13:37 +0100 Subject: [PATCH 0370/1526] Ignore no current student during avatar loading (#1210) --- .../java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index 857779838..ffcfcb614 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -113,7 +113,7 @@ class MainPresenter @Inject constructor( private fun showCurrentStudentAvatar() { val currentStudent = - studentsWitSemesters!!.single { it.student.isCurrent }.student + studentsWitSemesters?.singleOrNull { it.student.isCurrent }?.student ?: return view?.showStudentAvatar(currentStudent) } From 48249f30930dcbb1c450bc6ee34ab9314b0dc78f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 13 Mar 2021 20:13:48 +0100 Subject: [PATCH 0371/1526] Update kotlin coroutines (#1211) --- app/build.gradle | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0470ffb1d..2d95b0acf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,6 +5,8 @@ apply plugin: 'dagger.hilt.android.plugin' apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'com.github.triplet.play' apply plugin: 'com.mikepenz.aboutlibraries.plugin' +apply plugin: 'com.google.gms.google-services' +apply plugin: 'com.huawei.agconnect' apply from: 'jacoco.gradle' apply from: 'sonarqube.gradle' apply from: 'hooks.gradle' @@ -153,7 +155,7 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3' implementation "androidx.core:core-ktx:1.3.2" implementation "androidx.activity:activity-ktx:1.2.1" @@ -240,6 +242,3 @@ dependencies { androidTestImplementation "io.mockk:mockk-android:$mockk" androidTestImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" } - -apply plugin: 'com.google.gms.google-services' -apply plugin: 'com.huawei.agconnect' From be0445b227b1f4b4be1ab16953476e5bff08f838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Studzi=C5=84ski?= <48914870+studzinskik@users.noreply.github.com> Date: Sat, 13 Mar 2021 20:13:57 +0100 Subject: [PATCH 0372/1526] Change the absence request confirmation message string (#1212) --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 574c21b04..db5ed7b49 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -194,7 +194,7 @@ Absence reason (optional) Send - Absence excused successfully! + Absence excuse request sent successfully! You must select at least one absence! Excuse From 0ea2e6824956817b4c409eef25a35c91c705043f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 13 Mar 2021 20:14:10 +0100 Subject: [PATCH 0373/1526] Fix and clean proguard/r8 file (#1213) --- app/build.gradle | 2 +- app/proguard-rules.pro | 31 ++++++------------------------- 2 files changed, 7 insertions(+), 26 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2d95b0acf..6b1970d15 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,7 +60,7 @@ android { release { minifyEnabled true shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } debug { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 7c7962575..c83795603 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,33 +1,21 @@ -# Optimizations --optimizationpasses 5 --optimizations !code/simplification/arithmetic,!field/*,!class/merging/* --dontusemixedcaseclassnames --dontskipnonpubliclibraryclasses --dontskipnonpubliclibraryclassmembers --dontpreverify +# General -dontobfuscate --allowaccessmodification --repackageclasses '' --verbose -#Keep all wulkanowy files +#Config for wulkanowy -keep class io.github.wulkanowy.** {*;} -#Config for anallitycs --keepattributes *Annotation* +#Config for firebase crashlitycs -keepattributes SourceFile,LineNumberTable --keep class com.crashlytics.** {*;} -keep public class * extends java.lang.Exception --dontwarn com.crashlytics.** -#Config for OkHttp +#Config for Okio and OkHttp +-dontwarn javax.annotation.** -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase -dontwarn org.codehaus.mojo.animal_sniffer.* -dontwarn okhttp3.internal.platform.ConscryptPlatform --dontwarn javax.annotation.** #Config for MPAndroidChart @@ -35,11 +23,4 @@ #Config for Material Components --keep class com.google.android.material.tabs.** { *; } - - -#Config for About Libraries --keep class .R --keep class **.R$* { - ; -} +-keep class com.google.android.material.tabs.** { *; } \ No newline at end of file From fe846b463afa484c8a73ead3baffbdbbe5861a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 13 Mar 2021 20:14:36 +0100 Subject: [PATCH 0374/1526] Update material chips input (#1214) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6b1970d15..e6301b2f6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -172,7 +172,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.0.4" implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0" implementation "com.google.android.material:material:1.3.0" - implementation "com.github.wulkanowy:material-chips-input:2.1.1" + implementation "com.github.wulkanowy:material-chips-input:2.2.0" implementation "com.github.PhilJay:MPAndroidChart:v3.1.0" implementation 'com.mikhaellopez:circularimageview:4.2.0' From c1942d012f1b856b01297009c64b50216dfbe268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 13 Mar 2021 20:15:12 +0100 Subject: [PATCH 0375/1526] Maybe fix fragment commits after activity state is saved (#1216) --- .../github/wulkanowy/ui/modules/main/MainActivity.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 2b2079331..5fda72106 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -291,7 +291,7 @@ class MainActivity : BaseActivity(), MainVie ): Boolean { val fragment = supportFragmentManager.fragmentFactory.instantiate(classLoader, pref.fragment) - navController.pushFragment(fragment) + pushView(fragment) return true } @@ -305,6 +305,8 @@ class MainActivity : BaseActivity(), MainVie } override fun switchMenuView(position: Int) { + if (supportFragmentManager.isStateSaved) return + analytics.popCurrentScreen(navController.currentFrag!!::class.simpleName) navController.switchTab(position) } @@ -322,6 +324,8 @@ class MainActivity : BaseActivity(), MainVie } override fun showAccountPicker(studentWithSemesters: List) { + if (supportFragmentManager.isStateSaved) return + navController.showDialogFragment(AccountQuickDialog.newInstance(studentWithSemesters)) } @@ -339,15 +343,21 @@ class MainActivity : BaseActivity(), MainVie } fun showDialogFragment(dialog: DialogFragment) { + if (supportFragmentManager.isStateSaved) return + navController.showDialogFragment(dialog) } fun pushView(fragment: Fragment) { + if (supportFragmentManager.isStateSaved) return + analytics.popCurrentScreen(navController.currentFrag!!::class.simpleName) navController.pushFragment(fragment) } override fun popView(depth: Int) { + if (supportFragmentManager.isStateSaved) return + analytics.popCurrentScreen(navController.currentFrag!!::class.simpleName) navController.safelyPopFragments(depth) } From eee4e1f4b52fc41a8c397ed2fd79b7c8009f57bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 15 Mar 2021 00:33:40 +0100 Subject: [PATCH 0376/1526] Fix empty view in attendance (#1217) --- .../modules/attendance/AttendanceFragment.kt | 2 +- .../modules/attendance/AttendancePresenter.kt | 39 ++++++++++++------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 00d5aae87..cb718c724 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -192,7 +192,7 @@ class AttendanceFragment : BaseFragment(R.layout.frag } override fun showContent(show: Boolean) { - binding. attendanceRecycler.visibility = if (show) VISIBLE else GONE + binding.attendanceRecycler.visibility = if (show) VISIBLE else GONE } override fun showRefresh(show: Boolean) { 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 68802c0c7..b03db91af 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 @@ -190,35 +190,48 @@ class AttendancePresenter @Inject constructor( flowWithResourceIn { val student = studentRepository.getCurrentStudent() val semester = semesterRepository.getCurrentSemester(student) - attendanceRepository.getAttendance(student, semester, currentDate, currentDate, forceRefresh) + attendanceRepository.getAttendance( + student, + semester, + currentDate, + currentDate, + forceRefresh + ) }.onEach { when (it.status) { Status.LOADING -> { view?.showExcuseButton(false) if (!it.data.isNullOrEmpty()) { + val filteredAttendance = if (prefRepository.isShowPresent) { + it.data + } else { + it.data.filter { item -> !item.presence } + } + view?.run { enableSwipe(true) showRefresh(true) showProgress(false) - showContent(true) - updateData(it.data.let { items -> - if (prefRepository.isShowPresent) items - else items.filter { item -> !item.presence } - }.sortedBy { item -> item.number }) + showEmpty(filteredAttendance.isEmpty()) + showContent(filteredAttendance.isNotEmpty()) + updateData(filteredAttendance.sortedBy { item -> item.number }) } } } Status.SUCCESS -> { Timber.i("Loading attendance result: Success") + val filteredAttendance = if (prefRepository.isShowPresent) { + it.data.orEmpty() + } else { + it.data?.filter { item -> !item.presence }.orEmpty() + } + view?.apply { - updateData(it.data!!.let { items -> - if (prefRepository.isShowPresent) items - else items.filter { item -> !item.presence } - }.sortedBy { item -> item.number }) - showEmpty(it.data.isEmpty()) + updateData(filteredAttendance.sortedBy { item -> item.number }) + showEmpty(filteredAttendance.isEmpty()) showErrorView(false) - showContent(it.data.isNotEmpty()) - showExcuseButton(it.data.any { item -> item.excusable }) + showContent(filteredAttendance.isNotEmpty()) + showExcuseButton(filteredAttendance.any { item -> item.excusable }) } analytics.logEvent( "load_data", From 94506aca52ebb3fc2d310c778c2bd1155c8a90aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 15 Mar 2021 18:18:08 +0100 Subject: [PATCH 0377/1526] Add github actions config to deploy apk to App Center (#1220) --- .github/workflows/test.yml | 132 +++++++++++++++++++++++++++++++++++++ app/bitrise.jks | Bin 0 -> 2235 bytes app/bitrise.jks.gpg | Bin 0 -> 2215 bytes 3 files changed, 132 insertions(+) create mode 100644 app/bitrise.jks create mode 100644 app/bitrise.jks.gpg diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 806288a1a..a81b333f3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -68,3 +68,135 @@ jobs: PLAY_SERVICE_ACCOUNT_EMAIL: ${{ secrets.PLAY_SERVICE_ACCOUNT_EMAIL }} PLAY_STORE_PASSWORD: ${{ secrets.PLAY_STORE_PASSWORD }} run: ./gradlew publishPlayRelease -PenableFirebase --stacktrace; + + deploy-appcenter: + name: Deploy to App Center + runs-on: ubuntu-latest + timeout-minutes: 10 + environment: app-center + if: github.ref != 'refs/heads/develop' + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 11 + - uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*') }} + - name: Set run number with offset + env: + BUILD_NUMBER_OFFSET: ${{ secrets.BUILD_NUMBER_OFFSET }} + run: echo "RUN_NUMBER=$((GITHUB_RUN_NUMBER+BUILD_NUMBER_OFFSET))" >> $GITHUB_ENV + - name: Prepare build configuration + run: | + sed -i -e "s#applicationIdSuffix \".dev\"#applicationIdSuffix \".${GITHUB_HEAD_REF//[-.\/]/_}\"#" app/build.gradle + sed -i -e "s#.dev\"#.${GITHUB_HEAD_REF//[-.\/]/_}\"#" app/src/debug/google-services.json + sed -i -e "s#.dev\"#.${GITHUB_HEAD_REF//[-.\/]/_}\"#" app/src/debug/agconnect-services.json + sed -i -e '/versionNameSuffix/d' app/build.gradle + - name: Add signing config + run: | + cat >> app/build.gradle <> $GITHUB_ENV + - name: Add signing config + run: | + cat >> app/build.gradle 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 Date: Mon, 15 Mar 2021 23:58:50 +0100 Subject: [PATCH 0378/1526] Fix semester switch when student have only one semester (#1215) --- app/build.gradle | 2 +- .../ui/modules/grade/GradeFragment.kt | 9 ++++----- .../ui/modules/grade/GradePresenter.kt | 20 +++++++++++++------ .../wulkanowy/ui/modules/grade/GradeView.kt | 3 ++- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e6301b2f6..3a449f5ec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -150,7 +150,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:1.1.0" + implementation "io.github.wulkanowy:sdk:b2c274e" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt index 06b3e9316..b3ef3037a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt @@ -10,6 +10,7 @@ import android.view.View.VISIBLE import androidx.appcompat.app.AlertDialog import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.databinding.FragmentGradeBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter @@ -121,11 +122,9 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade semesterSwitchMenu?.isVisible = show } - override fun showSemesterDialog(selectedIndex: Int) { - val choices = arrayOf( - getString(R.string.grade_semester, 1), - getString(R.string.grade_semester, 2) - ) + override fun showSemesterDialog(selectedIndex: Int, semesters: List) { + val choices = semesters.map { getString(R.string.grade_semester, it.semesterName) } + .toTypedArray() AlertDialog.Builder(requireContext()) .setSingleChoiceItems(choices, selectedIndex) { dialog, which -> diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index bfc504d2c..c467c421e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -49,7 +49,9 @@ class GradePresenter @Inject constructor( } fun onSemesterSwitch(): Boolean { - if (semesters.isNotEmpty()) view?.showSemesterDialog(selectedIndex - 1) + if (semesters.isNotEmpty()) { + view?.showSemesterDialog(selectedIndex - 1, semesters.slice(0..1)) + } return true } @@ -137,11 +139,17 @@ class GradePresenter @Inject constructor( private fun loadChild(index: Int, forceRefresh: Boolean = false) { Timber.d("Load grade tab child. Selected semester: $selectedIndex, semesters: ${semesters.joinToString { it.semesterName.toString() }}") - semesters.first { it.semesterName == selectedIndex }.semesterId.also { - if (forceRefresh || loadedSemesterId[index] != it) { - Timber.i("Load grade child view index: $index") - view?.notifyChildLoadData(index, it, forceRefresh) - } + + val newSelectedSemesterId = try { + semesters.first { it.semesterName == selectedIndex }.semesterId + } catch (e: NoSuchElementException) { + Timber.e(e, "Selected semester no exists") + return + } + + if (forceRefresh || loadedSemesterId[index] != newSelectedSemesterId) { + Timber.i("Load grade child view index: $index") + view?.notifyChildLoadData(index, newSelectedSemesterId, forceRefresh) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt index 7b52daa88..104f8505a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.grade +import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.ui.base.BaseView interface GradeView : BaseView { @@ -18,7 +19,7 @@ interface GradeView : BaseView { fun showSemesterSwitch(show: Boolean) - fun showSemesterDialog(selectedIndex: Int) + fun showSemesterDialog(selectedIndex: Int, semesters: List) fun setCurrentSemesterName(semester: Int, schoolYear: Int) From c77b50d51b381bb906ad57c5b13322d17977a512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 16 Mar 2021 00:30:28 +0100 Subject: [PATCH 0379/1526] New Crowdin updates (#1204) --- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 4 ++-- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4745e1717..8c8ad7291 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -192,7 +192,7 @@ Důvod nepřítomnosti (volitelný) Poslat - Nepřítomnost úspěšně omluvena! + Žádost o omluvu nepřítomnosti byla úspěšně odeslána! Musíte vybrat alespoň jednu nepřítomnost! Ospravedlnit diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a0994b422..391fdd21f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -176,7 +176,7 @@ Abwesenheitsgrund (optional) Senden - Abwesenheit erfolgreich entschuldigt! + Absence excuse request sent successfully! Sie müssen mindestens eine Abwesenheit auswählen! Verzeihung diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 6542a5bc6..569df4bc8 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -192,7 +192,7 @@ Absence reason (optional) Send - Absence excused successfully! + Absence excuse request sent successfully! You must select at least one absence! Excuse diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 3f69d2a86..0d4395838 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -192,7 +192,7 @@ Powód nieobecności (opcjonalny) Wyślij - Usprawiedliwiono pomyślnie! + Prośba o usprawiedliwienie została pomyślnie wysłana! Musisz wybrać co najmniej jedną nieobecność! Usprawiedliw @@ -317,7 +317,7 @@ Pokaż historię Historia numerków - Brak informacji o szczęśliwych numerach + Brak informacji o szczęśliwych numerkach Dostęp mobilny Brak urządzeń diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 02407bbd0..b614ac9e9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -192,7 +192,7 @@ Причина отсутствия (необязательно) Послать - Статус отсутствия изменён + Absence excuse request sent successfully! Выберите хотя-бы одно отсутствие Изменить статус diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 32bd8067e..601bd880e 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -192,7 +192,7 @@ Dôvod neprítomnosti (voliteľný) Poslať - Neprítomnosť úspešne ospravedlnená! + Žiadosť o ospravedlnenie neprítomnosti bola úspešne odoslaná! Musíte vybrať aspoň jednu neprítomnosť! Ospravedlniť diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 64e147e74..61a6bb3f2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -192,7 +192,7 @@ Причина відсутності (необов’язково) Надіслати - Змінено статус відсутності + Absence excuse request sent successfully! Оберіть хоча б одну відсутність Змінити статус From eeb1341c1ff6d90c7d1c5796c697b22f7a18677b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 16 Mar 2021 00:43:28 +0100 Subject: [PATCH 0380/1526] Version 1.1.1 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 11 +++-------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3a449f5ec..d2f592397 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 30 - versionCode 86 - versionName "1.1.0" + versionCode 87 + versionName "1.1.1" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -137,7 +137,7 @@ play { serviceAccountCredentials = file('key.p12') defaultToAppBundles = false track = 'production' - updatePriority = 3 + updatePriority = 5 } ext { @@ -150,7 +150,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:b2c274e" + implementation "io.github.wulkanowy:sdk:1.1.1" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 35320c1ea..2b0af6e5a 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,11 +1,6 @@ -Wersja 1.1.0 +Wersja 1.1.1 -- dodaliśmy wyświetlanie inicjałów imienia ucznia jako awatar widoczny w aplikacji -- dodaliśmy historię szczęśliwego numerka -- dodaliśmy język słowacki -- zmieniliśmy kolor górnego i dolnego paska systemowego lepiej dostosowując je do aplikacji -- zmieniliśmy wygląd ustawień dzieląc je na sekcje -- naprawiliśmy problem dublujących się czasem ocen -- naprawiliśmy kilka innych błędów i poprawiliśmy stabilność aplikacji +- naprawiliśmy wyświetlanie planu lekcji +- naprawiliśmy kilka rzadkich problemów ze stabilnością Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 3f6159e976cad3e3224a2a38c7530e8b3fdcb361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 16 Mar 2021 12:47:51 +0100 Subject: [PATCH 0381/1526] Fix show error details button in additional lessons (#1225) --- app/build.gradle | 2 +- .../modules/timetable/additional/AdditionalLessonsFragment.kt | 1 + .../timetable/additional/AdditionalLessonsPresenter.kt | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d2f592397..78a31aac7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -150,7 +150,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:1.1.1" + implementation "com.github.wulkanowy:sdk:340cf4ebd3" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt index 18551faa8..7982387df 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt @@ -57,6 +57,7 @@ class AdditionalLessonsFragment : additionalLessonsSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) additionalLessonsSwipe.setProgressBackgroundColorSchemeColor(requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh)) additionalLessonsErrorRetry.setOnClickListener { presenter.onRetry() } + additionalLessonsErrorDetails.setOnClickListener { presenter.onDetailsClick() } additionalLessonsPreviousButton.setOnClickListener { presenter.onPreviousDay() } additionalLessonsNavDate.setOnClickListener { presenter.onPickDate() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsPresenter.kt index 623160e7e..21997b33f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsPresenter.kt @@ -80,6 +80,10 @@ class AdditionalLessonsPresenter @Inject constructor( loadData(currentDate, true) } + fun onDetailsClick() { + view?.showErrorDetailsDialog(lastError) + } + private fun setBaseDateOnHolidays() { flow { val student = studentRepository.getCurrentStudent() From 21ef2adcf6d6e7769ac8707d122575238ca936db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 16 Mar 2021 12:49:17 +0100 Subject: [PATCH 0382/1526] Disable optimization in r8 config and fix crash in grade fragment (#1226) --- app/build.gradle | 2 +- app/proguard-rules.pro | 2 +- .../java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 78a31aac7..ba49f4484 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,7 +60,7 @@ android { release { minifyEnabled true shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } debug { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index c83795603..fd9482613 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -23,4 +23,4 @@ #Config for Material Components --keep class com.google.android.material.tabs.** { *; } \ No newline at end of file +-keep class com.google.android.material.tabs.** { *; } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index c467c421e..504c730de 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -50,7 +50,7 @@ class GradePresenter @Inject constructor( fun onSemesterSwitch(): Boolean { if (semesters.isNotEmpty()) { - view?.showSemesterDialog(selectedIndex - 1, semesters.slice(0..1)) + view?.showSemesterDialog(selectedIndex - 1, semesters.take(2)) } return true } From 3e1acbd3bfdc94363a30477600f9d166c3e34abd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 16 Mar 2021 12:58:52 +0100 Subject: [PATCH 0383/1526] Version 1.1.2 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ba49f4484..b8b6f0162 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 30 - versionCode 87 - versionName "1.1.1" + versionCode 88 + versionName "1.1.2" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -150,7 +150,7 @@ ext { } dependencies { - implementation "com.github.wulkanowy:sdk:340cf4ebd3" + implementation "io.github.wulkanowy:sdk:1.1.2" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 2b0af6e5a..8ab595f93 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,6 @@ -Wersja 1.1.1 +Wersja 1.1.2 -- naprawiliśmy wyświetlanie planu lekcji +- naprawiliśmy wyświetlanie planu lekcji i lekcji dodatkowych - naprawiliśmy kilka rzadkich problemów ze stabilnością Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 57681b35ea0be4e8b7df011050410445dce126ae Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 17 Mar 2021 22:58:17 +0000 Subject: [PATCH 0384/1526] Bump mockk from 1.10.6 to 1.11.0 (#1229) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b8b6f0162..3e56ea24b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -145,7 +145,7 @@ ext { work_hilt = "1.0.0-beta01" room = "2.3.0-beta03" chucker = "3.4.0" - mockk = "1.10.6" + mockk = "1.11.0" moshi = "1.11.0" } From 87e7e00705c25c0d9807207bfc7c9c5e9fd21f74 Mon Sep 17 00:00:00 2001 From: MRmlik12 <44818681+MRmlik12@users.noreply.github.com> Date: Fri, 19 Mar 2021 15:57:12 +0100 Subject: [PATCH 0385/1526] Remove firebase inappmessage dependency (#1235) --- app/build.gradle | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3e56ea24b..6b36d6299 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -208,8 +208,6 @@ dependencies { playImplementation platform('com.google.firebase:firebase-bom:26.7.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' - playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx' - playImplementation "com.google.firebase:firebase-inappmessaging-ktx" playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.android.play:core-ktx:1.8.1' From c9dc9a323fc6518ea7168f17fe36494f52db086e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Mar 2021 15:02:28 +0000 Subject: [PATCH 0386/1526] Bump gradle from 4.1.2 to 4.1.3 (#1234) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8a10f65be..77374fe8a 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.android.tools.build:gradle:4.1.2' + classpath 'com.android.tools.build:gradle:4.1.3' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.5' classpath 'com.huawei.agconnect:agcp:1.5.0.300' From 5bee155f1ed7b2e898bb1a6a3668b86358b095e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 20 Mar 2021 13:10:53 +0100 Subject: [PATCH 0387/1526] Remove listenablefuture from dependencies (#1237) --- app/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6b36d6299..c31ced27c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -211,7 +211,6 @@ dependencies { playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.android.play:core-ktx:1.8.1' - playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' hmsImplementation 'com.huawei.hms:hianalytics:5.2.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.5.0.300' From 15603357499961ae70dcf2753bd46362a4bc501a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 20 Mar 2021 13:27:47 +0100 Subject: [PATCH 0388/1526] Fix very rare crash in login recovery (#1231) --- .../login/recover/LoginRecoverFragment.kt | 22 +++++++++++---- .../res/layout/fragment_login_recover.xml | 28 +++++++++++-------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt index f0c9652fb..2e2f9f5ce 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt @@ -9,6 +9,7 @@ import android.view.View.VISIBLE import android.webkit.JavascriptInterface import android.webkit.WebView import android.webkit.WebViewClient +import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R @@ -42,10 +43,12 @@ class LoginRecoverFragment : private lateinit var hostSymbols: Array override val recoverHostValue: String - get() = hostValues.getOrNull(hostKeys.indexOf(bindingLocal.loginRecoverHost.text.toString())).orEmpty() + get() = hostValues.getOrNull(hostKeys.indexOf(bindingLocal.loginRecoverHost.text.toString())) + .orEmpty() override val formHostSymbol: String - get() = hostSymbols.getOrNull(hostKeys.indexOf(bindingLocal.loginRecoverHost.text.toString())).orEmpty() + get() = hostSymbols.getOrNull(hostKeys.indexOf(bindingLocal.loginRecoverHost.text.toString())) + .orEmpty() override val recoverNameValue: String get() = bindingLocal.loginRecoverName.text.toString().trim() @@ -82,7 +85,9 @@ class LoginRecoverFragment : with(bindingLocal.loginRecoverHost) { setText(hostKeys.getOrNull(0).orEmpty()) - setAdapter(LoginSymbolAdapter(context, R.layout.support_simple_spinner_dropdown_item, hostKeys)) + setAdapter( + LoginSymbolAdapter(context, R.layout.support_simple_spinner_dropdown_item, hostKeys) + ) setOnClickListener { if (bindingLocal.loginRecoverFormContainer.visibility == GONE) dismissDropDown() } } } @@ -127,6 +132,7 @@ class LoginRecoverFragment : override fun showErrorView(show: Boolean) { bindingLocal.loginRecoverError.visibility = if (show) VISIBLE else GONE + bindingLocal.loginRecoverErrorDetails.isVisible = true } override fun setErrorDetails(message: String) { @@ -166,7 +172,7 @@ class LoginRecoverFragment : with(bindingLocal.loginRecoverWebView) { settings.javaScriptEnabled = true webViewClient = object : WebViewClient() { - private var recoverWebViewSuccess: Boolean = true + private var recoverWebViewSuccess = true override fun onPageFinished(view: WebView?, url: String?) { if (recoverWebViewSuccess) { @@ -175,10 +181,16 @@ class LoginRecoverFragment : } else { showProgress(false) showErrorView(true) + bindingLocal.loginRecoverErrorDetails.isVisible = false } } - override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) { + override fun onReceivedError( + view: WebView, + errorCode: Int, + description: String, + failingUrl: String + ) { recoverWebViewSuccess = false } } diff --git a/app/src/main/res/layout/fragment_login_recover.xml b/app/src/main/res/layout/fragment_login_recover.xml index 629ed54de..4277155bc 100644 --- a/app/src/main/res/layout/fragment_login_recover.xml +++ b/app/src/main/res/layout/fragment_login_recover.xml @@ -26,7 +26,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="16dp" - android:visibility="visible"> + android:visibility="gone"> @@ -156,7 +156,7 @@ android:orientation="vertical" android:visibility="invisible" tools:ignore="UseCompoundDrawables" - tools:visibility="invisible"> + tools:visibility="visible"> - + android:layout_marginTop="16dp"> + android:text="@string/all_details" + app:layout_constraintEnd_toStartOf="@id/loginRecoverErrorRetry" + app:layout_constraintHorizontal_chainStyle="packed" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + android:text="@string/all_retry" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/loginRecoverErrorDetails" + app:layout_constraintTop_toTopOf="parent" /> + + tools:visibility="gone"> - From efafd2094a0d913cd40bef53cc78434a94bcf3a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 20 Mar 2021 14:01:17 +0100 Subject: [PATCH 0389/1526] Add dialog with info about dropping support for android 4 (#1221) --- .../repositories/PreferencesRepository.kt | 5 +++ .../ui/modules/splash/SplashActivity.kt | 16 +++++++++ .../ui/modules/splash/SplashPresenter.kt | 35 ++++++++++++++++--- .../wulkanowy/ui/modules/splash/SplashView.kt | 2 ++ app/src/main/res/values/strings.xml | 7 ++++ .../ui/modules/splash/SplashPresenterTest.kt | 17 ++++++++- 6 files changed, 76 insertions(+), 6 deletions(-) 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 11adbd0f7..5bd1f3c12 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 @@ -2,6 +2,7 @@ package io.github.wulkanowy.data.repositories import android.content.Context import android.content.SharedPreferences +import androidx.core.content.edit import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.grade.GradeAverageMode @@ -145,6 +146,10 @@ class PreferencesRepository @Inject constructor( R.bool.pref_default_subjects_without_grades ) + var isKitkatDialogDisabled: Boolean + get() = sharedPref.getBoolean("kitkat_dialog_disabled", false) + set(value) = sharedPref.edit { putBoolean("kitkat_dialog_disabled", value) } + private fun getString(id: Int, default: Int) = getString(context.getString(id), default) private fun getString(id: String, default: Int) = diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt index 80138175d..2b96a9a0c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt @@ -3,17 +3,23 @@ package io.github.wulkanowy.ui.modules.splash import android.os.Bundle import android.widget.Toast import android.widget.Toast.LENGTH_LONG +import androidx.appcompat.app.AlertDialog import androidx.viewbinding.ViewBinding import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject @AndroidEntryPoint class SplashActivity : BaseActivity(), SplashView { + @Inject + lateinit var appInfo: AppInfo + @Inject override lateinit var presenter: SplashPresenter @@ -40,4 +46,14 @@ class SplashActivity : BaseActivity(), SplashView override fun showError(text: String, error: Throwable) { Toast.makeText(this, text, LENGTH_LONG).show() } + + override fun showKitkatView() { + AlertDialog.Builder(this) + .setTitle(R.string.drop_kitkat_title) + .setMessage(R.string.drop_kitkat_content) + .setPositiveButton(android.R.string.ok, null) + .setNeutralButton(R.string.drop_kitkat_again) { _, _ -> presenter.onNeutralButtonSelected() } + .setOnDismissListener { presenter.onKitkatViewDismissed() } + .show() + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt index 795889171..4590d91a5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt @@ -1,9 +1,12 @@ package io.github.wulkanowy.ui.modules.splash +import android.os.Build import io.github.wulkanowy.data.Status +import io.github.wulkanowy.data.repositories.PreferencesRepository 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.utils.AppInfo import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach import timber.log.Timber @@ -11,25 +14,47 @@ import javax.inject.Inject class SplashPresenter @Inject constructor( errorHandler: ErrorHandler, - studentRepository: StudentRepository + studentRepository: StudentRepository, + private val preferencesRepository: PreferencesRepository, + private val appInfo: AppInfo ) : BasePresenter(errorHandler, studentRepository) { + private var externalUrl: String? = null + fun onAttachView(view: SplashView, externalUrl: String?) { super.onAttachView(view) + this.externalUrl = externalUrl + if (appInfo.systemVersion < Build.VERSION_CODES.LOLLIPOP && !preferencesRepository.isKitkatDialogDisabled) { + view.showKitkatView() + } else { + loadCorrectDataOrUser() + } + } + + private fun loadCorrectDataOrUser() { if (!externalUrl.isNullOrBlank()) { - return view.openExternalUrlAndFinish(externalUrl) + view?.openExternalUrlAndFinish(externalUrl!!) + return } flowWithResource { studentRepository.isCurrentStudentSet() }.onEach { when (it.status) { Status.LOADING -> Timber.d("Is current user set check started") - Status.SUCCESS -> with(view) { - if (it.data!!) openMainView() - else openLoginView() + Status.SUCCESS -> { + if (it.data!!) view?.openMainView() + else view?.openLoginView() } Status.ERROR -> errorHandler.dispatch(it.error!!) } }.launch() } + + fun onKitkatViewDismissed() { + loadCorrectDataOrUser() + } + + fun onNeutralButtonSelected() { + preferencesRepository.isKitkatDialogDisabled = true + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt index a5aa14091..c9c5fe9a4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt @@ -9,4 +9,6 @@ interface SplashView : BaseView { fun openMainView() fun openExternalUrlAndFinish(url: String) + + fun showKitkatView() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index db5ed7b49..c4109d2b8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -541,6 +541,12 @@ Debug + + End of support + We are ending support for your device. No more new features will appear for it in Wulkanowy. However, we will be releasing critical patches until the end of 2021 so you have time to switch to a newer model + Don\'t show again + + Black Red @@ -554,6 +560,7 @@ Copied Undo + Download of updates has started… An update has just been downloaded. diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt index 71d17b3b8..48c2aa9c3 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt @@ -1,10 +1,13 @@ package io.github.wulkanowy.ui.modules.splash import io.github.wulkanowy.MainCoroutineRule +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.ui.base.ErrorHandler +import io.github.wulkanowy.utils.AppInfo import io.mockk.MockKAnnotations import io.mockk.coEvery +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.verify import org.junit.Before @@ -22,6 +25,12 @@ class SplashPresenterTest { @MockK lateinit var studentRepository: StudentRepository + @MockK + lateinit var preferencesRepository: PreferencesRepository + + @MockK + lateinit var appInfo: AppInfo + @MockK(relaxed = true) lateinit var errorHandler: ErrorHandler @@ -30,19 +39,25 @@ class SplashPresenterTest { @Before fun setUp() { MockKAnnotations.init(this) - presenter = SplashPresenter(errorHandler, studentRepository) + presenter = SplashPresenter(errorHandler, studentRepository, preferencesRepository, appInfo) } @Test fun testOpenLoginView() { + every { appInfo.systemVersion } returns 30 + every { preferencesRepository.isKitkatDialogDisabled } returns true coEvery { studentRepository.isCurrentStudentSet() } returns false + presenter.onAttachView(splashView, null) verify { splashView.openLoginView() } } @Test fun testMainMainView() { + every { appInfo.systemVersion } returns 30 + every { preferencesRepository.isKitkatDialogDisabled } returns true coEvery { studentRepository.isCurrentStudentSet() } returns true + presenter.onAttachView(splashView, null) verify { splashView.openMainView() } } From e03b0dfa0150505da6c67c9bc4917ed292719e66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 21 Mar 2021 12:04:55 +0100 Subject: [PATCH 0390/1526] Fix missing avatars in widgets (#1238) --- .../ui/base/WidgetConfigureAdapter.kt | 29 ++++-- .../TimetableWidgetProvider.kt | 93 ++++++++++++++++--- 2 files changed, 101 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt index 8e6130fbf..99440f83f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt @@ -1,18 +1,20 @@ package io.github.wulkanowy.ui.base import android.annotation.SuppressLint -import android.graphics.PorterDuff import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.databinding.ItemAccountBinding +import io.github.wulkanowy.utils.createNameInitialsDrawable import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.nickOrName import javax.inject.Inject -class WidgetConfigureAdapter @Inject constructor() : RecyclerView.Adapter() { +class WidgetConfigureAdapter @Inject constructor() : + RecyclerView.Adapter() { var items = emptyList>() @@ -27,16 +29,31 @@ class WidgetConfigureAdapter @Inject constructor() : RecyclerView.Adapter 1 with(holder.binding) { accountItemName.text = "${student.nickOrName} ${student.className}" accountItemSchool.text = student.schoolName + accountItemImage.setImageDrawable(avatar) - with(accountItemImage) { - val colorImage = if (isCurrent) context.getThemeAttrColor(R.attr.colorPrimary) - else context.getThemeAttrColor(R.attr.colorOnSurface, 153) + with(accountItemAccountType) { + setText(if (student.isParent) R.string.account_type_parent else R.string.account_type_student) + isVisible = isDuplicatedStudent + } - setColorFilter(colorImage, PorterDuff.Mode.SRC_IN) + with(accountItemCheck) { + isVisible = isCurrent + borderColor = checkBackgroundColor + circleColor = checkBackgroundColor } root.setOnClickListener { onClickListener(student) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 1d63f0943..071a2d178 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -13,6 +13,8 @@ import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.res.Configuration +import android.graphics.Bitmap +import android.graphics.Canvas import android.widget.RemoteViews import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R @@ -25,6 +27,8 @@ import io.github.wulkanowy.services.widgets.TimetableWidgetService import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AnalyticsHelper +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 @@ -72,7 +76,8 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { fun getThemeWidgetKey(appWidgetId: Int) = "timetable_widget_theme_$appWidgetId" - fun getCurrentThemeWidgetKey(appWidgetId: Int) = "timetable_widget_current_theme_$appWidgetId" + fun getCurrentThemeWidgetKey(appWidgetId: Int) = + "timetable_widget_current_theme_$appWidgetId" } override fun onReceive(context: Context, intent: Intent) { @@ -88,21 +93,29 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { private suspend fun onUpdate(context: Context, intent: Intent) { if (intent.getStringExtra(EXTRA_BUTTON_TYPE) === null) { intent.getIntArrayExtra(EXTRA_APPWIDGET_IDS)?.forEach { appWidgetId -> - val student = getStudent(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId) + val student = + getStudent(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId) updateWidget(context, appWidgetId, now().nextOrSameSchoolDay, student) } } else { val buttonType = intent.getStringExtra(EXTRA_BUTTON_TYPE) val toggledWidgetId = intent.getIntExtra(EXTRA_TOGGLED_WIDGET_ID, 0) - val student = getStudent(sharedPref.getLong(getStudentWidgetKey(toggledWidgetId), 0), toggledWidgetId) - val savedDate = LocalDate.ofEpochDay(sharedPref.getLong(getDateWidgetKey(toggledWidgetId), 0)) + val student = getStudent( + sharedPref.getLong(getStudentWidgetKey(toggledWidgetId), 0), + toggledWidgetId + ) + val savedDate = + LocalDate.ofEpochDay(sharedPref.getLong(getDateWidgetKey(toggledWidgetId), 0)) val date = when (buttonType) { BUTTON_RESET -> now().nextOrSameSchoolDay BUTTON_NEXT -> savedDate.nextSchoolDay BUTTON_PREV -> savedDate.previousSchoolDay else -> now().nextOrSameSchoolDay } - if (!buttonType.isNullOrBlank()) analytics.logEvent("changed_timetable_widget_day", "button" to buttonType) + if (!buttonType.isNullOrBlank()) analytics.logEvent( + "changed_timetable_widget_day", + "button" to buttonType + ) updateWidget(context, toggledWidgetId, date, student) } } @@ -121,9 +134,15 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { } @SuppressLint("DefaultLocale") - private fun updateWidget(context: Context, appWidgetId: Int, date: LocalDate, student: Student?) { + private fun updateWidget( + context: Context, + appWidgetId: Int, + date: LocalDate, + student: Student? + ) { val savedConfigureTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) - val isSystemDarkMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES + val isSystemDarkMode = + context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES var currentTheme = 0L var layoutId = R.layout.widget_timetable @@ -134,21 +153,28 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { val nextNavIntent = createNavIntent(context, appWidgetId, appWidgetId, BUTTON_NEXT) val prevNavIntent = createNavIntent(context, -appWidgetId, appWidgetId, BUTTON_PREV) - val resetNavIntent = createNavIntent(context, Int.MAX_VALUE - appWidgetId, appWidgetId, BUTTON_RESET) + val resetNavIntent = + createNavIntent(context, Int.MAX_VALUE - appWidgetId, appWidgetId, BUTTON_RESET) val adapterIntent = Intent(context, TimetableWidgetService::class.java) .apply { putExtra(EXTRA_APPWIDGET_ID, appWidgetId) //make Intent unique action = appWidgetId.toString() } - val accountIntent = PendingIntent.getActivity(context, -Int.MAX_VALUE + appWidgetId, + val accountIntent = PendingIntent.getActivity( + context, -Int.MAX_VALUE + appWidgetId, Intent(context, TimetableWidgetConfigureActivity::class.java).apply { addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK) putExtra(EXTRA_APPWIDGET_ID, appWidgetId) putExtra(EXTRA_FROM_PROVIDER, true) - }, FLAG_UPDATE_CURRENT) - val appIntent = PendingIntent.getActivity(context, MainView.Section.TIMETABLE.id, - MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true), FLAG_UPDATE_CURRENT) + }, FLAG_UPDATE_CURRENT + ) + val appIntent = PendingIntent.getActivity( + context, + MainView.Section.TIMETABLE.id, + MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true), + FLAG_UPDATE_CURRENT + ) val remoteView = RemoteViews(context.packageName, layoutId).apply { setEmptyView(R.id.timetableWidgetList, R.id.timetableWidgetEmpty) @@ -160,6 +186,11 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { R.id.timetableWidgetName, student?.nickOrName ?: context.getString(R.string.all_no_data) ) + + student?.let { + setImageViewBitmap(R.id.timetableWidgetAccount, context.createAvatarBitmap(it)) + } + setRemoteAdapter(R.id.timetableWidgetList, adapterIntent) setOnClickPendingIntent(R.id.timetableWidgetNext, nextNavIntent) setOnClickPendingIntent(R.id.timetableWidgetPrev, prevNavIntent) @@ -181,13 +212,20 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { } } - private fun createNavIntent(context: Context, code: Int, appWidgetId: Int, buttonType: String): PendingIntent { - return PendingIntent.getBroadcast(context, code, + private fun createNavIntent( + context: Context, + code: Int, + appWidgetId: Int, + buttonType: String + ): PendingIntent { + return PendingIntent.getBroadcast( + context, code, Intent(context, TimetableWidgetProvider::class.java).apply { action = ACTION_APPWIDGET_UPDATE putExtra(EXTRA_BUTTON_TYPE, buttonType) putExtra(EXTRA_TOGGLED_WIDGET_ID, appWidgetId) - }, FLAG_UPDATE_CURRENT) + }, FLAG_UPDATE_CURRENT + ) } private suspend fun getStudent(studentId: Long, appWidgetId: Int) = try { @@ -208,4 +246,29 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { } null } + + private fun Context.createAvatarBitmap(student: Student): Bitmap { + val avatarColor = if (student.avatarColor == -2937041L) { + getCompatColor(R.color.colorPrimaryLight).toLong() + } else { + student.avatarColor + } + val avatarDrawable = createNameInitialsDrawable(student.nickOrName, avatarColor, 0.5f) + + val avatarBitmap = + if (avatarDrawable.intrinsicWidth <= 0 || avatarDrawable.intrinsicHeight <= 0) { + Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) + } else { + Bitmap.createBitmap( + avatarDrawable.intrinsicWidth, + avatarDrawable.intrinsicHeight, + Bitmap.Config.ARGB_8888 + ) + } + + val canvas = Canvas(avatarBitmap) + avatarDrawable.setBounds(0, 0, canvas.width, canvas.height) + avatarDrawable.draw(canvas) + return avatarBitmap + } } From 8733e7782f5d87e8ae8525cb51644d04ac3a68ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 21 Mar 2021 22:37:34 +0100 Subject: [PATCH 0391/1526] Fix colorPrimary and class name in widget account manager (#1241) --- .../ui/base/WidgetConfigureAdapter.kt | 14 +++++++++----- .../ui/modules/account/AccountAdapter.kt | 7 +++---- .../LuckyNumberWidgetConfigureActivity.kt | 9 ++++++--- .../LuckyNumberWidgetConfigurePresenter.kt | 9 +++++---- .../LuckyNumberWidgetConfigureView.kt | 4 ++-- .../TimetableWidgetConfigureActivity.kt | 18 +++++++++++++----- .../TimetableWidgetConfigurePresenter.kt | 15 ++++++++++----- .../TimetableWidgetConfigureView.kt | 4 ++-- app/src/main/res/values-night/styles.xml | 8 ++++++++ app/src/main/res/values/styles.xml | 2 +- 10 files changed, 59 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt index 99440f83f..a43aaffb7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/WidgetConfigureAdapter.kt @@ -7,6 +7,7 @@ import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.databinding.ItemAccountBinding import io.github.wulkanowy.utils.createNameInitialsDrawable import io.github.wulkanowy.utils.getThemeAttrColor @@ -16,7 +17,9 @@ import javax.inject.Inject class WidgetConfigureAdapter @Inject constructor() : RecyclerView.Adapter() { - var items = emptyList>() + var items = emptyList() + + var selectedId = -1L var onClickListener: (Student) -> Unit = {} @@ -28,12 +31,13 @@ class WidgetConfigureAdapter @Inject constructor() : @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - val (student, isCurrent) = items[position] + val (student, semesters) = items[position] + val semester = semesters.maxByOrNull { it.semesterId } val context = holder.binding.root.context val checkBackgroundColor = context.getThemeAttrColor(R.attr.colorSurface) val avatar = context.createNameInitialsDrawable(student.nickOrName, student.avatarColor) val isDuplicatedStudent = items.filter { - val studentToCompare = it.first + val studentToCompare = it.student studentToCompare.studentId == student.studentId && studentToCompare.schoolSymbol == student.schoolSymbol @@ -41,7 +45,7 @@ class WidgetConfigureAdapter @Inject constructor() : }.size > 1 with(holder.binding) { - accountItemName.text = "${student.nickOrName} ${student.className}" + accountItemName.text = "${student.nickOrName} ${semester?.diaryName.orEmpty()}" accountItemSchool.text = student.schoolName accountItemImage.setImageDrawable(avatar) @@ -51,7 +55,7 @@ class WidgetConfigureAdapter @Inject constructor() : } with(accountItemCheck) { - isVisible = isCurrent + isVisible = student.id == selectedId borderColor = checkBackgroundColor circleColor = checkBackgroundColor } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt index 227f06613..523fbbd79 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountAdapter.kt @@ -74,9 +74,8 @@ class AccountAdapter @Inject constructor() : RecyclerView.Adapter 1 && isAccountQuickDialogMode with(binding) { - accountItemName.text = "${student.nickOrName} ${diary?.diaryName.orEmpty()}" + accountItemName.text = "${student.nickOrName} ${semester?.diaryName.orEmpty()}" accountItemSchool.text = studentWithSemesters.student.schoolName accountItemImage.setImageDrawable(avatar) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt index 692615d98..024beff85 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt @@ -11,7 +11,7 @@ import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.databinding.ActivityWidgetConfigureBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.WidgetConfigureAdapter @@ -38,7 +38,9 @@ class LuckyNumberWidgetConfigureActivity : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setResult(RESULT_CANCELED) - setContentView(ActivityWidgetConfigureBinding.inflate(layoutInflater).apply { binding = this }.root) + setContentView( + ActivityWidgetConfigureBinding.inflate(layoutInflater).apply { binding = this }.root + ) intent.extras.let { presenter.onAttachView(this, it?.getInt(EXTRA_APPWIDGET_ID)) @@ -70,8 +72,9 @@ class LuckyNumberWidgetConfigureActivity : .show() } - override fun updateData(data: List>) { + override fun updateData(data: List, selectedStudentId: Long) { with(configureAdapter) { + selectedId = selectedStudentId items = data notifyDataSetChanged() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt index f4041e9e4..5b6af69ac 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt @@ -51,16 +51,17 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( when (it.status) { Status.LOADING -> Timber.d("Lucky number widget configure students data load") Status.SUCCESS -> { - val widgetId = appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } + val selectedStudentId = appWidgetId?.let { id -> + sharedPref.getLong(getStudentWidgetKey(id), 0) + } ?: -1 + when { it.data!!.isEmpty() -> view?.openLoginView() it.data.size == 1 -> { selectedStudent = it.data.single().student view?.showThemeDialog() } - else -> view?.updateData(it.data.map { entity -> - entity.student to (entity.student.id == widgetId) - }) + else -> view?.updateData(it.data, selectedStudentId) } } Status.ERROR -> errorHandler.dispatch(it.error!!) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt index c8c348ed3..b4556f7ef 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt @@ -1,6 +1,6 @@ package io.github.wulkanowy.ui.modules.luckynumberwidget -import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.ui.base.BaseView interface LuckyNumberWidgetConfigureView : BaseView { @@ -9,7 +9,7 @@ interface LuckyNumberWidgetConfigureView : BaseView { fun showThemeDialog() - fun updateData(data: List>) + fun updateData(data: List, selectedStudentId: Long) fun updateLuckyNumberWidget(widgetId: Int) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt index 23d1f27ab..a27dba882 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt @@ -12,7 +12,7 @@ import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.databinding.ActivityWidgetConfigureBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.WidgetConfigureAdapter @@ -37,13 +37,19 @@ class TimetableWidgetConfigureActivity : private var dialog: AlertDialog? = null - override public fun onCreate(savedInstanceState: Bundle?) { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setResult(RESULT_CANCELED) - setContentView(ActivityWidgetConfigureBinding.inflate(layoutInflater).apply { binding = this }.root) + setContentView( + ActivityWidgetConfigureBinding.inflate(layoutInflater).apply { binding = this }.root + ) intent.extras.let { - presenter.onAttachView(this, it?.getInt(EXTRA_APPWIDGET_ID), it?.getBoolean(EXTRA_FROM_PROVIDER)) + presenter.onAttachView( + this, + it?.getInt(EXTRA_APPWIDGET_ID), + it?.getBoolean(EXTRA_FROM_PROVIDER) + ) } } @@ -61,6 +67,7 @@ class TimetableWidgetConfigureActivity : getString(R.string.widget_timetable_theme_light), getString(R.string.widget_timetable_theme_dark) ) + if (appInfo.systemVersion >= Build.VERSION_CODES.Q) items += getString(R.string.widget_timetable_theme_system) dialog = AlertDialog.Builder(this, R.style.WulkanowyTheme_WidgetAccountSwitcher) @@ -72,8 +79,9 @@ class TimetableWidgetConfigureActivity : .show() } - override fun updateData(data: List>) { + override fun updateData(data: List, selectedStudentId: Long) { with(configureAdapter) { + selectedId = selectedStudentId items = data notifyDataSetChanged() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt index 67805fe0b..2a40c8e4a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt @@ -25,7 +25,11 @@ class TimetableWidgetConfigurePresenter @Inject constructor( private var selectedStudent: Student? = null - fun onAttachView(view: TimetableWidgetConfigureView, appWidgetId: Int?, isFromProvider: Boolean?) { + fun onAttachView( + view: TimetableWidgetConfigureView, + appWidgetId: Int?, + isFromProvider: Boolean? + ) { super.onAttachView(view) this.appWidgetId = appWidgetId this.isFromProvider = isFromProvider ?: false @@ -56,16 +60,17 @@ class TimetableWidgetConfigurePresenter @Inject constructor( when (it.status) { Status.LOADING -> Timber.d("Timetable widget configure students data load") Status.SUCCESS -> { - val widgetId = appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } + val selectedStudentId = appWidgetId?.let { id -> + sharedPref.getLong(getStudentWidgetKey(id), 0) + } ?: -1 + when { it.data!!.isEmpty() -> view?.openLoginView() it.data.size == 1 && !isFromProvider -> { selectedStudent = it.data.single().student view?.showThemeDialog() } - else -> view?.updateData(it.data.map { entity -> - entity.student to (entity.student.id == widgetId) - }) + else -> view?.updateData(it.data, selectedStudentId) } } Status.ERROR -> errorHandler.dispatch(it.error!!) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt index 056225ab5..accdc28dc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt @@ -1,13 +1,13 @@ package io.github.wulkanowy.ui.modules.timetablewidget -import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.ui.base.BaseView interface TimetableWidgetConfigureView : BaseView { fun initView() - fun updateData(data: List>) + fun updateData(data: List, selectedStudentId: Long) fun updateTimetableWidget(widgetId: Int) diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index b218fbc87..68a9fa2fe 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -49,4 +49,12 @@ ?colorSurface @android:color/black + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index fc7ffb77f..297a4f288 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -26,7 +26,7 @@ @drawable/layer_splash_background - + + - - - \ No newline at end of file diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index 44f54c170..2d2eedb4c 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -109,15 +109,4 @@ both_semesters all_year - - - Don\'t show - Show all - Show smaller - - - no - yes - small - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1b7c9e427..3d54c16a0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,7 +40,6 @@ Hybrid Token PIN - API key Symbol Sign in Password too short @@ -66,7 +65,6 @@ Email Discord Send email - Describe details of problem: Zgłoszenie: Problemy z logowaniem Informacje o aplikacji:\n\nUrządzenie: %1$s\nWersja SDK: %2$s\nWersja aplikacji: %3$s\nDodatkowe informacje: %4$s\nOstatni błąd: %5$s\n\nOpis problemu: Make sure you select the correct UONET+ register variation! @@ -91,13 +89,10 @@ Weight Weight: %s Comment - No new grades Number of new ratings: %1$d Average: %1$.2f Points: %s No average - Predicted: %1$s - Final: %1$s Total points Final grade Predicted grade @@ -188,10 +183,6 @@ Unknown Number of lesson No entries - - %1$d absence - %1$d absences - Absence reason (optional) Send Absence excuse request sent successfully! @@ -200,7 +191,6 @@ - Attendance Total @@ -216,7 +206,6 @@ Trash (no subject) No messages - An error occurred while downloading message content From: To: Date: %s @@ -357,8 +346,6 @@ Student logout Student account Parent account - Mobile API mode - Hybrid mode Edit data Accounts manager Select student @@ -479,7 +466,6 @@ Mark current lesson Show groups next to subjects Show chart list in class grades - Show whole class lessons Show subjects without grades Grades color scheme Subjects sorting @@ -532,7 +518,6 @@ - New entries in register New grades Lucky number New messages diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 08867b79e..8fb07e1a7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -11,6 +11,7 @@ @color/colorError @color/colorDivider @color/colorSwipeRefresh + @android:color/darker_gray ?android:textColorPrimary @style/PreferenceThemeOverlay false @@ -24,6 +25,8 @@ + + + + From ec6d18968f8d7c996314c8a1f1c3db7dcba5b4c4 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sat, 7 Aug 2021 10:27:51 +0200 Subject: [PATCH 0539/1526] Fix filter search bug (#1427) * Fix filter search bug * refractor --- .../wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index cf1811822..93c7408f6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -185,7 +185,9 @@ class MessageTabPresenter @Inject constructor( .debounce(250) .map { query -> lastSearchQuery = query - getFilteredData(query) + val isOnlyUnread = view?.onlyUnread == true + val isOnlyWithAttachments = view?.onlyWithAttachments == true + getFilteredData(query, isOnlyUnread, isOnlyWithAttachments) } .catch { Timber.e(it) } .collect { From 2a913461551c57919bb0a797067d106a13777fcf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Aug 2021 13:53:54 +0000 Subject: [PATCH 0540/1526] Bump activity-ktx from 1.3.0 to 1.3.1 (#1434) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0b279ca43..dd6f3e5a5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -172,7 +172,7 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1" implementation "androidx.core:core-ktx:1.6.0" - implementation "androidx.activity:activity-ktx:1.3.0" + implementation "androidx.activity:activity-ktx:1.3.1" implementation "androidx.appcompat:appcompat:1.3.1" implementation "androidx.appcompat:appcompat-resources:1.3.1" implementation "androidx.fragment:fragment-ktx:1.3.6" From 7c94837af01d56a737b66235454740e00d7af509 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Aug 2021 13:54:31 +0000 Subject: [PATCH 0541/1526] Bump coil from 1.3.1 to 1.3.2 (#1433) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index dd6f3e5a5..9783c14dc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -214,7 +214,7 @@ dependencies { implementation "at.favre.lib:slf4j-timber:1.0.1" implementation 'com.github.bastienpaulfr:Treessence:1.0.4' implementation "com.mikepenz:aboutlibraries-core:$about_libraries" - implementation "io.coil-kt:coil:1.3.1" + implementation "io.coil-kt:coil:1.3.2" implementation "io.github.wulkanowy:AppKillerManager:3.0.0" implementation 'me.xdrop:fuzzywuzzy:1.3.1' implementation 'com.fredporciuncula:flow-preferences:1.5.0' From 4ae3f7b0163357f48057eeba26e84a38523f5e86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Aug 2021 13:54:48 +0000 Subject: [PATCH 0542/1526] Bump google-services from 4.3.8 to 4.3.9 (#1432) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8f70f8111..23c0276ff 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.android.tools.build:gradle:7.0.0' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" - classpath 'com.google.gms:google-services:4.3.8' + classpath 'com.google.gms:google-services:4.3.9' classpath 'com.huawei.agconnect:agcp:1.6.0.300' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' classpath "com.github.triplet.gradle:play-publisher:2.8.0" From 72ef5f428ea17a63d6fc3ba161a55cfcd09c0aa3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Aug 2021 13:55:03 +0000 Subject: [PATCH 0543/1526] Bump firebase-bom from 28.3.0 to 28.3.1 (#1431) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 9783c14dc..05d1a1508 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -219,7 +219,7 @@ dependencies { implementation 'me.xdrop:fuzzywuzzy:1.3.1' implementation 'com.fredporciuncula:flow-preferences:1.5.0' - playImplementation platform('com.google.firebase:firebase-bom:28.3.0') + playImplementation platform('com.google.firebase:firebase-bom:28.3.1') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From 626169de115072abb1612a04b3544a03796de43f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 10 Aug 2021 11:55:51 +0200 Subject: [PATCH 0544/1526] Add drag and drop to dashboard tiles (#1415) --- .../repositories/PreferencesRepository.kt | 30 +++++++++- .../ui/modules/dashboard/DashboardAdapter.kt | 57 +++++++++++++------ .../ui/modules/dashboard/DashboardFragment.kt | 9 +++ .../dashboard/DashboardItemMoveCallback.kt | 55 ++++++++++++++++++ .../modules/dashboard/DashboardPresenter.kt | 18 +++++- .../item_dashboard_horizontal_group.xml | 5 +- .../res/layout/subitem_dashboard_grades.xml | 13 ++++- app/src/main/res/values/strings.xml | 2 +- 8 files changed, 162 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt 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 5b97b65da..1e6cd5115 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 @@ -2,9 +2,12 @@ package io.github.wulkanowy.data.repositories import android.content.Context import android.content.SharedPreferences -import com.squareup.moshi.Moshi +import androidx.core.content.edit import com.fredporciuncula.flow.preferences.FlowSharedPreferences import com.fredporciuncula.flow.preferences.Preference +import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.Moshi +import com.squareup.moshi.adapter import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.dashboard.DashboardItem @@ -21,8 +24,13 @@ import javax.inject.Singleton class PreferencesRepository @Inject constructor( private val sharedPref: SharedPreferences, private val flowSharedPref: FlowSharedPreferences, - @ApplicationContext val context: Context + @ApplicationContext val context: Context, + moshi: Moshi ) { + @OptIn(ExperimentalStdlibApi::class) + private val dashboardItemsPositionAdapter: JsonAdapter> = + moshi.adapter() + val startMenuIndex: Int get() = getString(R.string.pref_key_start_menu, R.string.pref_default_startup).toInt() @@ -160,6 +168,19 @@ class PreferencesRepository @Inject constructor( R.bool.pref_default_optional_arithmetic_average ) + var dashboardItemsPosition: Map? + get() { + val json = sharedPref.getString(PREF_KEY_DASHBOARD_ITEMS_POSITION, null) ?: return null + + return dashboardItemsPositionAdapter.fromJson(json) + } + set(value) = sharedPref.edit { + putString( + PREF_KEY_DASHBOARD_ITEMS_POSITION, + dashboardItemsPositionAdapter.toJson(value) + ) + } + val selectedDashboardTilesFlow: Flow> get() = selectedDashboardTilesPreference.asFlow() .map { set -> @@ -199,4 +220,9 @@ class PreferencesRepository @Inject constructor( private fun getBoolean(id: String, default: Int) = sharedPref.getBoolean(id, context.resources.getBoolean(default)) + + private companion object { + + private const val PREF_KEY_DASHBOARD_ITEMS_POSITION = "dashboard_items_position" + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt index 9f3d546e5..fa081ce7f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt @@ -12,7 +12,6 @@ import androidx.core.view.updateLayoutParams import androidx.core.view.updateMarginsRelative import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable @@ -38,10 +37,9 @@ import java.util.Timer import javax.inject.Inject import kotlin.concurrent.timer -class DashboardAdapter @Inject constructor() : - ListAdapter(DashboardAdapterDiffCallback()) { +class DashboardAdapter @Inject constructor() : RecyclerView.Adapter() { - var lessonsTimer: Timer? = null + private var lessonsTimer: Timer? = null var onAccountTileClickListener: () -> Unit = {} @@ -63,7 +61,23 @@ class DashboardAdapter @Inject constructor() : var onConferencesTileClickListener: () -> Unit = {} - override fun getItemViewType(position: Int) = getItem(position).type.ordinal + val items = mutableListOf() + + fun submitList(newItems: List) { + val diffResult = + DiffUtil.calculateDiff(DiffCallback(newItems, items.toMutableList())) + + with(items) { + clear() + addAll(newItems) + } + + diffResult.dispatchUpdatesTo(this) + } + + override fun getItemCount() = items.size + + override fun getItemViewType(position: Int) = items[position].type.ordinal override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) @@ -119,7 +133,7 @@ class DashboardAdapter @Inject constructor() : } private fun bindAccountViewHolder(accountViewHolder: AccountViewHolder, position: Int) { - val item = getItem(position) as DashboardItem.Account + val item = items[position] as DashboardItem.Account val student = item.student val isLoading = item.isLoading @@ -147,7 +161,7 @@ class DashboardAdapter @Inject constructor() : horizontalGroupViewHolder: HorizontalGroupViewHolder, position: Int ) { - val item = getItem(position) as DashboardItem.HorizontalGroup + val item = items[position] as DashboardItem.HorizontalGroup val unreadMessagesCount = item.unreadMessagesCount val attendancePercentage = item.attendancePercentage val luckyNumber = item.luckyNumber @@ -221,7 +235,7 @@ class DashboardAdapter @Inject constructor() : } private fun bindGradesViewHolder(gradesViewHolder: GradesViewHolder, position: Int) { - val item = getItem(position) as DashboardItem.Grades + val item = items[position] as DashboardItem.Grades val subjectWithGrades = item.subjectWithGrades.orEmpty() val gradeTheme = item.gradeTheme val error = item.error @@ -250,7 +264,7 @@ class DashboardAdapter @Inject constructor() : } private fun bindLessonsViewHolder(lessonsViewHolder: LessonsViewHolder, position: Int) { - val item = getItem(position) as DashboardItem.Lessons + val item = items[position] as DashboardItem.Lessons val timetableFull = item.lessons val binding = lessonsViewHolder.binding @@ -519,7 +533,7 @@ class DashboardAdapter @Inject constructor() : } private fun bindHomeworkViewHolder(homeworkViewHolder: HomeworkViewHolder, position: Int) { - val item = getItem(position) as DashboardItem.Homework + val item = items[position] as DashboardItem.Homework val homeworkList = item.homework.orEmpty() val error = item.error val isLoading = item.isLoading @@ -557,7 +571,7 @@ class DashboardAdapter @Inject constructor() : announcementsViewHolder: AnnouncementsViewHolder, position: Int ) { - val item = getItem(position) as DashboardItem.Announcements + val item = items[position] as DashboardItem.Announcements val schoolAnnouncementList = item.announcement.orEmpty() val error = item.error val isLoading = item.isLoading @@ -594,7 +608,7 @@ class DashboardAdapter @Inject constructor() : } private fun bindExamsViewHolder(examsViewHolder: ExamsViewHolder, position: Int) { - val item = getItem(position) as DashboardItem.Exams + val item = items[position] as DashboardItem.Exams val exams = item.exams.orEmpty() val error = item.error val isLoading = item.isLoading @@ -630,7 +644,7 @@ class DashboardAdapter @Inject constructor() : conferencesViewHolder: ConferencesViewHolder, position: Int ) { - val item = getItem(position) as DashboardItem.Conferences + val item = items[position] as DashboardItem.Conferences val conferences = item.conferences.orEmpty() val error = item.error val isLoading = item.isLoading @@ -703,13 +717,20 @@ class DashboardAdapter @Inject constructor() : val adapter by lazy { DashboardConferencesAdapter() } } - class DashboardAdapterDiffCallback : DiffUtil.ItemCallback() { + private class DiffCallback( + private val newList: List, + private val oldList: List + ) : DiffUtil.Callback() { - override fun areItemsTheSame(oldItem: DashboardItem, newItem: DashboardItem) = - oldItem.type == newItem.type + override fun getNewListSize() = newList.size - override fun areContentsTheSame(oldItem: DashboardItem, newItem: DashboardItem) = - oldItem == newItem + override fun getOldListSize() = oldList.size + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int) = + newList[newItemPosition] == oldList[oldItemPosition] + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) = + newList[newItemPosition].type == oldList[oldItemPosition].type } private companion object { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt index 283f57451..3392280bc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt @@ -8,6 +8,7 @@ import android.view.View import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import androidx.recyclerview.widget.DefaultItemAnimator +import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R @@ -68,6 +69,12 @@ class DashboardFragment : BaseFragment(R.layout.fragme override fun initView() { val mainActivity = requireActivity() as MainActivity + val itemTouchHelper = ItemTouchHelper( + DashboardItemMoveCallback( + dashboardAdapter, + presenter::onDragAndDropEnd + ) + ) dashboardAdapter.apply { onAccountTileClickListener = { mainActivity.pushView(AccountFragment.newInstance()) } @@ -104,6 +111,8 @@ class DashboardFragment : BaseFragment(R.layout.fragme adapter = dashboardAdapter (itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false } + + itemTouchHelper.attachToRecyclerView(dashboardRecycler) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt new file mode 100644 index 000000000..cf4097a4a --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt @@ -0,0 +1,55 @@ +package io.github.wulkanowy.ui.modules.dashboard + +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView +import java.util.Collections + +class DashboardItemMoveCallback( + private val dashboardAdapter: DashboardAdapter, + private var onUserInteractionEndListener: (List) -> Unit = {} +) : ItemTouchHelper.Callback() { + + override fun isLongPressDragEnabled() = true + + override fun isItemViewSwipeEnabled() = false + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + //Not implemented + } + + override fun getMovementFlags( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder + ): Int { + val dragFlags = if (viewHolder.bindingAdapterPosition != 0) { + ItemTouchHelper.UP or ItemTouchHelper.DOWN + } else 0 + + return makeMovementFlags(dragFlags, 0) + } + + override fun canDropOver( + recyclerView: RecyclerView, + current: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ) = target.bindingAdapterPosition != 0 + + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean { + val list = dashboardAdapter.items.toMutableList() + + Collections.swap(list, viewHolder.bindingAdapterPosition, target.bindingAdapterPosition) + + dashboardAdapter.submitList(list) + return true + } + + override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + super.clearView(recyclerView, viewHolder) + + onUserInteractionEndListener(dashboardAdapter.items.toList()) + } +} 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 12374859d..0e24f0a14 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 @@ -68,6 +68,16 @@ class DashboardPresenter @Inject constructor( .launch("dashboard_pref") } + fun onDragAndDropEnd(list: List) { + dashboardItemLoadedList.clear() + dashboardItemLoadedList.addAll(list) + + val positionList = + list.mapIndexed { index, dashboardItem -> Pair(dashboardItem.type, index) }.toMap() + + preferencesRepository.dashboardItemsPosition = positionList + } + fun loadData(forceRefresh: Boolean = false, tilesToLoad: Set) { val oldDashboardDataToLoad = dashboardTilesToLoad @@ -622,6 +632,7 @@ class DashboardPresenter @Inject constructor( private fun updateData(dashboardItem: DashboardItem, forceRefresh: Boolean) { val isForceRefreshError = forceRefresh && dashboardItem.error != null + val dashboardItemsPosition = preferencesRepository.dashboardItemsPosition with(dashboardItemLoadedList) { removeAll { it.type == dashboardItem.type && !isForceRefreshError } @@ -636,7 +647,12 @@ class DashboardPresenter @Inject constructor( } } - dashboardItemLoadedList.sortBy { tile -> dashboardItemsToLoad.single { it == tile.type }.ordinal } + dashboardItemLoadedList.sortBy { tile -> + dashboardItemsPosition?.getOrDefault( + tile.type, + tile.type.ordinal + 100 + ) ?: tile.type.ordinal + } val isItemsLoaded = dashboardItemsToLoad.all { type -> dashboardItemLoadedList.any { it.type == type } } diff --git a/app/src/main/res/layout/item_dashboard_horizontal_group.xml b/app/src/main/res/layout/item_dashboard_horizontal_group.xml index a8532e6fb..bbd8f3517 100644 --- a/app/src/main/res/layout/item_dashboard_horizontal_group.xml +++ b/app/src/main/res/layout/item_dashboard_horizontal_group.xml @@ -4,8 +4,9 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="12dp" - android:layout_marginVertical="2dp"> + android:paddingHorizontal="12dp" + android:layout_marginVertical="2dp" + android:clipToPadding="false"> + app:layout_constraintTop_toTopOf="parent"> + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c6323668a..c1b3a3ee4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -501,7 +501,7 @@ until %1$s No upcoming lessons - An error occurred while loading the lesson + An error occurred while loading the lessons Homework No homework to do From 9c819835ca8debbe5890add702148630c2ecef02 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sun, 15 Aug 2021 15:59:32 +0200 Subject: [PATCH 0545/1526] Add last sync date in sync settings (#1436) --- .../data/repositories/PreferencesRepository.kt | 15 +++++++++++++++ .../github/wulkanowy/services/sync/SyncWorker.kt | 3 +++ .../ui/modules/settings/sync/SyncFragment.kt | 6 ++++++ .../ui/modules/settings/sync/SyncPresenter.kt | 15 ++++++++++++++- .../ui/modules/settings/sync/SyncView.kt | 2 ++ app/src/main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 1 + 8 files changed, 43 insertions(+), 1 deletion(-) 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 1e6cd5115..e725c42a0 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 @@ -13,9 +13,12 @@ import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.dashboard.DashboardItem import io.github.wulkanowy.ui.modules.grade.GradeAverageMode import io.github.wulkanowy.ui.modules.grade.GradeSortingMode +import io.github.wulkanowy.utils.toLocalDateTime +import io.github.wulkanowy.utils.toTimestamp import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import java.time.LocalDateTime import javax.inject.Inject import javax.inject.Singleton @@ -168,6 +171,13 @@ class PreferencesRepository @Inject constructor( R.bool.pref_default_optional_arithmetic_average ) + var lasSyncDate: LocalDateTime + get() = getLong( + R.string.pref_key_last_sync_date, + R.string.pref_default_last_sync_date + ).toLocalDateTime() + set(value) = sharedPref.edit().putLong("last_sync_date", value.toTimestamp()).apply() + var dashboardItemsPosition: Map? get() { val json = sharedPref.getString(PREF_KEY_DASHBOARD_ITEMS_POSITION, null) ?: return null @@ -211,6 +221,11 @@ class PreferencesRepository @Inject constructor( return flowSharedPref.getStringSet(prefKey, defaultSet) } + private fun getLong(id: Int, default: Int) = getLong(context.getString(id), default) + + private fun getLong(id: String, default: Int) = + sharedPref.getLong(id, context.resources.getString(default).toLong()) + private fun getString(id: Int, default: Int) = getString(context.getString(id), default) private fun getString(id: String, default: Int) = diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt index 49d61a41d..ea1f79cbf 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt @@ -22,6 +22,8 @@ import io.github.wulkanowy.services.sync.works.Work import io.github.wulkanowy.utils.getCompatColor import kotlinx.coroutines.coroutineScope import timber.log.Timber +import java.time.LocalDateTime +import java.time.ZoneId import kotlin.random.Random @HiltWorker @@ -48,6 +50,7 @@ class SyncWorker @AssistedInject constructor( Timber.i("${work::class.java.simpleName} is starting") work.doWork(student, semester) Timber.i("${work::class.java.simpleName} result: Success") + preferencesRepository.lasSyncDate = LocalDateTime.now(ZoneId.systemDefault()) null } catch (e: Throwable) { Timber.w("${work::class.java.simpleName} result: An exception ${e.message} occurred") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt index 207fe2ff6..342988092 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt @@ -39,6 +39,12 @@ class SyncFragment : PreferenceFragmentCompat(), } } + override fun setLastSyncDate(lastSyncDate: String) { + findPreference(getString(R.string.pref_key_services_force_sync))?.run { + summary = getString(R.string.pref_services_last_full_sync_date, lastSyncDate) + } + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) presenter.onAttachView(this) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt index 36b8d792c..63e86a475 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.isHolidays +import io.github.wulkanowy.utils.toFormattedString import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.onEach import timber.log.Timber @@ -27,6 +28,7 @@ class SyncPresenter @Inject constructor( Timber.i("Settings sync view was initialized") view.setServicesSuspended(preferencesRepository.serviceEnableKey, now().isHolidays) view.initView() + setSyncDateInView() } fun onSharedPreferenceChanged(key: String) { @@ -63,10 +65,21 @@ class SyncPresenter @Inject constructor( } else -> Timber.d("Sync now state: ${workInfo.state}") } - if (workInfo.state.isFinished) setSyncInProgress(false) + if (workInfo.state.isFinished) { + setSyncInProgress(false) + setSyncDateInView() + } }.catch { Timber.e(it, "Sync now failed") }.launch("sync") } } + + private fun setSyncDateInView() { + val lastSyncDate = preferencesRepository.lasSyncDate + + if (lastSyncDate.year == 1970) return + + view?.setLastSyncDate(lastSyncDate.toFormattedString("dd.MM.yyyy HH:mm:ss")) + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncView.kt index 9da473ba7..6ffe156f2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncView.kt @@ -10,6 +10,8 @@ interface SyncView : BaseView { fun initView() + fun setLastSyncDate(lastSyncDate: String) + fun setServicesSuspended(serviceEnablesKey: String, isHolidays: Boolean) fun setSyncInProgress(inProgress: Boolean) diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 5721763f1..1ba9359cd 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -25,6 +25,7 @@ false false false + 0 LUCKY_NUMBER MESSAGES diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 876e43337..aa60bb7e6 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -31,4 +31,5 @@ optional_arithmetic_average message_send_is_draft message_send_recipients + last_sync_date diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c1b3a3ee4..0b25f4a5d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -615,6 +615,7 @@ Synced! Sync failed Sync in progress + Last full sync: %s Value of the plus Value of the minus From 428e40d7fe6f9b8b67a078868bbc98bd9040d753 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Aug 2021 13:32:34 +0000 Subject: [PATCH 0546/1526] Bump hianalytics from 6.1.0.300 to 6.1.1.300 (#1441) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 05d1a1508..fae7d6e6a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -225,7 +225,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.android.play:core-ktx:1.8.1' - hmsImplementation 'com.huawei.hms:hianalytics:6.1.0.300' + hmsImplementation 'com.huawei.hms:hianalytics:6.1.1.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.0.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 9c5d2fbf8462b5f9c927154818e037b6abdb7835 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Aug 2021 13:32:48 +0000 Subject: [PATCH 0547/1526] Bump google-services from 4.3.9 to 4.3.10 (#1439) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 23c0276ff..fecbb019f 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.android.tools.build:gradle:7.0.0' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" - classpath 'com.google.gms:google-services:4.3.9' + classpath 'com.google.gms:google-services:4.3.10' classpath 'com.huawei.agconnect:agcp:1.6.0.300' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' classpath "com.github.triplet.gradle:play-publisher:2.8.0" From d3b3939d2649ff7d1e9d779d31f6ecdd9b3f495d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Aug 2021 13:44:06 +0000 Subject: [PATCH 0548/1526] Bump timber from 4.7.1 to 5.0.1 (#1440) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index fae7d6e6a..5e1ae9abc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -210,7 +210,7 @@ dependencies { implementation "com.squareup.moshi:moshi-adapters:$moshi" kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi" - implementation "com.jakewharton.timber:timber:4.7.1" + implementation "com.jakewharton.timber:timber:5.0.1" implementation "at.favre.lib:slf4j-timber:1.0.1" implementation 'com.github.bastienpaulfr:Treessence:1.0.4' implementation "com.mikepenz:aboutlibraries-core:$about_libraries" From eb94e06d54c88a6f1069df4f06e5f6ef5560fe87 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sun, 22 Aug 2021 16:33:12 +0200 Subject: [PATCH 0549/1526] Fix buggy timers in timetable (#1428) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rafał Borcz --- .../ui/modules/timetable/TimetableAdapter.kt | 201 +++++++++++++----- .../ui/modules/timetable/TimetableFragment.kt | 20 +- 2 files changed, 152 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index f049f828e..87b3362db 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -7,6 +7,7 @@ import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.TextView import androidx.core.view.ViewCompat +import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable @@ -26,31 +27,58 @@ import kotlin.concurrent.timer class TimetableAdapter @Inject constructor() : RecyclerView.Adapter() { - private enum class ViewType(val id: Int) { - ITEM_NORMAL(1), - ITEM_SMALL(2) + private enum class ViewType { + ITEM_NORMAL, + ITEM_SMALL } - var items = mutableListOf() - set(value) { - field = value - resetTimers() - } - var onClickListener: (Timetable) -> Unit = {} - var showWholeClassPlan: String = "no" + private var showWholeClassPlan: String = "no" - var showGroupsInPlan: Boolean = false + private var showGroupsInPlan: Boolean = false - var showTimers: Boolean = false + private var showTimers: Boolean = false - private val timers = mutableMapOf() + private val timers = mutableMapOf() - fun resetTimers() { - Timber.d("Timetable timers (${timers.size}) reset") + private val items = mutableListOf() + + fun submitList( + newTimetable: List, + showWholeClassPlan: String = this.showWholeClassPlan, + showGroupsInPlan: Boolean = this.showGroupsInPlan, + showTimers: Boolean = this.showTimers + ) { + val isFlagsDifferent = this.showWholeClassPlan != showWholeClassPlan + || this.showGroupsInPlan != showGroupsInPlan + || this.showTimers != showTimers + + val diffResult = DiffUtil.calculateDiff( + TimetableAdapterDiffCallback( + oldList = items.toMutableList(), + newList = newTimetable, + isFlagsDifferent = isFlagsDifferent + ) + ) + + this.showGroupsInPlan = showGroupsInPlan + this.showTimers = showTimers + this.showWholeClassPlan = showWholeClassPlan + + items.clear() + items.addAll(newTimetable) + + diffResult.dispatchUpdatesTo(this) + } + + fun clearTimers() { + Timber.d("Timetable timers (${timers.size}) cleared") with(timers) { - forEach { (_, timer) -> timer.cancel() } + forEach { (_, timer) -> + timer?.cancel() + timer?.purge() + } clear() } } @@ -58,16 +86,20 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter ViewType.ITEM_SMALL.id - else -> ViewType.ITEM_NORMAL.id + !items[position].isStudentPlan && showWholeClassPlan == "small" -> ViewType.ITEM_SMALL.ordinal + else -> ViewType.ITEM_NORMAL.ordinal } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) return when (viewType) { - ViewType.ITEM_NORMAL.id -> ItemViewHolder(ItemTimetableBinding.inflate(inflater, parent, false)) - ViewType.ITEM_SMALL.id -> SmallItemViewHolder(ItemTimetableSmallBinding.inflate(inflater, parent, false)) + ViewType.ITEM_NORMAL.ordinal -> ItemViewHolder( + ItemTimetableBinding.inflate(inflater, parent, false) + ) + ViewType.ITEM_SMALL.ordinal -> SmallItemViewHolder( + ItemTimetableSmallBinding.inflate(inflater, parent, false) + ) else -> throw IllegalStateException() } } @@ -111,6 +143,12 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter i < position && !item.isStudentPlan }.size)?.let { - if (!it.canceled && it.isStudentPlan) it.end - else null - } + return items.filter { it.isStudentPlan } + .getOrNull(position - 1 - items.filterIndexed { i, item -> i < position && !item.isStudentPlan }.size) + ?.let { + if (!it.canceled && it.isStudentPlan) it.end + else null + } } private fun updateTimeLeft(binding: ItemTimetableBinding, lesson: Timetable, position: Int) { @@ -148,11 +188,18 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter, + private val newList: List, + private val isFlagsDifferent: Boolean + ) : DiffUtil.Callback() { + + override fun getOldListSize() = oldList.size + + override fun getNewListSize() = newList.size + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) = + oldList[oldItemPosition].id == newList[newItemPosition].id + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int) = + oldList[oldItemPosition] == newList[newItemPosition] && !isFlagsDifferent + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index 2bc7aa595..a374e166c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -49,7 +49,7 @@ class TimetableFragment : BaseFragment(R.layout.fragme override val titleStringId get() = R.string.timetable_title - override val isViewEmpty get() = timetableAdapter.items.isEmpty() + override val isViewEmpty get() = timetableAdapter.itemCount > 0 override val currentStackSize get() = (activity as? MainActivity)?.currentStackSize @@ -109,20 +109,16 @@ class TimetableFragment : BaseFragment(R.layout.fragme showGroupsInPlanType: Boolean, showTimetableTimers: Boolean ) { - with(timetableAdapter) { - items = data.toMutableList() - showTimers = showTimetableTimers + timetableAdapter.submitList( + newTimetable = data.toMutableList(), + showGroupsInPlan = showGroupsInPlanType, + showTimers = showTimetableTimers, showWholeClassPlan = showWholeClassPlanType - showGroupsInPlan = showGroupsInPlanType - notifyDataSetChanged() - } + ) } override fun clearData() { - with(timetableAdapter) { - items = mutableListOf() - notifyDataSetChanged() - } + timetableAdapter.submitList(listOf()) } override fun updateNavigationDay(date: String) { @@ -226,7 +222,7 @@ class TimetableFragment : BaseFragment(R.layout.fragme } override fun onDestroyView() { - timetableAdapter.resetTimers() + timetableAdapter.clearTimers() presenter.onDetachView() super.onDestroyView() } From 02b87c8c6a7b419a552abff2d63bfb7f0b840637 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Aug 2021 13:42:20 +0000 Subject: [PATCH 0550/1526] Bump firebase-bom from 28.3.1 to 28.4.0 (#1446) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5e1ae9abc..1338bd8df 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -219,7 +219,7 @@ dependencies { implementation 'me.xdrop:fuzzywuzzy:1.3.1' implementation 'com.fredporciuncula:flow-preferences:1.5.0' - playImplementation platform('com.google.firebase:firebase-bom:28.3.1') + playImplementation platform('com.google.firebase:firebase-bom:28.4.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From 1cfabe43a5e837b46d8041137f1f1246512a6660 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Mon, 23 Aug 2021 15:48:48 +0200 Subject: [PATCH 0551/1526] Add captions for averages from how many items have been counted (#1437) --- .../grade/summary/GradeSummaryAdapter.kt | 38 ++++++++++++++----- .../scrollable_header_grade_summary.xml | 20 ++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt index 4de6044bf..9a888ddcc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.ItemGradeSummaryBinding @@ -35,8 +36,12 @@ class GradeSummaryAdapter @Inject constructor( val inflater = LayoutInflater.from(parent.context) return when (viewType) { - ViewType.HEADER.id -> HeaderViewHolder(ScrollableHeaderGradeSummaryBinding.inflate(inflater, parent, false)) - ViewType.ITEM.id -> ItemViewHolder(ItemGradeSummaryBinding.inflate(inflater, parent, false)) + ViewType.HEADER.id -> HeaderViewHolder( + ScrollableHeaderGradeSummaryBinding.inflate(inflater, parent, false) + ) + ViewType.ITEM.id -> ItemViewHolder( + ItemGradeSummaryBinding.inflate(inflater, parent, false) + ) else -> throw IllegalStateException() } } @@ -51,13 +56,27 @@ class GradeSummaryAdapter @Inject constructor( private fun bindHeaderViewHolder(binding: ScrollableHeaderGradeSummaryBinding) { if (items.isEmpty()) return + val context = binding.root.context + val finalItemsCount = items.count { it.finalGrade.matches("[0-6][+-]?".toRegex()) } + val calculatedItemsCount = items.count { value -> value.average != 0.0 } + val finalAverage = items.calcAverage( + preferencesRepository.gradePlusModifier, + preferencesRepository.gradeMinusModifier + ) + val calculatedAverage = items.filter { value -> value.average != 0.0 } + .map { values -> values.average } + .reversed() // fix average precision + .average() + with(binding) { - gradeSummaryScrollableHeaderFinal.text = formatAverage(items.calcAverage(preferencesRepository.gradePlusModifier, preferencesRepository.gradeMinusModifier)) - gradeSummaryScrollableHeaderCalculated.text = formatAverage(items - .filter { value -> value.average != 0.0 } - .map { values -> values.average } - .reversed() // fix average precision - .average() + gradeSummaryScrollableHeaderFinal.text = formatAverage(finalAverage) + gradeSummaryScrollableHeaderCalculated.text = formatAverage(calculatedAverage) + gradeSummaryScrollableHeaderFinalSubjectCount.text = + context.getString(R.string.grade_summary_from_subjects, finalItemsCount, items.size) + gradeSummaryScrollableHeaderCalculatedSubjectCount.text = context.getString( + R.string.grade_summary_from_subjects, + calculatedItemsCount, + items.size ) } } @@ -71,7 +90,8 @@ class GradeSummaryAdapter @Inject constructor( gradeSummaryItemPredicted.text = "${item.predictedGrade} ${item.proposedPoints}".trim() gradeSummaryItemFinal.text = "${item.finalGrade} ${item.finalPoints}".trim() - gradeSummaryItemPointsContainer.visibility = if (item.pointsSum.isBlank()) View.GONE else View.VISIBLE + gradeSummaryItemPointsContainer.visibility = + if (item.pointsSum.isBlank()) View.GONE else View.VISIBLE } } diff --git a/app/src/main/res/layout/scrollable_header_grade_summary.xml b/app/src/main/res/layout/scrollable_header_grade_summary.xml index 2eea20f42..29657ba1a 100644 --- a/app/src/main/res/layout/scrollable_header_grade_summary.xml +++ b/app/src/main/res/layout/scrollable_header_grade_summary.xml @@ -20,6 +20,7 @@ android:layout_height="wrap_content" android:gravity="center" android:minLines="2" + android:textStyle="bold" android:text="@string/grade_summary_calculated_average" android:textSize="16sp" /> @@ -30,6 +31,15 @@ android:gravity="center_horizontal" android:textSize="21sp" tools:text="6,00" /> + + @@ -53,5 +64,14 @@ android:gravity="center_horizontal" android:textSize="21sp" tools:text="6,00" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0b25f4a5d..8b3f3b8e8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,6 +101,7 @@ Predicted grade Calculated average Final average + From %d of %d subjects Summary Class Mark as read From 076948a680b1e576cbdf1386b498dc763c165fbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Aug 2021 13:53:04 +0000 Subject: [PATCH 0552/1526] Bump gradle from 7.0.0 to 7.0.1 (#1445) --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index fecbb019f..d169291d6 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ buildscript { } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.android.tools.build:gradle:7.0.0' + classpath 'com.android.tools.build:gradle:7.0.1' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.10' classpath 'com.huawei.agconnect:agcp:1.6.0.300' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch delta 18435 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 delta 17845 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 Date: Mon, 23 Aug 2021 18:02:21 +0200 Subject: [PATCH 0553/1526] New timetable widget design (#1384) --- app/build.gradle | 2 +- .../background_widget_header_timetable.xml | 7 +++++++ ...ackground_widget_header_timetable_dark.xml | 7 +++++++ .../background_widget_item_timetable.xml | 5 +++++ .../background_widget_item_timetable_dark.xml | 5 +++++ .../drawable/background_widget_timetable.xml | 5 +++++ .../background_widget_timetable_dark.xml | 5 +++++ .../drawable/img_timetable_widget_preview.png | Bin 5284 -> 25538 bytes .../main/res/layout/item_widget_timetable.xml | 7 +------ .../res/layout/item_widget_timetable_dark.xml | 7 +------ .../layout/item_widget_timetable_small.xml | 2 +- .../item_widget_timetable_small_dark.xml | 2 +- app/src/main/res/layout/widget_timetable.xml | 13 ++++++++++--- .../main/res/layout/widget_timetable_dark.xml | 13 ++++++++++--- 14 files changed, 59 insertions(+), 21 deletions(-) create mode 100644 app/src/main/res/drawable/background_widget_header_timetable.xml create mode 100644 app/src/main/res/drawable/background_widget_header_timetable_dark.xml create mode 100644 app/src/main/res/drawable/background_widget_item_timetable.xml create mode 100644 app/src/main/res/drawable/background_widget_item_timetable_dark.xml create mode 100644 app/src/main/res/drawable/background_widget_timetable.xml create mode 100644 app/src/main/res/drawable/background_widget_timetable_dark.xml mode change 100644 => 100755 app/src/main/res/drawable/img_timetable_widget_preview.png diff --git a/app/build.gradle b/app/build.gradle index 1338bd8df..409e6c4d1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -164,7 +164,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:496dc01d15" + implementation "io.github.wulkanowy:sdk:b991d0c" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/res/drawable/background_widget_header_timetable.xml b/app/src/main/res/drawable/background_widget_header_timetable.xml new file mode 100644 index 000000000..98eec700d --- /dev/null +++ b/app/src/main/res/drawable/background_widget_header_timetable.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_widget_header_timetable_dark.xml b/app/src/main/res/drawable/background_widget_header_timetable_dark.xml new file mode 100644 index 000000000..616a91279 --- /dev/null +++ b/app/src/main/res/drawable/background_widget_header_timetable_dark.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_widget_item_timetable.xml b/app/src/main/res/drawable/background_widget_item_timetable.xml new file mode 100644 index 000000000..08854fba2 --- /dev/null +++ b/app/src/main/res/drawable/background_widget_item_timetable.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_widget_item_timetable_dark.xml b/app/src/main/res/drawable/background_widget_item_timetable_dark.xml new file mode 100644 index 000000000..e432a648c --- /dev/null +++ b/app/src/main/res/drawable/background_widget_item_timetable_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_widget_timetable.xml b/app/src/main/res/drawable/background_widget_timetable.xml new file mode 100644 index 000000000..2267587d9 --- /dev/null +++ b/app/src/main/res/drawable/background_widget_timetable.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_widget_timetable_dark.xml b/app/src/main/res/drawable/background_widget_timetable_dark.xml new file mode 100644 index 000000000..6fe7d0ab2 --- /dev/null +++ b/app/src/main/res/drawable/background_widget_timetable_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/img_timetable_widget_preview.png b/app/src/main/res/drawable/img_timetable_widget_preview.png old mode 100644 new mode 100755 index 550260258a82ae1fcb8c54530efff52985580153..8494301878a1bdcb838aee6ee82be8b42c3904cd GIT binary patch literal 25538 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 - - diff --git a/app/src/main/res/layout/item_widget_timetable_dark.xml b/app/src/main/res/layout/item_widget_timetable_dark.xml index 34535c694..06233244b 100644 --- a/app/src/main/res/layout/item_widget_timetable_dark.xml +++ b/app/src/main/res/layout/item_widget_timetable_dark.xml @@ -6,12 +6,12 @@ android:layout_height="wrap_content" android:minHeight="45dp" android:orientation="vertical" + android:background="@drawable/background_widget_item_timetable_dark" tools:context=".ui.modules.timetablewidget.TimetableWidgetFactory"> - - diff --git a/app/src/main/res/layout/item_widget_timetable_small.xml b/app/src/main/res/layout/item_widget_timetable_small.xml index 36a6bbddf..1bf4072dc 100644 --- a/app/src/main/res/layout/item_widget_timetable_small.xml +++ b/app/src/main/res/layout/item_widget_timetable_small.xml @@ -91,7 +91,7 @@ tools:text="@tools:sample/lorem/random" /> - diff --git a/app/src/main/res/layout/item_widget_timetable_small_dark.xml b/app/src/main/res/layout/item_widget_timetable_small_dark.xml index a02d85850..50bbbd031 100644 --- a/app/src/main/res/layout/item_widget_timetable_small_dark.xml +++ b/app/src/main/res/layout/item_widget_timetable_small_dark.xml @@ -90,7 +90,7 @@ tools:text="@tools:sample/lorem/random" /> - diff --git a/app/src/main/res/layout/widget_timetable.xml b/app/src/main/res/layout/widget_timetable.xml index 8a08b5d24..059bb741f 100644 --- a/app/src/main/res/layout/widget_timetable.xml +++ b/app/src/main/res/layout/widget_timetable.xml @@ -3,13 +3,13 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@android:color/white" + android:background="@drawable/background_widget_timetable" tools:context=".ui.modules.timetablewidget.TimetableWidgetProvider"> + android:background="@drawable/background_widget_header_timetable"> @@ -77,7 +78,12 @@ android:id="@+id/timetableWidgetList" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginTop="56dp" + android:layout_marginLeft="10dp" + android:layout_marginTop="66dp" + android:layout_marginRight="10dp" + android:layout_marginBottom="10dp" + android:divider="#00ffffff" + android:dividerHeight="4dp" tools:listitem="@layout/item_widget_timetable" /> diff --git a/app/src/main/res/layout/widget_timetable_dark.xml b/app/src/main/res/layout/widget_timetable_dark.xml index 5533eaeee..9c8b8c561 100644 --- a/app/src/main/res/layout/widget_timetable_dark.xml +++ b/app/src/main/res/layout/widget_timetable_dark.xml @@ -3,13 +3,13 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/colorWidgetBackground" + android:background="@drawable/background_widget_timetable_dark" tools:context=".ui.modules.timetablewidget.TimetableWidgetProvider"> + android:background="@drawable/background_widget_header_timetable_dark"> @@ -77,7 +78,12 @@ android:id="@+id/timetableWidgetList" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginTop="56dp" + android:layout_marginTop="66dp" + android:layout_marginBottom="10dp" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:divider="#00ffffff" + android:dividerHeight="4dp" tools:listitem="@layout/item_widget_timetable_dark" /> From 2979d8b62ac47cc034028e34286dd7805930866b Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Mon, 23 Aug 2021 18:16:41 +0200 Subject: [PATCH 0554/1526] Show information when the recipient has read the message (#1430) --- .../data/repositories/MessageRepository.kt | 5 +- .../message/preview/MessagePreviewAdapter.kt | 52 ++++++++++++++++--- .../main/res/layout/item_message_preview.xml | 13 ++++- app/src/main/res/values/strings.xml | 7 ++- 4 files changed, 64 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index 2034000e2..2d70e26ee 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -20,14 +20,12 @@ import io.github.wulkanowy.data.pojos.MessageDraftJsonAdapter import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Folder import io.github.wulkanowy.sdk.pojo.SentMessage -import io.github.wulkanowy.ui.modules.message.send.RecipientChipItem import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map import kotlinx.coroutines.sync.Mutex import timber.log.Timber import java.time.LocalDateTime.now @@ -79,8 +77,9 @@ class MessageRepository @Inject constructor( }, saveFetchResult = { old, (downloadedMessage, attachments) -> checkNotNull(old, { "Fetched message no longer exist!" }) - messagesDb.updateAll(listOf(old.message.copy(unread = !markAsRead).apply { + messagesDb.updateAll(listOf(old.message.apply { id = old.message.id + unread = !markAsRead content = content.ifBlank { downloadedMessage } })) messageAttachmentDao.insertAttachments(attachments) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt index 206a74602..421453c94 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt @@ -33,7 +33,8 @@ class MessagePreviewAdapter @Inject constructor() : private var attachments: List = emptyList() - override fun getItemCount() = if (messageWithAttachment == null) 0 else attachments.size + 1 + if (attachments.isNotEmpty()) 1 else 0 + override fun getItemCount() = + if (messageWithAttachment == null) 0 else attachments.size + 1 + if (attachments.isNotEmpty()) 1 else 0 override fun getItemViewType(position: Int) = when (position) { 0 -> ViewType.MESSAGE.id @@ -45,25 +46,60 @@ class MessagePreviewAdapter @Inject constructor() : val inflater = LayoutInflater.from(parent.context) return when (viewType) { - ViewType.MESSAGE.id -> MessageViewHolder(ItemMessagePreviewBinding.inflate(inflater, parent, false)) - ViewType.DIVIDER.id -> DividerViewHolder(ItemMessageDividerBinding.inflate(inflater, parent, false)) - ViewType.ATTACHMENT.id -> AttachmentViewHolder(ItemMessageAttachmentBinding.inflate(inflater, parent, false)) + ViewType.MESSAGE.id -> MessageViewHolder( + ItemMessagePreviewBinding.inflate(inflater, parent, false) + ) + ViewType.DIVIDER.id -> DividerViewHolder( + ItemMessageDividerBinding.inflate(inflater, parent, false) + ) + ViewType.ATTACHMENT.id -> AttachmentViewHolder( + ItemMessageAttachmentBinding.inflate(inflater, parent, false) + ) else -> throw IllegalStateException() } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { - is MessageViewHolder -> bindMessage(holder, requireNotNull(messageWithAttachment).message) - is AttachmentViewHolder -> bindAttachment(holder, requireNotNull(messageWithAttachment).attachments[position - 2]) + is MessageViewHolder -> bindMessage( + holder, + requireNotNull(messageWithAttachment).message + ) + is AttachmentViewHolder -> bindAttachment( + holder, + requireNotNull(messageWithAttachment).attachments[position - 2] + ) } } @SuppressLint("SetTextI18n") private fun bindMessage(holder: MessageViewHolder, message: Message) { + val context = holder.binding.root.context + val recipientCount = message.unreadBy + message.readBy + + val readText = when { + recipientCount > 1 -> { + context.resources.getQuantityString( + R.plurals.message_read_by, + message.readBy, + message.readBy, + recipientCount + ) + } + message.readBy == 1 -> { + context.getString(R.string.message_read, context.getString(R.string.all_yes)) + } + else -> context.getString(R.string.message_read, context.getString(R.string.all_no)) + } + with(holder.binding) { - messagePreviewSubject.text = message.subject.ifBlank { root.context.getString(R.string.message_no_subject) } - messagePreviewDate.text = root.context.getString(R.string.message_date, message.date.toFormattedString("yyyy-MM-dd HH:mm:ss")) + messagePreviewSubject.text = + message.subject.ifBlank { root.context.getString(R.string.message_no_subject) } + messagePreviewDate.text = root.context.getString( + R.string.message_date, + message.date.toFormattedString("yyyy-MM-dd HH:mm:ss") + ) + messagePreviewRead.text = readText messagePreviewContent.text = message.content messagePreviewFromSender.text = message.sender messagePreviewToRecipient.text = message.recipient diff --git a/app/src/main/res/layout/item_message_preview.xml b/app/src/main/res/layout/item_message_preview.xml index 83a4406bb..c5dc2fa90 100644 --- a/app/src/main/res/layout/item_message_preview.xml +++ b/app/src/main/res/layout/item_message_preview.xml @@ -78,6 +78,17 @@ app:layout_constraintTop_toBottomOf="@id/messagePreviewToLabel" tools:text="@tools:sample/date/ddmmyy" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8b3f3b8e8..b655769d4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,7 +101,7 @@ Predicted grade Calculated average Final average - From %d of %d subjects + From %1$d of %2$d subjects Summary Class Mark as read @@ -237,6 +237,11 @@ The message content must be at least 3 characters Only unread Only with attachments + Read: %s + + Read by: %1$d of %2$d people + Read by: %1$d of %2$d people + %d message %d messages From a6a2bcff3b2beec3b535f4e6364f30c28a7bf937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 24 Aug 2021 19:51:08 +0200 Subject: [PATCH 0555/1526] Remove Zachowanie from all count of subjects (#1447) --- .../ui/modules/grade/summary/GradeSummaryAdapter.kt | 9 +++++++-- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt index 9a888ddcc..0754361c9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt @@ -59,6 +59,7 @@ class GradeSummaryAdapter @Inject constructor( val context = binding.root.context val finalItemsCount = items.count { it.finalGrade.matches("[0-6][+-]?".toRegex()) } val calculatedItemsCount = items.count { value -> value.average != 0.0 } + val allItemsCount = items.count { !it.subject.equals("zachowanie", true) } val finalAverage = items.calcAverage( preferencesRepository.gradePlusModifier, preferencesRepository.gradeMinusModifier @@ -72,11 +73,15 @@ class GradeSummaryAdapter @Inject constructor( gradeSummaryScrollableHeaderFinal.text = formatAverage(finalAverage) gradeSummaryScrollableHeaderCalculated.text = formatAverage(calculatedAverage) gradeSummaryScrollableHeaderFinalSubjectCount.text = - context.getString(R.string.grade_summary_from_subjects, finalItemsCount, items.size) + context.getString( + R.string.grade_summary_from_subjects, + finalItemsCount, + allItemsCount + ) gradeSummaryScrollableHeaderCalculatedSubjectCount.text = context.getString( R.string.grade_summary_from_subjects, calculatedItemsCount, - items.size + allItemsCount ) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b655769d4..ee911cfba 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,7 +101,7 @@ Predicted grade Calculated average Final average - From %1$d of %2$d subjects + from %1$d of %2$d subjects Summary Class Mark as read From b4b9d91ea6f706efe6bb007b4989e7c4f29b7e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 25 Aug 2021 20:49:44 +0200 Subject: [PATCH 0556/1526] Update dependencies (#1448) --- app/build.gradle | 18 +++++------------- app/jacoco.gradle | 6 +++--- .../alarm/TimetableNotificationReceiver.kt | 4 ++-- .../wulkanowy/ui/modules/main/MainActivity.kt | 4 ++-- .../message/send/SendMessageActivity.kt | 4 +--- .../message/send/SendMessagePresenter.kt | 2 -- .../modules/message/tab/MessageTabFragment.kt | 2 -- .../modules/message/tab/MessageTabPresenter.kt | 3 +-- .../timetablewidget/TimetableWidgetProvider.kt | 2 ++ build.gradle | 2 +- gradle.properties | 8 +++++--- 11 files changed, 22 insertions(+), 33 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 409e6c4d1..d5fccac6f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,11 +3,11 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-parcelize' apply plugin: 'kotlin-kapt' apply plugin: 'dagger.hilt.android.plugin' +apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'com.github.triplet.play' apply plugin: 'ru.cian.huawei-publish' apply plugin: 'com.mikepenz.aboutlibraries.plugin' -apply plugin: 'com.google.gms.google-services' apply plugin: 'com.huawei.agconnect' apply from: 'jacoco.gradle' apply from: 'sonarqube.gradle' @@ -15,7 +15,6 @@ apply from: 'hooks.gradle' android { compileSdkVersion 30 - buildToolsVersion '30.0.3' defaultConfig { applicationId "io.github.wulkanowy" @@ -98,7 +97,7 @@ android { } buildFeatures { - viewBinding = true + viewBinding true } testOptions.unitTests { @@ -107,12 +106,12 @@ android { compileOptions { coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "11" freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn", "-Xjvm-default=all"] } @@ -128,12 +127,6 @@ android { kapt { correctErrorTypes true - - javacOptions { - //Bug workaround https://youtrack.jetbrains.com/issue/KT-47416 - option("-Adagger.fastInit=ENABLED") - option("-Adagger.hilt.android.internal.disableAndroidSuperclassValidation=true") - } } play { @@ -168,7 +161,6 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1" implementation "androidx.core:core-ktx:1.6.0" diff --git a/app/jacoco.gradle b/app/jacoco.gradle index 9c1f5b1c2..f253673e6 100644 --- a/app/jacoco.gradle +++ b/app/jacoco.gradle @@ -2,7 +2,7 @@ apply plugin: "jacoco" jacoco { toolVersion "0.8.7" - reportsDirectory = file("$buildDir/reports") + reportsDirectory.set(file("$buildDir/reports")) } tasks.withType(Test) { @@ -16,8 +16,8 @@ task jacocoTestReport(type: JacocoReport) { description = "Generate Jacoco coverage reports" reports { - xml.enabled = true - html.enabled = true + xml.required.set(true) + html.required.set(true) } def excludes = ['**/R.class', diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt index 8eefc032f..406d91f5f 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.services.alarm -import android.annotation.SuppressLint import android.app.PendingIntent import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.content.Context @@ -20,6 +19,7 @@ import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.toLocalDateTime +import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -50,7 +50,7 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { const val LESSON_END = "end_timestamp" } - @SuppressLint("CheckResult") + @OptIn(DelicateCoroutinesApi::class) override fun onReceive(context: Context, intent: Intent) { super.onReceive(context, intent) Timber.d("Receiving intent... ${intent.toUri(0)}") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 188cf5fc9..b44bb4b21 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -230,8 +230,8 @@ class MainActivity : BaseActivity(), MainVie .setIcon(R.drawable.ic_main_more) } selectedItemId = startMenuIndex - setOnNavigationItemSelectedListener { presenter.onTabSelected(it.itemId, false) } - setOnNavigationItemReselectedListener { presenter.onTabSelected(it.itemId, true) } + setOnItemSelectedListener { presenter.onTabSelected(it.itemId, false) } + setOnItemReselectedListener { presenter.onTabSelected(it.itemId, true) } } with(navController) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt index f169de9fd..d49c9b833 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt @@ -23,8 +23,6 @@ import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.hideSoftInput import io.github.wulkanowy.utils.showSoftInput -import kotlinx.coroutines.FlowPreview -import timber.log.Timber import javax.inject.Inject @AndroidEntryPoint @@ -67,7 +65,6 @@ class SendMessageActivity : BaseActivity presenter.clearDraft() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt index b1cf3b642..f61542187 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.message.send -import io.github.wulkanowy.R import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Recipient @@ -41,7 +40,6 @@ class SendMessagePresenter @Inject constructor( private val messageUpdateChannel = Channel() - @FlowPreview fun onAttachView(view: SendMessageView, message: Message?, reply: Boolean?) { super.onAttachView(view) view.initView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt index dfd95b721..54ee74eb1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt @@ -21,7 +21,6 @@ import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.message.preview.MessagePreviewFragment import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.getThemeAttrColor -import kotlinx.coroutines.FlowPreview import javax.inject.Inject @AndroidEntryPoint @@ -58,7 +57,6 @@ class MessageTabFragment : BaseFragment(R.layout.frag setHasOptionsMenu(true) } - @FlowPreview override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding = FragmentMessageTabBinding.bind(view) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 93c7408f6..3e5e09b48 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -44,7 +44,6 @@ class MessageTabPresenter @Inject constructor( private val searchChannel = Channel() - @FlowPreview fun onAttachView(view: MessageTabView, folder: MessageFolder) { super.onAttachView(view) view.initView() @@ -178,7 +177,7 @@ class MessageTabPresenter @Inject constructor( } } - @FlowPreview + @OptIn(FlowPreview::class) private fun initializeSearchStream() { launch { searchChannel.consumeAsFlow() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 733eb17fc..f9079b5f9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -35,6 +35,7 @@ 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 kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import timber.log.Timber @@ -81,6 +82,7 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { "timetable_widget_current_theme_$appWidgetId" } + @OptIn(DelicateCoroutinesApi::class) override fun onReceive(context: Context, intent: Intent) { super.onReceive(context, intent) GlobalScope.launch { diff --git a/build.gradle b/build.gradle index d169291d6..afe0285c8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.5.21' + kotlin_version = '1.5.30' about_libraries = '8.9.1' hilt_version = "2.38.1" } diff --git a/gradle.properties b/gradle.properties index 998e31957..38603830b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,17 +4,19 @@ # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html - +# # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m +# android.enableJetifier=true android.useAndroidX=true +# kotlin.code.style=official -kapt.incremental.apt=true +# kapt.use.worker.api=true kapt.include.compile.classpath=false - +# # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects From 4a38a0be709ac180cf8fb780da81b2852ecc2098 Mon Sep 17 00:00:00 2001 From: Piotr Romanowski Date: Thu, 26 Aug 2021 19:35:41 +0200 Subject: [PATCH 0557/1526] Add change password snackbar (#1336) --- .../github/wulkanowy/ui/base/BaseActivity.kt | 21 ++++++++++++------- .../wulkanowy/ui/base/BaseDialogFragment.kt | 4 ++++ .../github/wulkanowy/ui/base/BaseFragment.kt | 4 ++++ .../github/wulkanowy/ui/base/BasePresenter.kt | 1 + .../io/github/wulkanowy/ui/base/BaseView.kt | 2 ++ .../github/wulkanowy/ui/base/ErrorHandler.kt | 5 +++++ .../settings/advanced/AdvancedFragment.kt | 4 ++++ .../settings/appearance/AppearanceFragment.kt | 4 ++++ .../notifications/NotificationsFragment.kt | 4 ++++ .../ui/modules/settings/sync/SyncFragment.kt | 4 ++++ .../wulkanowy/utils/ContextExtension.kt | 2 +- app/src/main/res/values/strings.xml | 1 + 12 files changed, 47 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index 9b93953d4..0521b4a08 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -3,8 +3,6 @@ package io.github.wulkanowy.ui.base import android.app.ActivityManager import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK import android.content.Intent.FLAG_ACTIVITY_NEW_TASK -import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Bundle import android.view.View import android.widget.Toast @@ -19,6 +17,7 @@ import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.utils.FragmentLifecycleLogger import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.lifecycleAwareVariable +import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject abstract class BaseActivity, VB : ViewBinding> : @@ -43,12 +42,10 @@ abstract class BaseActivity, VB : ViewBinding> : supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true) AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) - if (SDK_INT >= LOLLIPOP) { - @Suppress("DEPRECATION") - setTaskDescription( - ActivityManager.TaskDescription(null, null, getThemeAttrColor(R.attr.colorSurface)) - ) - } + @Suppress("DEPRECATION") + setTaskDescription( + ActivityManager.TaskDescription(null, null, getThemeAttrColor(R.attr.colorSurface)) + ) } override fun showError(text: String, error: Throwable) { @@ -77,6 +74,14 @@ abstract class BaseActivity, VB : ViewBinding> : .show() } + override fun showChangePasswordSnackbar(redirectUrl: String) { + messageContainer?.let { + Snackbar.make(it, R.string.error_password_change_required, LENGTH_LONG) + .setAction(R.string.all_change) { openInternetBrowser(redirectUrl) } + .show() + } + } + override fun openClearLoginView() { startActivity(LoginActivity.getStartIntent(this) .apply { addFlags(FLAG_ACTIVITY_CLEAR_TASK or FLAG_ACTIVITY_NEW_TASK) }) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt index 1c31976ee..25a53395d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt @@ -30,6 +30,10 @@ abstract class BaseDialogFragment : DialogFragment(), BaseView (activity as? BaseActivity<*, *>)?.openClearLoginView() } + override fun showChangePasswordSnackbar(redirectUrl: String) { + (activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl) + } + override fun showErrorDetailsDialog(error: Throwable) { ErrorDialog.newInstance(error).show(childFragmentManager, error.toString()) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt index c6a2e1d1c..dbc5af3a9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt @@ -45,4 +45,8 @@ abstract class BaseFragment(@LayoutRes layoutId: Int) : Fragme override fun openClearLoginView() { (activity as? BaseActivity<*, *>)?.openClearLoginView() } + + override fun showChangePasswordSnackbar(redirectUrl: String) { + (activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl) + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index b222b0abb..be5300499 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -34,6 +34,7 @@ open class BasePresenter( showErrorMessage = view::showError onSessionExpired = view::showExpiredDialog onNoCurrentStudent = view::openClearLoginView + onPasswordChangeRequired = view::showChangePasswordSnackbar } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt index 0f4df92cd..d3165ea44 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt @@ -11,4 +11,6 @@ interface BaseView { fun openClearLoginView() fun showErrorDetailsDialog(error: Throwable) + + fun showChangePasswordSnackbar(redirectUrl: String) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index 34dd3ec16..7c32ef184 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.base import android.content.res.Resources import io.github.wulkanowy.data.exceptions.NoCurrentStudentException import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException +import io.github.wulkanowy.sdk.scrapper.login.PasswordChangeRequiredException import io.github.wulkanowy.utils.getString import io.github.wulkanowy.utils.security.ScramblerException import timber.log.Timber @@ -16,6 +17,8 @@ open class ErrorHandler @Inject constructor(protected val resources: Resources) var onNoCurrentStudent: () -> Unit = {} + var onPasswordChangeRequired: (String) -> Unit = {} + fun dispatch(error: Throwable) { Timber.e(error, "An exception occurred while the Wulkanowy was running") proceed(error) @@ -24,6 +27,7 @@ open class ErrorHandler @Inject constructor(protected val resources: Resources) protected open fun proceed(error: Throwable) { showErrorMessage(resources.getString(error), error) when (error) { + is PasswordChangeRequiredException -> onPasswordChangeRequired(error.redirectUrl) is ScramblerException, is BadCredentialsException -> onSessionExpired() is NoCurrentStudentException -> onNoCurrentStudent() } @@ -33,5 +37,6 @@ open class ErrorHandler @Inject constructor(protected val resources: Resources) showErrorMessage = { _, _ -> } onSessionExpired = {} onNoCurrentStudent = {} + onPasswordChangeRequired = {} } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt index 524d7ba6d..9f29731f6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt @@ -58,6 +58,10 @@ class AdvancedFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showExpiredDialog() } + override fun showChangePasswordSnackbar(redirectUrl: String) { + (activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl) + } + override fun openClearLoginView() { (activity as? BaseActivity<*, *>)?.openClearLoginView() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt index 5ac801dc6..a7ee800be 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt @@ -70,6 +70,10 @@ class AppearanceFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showExpiredDialog() } + override fun showChangePasswordSnackbar(redirectUrl: String) { + (activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl) + } + override fun openClearLoginView() { (activity as? BaseActivity<*, *>)?.openClearLoginView() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt index 96d14a1b6..0fc7e68e7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt @@ -107,6 +107,10 @@ class NotificationsFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showExpiredDialog() } + override fun showChangePasswordSnackbar(redirectUrl: String) { + (activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl) + } + override fun openClearLoginView() { (activity as? BaseActivity<*, *>)?.openClearLoginView() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt index 342988092..83caa3b0a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt @@ -86,6 +86,10 @@ class SyncFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showExpiredDialog() } + override fun showChangePasswordSnackbar(redirectUrl: String) { + (activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl) + } + override fun openClearLoginView() { (activity as? BaseActivity<*, *>)?.openClearLoginView() } diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt index be664a470..cb31389e0 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt @@ -56,7 +56,7 @@ fun Context.getCompatDrawable(@DrawableRes drawableRes: Int, @ColorRes colorRes: fun Context.getCompatBitmap(@DrawableRes drawableRes: Int, @ColorRes colorRes: Int) = getCompatDrawable(drawableRes, colorRes)?.toBitmap() -fun Context.openInternetBrowser(uri: String, onActivityNotFound: (uri: String) -> Unit) { +fun Context.openInternetBrowser(uri: String, onActivityNotFound: (uri: String) -> Unit = {}) { Intent.parseUri(uri, 0).let { if (it.resolveActivity(packageManager) != null) startActivity(it) else onActivityNotFound(uri) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ee911cfba..39478a2ed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -678,6 +678,7 @@ Copied Undo + Change From cebd1aa75d77b53eeb10b116d40fe7fda3154505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 28 Aug 2021 12:14:01 +0200 Subject: [PATCH 0558/1526] Remove lithuanian lang (#1449) --- .../res/values-lt-v29/preferences_values.xml | 9 - .../main/res/values-lt/preferences_values.xml | 48 -- app/src/main/res/values-lt/strings.xml | 548 ------------------ 3 files changed, 605 deletions(-) delete mode 100644 app/src/main/res/values-lt-v29/preferences_values.xml delete mode 100644 app/src/main/res/values-lt/preferences_values.xml delete mode 100644 app/src/main/res/values-lt/strings.xml diff --git a/app/src/main/res/values-lt-v29/preferences_values.xml b/app/src/main/res/values-lt-v29/preferences_values.xml deleted file mode 100644 index 18cbd4cf5..000000000 --- a/app/src/main/res/values-lt-v29/preferences_values.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - Sistemos tema - Šviesi - Tamsi - Juoda (AMOLED) - - diff --git a/app/src/main/res/values-lt/preferences_values.xml b/app/src/main/res/values-lt/preferences_values.xml deleted file mode 100644 index 5999a2fdd..000000000 --- a/app/src/main/res/values-lt/preferences_values.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - Šviesi - Tamsi - Juoda (AMOLED) - - - Sistemos kalba - Polski - English - Pусский - Українська - Deutsch - Čeština - Slovenčina - - - 15 minučių - 30 minučių - 1 valandą - 2 valandas - 6 valandas - 12 valandas - 24 valandas - - - 0,00 - 0,25 - 0,33 - 0,5 - 0,75 - - - Pagal abėcėlę - Pagal datą - - - Dzienniczek+ - Wulkanowy - Laipsnio spalvos registre - - - Antrojo semestro laipsnių vidurkis - Abiejų semestrų laipsnių vidurkis - Visų metų laipsnių vidurkis - - diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml deleted file mode 100644 index cf9d44d11..000000000 --- a/app/src/main/res/values-lt/strings.xml +++ /dev/null @@ -1,548 +0,0 @@ - - - - Prisijungti - Wulkanowy - Laipsnis - Attendance - Exams - Timetable - Nustatymai - Daugiau - Apie - Peržiūrėti žurnalą - Prisidėję - Licencijos - Žinutės - Nauja žinutė - Pastabos ir pasiekimai - Namų darbai - Paskyros valdymas - Pasirinkite paskyrą - Paskyros informacija - Studentų informacija - - Semestras %1$d, %2$d/%3$d - - Sign in with the student or parent account - Enter the symbol from the register page - Vartotojo vardas - El. paštas - Prisijunkite, PESEL arba el. paštas - Slaptažodis - UONET+ register variant - Mobile API - Scraper - Hibridas - Token - PIN - Symbol - Prisijungti - Slaptažodis per trumpas - Login details are incorrect. Make sure the correct UONET+ register variation is selected in the field below - Netinkamas PIN kodas - Invalid token - Token expired - Neteisingas el. paštas - Use the assigned login instead of email - Use the assigned login or email in @%1$s - Netinkamas simbolis - Student not found. Validate the symbol and the chosen variation of the UONET+ register - This field is required - Selected student is already logged in - The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the previous screen. Wulkanowy does not detect pre-school students at the moment - Select students to log in to the application - Papildomi nustatymai - In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices - This mode displays the same data as it appears on the register website - The combination of the best features of the other two modes. It works faster than scraper and provides features not available in the Mobile API mode. It is in the experimental phase - Privatumo politika - Trouble signing in? Contact us! - El. paštas - Discord - Send email - Make sure you select the correct UONET+ register variation! - I forgot my password - Recover your account - Atkurti - Student is already signed in - - Paskyros valdymas - Prisijungti - Sesijos laikas baigėsi - Sesijos laikas baigėsi, prašome prisijungti iš naujo - - Laipsnis - Semestras %d - Keisti semestrą - Jokių laipsnių - Svoris - Svoris: %s - Pastabos - Number of new ratings: %1$d - Vidurkis: %1$.2f - Puantai: %s - Jokiu vidurkis - Bendras punktų skaičius - Galutinis laipsnis - Numatomas laipsnis - Calculated average - Final average - Summary - Class - Mark as read - Partial - Semester - Points - Legend - Average: %1$s - Class - Student - - %d grade - %d grades - %d grades - %d grades - - - New grade - New grades - New grades - New grades - - - New predicted grade - New predicted grades - New predicted grades - New predicted grades - - - New final grade - New final grades - New final grades - New final grades - - - You received %1$d grade - You received %1$d grades - You received %1$d grades - You received %1$d grades - - - You received %1$d predicted grade - You received %1$d predicted grades - You received %1$d predicted grades - You received %1$d predicted grades - - - You received %1$d final grade - You received %1$d final grades - You received %1$d final grades - You received %1$d final grades - - - Lesson - Room - Group - Hours - Changes - No lessons this day - %s min - %s sec - %1$s left - in %1$s - Finished - Now: %s - Next: %s - Later: %s - - Completed lessons - Show completed lessons - No info about completed lessons - Topic - Absence - Resources - - Additional lessons - Show additional lessons - No info about additional lessons - - Attendance summary - Absent for school reasons - Excused absence - Unexcused absence - Exemption - Excused lateness - Unexcused lateness - Present - Deleted - Unknown - Number of lesson - No entries - Absence reason (optional) - Send - Absence excuse request sent successfully! - You must select at least one absence! - Excuse - - Total - - No exams this week - Type - Entry date - - New exam - New exams - New exams - New exams - - - %d exam - %d exams - %d exams - %d exams - - - Inbox - Sent - Trash - (no subject) - No messages - From: - To: - Date: %s - Reply - Forward - Delete - Move to trash - Delete permanently - Message deleted successfully - Share - Print - Subject - Content - Message sent successfully - Message does not exist - You need to choose at least 1 recipient - The message content must be at least 3 characters - - %d message - %d messages - %d messages - %d messages - - - New message - New messages - New messages - New messages - - - You received %1$d message - You received %1$d messages - You received %1$d messages - You received %1$d messages - - - No info about notes - Points - - %d note - %d notes - %d notes - %d notes - - - New note - New notes - New notes - New notes - - - You received %1$d note - You received %1$d notes - You received %1$d notes - You received %1$d notes - - - - %d praise - %d praises - %d praises - %d praises - - - New praise - New praises - New praises - New praises - - - You received %1$d praise - You received %1$d praises - You received %1$d praises - You received %1$d praises - - - - %d neutral note - %d neutral notes - %d neutral notes - %d neutral notes - - - New neutral note - New neutral notes - New neutral notes - New neutral notes - - - You received %1$d neutral note - You received %1$d neutral notes - You received %1$d neutral notes - You received %1$d neutral notes - - - No info about homework - Mark as done - Mark as undone - Attachments - - New homework - New homework - New homework - New homework - - - %d homework - %d homework - %d homework - %d homework - - - Lucky number - Today\'s lucky number is - No info about the lucky number - Lucky number for today - Today\'s lucky number is: %s - Show history - - Lucky number history - No info about lucky numbers - - Mobile devices - No devices - Deregister - Device removed - QR code - Token - Symbol - PIN - - School and teachers - - School - No info about school - School name - School address - Telephone - Name of headmaster - Name of pedagogue - Show on map - Call - - Teachers - No info about teachers - No subject - - Conferences - No info about conferences - - Add account - Logout - Do you want to log out this student? - Student logout - Student account - Parent account - Edit data - Accounts manager - Select student - Family - Contact - Residence details - Personal information - - App version - Contributors - List of Wulkanowy developers - Report a bug - Send a bug report via e-mail - FAQ - Read Frequently Asked Questions - Discord server - Join the Wulkanowy community - Facebook fanpage - Like our facebook fanpage - Privacy policy - Rules for collecting personal data - System settings - Open system settings - Homepage - Visit the website and help develop the application - Licenses - Licenses of libraries used in the application - - License - - Avatar - See more on GitHub - - No info about student or student family - Name - Second name - Gender - Polish citizenship - Family name - Mother\'s and father\'s names - Phone - Cellphone - E-mail - Address of residence - Address of registration - Correspondence address - Surname and first name - Degree of kinship - Address - Phones - Male - Female - Last name - - Nick - Add nick - Choose avatar color - - Share logs - Refresh - - Check for updates - Before reporting a bug, check first if an update with the bug fix is available - - Content - Retry - Description - No description - Teacher - Date - Entry date - Color - Details - Category - Close - No data - Subject - Prev - Next - Search - Search… - Yes - No - Save - - No lessons - Choose theme - Light - Dark - System Theme - - App appearance & behavior - Default view - Calculation of the end-of-year average - Force average calculation by app - Show presence - Theme - Expand grades - Mark current lesson - Show groups next to subjects - Show chart list in class grades - Show subjects without grades - Grades color scheme - Subjects sorting - Language - Notifications - Show notifications - Show upcoming lesson notifications - Open system notification settings - Fix synchronization & notifications issues - Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. - Go to settings - Show debug notifications - Synchronization is disabled - Synchronization - Automatic update - Suspended on holidays - Updates interval - Wi-Fi only - Sync now - Synced! - Sync failed - Sync in progress - Value of the plus - Value of the minus - Reply with message history - Show arithmetic average when no weights provided - Advanced - Appearance & Behavior - Notifications - Synchronization - Grades - Attendance - Timetable - Grades - Messages - Appearance & Behavior - Languages, themes, subjects sorting - App notifications, fix problems - Notifications - Synchronization - Automatic update, synchronization interval - Plus and minus values, average calculation - Advanced - App version, contributors, social portals, licenses - - New grades - New homework - New exams - Lucky number - New messages - New notes - Push notifications - Upcoming lessons - Debug - - Black - Red - Blue - Green - Purple - No color - - Copied - Undo - - Download of updates has started… - An update has just been downloaded. - Restart - Update failed! Wulkanowy may not function properly. Consider updating - - No internet connection - Connection to register failed. Servers can be overloaded. Please try again later - Loading data failed. Please try again later - Register password change required - Maintenance underway UONET + register. Try again later - Unknown UONET + register error. Try again later - Unknown application error. Please try again later - An unexpected error occurred - Feature disabled by your school - Feature not available. Login in a mode other than Mobile API - From 55518cb0449f1073b056d0778a8f2618a924d7bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 28 Aug 2021 21:43:10 +0200 Subject: [PATCH 0559/1526] Add missing dashboard item in default view settings (#1450) --- .../repositories/PreferencesRepository.kt | 1 + .../wulkanowy/ui/modules/exam/ExamFragment.kt | 10 +----- .../ui/modules/exam/ExamPresenter.kt | 10 ------ .../wulkanowy/ui/modules/exam/ExamView.kt | 2 -- .../wulkanowy/ui/modules/main/MainActivity.kt | 6 ++-- .../ui/modules/main/MainPresenter.kt | 10 +++--- .../wulkanowy/ui/modules/main/MainView.kt | 36 ++++++++++--------- .../wulkanowy/utils/FragmentExtension.kt | 4 +-- app/src/main/res/values/preferences_keys.xml | 2 +- .../main/res/values/preferences_values.xml | 2 +- 10 files changed, 33 insertions(+), 50 deletions(-) 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 e725c42a0..7b3cd67b1 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 @@ -30,6 +30,7 @@ class PreferencesRepository @Inject constructor( @ApplicationContext val context: Context, moshi: Moshi ) { + @OptIn(ExperimentalStdlibApi::class) private val dashboardItemsPositionAdapter: JsonAdapter> = moshi.adapter() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt index 0940b0bdf..fb7939bc5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt @@ -20,7 +20,7 @@ import javax.inject.Inject @AndroidEntryPoint class ExamFragment : BaseFragment(R.layout.fragment_exam), ExamView, - MainView.MainChildView, MainView.TitledView { + MainView.TitledView { @Inject lateinit var presenter: ExamPresenter @@ -90,14 +90,6 @@ class ExamFragment : BaseFragment(R.layout.fragment_exam), } } - override fun resetView() { - binding.examRecycler.scrollToPosition(0) - } - - override fun onFragmentReselected() { - if (::presenter.isInitialized) presenter.onViewReselected() - } - override fun showEmpty(show: Boolean) { binding.examEmpty.visibility = if (show) VISIBLE else GONE } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index b70a648f4..582641fcf 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -82,16 +82,6 @@ class ExamPresenter @Inject constructor( view?.showExamDialog(exam) } - fun onViewReselected() { - Timber.i("Exam view is reselected") - baseDate.also { - if (currentDate != it) { - reloadView(it) - loadData() - } else if (view?.isViewEmpty == false) view?.resetView() - } - } - private fun setBaseDateOnHolidays() { flow { val student = studentRepository.getCurrentStudent() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt index ac1a87fe9..45b9e788c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt @@ -17,8 +17,6 @@ interface ExamView : BaseView { fun showRefresh(show: Boolean) - fun resetView() - fun showEmpty(show: Boolean) fun showErrorView(show: Boolean) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index b44bb4b21..cf31040a3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -34,6 +34,7 @@ import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment import io.github.wulkanowy.ui.modules.conference.ConferenceFragment import io.github.wulkanowy.ui.modules.dashboard.DashboardFragment +import io.github.wulkanowy.ui.modules.exam.ExamFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment import io.github.wulkanowy.ui.modules.homework.HomeworkFragment import io.github.wulkanowy.ui.modules.luckynumber.LuckyNumberFragment @@ -107,11 +108,12 @@ class MainActivity : BaseActivity(), MainVie private val moreMenuFragments = mapOf( MainView.Section.MESSAGE.id to MessageFragment.newInstance(), + MainView.Section.EXAM.id to ExamFragment.newInstance(), MainView.Section.HOMEWORK.id to HomeworkFragment.newInstance(), MainView.Section.NOTE.id to NoteFragment.newInstance(), - MainView.Section.LUCKY_NUMBER.id to LuckyNumberFragment.newInstance(), - MainView.Section.SCHOOL_ANNOUNCEMENT.id to SchoolAnnouncementFragment.newInstance(), MainView.Section.CONFERENCE.id to ConferenceFragment.newInstance(), + MainView.Section.SCHOOL_ANNOUNCEMENT.id to SchoolAnnouncementFragment.newInstance(), + MainView.Section.LUCKY_NUMBER.id to LuckyNumberFragment.newInstance(), ) @SuppressLint("NewApi") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index c0eb2b11d..a2fb07f66 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -118,11 +118,9 @@ class MainPresenter @Inject constructor( view?.showStudentAvatar(currentStudent) } - private fun getProperViewIndexes(initMenu: MainView.Section?): Pair { - return when (initMenu?.id) { - in 0..3 -> initMenu!!.id to -1 - in 4..10 -> 4 to initMenu!!.id - else -> prefRepository.startMenuIndex to -1 - } + private fun getProperViewIndexes(initMenu: MainView.Section?) = when (initMenu?.id) { + in 0..3 -> initMenu!!.id to -1 + in 4..100 -> 4 to initMenu!!.id + else -> prefRepository.startMenuIndex to -1 } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt index 44f37d50b..7402d37e0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt @@ -56,22 +56,24 @@ interface MainView : BaseView { set(_) {} } - enum class Section(val id: Int) { - GRADE(0), - ATTENDANCE(1), - EXAM(2), - TIMETABLE(3), - MORE(4), - MESSAGE(5), - HOMEWORK(6), - NOTE(7), - LUCKY_NUMBER(8), - SETTINGS(9), - ABOUT(10), - SCHOOL(11), - ACCOUNT(12), - STUDENT_INFO(13), - CONFERENCE(14), - SCHOOL_ANNOUNCEMENT(15) + enum class Section { + DASHBOARD, + GRADE, + ATTENDANCE, + TIMETABLE, + MORE, + MESSAGE, + EXAM, + HOMEWORK, + NOTE, + CONFERENCE, + SCHOOL_ANNOUNCEMENT, + SCHOOL, + LUCKY_NUMBER, + ACCOUNT, + STUDENT_INFO, + SETTINGS; + + val id get() = ordinal } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/FragmentExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/FragmentExtension.kt index 4651dffd2..210a62090 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/FragmentExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/FragmentExtension.kt @@ -1,11 +1,11 @@ package io.github.wulkanowy.utils import androidx.fragment.app.Fragment -import io.github.wulkanowy.ui.modules.about.AboutFragment import io.github.wulkanowy.ui.modules.account.AccountFragment import io.github.wulkanowy.ui.modules.account.accountdetails.AccountDetailsFragment import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment import io.github.wulkanowy.ui.modules.conference.ConferenceFragment +import io.github.wulkanowy.ui.modules.dashboard.DashboardFragment import io.github.wulkanowy.ui.modules.exam.ExamFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment import io.github.wulkanowy.ui.modules.homework.HomeworkFragment @@ -32,13 +32,13 @@ fun Fragment.toSection(): MainView.Section? { is NoteFragment -> MainView.Section.NOTE is LuckyNumberFragment -> MainView.Section.LUCKY_NUMBER is SettingsFragment -> MainView.Section.SETTINGS - is AboutFragment -> MainView.Section.ABOUT is SchoolAndTeachersFragment -> MainView.Section.SCHOOL is AccountFragment -> MainView.Section.ACCOUNT is AccountDetailsFragment -> MainView.Section.ACCOUNT is StudentInfoFragment -> MainView.Section.STUDENT_INFO is ConferenceFragment -> MainView.Section.CONFERENCE is SchoolAnnouncementFragment -> MainView.Section.SCHOOL_ANNOUNCEMENT + is DashboardFragment -> MainView.Section.DASHBOARD else -> null } } diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index aa60bb7e6..09dac7002 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -1,6 +1,6 @@ - start_menu + default_menu_index attendance_present app_theme dashboard_tiles diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index f5a2b864e..9c1a0421a 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -1,9 +1,9 @@ + @string/dashboard_title @string/grade_title @string/attendance_title - @string/exam_title @string/timetable_title From 04c727a0c8a5a8a5ed5476a2439eceb0b23d7249 Mon Sep 17 00:00:00 2001 From: Tomasz F Date: Sun, 29 Aug 2021 00:41:58 +0200 Subject: [PATCH 0560/1526] Exams and homework notification fixes (#1292) --- .../wulkanowy/data/repositories/ExamRepository.kt | 6 ++++-- .../data/repositories/HomeworkRepository.kt | 6 ++++-- .../sync/notifications/NewConferenceNotification.kt | 11 ++++++++--- .../sync/notifications/NewExamNotification.kt | 13 +++++++++---- .../sync/notifications/NewHomeworkNotification.kt | 13 +++++++++---- .../modules/debug/notification/mock/conference.kt | 2 +- app/src/main/res/values/strings.xml | 8 ++++++++ 7 files changed, 43 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt index 9406c77c6..93d5a47cb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt @@ -40,8 +40,10 @@ class ExamRepository @Inject constructor( ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { - it.isEmpty() || forceRefresh - || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester, start, end)) + val isShouldBeRefreshed = refreshHelper.isShouldBeRefreshed( + key = getRefreshKey(cacheKey, semester, start, end) + ) + it.isEmpty() || forceRefresh || isShouldBeRefreshed }, query = { examDb.loadAll( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt index 476a810c9..23dd74c2c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt @@ -36,8 +36,10 @@ class HomeworkRepository @Inject constructor( ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { - it.isEmpty() || forceRefresh || - refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester, start, end)) + val isShouldBeRefreshed = refreshHelper.isShouldBeRefreshed( + key = getRefreshKey(cacheKey, semester, start, end) + ) + it.isEmpty() || forceRefresh || isShouldBeRefreshed }, query = { homeworkDb.loadAll( diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt index 25648b931..fda2922f9 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt @@ -8,6 +8,8 @@ import io.github.wulkanowy.data.db.entities.Conference import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.MultipleNotifications import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.utils.toFormattedString +import java.time.LocalDateTime import javax.inject.Inject class NewConferenceNotification @Inject constructor( @@ -16,6 +18,11 @@ class NewConferenceNotification @Inject constructor( ) : BaseNotification(context, notificationManager) { fun notify(items: List, student: Student) { + val today = LocalDateTime.now() + val lines = items.filter { !it.date.isBefore(today) }.map { + "${it.date.toFormattedString("dd.MM")} - ${it.title}: ${it.subject}" + }.ifEmpty { return } + val notification = MultipleNotifications( type = NotificationType.NEW_CONFERENCE, icon = R.drawable.ic_more_conferences, @@ -23,9 +30,7 @@ class NewConferenceNotification @Inject constructor( contentStringRes = R.plurals.conference_notify_new_items, summaryStringRes = R.plurals.conference_number_item, startMenu = MainView.Section.CONFERENCE, - lines = items.map { - "${it.title}: ${it.subject}" - } + lines = lines ) sendNotification(notification, student) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt index a41c44e58..d493c4d2e 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt @@ -8,6 +8,8 @@ import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.MultipleNotifications import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.utils.toFormattedString +import java.time.LocalDate import javax.inject.Inject class NewExamNotification @Inject constructor( @@ -16,16 +18,19 @@ class NewExamNotification @Inject constructor( ) : BaseNotification(context, notificationManager) { fun notify(items: List, student: Student) { + val today = LocalDate.now() + val lines = items.filter { !it.date.isBefore(today) }.map { + "${it.date.toFormattedString("dd.MM")} - ${it.subject}: ${it.description}" + }.ifEmpty { return } + val notification = MultipleNotifications( type = NotificationType.NEW_EXAM, icon = R.drawable.ic_main_exam, titleStringRes = R.plurals.exam_notify_new_item_title, - contentStringRes = R.plurals.exam_notify_new_item_title, // TODO add missing string + contentStringRes = R.plurals.exam_notify_new_item_content, summaryStringRes = R.plurals.exam_number_item, startMenu = MainView.Section.EXAM, - lines = items.map { - "${it.subject}: ${it.description}" - } + lines = lines ) sendNotification(notification, student) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt index 844aed979..fe973cade 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt @@ -8,6 +8,8 @@ import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.MultipleNotifications import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.utils.toFormattedString +import java.time.LocalDate import javax.inject.Inject class NewHomeworkNotification @Inject constructor( @@ -16,16 +18,19 @@ class NewHomeworkNotification @Inject constructor( ) : BaseNotification(context, notificationManager) { fun notify(items: List, student: Student) { + val today = LocalDate.now() + val lines = items.filter { !it.date.isBefore(today) }.map { + "${it.date.toFormattedString("dd.MM")} - ${it.subject}: ${it.content}" + }.ifEmpty { return } + val notification = MultipleNotifications( type = NotificationType.NEW_HOMEWORK, icon = R.drawable.ic_more_homework, titleStringRes = R.plurals.homework_notify_new_item_title, - contentStringRes = R.plurals.homework_notify_new_item_title, // todo: you received %d new homework + contentStringRes = R.plurals.homework_notify_new_item_content, summaryStringRes = R.plurals.homework_number_item, startMenu = MainView.Section.HOMEWORK, - lines = items.map { - "${it.subject}: ${it.content}" - } + lines = lines ) sendNotification(notification, student) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/conference.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/conference.kt index 969b1cf23..40af6bfbb 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/conference.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/conference.kt @@ -53,6 +53,6 @@ private fun generateConference(title: String, subject: String) = Conference( diaryId = 0, agenda = "", conferenceId = 0, - date = LocalDateTime.now(), + date = LocalDateTime.now().plusMinutes(10), presentOnConference = "", ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 39478a2ed..ea1187c84 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -206,6 +206,10 @@ New exam New exams + + You received %d new exam + You received %d new exams + %d exam %d exams @@ -312,6 +316,10 @@ New homework New homework + + You received %d new homework + You received %d new homework + %d homework %d homework From 765f8a2d1f0a18fb2cc2d48f9da7d3fb5d7602b6 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sun, 29 Aug 2021 00:43:58 +0200 Subject: [PATCH 0561/1526] Add in app review (#1435) --- app/build.gradle | 1 + .../wulkanowy/utils/InAppReviewHelper.kt | 17 +++++++++++ .../wulkanowy/utils/InAppReviewHelper.kt | 17 +++++++++++ .../repositories/PreferencesRepository.kt | 21 ++++++++++++++ .../wulkanowy/ui/modules/main/MainActivity.kt | 8 ++++++ .../ui/modules/main/MainPresenter.kt | 17 +++++++++++ .../wulkanowy/ui/modules/main/MainView.kt | 2 ++ .../wulkanowy/utils/InAppReviewHelper.kt | 28 +++++++++++++++++++ 8 files changed, 111 insertions(+) create mode 100644 app/src/fdroid/java/io/github/wulkanowy/utils/InAppReviewHelper.kt create mode 100644 app/src/hms/java/io/github/wulkanowy/utils/InAppReviewHelper.kt create mode 100644 app/src/play/java/io/github/wulkanowy/utils/InAppReviewHelper.kt diff --git a/app/build.gradle b/app/build.gradle index d5fccac6f..c05aa0341 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -215,6 +215,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' + playImplementation 'com.google.android.play:core:1.10.0' playImplementation 'com.google.android.play:core-ktx:1.8.1' hmsImplementation 'com.huawei.hms:hianalytics:6.1.1.300' diff --git a/app/src/fdroid/java/io/github/wulkanowy/utils/InAppReviewHelper.kt b/app/src/fdroid/java/io/github/wulkanowy/utils/InAppReviewHelper.kt new file mode 100644 index 000000000..d052b54b8 --- /dev/null +++ b/app/src/fdroid/java/io/github/wulkanowy/utils/InAppReviewHelper.kt @@ -0,0 +1,17 @@ +package io.github.wulkanowy.utils + +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.ui.modules.main.MainActivity +import javax.inject.Singleton +import javax.inject.Inject + +@Singleton +class InAppReviewHelper @Inject constructor( + @ApplicationContext private val context: Context +) { + + fun showInAppReview(activity: MainActivity) { + // do nothing + } +} \ No newline at end of file diff --git a/app/src/hms/java/io/github/wulkanowy/utils/InAppReviewHelper.kt b/app/src/hms/java/io/github/wulkanowy/utils/InAppReviewHelper.kt new file mode 100644 index 000000000..fb9bcae6c --- /dev/null +++ b/app/src/hms/java/io/github/wulkanowy/utils/InAppReviewHelper.kt @@ -0,0 +1,17 @@ +package io.github.wulkanowy.utils + +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.ui.modules.main.MainActivity +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class InAppReviewHelper @Inject constructor( + @ApplicationContext private val context: Context +) { + + fun showInAppReview(activity: MainActivity) { + // do nothing + } +} \ No newline at end of file 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 7b3cd67b1..bc8100f22 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 @@ -10,14 +10,17 @@ import com.squareup.moshi.Moshi import com.squareup.moshi.adapter import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R +import io.github.wulkanowy.sdk.toLocalDate import io.github.wulkanowy.ui.modules.dashboard.DashboardItem import io.github.wulkanowy.ui.modules.grade.GradeAverageMode import io.github.wulkanowy.ui.modules.grade.GradeSortingMode +import io.github.wulkanowy.utils.toTimestamp import io.github.wulkanowy.utils.toLocalDateTime import io.github.wulkanowy.utils.toTimestamp import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import java.time.LocalDate import java.time.LocalDateTime import javax.inject.Inject import javax.inject.Singleton @@ -222,6 +225,18 @@ class PreferencesRepository @Inject constructor( return flowSharedPref.getStringSet(prefKey, defaultSet) } + var inAppReviewCount: Int + get() = sharedPref.getInt(PREF_KEY_IN_APP_REVIEW_COUNT, 0) + set(value) = sharedPref.edit().putInt(PREF_KEY_IN_APP_REVIEW_COUNT, value).apply() + + var inAppReviewDate: LocalDate? + get() = sharedPref.getLong(PREF_KEY_IN_APP_REVIEW_DATE, 0).takeIf { it != 0L }?.toLocalDate() + set(value) = sharedPref.edit().putLong(PREF_KEY_IN_APP_REVIEW_DATE, value!!.toTimestamp()).apply() + + var isAppReviewDone: Boolean + get() = sharedPref.getBoolean(PREF_KEY_IN_APP_REVIEW_DONE, false) + set(value) = sharedPref.edit().putBoolean(PREF_KEY_IN_APP_REVIEW_DONE, value).apply() + private fun getLong(id: Int, default: Int) = getLong(context.getString(id), default) private fun getLong(id: String, default: Int) = @@ -240,5 +255,11 @@ class PreferencesRepository @Inject constructor( private companion object { private const val PREF_KEY_DASHBOARD_ITEMS_POSITION = "dashboard_items_position" + + private const val PREF_KEY_IN_APP_REVIEW_COUNT = "in_app_review_count" + + private const val PREF_KEY_IN_APP_REVIEW_DATE = "in_app_review_date" + + private const val PREF_KEY_IN_APP_REVIEW_DONE = "in_app_review_done" } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index cf31040a3..d758ac0da 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -45,6 +45,7 @@ import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragm import io.github.wulkanowy.ui.modules.timetable.TimetableFragment import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.InAppReviewHelper import io.github.wulkanowy.utils.UpdateHelper import io.github.wulkanowy.utils.createNameInitialsDrawable import io.github.wulkanowy.utils.dpToPx @@ -68,6 +69,9 @@ class MainActivity : BaseActivity(), MainVie @Inject lateinit var updateHelper: UpdateHelper + @Inject + lateinit var inAppReviewHelper: InAppReviewHelper + @Inject lateinit var appInfo: AppInfo @@ -362,6 +366,10 @@ class MainActivity : BaseActivity(), MainVie } } + override fun showInAppReview() { + inAppReviewHelper.showInAppReview(this) + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) navController.onSaveInstanceState(outState) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index a2fb07f66..4805b5a1c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach import timber.log.Timber +import java.time.LocalDate import javax.inject.Inject class MainPresenter @Inject constructor( @@ -106,11 +107,27 @@ class MainPresenter @Inject constructor( } else { notifyMenuViewChanged() switchMenuView(index) + checkInAppReview() true } } == true } + private fun checkInAppReview() { + prefRepository.inAppReviewCount++ + + if (prefRepository.inAppReviewDate == null) { + prefRepository.inAppReviewDate = LocalDate.now() + } + + if (!prefRepository.isAppReviewDone && prefRepository.inAppReviewCount >= 50 && + LocalDate.now().minusDays(14).isAfter(prefRepository.inAppReviewDate) + ) { + view?.showInAppReview() + prefRepository.isAppReviewDone = true + } + } + private fun showCurrentStudentAvatar() { val currentStudent = studentsWitSemesters?.singleOrNull { it.student.isCurrent }?.student ?: return diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt index 7402d37e0..8851f5878 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt @@ -40,6 +40,8 @@ interface MainView : BaseView { fun showStudentAvatar(student: Student) + fun showInAppReview() + interface MainChildView { fun onFragmentReselected() diff --git a/app/src/play/java/io/github/wulkanowy/utils/InAppReviewHelper.kt b/app/src/play/java/io/github/wulkanowy/utils/InAppReviewHelper.kt new file mode 100644 index 000000000..1dcece99d --- /dev/null +++ b/app/src/play/java/io/github/wulkanowy/utils/InAppReviewHelper.kt @@ -0,0 +1,28 @@ +package io.github.wulkanowy.utils + +import android.content.Context +import com.google.android.play.core.review.ReviewManagerFactory +import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.ui.modules.main.MainActivity +import timber.log.Timber +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class InAppReviewHelper @Inject constructor( + @ApplicationContext private val context: Context +) { + + fun showInAppReview(activity: MainActivity) { + val manager = ReviewManagerFactory.create(context) + val request = manager.requestReviewFlow() + request.addOnCompleteListener { task -> + if (task.isSuccessful) { + val reviewInfo = task.result + manager.launchReviewFlow(activity, reviewInfo) + } else { + Timber.e(task.exception) + } + } + } +} \ No newline at end of file From 2f43b6e55247167852e1f8f4c4396f63c4edec6d Mon Sep 17 00:00:00 2001 From: Daniel Olczyk <44818681+MRmlik12@users.noreply.github.com> Date: Sun, 29 Aug 2021 14:08:48 +0200 Subject: [PATCH 0562/1526] Change display name for MRmlik12 (#1451) --- app/src/main/assets/contributors.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/contributors.json b/app/src/main/assets/contributors.json index c1e7e209d..b2849931a 100644 --- a/app/src/main/assets/contributors.json +++ b/app/src/main/assets/contributors.json @@ -36,7 +36,7 @@ "githubUsername": "Luncenok" }, { - "displayName": "MRmlik12", + "displayName": "Daniel Olczyk", "githubUsername": "MRmlik12" }, { From 57d11e825be154c8d40046add5d133e422f12c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 29 Aug 2021 15:40:28 +0200 Subject: [PATCH 0563/1526] Update readBy and unreadBy fields during message list fetch (#1452) --- .../data/repositories/MessageRepository.kt | 83 ++++++++-- .../repositories/MessageRepositoryTest.kt | 156 ++++++++++++++++-- 2 files changed, 205 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index 2d70e26ee..9977e1d57 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -4,10 +4,12 @@ import android.content.Context import com.squareup.moshi.Moshi import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R +import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.dao.MessageAttachmentDao import io.github.wulkanowy.data.db.dao.MessagesDao import io.github.wulkanowy.data.db.entities.Message +import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student @@ -48,22 +50,54 @@ class MessageRepository @Inject constructor( private val cacheKey = "message" @Suppress("UNUSED_PARAMETER") - fun getMessages(student: Student, semester: Semester, folder: MessageFolder, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + fun getMessages( + student: Student, semester: Semester, + folder: MessageFolder, forceRefresh: Boolean, notify: Boolean = false + ): Flow>> = networkBoundResource( mutex = saveFetchResultMutex, - shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, student, folder)) }, + shouldFetch = { + it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed( + getRefreshKey(cacheKey, student, folder) + ) + }, query = { messagesDb.loadAll(student.id.toInt(), folder.id) }, - fetch = { sdk.init(student).getMessages(Folder.valueOf(folder.name), now().minusMonths(3), now()).mapToEntities(student) }, + fetch = { + sdk.init(student).getMessages(Folder.valueOf(folder.name), now().minusMonths(3), now()) + .mapToEntities(student) + }, saveFetchResult = { old, new -> messagesDb.deleteAll(old uniqueSubtract new) messagesDb.insertAll((new uniqueSubtract old).onEach { it.isNotified = !notify }) + messagesDb.updateAll(getMessagesWithReadByChange(old, new, !notify)) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, student, folder)) } ) - fun getMessage(student: Student, message: Message, markAsRead: Boolean = false) = networkBoundResource( + private fun getMessagesWithReadByChange( + old: List, new: List, + setNotified: Boolean + ): List { + val oldMeta = old.map { Triple(it, it.readBy, it.unreadBy) } + val newMeta = new.map { Triple(it, it.readBy, it.unreadBy) } + + val updatedItems = newMeta uniqueSubtract oldMeta + + return updatedItems.map { + val oldItem = old.find { item -> item.messageId == it.first.messageId } + it.first.apply { + id = oldItem?.id ?: 0 + isNotified = oldItem?.isNotified ?: setNotified + content = oldItem?.content.orEmpty() + } + } + } + + fun getMessage( + student: Student, message: Message, markAsRead: Boolean = false + ): Flow> = networkBoundResource( shouldFetch = { checkNotNull(it, { "This message no longer exist!" }) Timber.d("Message content in db empty: ${it.message.content.isEmpty()}") @@ -71,7 +105,12 @@ class MessageRepository @Inject constructor( }, query = { messagesDb.loadMessageWithAttachment(student.id.toInt(), message.messageId) }, fetch = { - sdk.init(student).getMessageDetails(it!!.message.messageId, message.folderId, markAsRead, message.realId).let { details -> + sdk.init(student).getMessageDetails( + messageId = it!!.message.messageId, + folderId = message.folderId, + read = markAsRead, + id = message.realId + ).let { details -> details.content to details.attachments.mapToEntities() } }, @@ -95,26 +134,34 @@ class MessageRepository @Inject constructor( return messagesDb.updateAll(messages) } - suspend fun sendMessage(student: Student, subject: String, content: String, recipients: List): SentMessage { - return sdk.init(student).sendMessage( - subject = subject, - content = content, - recipients = recipients.mapFromEntities() - ) - } + suspend fun sendMessage( + student: Student, subject: String, content: String, + recipients: List + ): SentMessage = sdk.init(student).sendMessage( + subject = subject, + content = content, + recipients = recipients.mapFromEntities() + ) suspend fun deleteMessage(student: Student, message: Message) { - val isDeleted = sdk.init(student).deleteMessages(listOf(message.messageId), message.folderId) + val isDeleted = sdk.init(student).deleteMessages( + messages = listOf(message.messageId), message.folderId + ) - if (message.folderId != MessageFolder.TRASHED.id) { - if (isDeleted) messagesDb.updateAll(listOf(message.copy(folderId = MessageFolder.TRASHED.id).apply { + if (message.folderId != MessageFolder.TRASHED.id && isDeleted) { + val deletedMessage = message.copy(folderId = MessageFolder.TRASHED.id).apply { id = message.id content = message.content - })) + } + messagesDb.updateAll(listOf(deletedMessage)) } else messagesDb.deleteAll(listOf(message)) } var draftMessage: MessageDraft? - get() = sharedPrefProvider.getString(context.getString(R.string.pref_key_message_send_draft))?.let { MessageDraftJsonAdapter(moshi).fromJson(it) } - set(value) = sharedPrefProvider.putString(context.getString(R.string.pref_key_message_send_draft), value?.let { MessageDraftJsonAdapter(moshi).toJson(it) }) + get() = sharedPrefProvider.getString(context.getString(R.string.pref_key_message_send_draft)) + ?.let { MessageDraftJsonAdapter(moshi).fromJson(it) } + set(value) = sharedPrefProvider.putString( + context.getString(R.string.pref_key_message_send_draft), + value?.let { MessageDraftJsonAdapter(moshi).toJson(it) } + ) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt index 8b72479f1..cadc4225a 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt @@ -8,19 +8,25 @@ import io.github.wulkanowy.data.db.dao.MessageAttachmentDao import io.github.wulkanowy.data.db.dao.MessagesDao import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment +import io.github.wulkanowy.data.enums.MessageFolder +import io.github.wulkanowy.getSemesterEntity import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.sdk.pojo.Folder import io.github.wulkanowy.sdk.pojo.MessageDetails +import io.github.wulkanowy.sdk.pojo.Sender import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.toFirstResult import io.mockk.MockKAnnotations import io.mockk.Runs +import io.mockk.checkEquals import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK import io.mockk.just +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking @@ -29,6 +35,7 @@ import org.junit.Before import org.junit.Test import java.net.UnknownHostException import java.time.LocalDateTime +import kotlin.test.assertTrue class MessageRepositoryTest { @@ -52,7 +59,9 @@ class MessageRepositoryTest { private val student = getStudentEntity() - private lateinit var messageRepository: MessageRepository + private val semester = getSemesterEntity() + + private lateinit var repository: MessageRepository @MockK private lateinit var moshi: Moshi @@ -62,15 +71,92 @@ class MessageRepositoryTest { MockKAnnotations.init(this) every { refreshHelper.isShouldBeRefreshed(any()) } returns false - messageRepository = MessageRepository(messageDb, messageAttachmentDao, sdk, context, refreshHelper, sharedPrefProvider, moshi) + repository = MessageRepository( + messagesDb = messageDb, + messageAttachmentDao = messageAttachmentDao, + sdk = sdk, + context = context, + refreshHelper = refreshHelper, + sharedPrefProvider = sharedPrefProvider, + moshi = moshi, + ) + } + + @Test + fun `get messages when read by values was changed on already read message`() = runBlocking { + every { messageDb.loadAll(any(), any()) } returns flow { + val dbMessage = getMessageEntity(3, "", false).apply { + unreadBy = 10 + readBy = 5 + isNotified = true + } + emit(listOf(dbMessage)) + } + coEvery { sdk.getMessages(Folder.RECEIVED, any(), any()) } returns listOf( + getMessageDto(messageId = 3, content = "", unread = false).copy( + unreadBy = 5, + readBy = 10, + ) + ) + coEvery { messageDb.deleteAll(any()) } just Runs + coEvery { messageDb.insertAll(any()) } returns listOf() + + repository.getMessages( + student = student, + semester = semester, + folder = MessageFolder.RECEIVED, + forceRefresh = true, + notify = true, // all new messages will be marked as not notified + ).toFirstResult().data.orEmpty() + + coVerify(exactly = 1) { messageDb.deleteAll(emptyList()) } + coVerify(exactly = 1) { messageDb.insertAll(emptyList()) } + coVerify(exactly = 1) { + messageDb.updateAll(withArg { + assertEquals(1, it.size) + assertEquals(5, it.single().unreadBy) + assertEquals(10, it.single().readBy) + }) + } + } + + @Test + fun `get messages when fetched completely new message without notify`() = runBlocking { + every { messageDb.loadAll(any(), any()) } returns flowOf(emptyList()) + coEvery { sdk.getMessages(Folder.RECEIVED, any(), any()) } returns listOf( + getMessageDto(messageId = 4, content = "Test", unread = true).copy( + unreadBy = 5, + readBy = 10, + ) + ) + coEvery { messageDb.deleteAll(any()) } just Runs + coEvery { messageDb.insertAll(any()) } returns listOf() + + repository.getMessages( + student = student, + semester = semester, + folder = MessageFolder.RECEIVED, + forceRefresh = true, + notify = false, + ).toFirstResult().data.orEmpty() + + coVerify(exactly = 1) { messageDb.deleteAll(withArg { checkEquals(emptyList()) }) } + coVerify { + messageDb.insertAll(withArg { + assertEquals(4, it.single().messageId) + assertTrue(it.single().isNotified) + }) + } } @Test(expected = NoSuchElementException::class) fun `throw error when message is not in the db`() { val testMessage = getMessageEntity(1, "", false) - coEvery { messageDb.loadMessageWithAttachment(1, 1) } throws NoSuchElementException("No message in database") + coEvery { + messageDb.loadMessageWithAttachment(1, 1) + } throws NoSuchElementException("No message in database") - runBlocking { messageRepository.getMessage(student, testMessage).toFirstResult() } + runBlocking { repository.getMessage(student, testMessage).toFirstResult() } } @Test @@ -78,9 +164,11 @@ class MessageRepositoryTest { val testMessage = getMessageEntity(123, "Test", false) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) - coEvery { messageDb.loadMessageWithAttachment(1, testMessage.messageId) } returns flowOf(messageWithAttachment) + coEvery { messageDb.loadMessageWithAttachment(1, testMessage.messageId) } returns flowOf( + messageWithAttachment + ) - val res = runBlocking { messageRepository.getMessage(student, testMessage).toFirstResult() } + val res = runBlocking { repository.getMessage(student, testMessage).toFirstResult() } assertEquals(null, res.error) assertEquals(Status.SUCCESS, res.status) @@ -95,12 +183,24 @@ class MessageRepositoryTest { val mWa = MessageWithAttachment(testMessage, emptyList()) val mWaWithContent = MessageWithAttachment(testMessageWithContent, emptyList()) - coEvery { messageDb.loadMessageWithAttachment(1, testMessage.messageId) } returnsMany listOf(flowOf(mWa), flowOf(mWaWithContent)) - coEvery { sdk.getMessageDetails(testMessage.messageId, 1, false, testMessage.realId) } returns MessageDetails("Test", emptyList()) + coEvery { + messageDb.loadMessageWithAttachment( + 1, + testMessage.messageId + ) + } returnsMany listOf(flowOf(mWa), flowOf(mWaWithContent)) + coEvery { + sdk.getMessageDetails( + messageId = testMessage.messageId, + folderId = 1, + read = false, + id = testMessage.realId + ) + } returns MessageDetails("Test", emptyList()) coEvery { messageDb.updateAll(any()) } just Runs coEvery { messageAttachmentDao.insertAttachments(any()) } returns listOf(1) - val res = runBlocking { messageRepository.getMessage(student, testMessage).toFirstResult() } + val res = runBlocking { repository.getMessage(student, testMessage).toFirstResult() } assertEquals(null, res.error) assertEquals(Status.SUCCESS, res.status) @@ -112,18 +212,22 @@ class MessageRepositoryTest { fun `get message when content in db is empty and there is no internet connection`() { val testMessage = getMessageEntity(123, "", false) - coEvery { messageDb.loadMessageWithAttachment(1, testMessage.messageId) } throws UnknownHostException() + coEvery { + messageDb.loadMessageWithAttachment(1, testMessage.messageId) + } throws UnknownHostException() - runBlocking { messageRepository.getMessage(student, testMessage).toFirstResult() } + runBlocking { repository.getMessage(student, testMessage).toFirstResult() } } @Test(expected = UnknownHostException::class) fun `get message when content in db is empty, unread and there is no internet connection`() { val testMessage = getMessageEntity(123, "", true) - coEvery { messageDb.loadMessageWithAttachment(1, testMessage.messageId) } throws UnknownHostException() + coEvery { + messageDb.loadMessageWithAttachment(1, testMessage.messageId) + } throws UnknownHostException() - runBlocking { messageRepository.getMessage(student, testMessage).toList()[1] } + runBlocking { repository.getMessage(student, testMessage).toList()[1] } } private fun getMessageEntity( @@ -135,10 +239,10 @@ class MessageRepositoryTest { realId = 1, messageId = messageId, sender = "", - senderId = 1, - recipient = "", + senderId = 0, + recipient = "Wielu adresatów", subject = "", - date = LocalDateTime.now(), + date = LocalDateTime.MAX, folderId = 1, unread = unread, removed = false, @@ -148,4 +252,24 @@ class MessageRepositoryTest { unreadBy = 1 readBy = 1 } + + private fun getMessageDto( + messageId: Int, + content: String, + unread: Boolean, + ) = io.github.wulkanowy.sdk.pojo.Message( + id = 1, + messageId = messageId, + sender = Sender("", "", 0, 0, 0, ""), + recipients = listOf(), + subject = "", + content = content, + date = LocalDateTime.MAX, + folderId = 1, + unread = unread, + unreadBy = 0, + readBy = 0, + removed = false, + hasAttachments = false, + ) } From 4aa6b0b99519db7e16dfec03cd72a14b6776b475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 29 Aug 2021 19:00:30 +0200 Subject: [PATCH 0564/1526] Hide keyboard on opening login host dropdown (#1455) --- .../wulkanowy/ui/modules/login/form/LoginFormFragment.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index 5250ceb6a..e383072ec 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -81,6 +81,9 @@ class LoginFormFragment : BaseFragment(R.layout.fragme loginFormRecoverLink.setOnClickListener { presenter.onRecoverClick() } loginFormRecoverLinkSecond.setOnClickListener { presenter.onRecoverClick() } loginFormPass.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() } + loginFormHost.setOnFocusChangeListener { _, hasFocus -> + if (hasFocus) requireActivity().hideSoftInput() + } } with(binding.loginFormHost) { From ea0fb00bdebaa48e9c7ac6dfa01ee39bc67e6bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 29 Aug 2021 19:31:28 +0200 Subject: [PATCH 0565/1526] Fix crash on opening date pickers during holidays (#1456) --- .../modules/attendance/AttendanceFragment.kt | 30 ++++++++++--------- .../history/LuckyNumberHistoryFragment.kt | 20 ++++++------- .../history/LuckyNumberHistoryPresenter.kt | 18 +++++++++++ .../ui/modules/timetable/TimetableFragment.kt | 21 +++++++------ 4 files changed, 54 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 10cab3df0..7ae1e0586 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -35,7 +35,8 @@ import java.time.LocalDate import javax.inject.Inject @AndroidEntryPoint -class AttendanceFragment : BaseFragment(R.layout.fragment_attendance), AttendanceView, MainView.MainChildView, +class AttendanceFragment : BaseFragment(R.layout.fragment_attendance), + AttendanceView, MainView.MainChildView, MainView.TitledView { @Inject @@ -118,7 +119,9 @@ class AttendanceFragment : BaseFragment(R.layout.frag with(binding) { attendanceSwipe.setOnRefreshListener(presenter::onSwipeRefresh) attendanceSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) - attendanceSwipe.setProgressBackgroundColorSchemeColor(requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh)) + attendanceSwipe.setProgressBackgroundColorSchemeColor( + requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh) + ) attendanceErrorRetry.setOnClickListener { presenter.onRetry() } attendanceErrorDetails.setOnClickListener { presenter.onDetailsClick() } @@ -208,7 +211,7 @@ class AttendanceFragment : BaseFragment(R.layout.frag } override fun showNextButton(show: Boolean) { - binding. attendanceNextButton.visibility = if (show) VISIBLE else INVISIBLE + binding.attendanceNextButton.visibility = if (show) VISIBLE else INVISIBLE } override fun showExcuseButton(show: Boolean) { @@ -220,20 +223,19 @@ class AttendanceFragment : BaseFragment(R.layout.frag } override fun showDatePickerDialog(currentDate: LocalDate) { - val now = LocalDate.now() - val startOfSchoolYear = now.schoolYearStart.toTimestamp() - val endWeek = now.plusWeeks(1).toTimestamp() + val baseDate = currentDate.schoolYearStart + val rangeStart = baseDate.toTimestamp() + val rangeEnd = LocalDate.now().plusWeeks(1).toTimestamp() val constraintsBuilder = CalendarConstraints.Builder().apply { - setValidator(SchoolDaysValidator(startOfSchoolYear, endWeek)) - setStart(startOfSchoolYear) - setEnd(endWeek) + setValidator(SchoolDaysValidator(rangeStart, rangeEnd)) + setStart(rangeStart) + setEnd(rangeEnd) } - val datePicker = - MaterialDatePicker.Builder.datePicker() - .setCalendarConstraints(constraintsBuilder.build()) - .setSelection(currentDate.toTimestamp()) - .build() + val datePicker = MaterialDatePicker.Builder.datePicker() + .setCalendarConstraints(constraintsBuilder.build()) + .setSelection(currentDate.toTimestamp()) + .build() datePicker.addOnPositiveButtonClickListener { val date = it.toLocalDateTime() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt index 4981aad25..dc141f8d3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt @@ -112,19 +112,19 @@ class LuckyNumberHistoryFragment : } override fun showDatePickerDialog(currentDate: LocalDate) { - val now = LocalDate.now() - val startOfSchoolYear = now.schoolYearStart.toTimestamp() + val baseDate = currentDate.schoolYearStart + val rangeStart = baseDate.toTimestamp() + val rangeEnd = LocalDate.now().plusWeeks(1).toTimestamp() val constraintsBuilder = CalendarConstraints.Builder().apply { - setValidator(SchoolDaysValidator(startOfSchoolYear, now.toTimestamp())) - setStart(startOfSchoolYear) - setEnd(now.toTimestamp()) + setValidator(SchoolDaysValidator(rangeStart, rangeEnd)) + setStart(rangeStart) + setEnd(rangeEnd) } - val datePicker = - MaterialDatePicker.Builder.datePicker() - .setCalendarConstraints(constraintsBuilder.build()) - .setSelection(currentDate.toTimestamp()) - .build() + val datePicker = MaterialDatePicker.Builder.datePicker() + .setCalendarConstraints(constraintsBuilder.build()) + .setSelection(currentDate.toTimestamp()) + .build() datePicker.addOnPositiveButtonClickListener { val date = it.toLocalDateTime() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryPresenter.kt index 556dda759..c45cb69a7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryPresenter.kt @@ -2,18 +2,22 @@ package io.github.wulkanowy.ui.modules.luckynumber.history import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.LuckyNumberRepository +import io.github.wulkanowy.data.repositories.SemesterRepository 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.utils.AnalyticsHelper import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource +import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.previousOrSameSchoolDay import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach import timber.log.Timber import java.time.LocalDate @@ -22,6 +26,7 @@ import javax.inject.Inject class LuckyNumberHistoryPresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, + private val semesterRepository: SemesterRepository, private val luckyNumberRepository: LuckyNumberRepository, private val analytics: AnalyticsHelper ) : BasePresenter(errorHandler, studentRepository) { @@ -40,6 +45,19 @@ class LuckyNumberHistoryPresenter @Inject constructor( Timber.i("Lucky number history view was initialized") errorHandler.showErrorMessage = ::showErrorViewOnError loadData() + if (currentDate.isHolidays) setBaseDateOnHolidays() + } + + private fun setBaseDateOnHolidays() { + flow { + val student = studentRepository.getCurrentStudent() + emit(semesterRepository.getCurrentSemester(student)) + }.catch { + Timber.i("Loading semester result: An exception occurred") + }.onEach { + currentDate = currentDate.getLastSchoolDayIfHoliday(it.schoolYear) + reloadNavigation() + }.launch("holidays") } private fun loadData() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index a374e166c..a65d69211 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -185,20 +185,19 @@ class TimetableFragment : BaseFragment(R.layout.fragme } override fun showDatePickerDialog(currentDate: LocalDate) { - val now = LocalDate.now() - val startOfSchoolYear = now.schoolYearStart.toTimestamp() - val endOfSchoolYear = now.schoolYearEnd.toTimestamp() + val baseDate = currentDate.schoolYearStart + val rangeStart = baseDate.toTimestamp() + val rangeEnd = LocalDate.now().schoolYearEnd.toTimestamp() val constraintsBuilder = CalendarConstraints.Builder().apply { - setValidator(SchoolDaysValidator(startOfSchoolYear, endOfSchoolYear)) - setStart(startOfSchoolYear) - setEnd(endOfSchoolYear) + setValidator(SchoolDaysValidator(rangeStart, rangeEnd)) + setStart(rangeStart) + setEnd(rangeEnd) } - val datePicker = - MaterialDatePicker.Builder.datePicker() - .setCalendarConstraints(constraintsBuilder.build()) - .setSelection(currentDate.toTimestamp()) - .build() + val datePicker = MaterialDatePicker.Builder.datePicker() + .setCalendarConstraints(constraintsBuilder.build()) + .setSelection(currentDate.toTimestamp()) + .build() datePicker.addOnPositiveButtonClickListener { val date = it.toLocalDateTime() From 98dcc62bb73de7b5eaef04dfe6ff1437eeb8fd2c Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sun, 29 Aug 2021 19:47:14 +0200 Subject: [PATCH 0566/1526] Add excuse function to "not excusable" account (#1429) --- .../modules/attendance/AttendanceAdapter.kt | 3 +- .../modules/attendance/AttendanceFragment.kt | 25 ++++++++++++++-- .../modules/attendance/AttendancePresenter.kt | 30 +++++++++++++++++-- .../ui/modules/attendance/AttendanceView.kt | 2 ++ .../message/send/SendMessageActivity.kt | 8 +++++ .../message/send/SendMessagePresenter.kt | 6 +++- .../wulkanowy/utils/AttendanceExtension.kt | 3 ++ app/src/main/res/values/strings.xml | 2 ++ 8 files changed, 72 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt index 03ec1c842..6cee23963 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt @@ -10,6 +10,7 @@ import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.enums.SentExcuseStatus import io.github.wulkanowy.databinding.ItemAttendanceBinding import io.github.wulkanowy.utils.description +import io.github.wulkanowy.utils.isExcusableOrNotExcused import javax.inject.Inject class AttendanceAdapter @Inject constructor() : @@ -56,7 +57,7 @@ class AttendanceAdapter @Inject constructor() : attendanceItemExcuseInfo.visibility = View.VISIBLE } else -> { - if (item.excusable && excuseActionMode) { + if (item.isExcusableOrNotExcused && excuseActionMode) { attendanceItemNumber.visibility = View.GONE attendanceItemExcuseCheckbox.visibility = View.VISIBLE } else { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 7ae1e0586..058946796 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -24,6 +24,7 @@ import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.attendance.summary.AttendanceSummaryFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.SchoolDaysValidator import io.github.wulkanowy.utils.dpToPx @@ -120,7 +121,9 @@ class AttendanceFragment : BaseFragment(R.layout.frag attendanceSwipe.setOnRefreshListener(presenter::onSwipeRefresh) attendanceSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) attendanceSwipe.setProgressBackgroundColorSchemeColor( - requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh) + requireContext().getThemeAttrColor( + R.attr.colorSwipeRefresh + ) ) attendanceErrorRetry.setOnClickListener { presenter.onRetry() } attendanceErrorDetails.setOnClickListener { presenter.onDetailsClick() } @@ -253,8 +256,13 @@ class AttendanceFragment : BaseFragment(R.layout.frag .setNegativeButton(android.R.string.cancel) { _, _ -> } .create() .apply { - setButton(BUTTON_POSITIVE, getString(R.string.attendance_excuse_dialog_submit)) { _, _ -> - presenter.onExcuseDialogSubmit(dialogBinding.excuseReason.text?.toString().orEmpty()) + setButton( + BUTTON_POSITIVE, + getString(R.string.attendance_excuse_dialog_submit) + ) { _, _ -> + presenter.onExcuseDialogSubmit( + dialogBinding.excuseReason.text?.toString().orEmpty() + ) } }.show() } @@ -267,6 +275,17 @@ class AttendanceFragment : BaseFragment(R.layout.frag actionMode = (activity as MainActivity?)?.startSupportActionMode(actionModeCallback) } + override fun startSendMessageIntent(date: LocalDate, numbers: String, reason: String) { + val reasonFullText = getString( + R.string.attendance_excuse_formula, + date, + numbers, + if (reason.isNotBlank()) " ${getString(R.string.attendance_excuse_reason)} " else "", + reason.ifBlank { "" } + ) + startActivity(SendMessageActivity.getStartIntent(requireContext(), reasonFullText)) + } + override fun showExcuseCheckboxes(show: Boolean) { attendanceAdapter.apply { excuseActionMode = show 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 333e7103a..9a1598128 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 @@ -15,6 +15,7 @@ import io.github.wulkanowy.utils.capitalise import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday +import io.github.wulkanowy.utils.isExcusableOrNotExcused import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousOrSameSchoolDay @@ -47,6 +48,8 @@ class AttendancePresenter @Inject constructor( private val attendanceToExcuseList = mutableListOf() + private var isVulcanExcusedFunctionEnabled = false + fun onAttachView(view: AttendanceView, date: Long?) { super.onAttachView(view) view.initView() @@ -148,7 +151,21 @@ class AttendancePresenter @Inject constructor( fun onExcuseDialogSubmit(reason: String) { view?.finishActionMode() - excuseAbsence(if (reason != "") reason else null, attendanceToExcuseList.toList()) + + if (isVulcanExcusedFunctionEnabled) { + excuseAbsence( + reason = reason.takeIf { it.isNotBlank() }, + toExcuseList = attendanceToExcuseList.toList() + ) + } else { + val attendanceToExcuseNumbers = attendanceToExcuseList.map { it.number } + + view?.startSendMessageIntent( + date = attendanceToExcuseList[0].date, + numbers = attendanceToExcuseNumbers.joinToString(", "), + reason = reason + ) + } } fun onPrepareActionMode(): Boolean { @@ -188,8 +205,12 @@ class AttendancePresenter @Inject constructor( private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading attendance data started") + var isParent = false + flowWithResourceIn { val student = studentRepository.getCurrentStudent() + isParent = student.isParent + val semester = semesterRepository.getCurrentSemester(student) attendanceRepository.getAttendance( student, @@ -227,12 +248,17 @@ class AttendancePresenter @Inject constructor( it.data?.filter { item -> !item.presence }.orEmpty() } + isVulcanExcusedFunctionEnabled = + filteredAttendance.any { item -> item.excusable } + view?.apply { updateData(filteredAttendance.sortedBy { item -> item.number }) showEmpty(filteredAttendance.isEmpty()) showErrorView(false) showContent(filteredAttendance.isNotEmpty()) - showExcuseButton(filteredAttendance.any { item -> item.excusable }) + showExcuseButton(filteredAttendance.any { item -> + (!isParent && isVulcanExcusedFunctionEnabled) || (isParent && item.isExcusableOrNotExcused) + }) } analytics.logEvent( "load_data", diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt index 0459dfcf6..738f2ff86 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt @@ -54,6 +54,8 @@ interface AttendanceView : BaseView { fun openSummaryView() + fun startSendMessageIntent(date: LocalDate, numbers: String, reason: String) + fun startActionMode() fun showExcuseCheckboxes(show: Boolean) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt index d49c9b833..1432a9945 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt @@ -35,6 +35,8 @@ class SendMessageActivity : BaseActivity() - fun onAttachView(view: SendMessageView, message: Message?, reply: Boolean?) { + fun onAttachView(view: SendMessageView, reason: String?, message: Message?, reply: Boolean?) { super.onAttachView(view) view.initView() initializeSubjectStream() @@ -50,6 +50,10 @@ class SendMessagePresenter @Inject constructor( if (messageRepository.draftMessage != null && reply == null) { view.showMessageBackupDialog() } + reason?.let { + setSubject("Usprawiedliwenie") + setContent(it) + } message?.let { setSubject(when (reply) { true -> "RE: " 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 8bccec620..479cc5188 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt @@ -16,6 +16,9 @@ private inline val AttendanceSummary.allPresences: Double private inline val AttendanceSummary.allAbsences: Double get() = absence.toDouble() + absenceExcused +inline val Attendance.isExcusableOrNotExcused: Boolean + get() = excusable || ((absence || lateness) && !excused) + fun AttendanceSummary.calculatePercentage() = calculatePercentage(allPresences, allAbsences) fun List.calculatePercentage(): Double { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ea1187c84..08776c1ab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -192,6 +192,8 @@ Absence excuse request sent successfully! You must select at least one absence! Excuse + z powodu + Dzień dobry,\nProszę o usprawiedliwienie mojego dziecka w dniu %s z lekcji %s%s%s.\n\nPozdrawiam. From 79e9e1a780c8c600d9380ffe3ad3ddd273955295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 29 Aug 2021 20:01:36 +0200 Subject: [PATCH 0567/1526] New Crowdin updates (#1321) --- .../main/res/values-cs/preferences_values.xml | 11 + app/src/main/res/values-cs/strings.xml | 163 ++++++++++++++- .../main/res/values-de/preferences_values.xml | 11 + app/src/main/res/values-de/strings.xml | 147 +++++++++++-- .../main/res/values-pl/preferences_values.xml | 11 + app/src/main/res/values-pl/strings.xml | 153 +++++++++++++- .../main/res/values-ru/preferences_values.xml | 11 + app/src/main/res/values-ru/strings.xml | 183 ++++++++++++++-- .../main/res/values-sk/preferences_values.xml | 11 + app/src/main/res/values-sk/strings.xml | 163 ++++++++++++++- .../main/res/values-uk/preferences_values.xml | 11 + app/src/main/res/values-uk/strings.xml | 195 +++++++++++++++--- 12 files changed, 999 insertions(+), 71 deletions(-) diff --git a/app/src/main/res/values-cs/preferences_values.xml b/app/src/main/res/values-cs/preferences_values.xml index ce32f22bc..fb938f092 100644 --- a/app/src/main/res/values-cs/preferences_values.xml +++ b/app/src/main/res/values-cs/preferences_values.xml @@ -45,4 +45,15 @@ Průměr známek z obou semestrů Průměr známek z celého roku + + Šťastné číslo + Nepřečtené zprávy + Docházka + Lekce + Známky + Domácí úkoly + Školní oznámení + Zkoušky + Setkání + diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 8929f6c20..3b8476551 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -11,6 +11,8 @@ Více O aplikaci Prohlížeč protokolů + Ladění + Ladění oznámení Tvůrci Licence Zprávy @@ -21,6 +23,7 @@ Vyberte účet Podrobnosti účtu Informace o žáku + Domů Semestr %1$d, %2$d/%3$d @@ -88,6 +91,7 @@ Předpokládaná známka Vypočítaný průměr Konečný průměr + z %1$d z %2$d předmětů Shrnutí Třída Označit jako přečtené @@ -196,6 +200,12 @@ Nové zkoušky Nové zkoušky + + Máte %d novou zkoušku + Máte %d nové zkoušky + Máte %d nových zkoušek + Máte %d nových zkoušek + %d zkouška %d zkoušky @@ -203,7 +213,7 @@ %d zkoušek - Doručená pošta + Doručené Odesláno Koš (žádný předmět) @@ -225,6 +235,15 @@ Zpráva neexistuje Musíte vybrat alespoň 1 příjemce Obsah zprávy musí mít alespoň 3 znaky + Pouze nepřečtené + Pouze s přílohami + Přečtena: %s + + Přečtena přes: %1$d z %2$d osob + Přečtena přes: %1$d z %2$d osob + Přečtena přes: %1$d z %2$d osob + Přečtena přes: %1$d z %2$d osob + %d zpráva %d zprávy @@ -237,6 +256,8 @@ Nové zprávy Nové zprávy + Chcete obnovit koncept zprávy? + Chcete obnovit koncept zprávy s příjemci: %s? Máte %1$d novou zprávu Máte %1$d nové zprávy @@ -313,6 +334,12 @@ Nové domácí úkoly Nové domácí úkoly + + Máte %d nový domácí úkol + Máte %d nové domácí úkoly + Máte %d nových domácích úkolů + Máte %d nových domácích úkolů + %d domácí úkol %d domácí úkoly @@ -324,7 +351,7 @@ Dnešní šťastné číslo je Žádné informace o šťastném čísle Šťastné číslo pro dnešek - Dnes je šťastným číslem: %s + Dnešní šťastné číslo je: %s Zobrazit historii Historie šťastných čísel @@ -357,6 +384,45 @@ Setkání Žádné informace o setkáních + + %d setkání + %d setkání + %d setkání + %d setkání + + + Nové setkání + Nová setkání + Nová setkání + Nová setkání + + + Máte %1$d nové setkání + Máte %1$d nové setkání + Máte %1$d nových setkání + Máte %1$d nových setkání + + + Školní oznámení + Žádná školní oznámení + + %d školní oznámení + %d školní oznámení + %d školní oznámení + %d školní oznámení + + + Nové školní oznámení + Nová školní oznámení + Nová školní oznámení + Nová školní oznámení + + + Máte %1$d nové školní oznámení + Máte %1$d nové školní oznámení + Máte %1$d nových školních oznámení + Máte %1$d nových školních oznámení + Přidat účet Odhlásit @@ -382,6 +448,8 @@ Server Discord Připojte se ke komunitě Wulkanového Facebooková fanpage + Twitter stránka + Sledujte nás na Twitteru Stejně jako naše facebooková fanpage Zásady ochrany osobních údajů Pravidla pro shromažďování osobních údajů @@ -417,6 +485,7 @@ Muž Žena Příjmení + Opatrovník Přezdívka Přidat přezdívku @@ -424,6 +493,80 @@ Sdílet protokoly Obnovit + + Lekce + (Zítra) + %1$s (%2$s) + Za chvíli: + Brzy: + První: + Teď: + + za %1$d minutu + za %1$d minuty + za %1$d minut + za %1$d minut + + + ještě %1$d minutu + ještě %1$d minuty + ještě %1$d minut + ještě %1$d minut + + Konec lekcí + Další: + Později: + + ještě %1$d další lekce + ještě %1$d další lekce + ještě %1$d dalších lekcí + ještě %1$d dalších lekcí + + do %1$s + Žádné nadcházející lekce + Při načítání lekcí došlo k chybě + Domácí úkoly + Žádné domácí úkoly do vykonána + Při načítání domácích úkolů došlo k chybě + + Ještě %1$d další domácí úkol + Ještě %1$d další domácí úkoly + Ještě %1$d dalších domácích úkolů + Ještě %1$d dalších domácích úkolů + + do %1$s + Poslední známky + Žádné nové známky + Při načítání známek došlo k chybě + Školní oznámení + Žádná aktuální oznámení + Při načítání oznámení došlo k chybě + + Ještě %1$d další oznámení + Ještě %1$d další oznámení + Ještě %1$d dalších oznámení + Ještě %1$d dalších oznámení + + Zkoušky + Žádné nadcházející zkoušky + Při načítání zkoušek došlo k chybě + + Ještě %1$d další zkouška + Ještě %1$d další zkoušky + Ještě %1$d dalších zkoušek + Ještě %1$d dalších zkoušek + + Setkání + Žádná nadcházející setkání + Při načítání setkání došlo k chybě + + Ještě %1$d další setkání + Ještě %1$d další setkání + Ještě %1$d dalších setkání + Ještě %1$d dalších setkání + + Při načítání dat došlo k chybě + Žádné Zkontrolovat aktualizace Před hlášením chyby zkontrolujte, zda je k dispozici aktualizace s opravou chyb @@ -487,6 +630,7 @@ Synchronizováno! Synchronizace selhala Probíhá synchronizace + Poslední úplná synchronizace: %s Hodnota plusu Hodnota mínusu Odpovědět s historií zpráv @@ -496,6 +640,8 @@ Upozornění Synchronizace Známky + Domů + Viditelnost dlaždic Docházka Plán lekce Známky @@ -512,23 +658,26 @@ Nové známky Nové domácí úkoly + Nová setkání Nové zkoušky Šťastné číslo Nové zprávy Nové poznámky + Nové školní oznámení Push upozornění Nadcházející lekce Ladění - Černý - Červený - Modrý - Zelený - Fialový + Černá + Červená + Modrá + Zelená + Fialová Žádná barva Zkopírováno Vrátit + Změnit Stahování aktualizací začalo… Aktualizace byla stažena. diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 35e930594..53faaf9b0 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -45,4 +45,15 @@ Durchschnitt der Noten aus beiden Semestern Durchschnitt der Noten aus dem ganzen Jahr + + Lucky number + Unread messages + Attendance + Lessons + Grades + Homework + School announcements + Exams + Conferences + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7399e1dea..4bbf7767b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -11,6 +11,8 @@ Mehr Über die Applikation Log Viewer + Debuggen + Benachrichtigungen debuggen Mitarbeiter Lizenzen Nachrichten @@ -21,6 +23,7 @@ Konto auswählen Kontodetails Schülerinfo + Übersicht Semester %1$d, %2$d/%3$d @@ -88,6 +91,7 @@ Vorhergesagte Note Berechnender Durchschnitt Finaler Durchschnitt + aus %1$d von %2$d Schulfächern Zusammenfassung Klasse Als gelesen markieren @@ -177,12 +181,16 @@ Form Eintrittsdatum - New exam - New exams + Neue prüfung + Neue prüfungen + + + You received %d new exam + Du hast %d neue Prüfungen bekommen - %d exam - %d exams + %d prüfung + %d prüfungen Posteingang @@ -207,6 +215,13 @@ Nachricht existiert nicht Sie müssen mindestens 1 Empfänger auswählen. Der Inhalt der Nachricht muss mindestens 3 Zeichen lang sein. + Nur ungelesen + Nur mit Anhängen + Lesen: %s + + Read by: %1$d of %2$d people + Read by: %1$d of %2$d people + %d nachricht %d nachrichten @@ -215,6 +230,8 @@ Neu nachricht Neue nachrichten + Do you want to restore draft message? + Do you want to restore draft message with recipients: %s? Du hast %1$d nachricht bekommen Du hast %1$d nachrichten bekommen @@ -266,19 +283,23 @@ Unvollständig Anhänge - New homework - New homework + Neue hausaufgaben + Neue hausaufgaben + + + You received %d new homework + Du hast %d neue Hausaufgaben bekommen - %d homework - %d homework + %d hausaufgaben + %d hausaufgaben Glückliche Nummer Die heutige Glücksnummer ist Keine Information über die Glücksnummer. Glücksnummer für heute - Die heutige Glücksnummer ist: %s + Heutige Glückszahl ist: %s Verlauf anzeigen Glücksnummerverlauf @@ -311,6 +332,33 @@ Sitzungen Keine Informationen über Sitzungen + + %d konferenz + %d konferenzen + + + Neue konferenz + Neue konferenzen + + + Sie haben %1$d neue konferenz + Sie haben %1$d neue konferenzen + + + Schulankündigungen + Keine schulankündigungen + + %d schulankündigung + %d schulankündigungen + + + Ankündigung der neuen schule + Neue schulankündigungen + + + Sie haben %1$d neue schulmitteilungen + Sie haben %1$d neue schulankündigungen + Konto hinzufügen Abmelden @@ -336,11 +384,13 @@ Discord server Treten Sie der Wulkanowy-Gemeinschaft bei Facebook fanpage + Twitter-Seite + Folgen Sie uns bei Twitter Gefällt unsere Facebook-Fanpage Datenschutzerklärung Regeln für die Sammlung persönlicher Daten - System settings - Open system settings + Systemeinstellungen + Systemeinstellungen öffnen Startseite Besuchen Sie die Website und helfen Sie bei der Entwicklung der Anwendung Lizenzen @@ -371,6 +421,7 @@ Mann Frau Nachname + Wächter Nick Nick hinzufügen @@ -378,6 +429,66 @@ Logs teilen Aktualisieren + + Lektionen + (Morgen) + %1$s (%2$s) + Gleich: + Bald: + Erstens: + Jetzt: + + in %1$d Minute + in %1$d Minuten + + + Noch %1$d Minute + Noch %1$d Minuten + + Ende der Lektion + Nächste: + Später: + + Noch %1$d Lektion + %1$d more lessons + + until %1$s + No upcoming lessons + An error occurred while loading the lessons + Homework + No homework to do + An error occurred while loading the homework + + %1$d more homework + %1$d more homework + + due %1$s + Last grades + No new grades + An error occurred while loading the grades + School announcements + No current announcements + An error occurred while loading the announcements + + %1$d more announcement + %1$d more announcements + + Exams + No upcoming exams + An error occurred while loading the exams + + %1$d more exam + %1$d more exams + + Conferences + No upcoming conferences + An error occurred while loading the conferences + + %1$d more conference + %1$d more conferences + + An error occurred while loading data + None Auf Updates prüfen Bevor Sie einen Fehler melden, prüfen Sie zuerst, ob ein Update mit der Fehlerbehebung verfügbar ist @@ -426,7 +537,7 @@ Benachrichtigungen Benachrichtigungen anzeigen Benachrichtigungen über bevorstehende Lektionen anzeigen - Open system notification settings + Systembenachrichtigungseinstellungen öffnen Synchronisierungs- und Benachrichtigungsprobleme reparieren Ihr Gerät hat möglicherweise Probleme mit der Datensynchronisierung und Benachrichtigungen.\n\nUm diese zu reparieren, fügen Sie Wulkanowy zum Autostart hinzu und deaktivieren Sie die Batterieoptimierung in den Systemeinstellungen des Geräts. Gehe zu den Einstellungen @@ -441,15 +552,18 @@ Synchronisiert! Synchronisierung fehlgeschlagen Synchronisierung läuft + Last full sync: %s Wert des Plus Wert des Minus Antwort mit Nachrichtenhistorie - Show arithmetic average when no weights provided + Arithmetisches Mittel anzeigen, wenn keine Gewichte angegeben sind Erweitert Aussehen & Verhalten Benachrichtigungen Synchronisierung Noten + Dashboard + Tiles visibility Schulbesuch Zeitplan Noten @@ -465,11 +579,13 @@ App-Version, Mitarbeiter, soziale Portale, Lizenzen Neue Noten - New homework - New exams + Neue Hausaufgaben + Neue Konferenzen + Neue Prüfungen Glückliche Nummer Neue Nachrichten Neue Eintragen + Neue Schulankündigungen Push-Benachrichtigungen Bevorstehende Lektionen Debuggen @@ -483,6 +599,7 @@ Kopiert lösen + Change Download der Updates wurde gestartet… Ein Update wurde gerade heruntergeladen. diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 918697856..12cfda8c9 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -45,4 +45,15 @@ Średnia średnich z obu semestrów Średnia wszystkich ocen z całego roku + + Szczęśliwy numerek + Nieprzeczytane wiadomości + Frekwencja + Lekcje + Oceny + Zadania domowe + Ogłoszenia szkolne + Sprawdziany + Zebrania + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a855ebd1c..74627ed1f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -11,6 +11,8 @@ Więcej O aplikacji Przeglądarka logów + Debugowanie + Debugowanie powiadomień Twórcy Licencje Wiadomości @@ -21,6 +23,7 @@ Wybierz konto Szczegóły konta Informacje o uczniu + Start Semestr %1$d, %2$d/%3$d @@ -88,6 +91,7 @@ Przewidywana ocena Obliczona średnia Końcowa średnia + z %1$d na %2$d przedmiotów Podsumowanie Klasa Oznacz jako przeczytane @@ -196,6 +200,12 @@ Nowe sprawdziany Nowe sprawdziany + + Masz %d nowy sprawdzian + Masz %d nowe sprawdziany + Masz %d nowych sprawdzianów + Masz %d nowych sprawdzianów + %d sprawdzian %d sprawdziany @@ -225,6 +235,15 @@ Wiadomość nie istnieje Musisz wybrać co najmniej 1 adresata Treść wiadomości musi zawierać co najmniej 3 znaki + Tylko nieprzeczytane + Tylko z załącznikami + Przeczytana: %s + + Przeczytana przez: %1$d z %2$d osób + Przeczytana przez: %1$d z %2$d osób + Przeczytana przez: %1$d z %2$d osób + Przeczytana przez: %1$d z %2$d osób + %d wiadomość %d wiadomości @@ -237,6 +256,8 @@ Nowe wiadomości Nowe wiadomości + Czy chcesz przywrócić wersję roboczą wiadomości? + Czy chcesz przywrócić wersję roboczą wiadomości z adresatami: %s? Masz %1$d nową wiadomość Masz %1$d nowe wiadomości @@ -313,6 +334,12 @@ Nowe zadania domowe Nowe zadania domowe + + Masz %d nowe zadanie domowe + Masz %d nowe zadania domowe + Masz %d nowych zadań domowych + Masz %d nowych zadań domowych + %d zadanie domowe %d zadania domowe @@ -324,7 +351,7 @@ Dzisiejszym szczęśliwym numerkiem jest Brak informacji o szczęśliwym numerku Szczęśliwy numerek na dzisiaj - Dziś szczęśliwym numerkiem jest: %s + Dzisiejszym szczęśliwym numerkiem jest: %s Pokaż historię Historia numerków @@ -357,6 +384,45 @@ Zebrania Brak informacji o zebraniach + + %d zebranie + %d zebrania + %d zebrań + %d zebrań + + + Nowe zebranie + Nowe zebrania + Nowe zebrania + Nowe zebrania + + + Masz %1$d nowe zebranie + Masz %1$d nowe zebrania + Masz %1$d nowych zebrań + Masz %1$d nowych zebrań + + + Ogłoszenia szkolne + Brak ogłoszeń szkolnych + + %d ogłoszenie szkolne + %d ogłoszenia szkolne + %d ogłoszeń szkolnych + %d ogłoszeń szkolnych + + + Nowe ogłoszenie szkolne + Nowe ogłoszenia szkolne + Nowe ogłoszenia szkolne + Nowe ogłoszenia szkolne + + + Masz %1$d nowe ogłoszenie szkolne + Masz %1$d nowe ogłoszenia szkolne + Masz %1$d nowych ogłoszeń szkolnych + Masz %1$d nowych ogłoszeń szkolnych + Dodaj konto Wyloguj @@ -382,6 +448,8 @@ Serwer Discord Dołącz do społeczności Wulkanowego Fanpage na Facebooku + Strona na Twitterze + Śledź nas na Twitterze Polub nasz fanpage na Facebooku Polityka prywatności Zasady zbierania danych osobowych @@ -417,6 +485,7 @@ Mężczyzna Kobieta Nazwisko + Opiekun Pseudonim Dodaj pseudonim @@ -424,6 +493,80 @@ Udostępnij logi Odśwież + + Lekcje + (Jutro) + %1$s (%2$s) + Za chwilę: + Wkrótce: + Pierwsza: + Teraz: + + za %1$d minutę + za %1$d minuty + za %1$d minut + za %1$d minut + + + jeszcze %1$d minuta + jeszcze %1$d minuty + jeszcze %1$d minut + jeszcze %1$d minut + + Koniec lekcji + Następnie: + Później: + + jeszcze %1$d dodatkowa lekcja + jeszcze %1$d dodatkowe lekcje + jeszcze %1$d dodatkowych lekcji + jeszcze %1$d dodatkowych lekcji + + do %1$s + Brak nadchodzących lekcji + Wystąpił błąd podczas ładowania lekcji + Zadania domowe + Brak prac domowych do wykonania + Wystąpił błąd podczas ładowania zadań domowych + + Jeszcze %1$d dodatkowe zadanie domowe + Jeszcze %1$d dodatkowe zadania domowe + Jeszcze %1$d dodatkowych zadań domowych + Jeszcze %1$d dodatkowych zadań domowych + + do %1$s + Ostatnie oceny + Brak nowych ocen + Wystąpił błąd podczas ładowania ocen + Ogłoszenia szkolne + Brak aktualnych ogłoszeń + Wystąpił błąd podczas ładowania ogłoszeń + + Jeszcze %1$d dodatkowe ogłoszenie + Jeszcze %1$d dodatkowe ogłoszenia + Jeszcze %1$d dodatkowych ogłoszeń + Jeszcze %1$d dodatkowych ogłoszeń + + Sprawdziany + Brak nadchodzących sprawdzianów + Wystąpił błąd podczas ładowania sprawdzianów + + Jeszcze %1$d dodatkowy sprawdzian + Jeszcze %1$d dodatkowe sprawdziany + Jeszcze %1$d dodatkowych sprawdzianów + Jeszcze %1$d dodatkowych sprawdzianów + + Zebrania + Brak nadchodzących zebrań + Wystąpił błąd podczas ładowania zebrań + + Jeszcze %1$d dodatkowe zebranie + Jeszcze %1$d dodatkowe zebrania + Jeszcze %1$d dodatkowych zebrań + Jeszcze %1$d dodatkowych zebrań + + Wystąpił błąd podczas ładowania danych + Brak Sprawdź dostępność aktualizacji Przed zgłoszeniem błędu sprawdź wcześniej, czy dostępna jest już aktualizacja z poprawką błędu @@ -472,7 +615,7 @@ Powiadomienia Pokazuj powiadomienia Pokazuj powiadomienia o nadchodzących lekcjach - Otwórz ustawienia systemowe powiadomień + Otwórz systemowe ustawienia powiadomień Napraw problemy z synchronizacją i powiadomieniami Na twoim urządzeniu mogą występować problemy z synchronizacją danych i powiadomieniami.\n\nBy je naprawić, dodaj Wulkanowego do autostartu i wyłącz optymalizację/oszczędzanie baterii w ustawieniach systemowych telefonu. Przejdź do ustawień @@ -487,6 +630,7 @@ Zsynchronizowano! Synchronizacja nie powiodła się Synchronizacja w trakcie + Ostatnia pełna synchronizacja: %s Wartość plusa Wartość minusa Odpowiadaj z historią wiadomości @@ -496,6 +640,8 @@ Powiadomienia Synchronizacja Oceny + Start + Widoczność kafelków Frekwencja Plan lekcji Oceny @@ -512,10 +658,12 @@ Nowe oceny Nowe zadania domowe + Nowe zebrania Nowe sprawdziany Szczęśliwy numerek Nowe wiadomości Nowe uwagi + Nowe ogłoszenia szkolne Powiadomienia push Nadchodzące lekcje Debugowanie @@ -529,6 +677,7 @@ Skopiowano Cofnij + Zmień Rozpoczęto pobieranie aktualizacji… Aktualizacja została pobrana. diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index 4ea5a6146..7c4d14df6 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -45,4 +45,15 @@ Средняя оценка с двух семестров Средняя оценок со всего года + + Счастливый номер + Непрочитанные сообщения + Посещаемость + Уроки + Оценки + Домашняя работа + Объявления школ + Экзамены + Конференции + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1c67d2841..e9349313b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -11,6 +11,8 @@ Ещё О приложении Просмотр журнала + Отладка + Отладка уведомления Разработчики Лицензии Сообщения @@ -21,6 +23,7 @@ Выбор учетной записи Данные аккаунта Информация о студенте + Панель %1$d семестр, %2$d/%3$d @@ -88,6 +91,7 @@ Ожидаемая оценка Рассчитанная средняя оценка Итоговая средняя оценка + от %1$d из %2$d субъектов Итоги Класс Пометить как \"прочитанное\" @@ -191,16 +195,22 @@ Тип Дата записи - New exam - New exams - New exams - New exams + Новый экзамен + Новый экзамен + Новый экзамен + Новые экзамены + + + Вы получили %d новый экзамен + Вы получили %d новый экзамен + Вы получили %d новый экзамен + Вы получили %d новых экзаменов - %d exam - %d exams - %d exams - %d exams + %d экзамен + %d экзамен + %d экзамен + %d экзаменов Полученные @@ -225,6 +235,15 @@ Сообщения не существует Вы должны выбрать как минимум одного получателя Текст сообщения должен содержать как минимум 3 знака + Только непрочитанные + Только с вложениями + Чтение: %s + + Прочитано: %1$d из %2$d человек + Прочитано: %1$d из %2$d человек + Прочитано: %1$d из %2$d человек + Прочитано: %1$d из %2$d человек + %d сообщение %d сообщения @@ -237,6 +256,8 @@ Новые сообщения Новые сообщения + Вы хотите восстановить черновичное сообщение? + Вы хотите восстановить черновик сообщения с получателями: %s? Вы получили %1$d новое сообщение Вы получили %1$d новых сообщения @@ -308,23 +329,29 @@ Отметить как невыполненное Вложения - New homework - New homework - New homework - New homework + Новая домашняя работа + Новая домашняя работа + Новая домашняя работа + Новая домашняя работа + + + Вы получили %d новых домашних заданий + Вы получили %d новых домашних заданий + Вы получили %d новых домашних заданий + Вы получили %d новых домашних заданий - %d homework - %d homework - %d homework - %d homework + %d домашних заданий + %d домашних заданий + %d домашних заданий + %d домашних заданий Счастливый номер Сегодняшний счастливый номер это Нет данных о счастливом номере Сегодняшний счастливый номер - Сегодняшний счастливый номер это: %s + Сегодняшний номер удачи: %s Показать историю История удачных чисел @@ -357,6 +384,45 @@ Встречи Нет информации о встречах + + %d конференция + %d конференция + %d конференция + %d конференций + + + Новая конференция + Новая конференция + Новая конференция + Новые конференции + + + У вас %1$d новая конференция + У вас %1$d новая конференция + У вас %1$d новая конференция + У вас %1$d новых конференций + + + Объявления школ + Нет объявлений о школе + + Объявление о школе %d + Объявление о школе %d + Объявление о школе %d + Объявления школы %d + + + Объявление о новой школе + New school announcements + New school announcements + New school announcements + + + You have %1$d new school announcement + You have %1$d new school announcements + You have %1$d new school announcements + You have %1$d new school announcements + Добавить аккаунт Выйти @@ -382,6 +448,8 @@ Сервер Discord Присоединиться к сообществу приложения Facebook фан-страница + Twitter page + Follow us on twitter Поставьте лайк на нашей странице в Facebook Политика приватности Правила хранения личных данных @@ -417,6 +485,7 @@ Муж Женская Фамилия + Guardian Ник Добавить ник @@ -424,6 +493,80 @@ Поделиться логами Обновить + + Lessons + (Tomorrow) + %1$s (%2$s) + In a moment: + Soon: + First: + Now: + + in %1$d minute + in %1$d minutes + in %1$d minutes + in %1$d minutes + + + %1$d more minute + %1$d more minutes + %1$d more minutes + %1$d more minutes + + End of lessons + Next: + Later: + + %1$d more lesson + %1$d more lessons + %1$d more lessons + %1$d more lessons + + until %1$s + No upcoming lessons + An error occurred while loading the lessons + Homework + No homework to do + An error occurred while loading the homework + + %1$d more homework + %1$d more homework + %1$d more homework + %1$d more homework + + due %1$s + Last grades + No new grades + An error occurred while loading the grades + School announcements + No current announcements + An error occurred while loading the announcements + + %1$d more announcement + %1$d more announcements + %1$d more announcements + %1$d more announcements + + Exams + No upcoming exams + An error occurred while loading the exams + + %1$d more exam + %1$d more exams + %1$d more exams + %1$d more exams + + Conferences + No upcoming conferences + An error occurred while loading the conferences + + %1$d more conference + %1$d more conferences + %1$d more conferences + %1$d more conferences + + An error occurred while loading data + None Проверить наличие обновлений Прежде чем сообщать об ошибке, проверьте наличие обновлений @@ -487,6 +630,7 @@ Синхронизировано! Синхронизация не удалась Идёт синхронизация + Last full sync: %s Стоимость плюса Стоимость минуса Отвечать с историей сообщений @@ -496,6 +640,8 @@ Уведомления Синхронизация Оценки + Dashboard + Tiles visibility Посещаемость Расписание Оценки @@ -512,10 +658,12 @@ Новые оценки New homework + New conferences New exams Счастливый номер Новые сообщения Новые заметки + New school announcements Показывать push-уведомления Будущие уроки Дебаг @@ -529,6 +677,7 @@ Скопировано Отменить + Change Загрузка обновлений началась… Только что было скачано обновление. diff --git a/app/src/main/res/values-sk/preferences_values.xml b/app/src/main/res/values-sk/preferences_values.xml index b51bfa404..108af555d 100644 --- a/app/src/main/res/values-sk/preferences_values.xml +++ b/app/src/main/res/values-sk/preferences_values.xml @@ -45,4 +45,15 @@ Priemer známok z oboch semestrov Priemer známok z celého roka + + Šťastné číslo + Neprečítané správy + Dochádzka + Lekcie + Známky + Domáce úlohy + Školské oznámenia + Skúšky + Stretnutie + diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index a9656eab7..81a76cf35 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -11,6 +11,8 @@ Viac O aplikácii Prehliadač protokolov + Ladenie + Ladenie oznámení Prispievatelia Licencie Správy @@ -21,6 +23,7 @@ Vyberte účet Podrobnosti účtu Informácie o žiakovi + Domov Semester %1$d, %2$d/%3$d @@ -88,6 +91,7 @@ Predpokladaná známka Vypočítaný priemer Konečný priemer + z %1$d z %2$d predmetov Zhrnutie Trieda Označiť ako prečítané @@ -196,6 +200,12 @@ Nové skúšky Nové skúšky + + You received %d new exam + You received %d new exams + You received %d new exams + You received %d new exams + %d skúška %d skúšky @@ -203,7 +213,7 @@ %d skúšok - Doručená pošta + Doručené Odoslané Kôš (žiadny predmet) @@ -225,6 +235,15 @@ Správa neexistuje Musíte vybrať aspoň 1 príjemca Obsah správy musí mať aspoň 3 znaky + Iba neprečítané + Iba s prílohami + Prečítaná: %s + + Prečítaná cez: %1$d z %2$d osôb + Prečítaná cez: %1$d z %2$d osôb + Prečítaná cez: %1$d z %2$d osôb + Prečítaná cez: %1$d z %2$d osôb + %d správa %d správy @@ -237,6 +256,8 @@ Nové správy Nové správy + Chcete obnoviť koncept správy? + Chcete obnoviť koncept správy s príjemcami:%s? Máte %1$d novú správu Máte %1$d nové správy @@ -313,6 +334,12 @@ Nové domáce úlohy Nové domáce úlohy + + You received %d new homework + You received %d new homework + You received %d new homework + You received %d new homework + %d domáci úloh %d domáce úlohy @@ -324,7 +351,7 @@ Dnešné šťastné číslo je Žiadne informácie o šťastnom čísle Šťastné číslo pre dnešok - Dnes je šťastným číslom: %s + Dnešné šťastné číslo je: %s Zobraziť históriu História šťastných čísel @@ -357,6 +384,45 @@ Stretnutie Žiadne informácie o stretnutiach + + %d stretnutie + %d stretnutia + %d stretnutí + %d stretnutí + + + Nové stretnutie + Nová stretnutia + Nová stretnutia + Nová stretnutia + + + Máte %1$d nové stretnutie + Máte %1$d nové stretnutia + Máte %1$d nových stretnutí + Máte %1$d nových stretnutí + + + Školské oznámenia + Žiadne školské oznámenia + + %d školské oznámenie + %d školské oznámenia + %d školských oznámení + %d školských oznámení + + + Nové školské oznámenie + Nové školské oznámenia + Nové školské oznámenia + Nové školské oznámenia + + + Máte %1$d nové školské oznámenie + Máte %1$d nové školské oznámenia + Máte %1$d nových školských oznámení + Máte %1$d nových školských oznámení + Pridať účet Odhlásiť @@ -382,6 +448,8 @@ Server Discord Pripojte sa ku komunite Wulkanového Facebooková fanpage + Twitter stránka + Sledujte nás na Twitteri Rovnako ako naše facebooková fanpage Zásady ochrany osobných údajov Pravidlá pre zhromažďovanie osobných údajov @@ -417,6 +485,7 @@ Muž Žena Priezvisko + Opatrovník Prezývka Pridať prezývku @@ -424,6 +493,80 @@ Zdieľať protokoly Obnoviť + + Lekcie + (Zajtra) + %1$s (%2$s) + Za chvíľu: + Čoskoro: + Prvá: + Teraz: + + za %1$d minútu + za %1$d minúty + za %1$d minút + za %1$d minút + + + ešte %1$d minútu + ešte %1$d minúty + ešte %1$d minút + ešte %1$d minút + + Koniec lekcií + Ďalej: + Neskôr: + + ešte %1$d ďalší lekcia + ešte %1$d ďalšie lekcie + ešte %1$d ďalších lekcií + ešte %1$d ďalších lekcií + + do %1$s + Žiadne nadchádzajúce lekcie + Pri načítaní lekcií došlo k chybe + Domáce úlohy + Žiadne domáce úlohy do vykonaná + Pri načítaní domácich úloh došlo k chybe + + Ešte %1$d ďalšia domáca úloha + Ešte %1$d ďalšie domáce úlohy + Ešte %1$d ďalších domácich úloh + Ešte %1$d ďalších domácich úloh + + do %1$s + Posledné známky + Žiadne nové známky + Pri načítaní známok došlo k chybe + Školské oznámenia + Žiadne aktuálne oznámenia + Pri načítaní oznámení došlo k chybe + + Ešte %1$d ďalšie oznámenie + Ešte %1$d ďalšie oznámenia + Ešte %1$d ďalších oznámení + Ešte %1$d ďalších oznámení + + Skúšky + Žiadne nadchádzajúce skúšky + Pri načítaní skúšok došlo k chybe + + Ešte %1$d ďalšia skúška + Ešte %1$d ďalšie skúšky + Ešte %1$d ďalších skúšok + Ešte %1$d ďalších skúšok + + Stretnutie + Žiadna nadchádzajúce stretnutie + Pri načítaní stretnutí došlo k chybe + + Ešte %1$d ďalšie stretnutie + Ešte %1$d ďalšie stretnutia + Ešte %1$d ďalších stretnutí + Ešte %1$d ďalších stretnutí + + Pri načítaní dát došlo k chybe + Žiadne Skontrolovať aktualizácie Pred hlásením chyby skontrolujte, či je k dispozícii aktualizácia s opravou chýb @@ -487,6 +630,7 @@ Synchronizovano! Synchronizácia zlyhala Prebieha synchronizácia + Posledná úplná synchronizácia: %s Hodnota plusu Hodnota mínusu Odpovedať s históriou správ @@ -496,6 +640,8 @@ Upozornenia Synchronizácia Známky + Domov + Viditeľnosť dlaždíc Dochádzka Plán lekcie Známky @@ -512,23 +658,26 @@ Nové známky Nové domáce úlohy + Nová stretnutia Nové skúšky Šťastné číslo Nové správy Nové poznámky + Nové školské oznámenia Push upozornenia Nadchádzajúce lekcie Ladenie - Čierny - Červený - Modrý - Zelený - Fialový + Čierna + Červená + Modrá + Zelená + Fialová Žiadna farba Skopírované Vrátiť + Zmeniť Sťahovanie aktualizácií začalo… Aktualizácia bola stiahnutá. diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index 5c70bd53a..f6f5b984f 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -45,4 +45,15 @@ Середнє оцінювання за обидва семестри Середнє оцінювання за весь рік + + Щасливий номер + Непрочитані повідомлення + Відвідуваність + Уроки + Оцінки + Домашні завдання + Оголошення школи + Тести + Конференції + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8bc1b8e31..4850e2396 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -11,6 +11,8 @@ Інше Про додаток Переглядач журналів + Відладка + Налагодження сповіщень Розробники Ліцензії Повідомлення @@ -21,6 +23,7 @@ Виберіть обліковий запис Деталі облікового запису Інформація про учня + Дошка %1$d семестр, %2$d/%3$d @@ -88,6 +91,7 @@ Очікувана оцінка Розрахована середня оцінка Підсумкова середня оцінка + з %1$d із %2$d тем Підсумок Клас Позначити як прочитане @@ -191,16 +195,22 @@ Тип Дата запису - New exam - New exams - New exams - New exams + Новий іспит + Новий іспит + Новий іспит + Нові іспити + + + Ви отримали %d новий іспит + Ви отримали %d новий іспит + Ви отримали %d новий іспит + Ви отримали %d нових іспитів - %d exam - %d exams - %d exams - %d exams + %d екзамен + %d екзамен + %d екзамен + %d іспити Отримані @@ -225,6 +235,15 @@ Такого повідомлення не існує Необхідно обрати принаймні 1 адресата Зміст повідомлення мусить складатися принаймні з 3 знаків + Лише непрочитані + Тільки з вкладеннями + Читання: %s + + Прочитані: %1$d з %2$d осіб + Прочитані: %1$d з %2$d осіб + Прочитані: %1$d з %2$d осіб + Прочитані: %1$d з %2$d осіб + %d повідомлення %d повідомлення @@ -237,6 +256,8 @@ Нові повідомлення Нові повідомлення + Ви хочете відновити повідомлення в чернетці? + Ви хочете відновити чернетку повідомлення з отримувачами: %s? Ви отримали %1$d нове повідомлення Ви отримали %1$d нових повідомлення @@ -308,23 +329,29 @@ Позначити як не зроблене Додатки - New homework - New homework - New homework - New homework + Нова домашня робота + Нова домашня робота + Нова домашня робота + Нова домашня робота + + + Ви отримали %d нове домашнє завдання + Ви отримали %d нове домашнє завдання + Ви отримали %d нове домашнє завдання + Ви отримали %d нове домашнє завдання - %d homework - %d homework - %d homework - %d homework + %d домашнє завдання + %d домашнє завдання + %d домашнє завдання + %d домашнє завдання Щасливий номер Сьогоднішній щасливий номер Брак інформації о щасливому номері Сьогоднішній щасливий номер - Сьогоднішнім щасливим номером є %s + Сьогоднішній щасливий номер: %s Показати історію Історія щасливих чисел @@ -357,6 +384,45 @@ Зустрічі Немає інформації про зустрічі + + %d конференція + %d конференція + %d конференція + %d конференцій + + + Нова конференція + Нова конференція + Нова конференція + Нові конференції + + + У вас є %1$d нова конференція + У вас є %1$d нова конференція + У вас є %1$d нова конференція + У вас є %1$d нових конференцій + + + Оголошення школи + Жодних навчальних оголошень + + %d оголошення про школу + %d оголошення про школу + %d оголошення про школу + Оголошення нової школи + + + Оголошення нової школи + Оголошення нової школи + Нові шкільні оголошення + Нові шкільні оголошення + + + У вас є %1$d нове оголошення про школу + У вас є %1$d нове оголошення про школу + У вас є %1$d нове оголошення про школу + У вас є %1$d нових оголошень про школи + Додати аккаунт Вийти @@ -382,11 +448,13 @@ Сервер Discord Приєднатися до спільноти додатка Фен-сторінка Facebook + Сторінка Twitter + Стежте за нами у Твіттері Вподобати нашу фансторінку у Facebook Політика конфіденційності Правила зберігання особистих даних - System settings - Open system settings + Налаштування системи + Відкрити налаштування системи Домашня сторінка Допомогти розвитку додатка Ліцензії @@ -417,6 +485,7 @@ Чоловіча Жінка Прізвище + Охоронець Псевдонім Додати псевдонім @@ -424,6 +493,80 @@ Поділитися логами Оновити + + Уроки + (Завтра) + %1$s (%2$s) + Через мить: + Незабаром: + Перше: + Зараз: + + через %1$d хвилину + через %1$d хвилину + через %1$d хвилину + через %1$d хвилин + + + %1$d більше хвилини + %1$d більше хвилини + %1$d більше хвилини + %1$d ще хвилин + + Кінець уроків + Далі: + Пізніше : + + %1$d більше уроку + %1$d більше уроку + %1$d більше уроку + %1$d більше уроків + + до %1$s + Немає майбутніх уроків + Сталася помилка під час завантаження уроків + Домашня робота + Немає домашнього завдання для виконання + Помилка при завантаженні домашньої роботи + + Ще %1$d домашнє завдання + Ще %1$d домашнє завдання + Ще %1$d домашнє завдання + Ще %1$d домашнє завдання + + до %1$s + Останні оцінки + Немає нових оцінок + Помилка при завантаженні класів + Оголошення школи + Немає поточних оголошень + Помилка при завантаженні анонсів + + %1$d нових оголошень + %1$d нових оголошень + %1$d нових оголошень + %1$d нових оголошень + + Іспити + Немає майбутніх іспитів + Помилка при завантаженні іспитів + + %1$d ще екзамен + %1$d ще екзамен + %1$d ще екзамен + %1$d ще іспитів + + Конференції + Немає майбутніх конференцій + Помилка при завантаженні конференцій + + Ще %1$d конференція + Ще %1$d конференція + Ще %1$d конференція + %1$d більше конференцій + + Помилка при завантаженні даних + Нічого Провірити наявність оновлень Перед тим, як повідомлювати о помілці, перевірте наявність оновлень @@ -472,7 +615,7 @@ Повідомлення Показувати повідомлення Показувати повідомлення о наступних уроках - Open system notification settings + Відкрити налаштування сповіщень системи Виправити помилки з синхронізацією і повідомленнями На вашому пристрої можуть бути помилки з синхронізацією і повідомленнями\n\nЩоб виправити іх, вам необхідно додати Wulkanowy в авто-старт и вимкнути оптимізацію/экономію батареї в налаштуваннях пристрою. Перейти до налаштувань @@ -487,15 +630,18 @@ Синхронізовано! Синхронізація не вдалася Триває синхронізація + Остання синхронізація: %s Вартість плюсу Вага мінуса Відповісти з історією повідомлень - Show arithmetic average when no weights provided + Показувати в середньому арифметику, якщо немає ваги Додатково Вигляд & Поведінка Повідомлення Синхронізація Оцінки + Дошка + Видимість плиток Відвідуваність Розклад Класи @@ -511,11 +657,13 @@ Версія програми, учасники, соціальні портали, ліцензії Нові оцінки - New homework - New exams + Нова домашня робота + Нові конференції + Нові іспити Щасливий номер Нові повідомлення Нові нотатки + Оголошення нової школи Показувати push-повідомлення Наступні уроки Дебаг @@ -529,6 +677,7 @@ Скопійовано Відмінити + Змінити Завантаження оновлень розпочато… Щойно завантажено оновлення. From 170b7c43798606aa1ef12cc0e7013788286bfe7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 29 Aug 2021 21:06:33 +0200 Subject: [PATCH 0568/1526] New Crowdin updates (#1459) --- .../main/res/values-de/preferences_values.xml | 18 +- app/src/main/res/values-de/strings.xml | 82 ++++----- app/src/main/res/values-ru/strings.xml | 160 +++++++++--------- app/src/main/res/values-sk/strings.xml | 16 +- 4 files changed, 138 insertions(+), 138 deletions(-) diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 53faaf9b0..1e0df8dea 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -46,14 +46,14 @@ Durchschnitt der Noten aus dem ganzen Jahr - Lucky number - Unread messages - Attendance - Lessons - Grades - Homework - School announcements - Exams - Conferences + Glückszahl + Ungelesene Nachrichten + Schulbesuch + Lektionen + Noten + Hausaufgaben + Schulankündigungen + Prüfungen + Sitzungen diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4bbf7767b..29d5c7636 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -185,8 +185,8 @@ Neue prüfungen - You received %d new exam - Du hast %d neue Prüfungen bekommen + Du hast %d neue Prüfung erhalten + Sie haben %d neue Prüfungen erhalten %d prüfung @@ -219,8 +219,8 @@ Nur mit Anhängen Lesen: %s - Read by: %1$d of %2$d people - Read by: %1$d of %2$d people + Lesen von: %1$d von %2$d Personen + Lesen von: %1$d von %2$d Personen %d nachricht @@ -230,8 +230,8 @@ Neu nachricht Neue nachrichten - Do you want to restore draft message? - Do you want to restore draft message with recipients: %s? + Möchten Sie den Entwurf der Nachricht wiederherstellen? + Möchten Sie die Entwurfsnachricht mit den Empfängern wiederherstellen: %s? Du hast %1$d nachricht bekommen Du hast %1$d nachrichten bekommen @@ -287,8 +287,8 @@ Neue hausaufgaben - You received %d new homework - Du hast %d neue Hausaufgaben bekommen + Du hast %d neue Hausaufgaben erhalten + Du hast %d neue Hausaufgaben erhalten %d hausaufgaben @@ -450,45 +450,45 @@ Später: Noch %1$d Lektion - %1$d more lessons + Noch %1$d Lektionen - until %1$s - No upcoming lessons - An error occurred while loading the lessons - Homework - No homework to do - An error occurred while loading the homework + bis %1$s + Keine anstehenden Lektionen + Fehler beim Laden des Lektionen + Hausaufgaben + Keine Hausaufgaben zu tun + Fehler beim Laden der Hausaufgaben - %1$d more homework - %1$d more homework + Noch %1$d Hausaufgabe + Noch %1$d Hausaufgaben - due %1$s - Last grades - No new grades - An error occurred while loading the grades - School announcements - No current announcements - An error occurred while loading the announcements + bis %1$s + Letzte Noten + Keine neuen Noten + Ein Fehler ist beim Laden der Noten + Schulankündigungen + Keine aktuellen Ankündigungen + Fehler beim Laden der Ankündigungen - %1$d more announcement - %1$d more announcements + Noch %1$d Schulankündigung + Noch %1$d Schulankündigungen - Exams - No upcoming exams - An error occurred while loading the exams + Prüfungen + Keine bevorstehenden Prüfungen + Fehler beim Laden der Prüfungen - %1$d more exam - %1$d more exams + Noch %1$d Prüfung + Noch %1$d Prüfungen - Conferences - No upcoming conferences - An error occurred while loading the conferences + Sitzungen + Keine bevorstehenden Ankündigungen + Beim Laden der Konferenzen trat ein Fehler auf - %1$d more conference - %1$d more conferences + %1$d weitere Konferenz + %1$d weitere Konferenzen - An error occurred while loading data - None + Fehler beim Laden der Daten + Keine Auf Updates prüfen Bevor Sie einen Fehler melden, prüfen Sie zuerst, ob ein Update mit der Fehlerbehebung verfügbar ist @@ -552,7 +552,7 @@ Synchronisiert! Synchronisierung fehlgeschlagen Synchronisierung läuft - Last full sync: %s + Letzte vollständige Synchronisierung: %s Wert des Plus Wert des Minus Antwort mit Nachrichtenhistorie @@ -563,7 +563,7 @@ Synchronisierung Noten Dashboard - Tiles visibility + Sichtbarkeit der Kacheln Schulbesuch Zeitplan Noten @@ -599,7 +599,7 @@ Kopiert lösen - Change + Ändern Download der Updates wurde gestartet… Ein Update wurde gerade heruntergeladen. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e9349313b..db78f5952 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -413,15 +413,15 @@ Объявление о новой школе - New school announcements - New school announcements - New school announcements + Объявление о новой школе + Объявление о новой школе + Объявления о новых школах - You have %1$d new school announcement - You have %1$d new school announcements - You have %1$d new school announcements - You have %1$d new school announcements + У вас %1$d объявление о новой школе + У вас %1$d объявление о новой школе + У тебя %1$d новых школьных объявлений + У тебя %1$d новых школьных объявлений Добавить аккаунт @@ -448,13 +448,13 @@ Сервер Discord Присоединиться к сообществу приложения Facebook фан-страница - Twitter page - Follow us on twitter + Странница в твиттере + Подпишись на нас в твиттере Поставьте лайк на нашей странице в Facebook Политика приватности Правила хранения личных данных - System settings - Open system settings + Параметры системы + Открыть системные настройки Домашняя страница Помочь в развитии приложения Лицензии @@ -485,7 +485,7 @@ Муж Женская Фамилия - Guardian + Опекун Ник Добавить ник @@ -494,79 +494,79 @@ Поделиться логами Обновить - Lessons - (Tomorrow) + Уроки + (Завтра) %1$s (%2$s) - In a moment: - Soon: - First: - Now: + Сейчас: + Скоро: + Первый: + Сейчас: - in %1$d minute - in %1$d minutes - in %1$d minutes - in %1$d minutes + через %1$d минуту + через %1$d минуту + через %1$d минуту + через %1$d минут - %1$d more minute - %1$d more minutes - %1$d more minutes - %1$d more minutes + Еще %1$d минута + Еще %1$d минута + Еще %1$d минута + Ещё %1$d минут - End of lessons - Next: - Later: + Окончание уроков + Далее: + Позднее: - %1$d more lesson - %1$d more lessons - %1$d more lessons - %1$d more lessons + Еще %1$d урок + Еще %1$d урок + Еще %1$d урок + Ещё %1$d уроков - until %1$s - No upcoming lessons - An error occurred while loading the lessons - Homework - No homework to do - An error occurred while loading the homework + до %1$s + Нет предстоящих занятий + Произошла ошибка при загрузке уроков + Домашняя работа + Нет домашних заданий + Произошла ошибка при загрузке домашнего задания - %1$d more homework - %1$d more homework - %1$d more homework - %1$d more homework + Ещё %1$d домашних заданий + Ещё %1$d домашних заданий + Ещё %1$d домашних заданий + Ещё %1$d домашних заданий - due %1$s - Last grades - No new grades - An error occurred while loading the grades - School announcements - No current announcements - An error occurred while loading the announcements + срок до %1$s + Последние оценки + Нет новых оценок + Произошла ошибка при загрузке оценок + Объявления школ + Нет текущих объявлений + Произошла ошибка при загрузке объявлений - %1$d more announcement - %1$d more announcements - %1$d more announcements - %1$d more announcements + Ещё %1$d объявление + Ещё %1$d объявление + Ещё %1$d объявление + Ещё %1$d объявлений - Exams - No upcoming exams - An error occurred while loading the exams + Экзамены + Нет предстоящих экзаменов + Произошла ошибка при загрузке экзамена - %1$d more exam - %1$d more exams - %1$d more exams - %1$d more exams + Еще %1$d экзамен + Еще %1$d экзамен + Еще %1$d экзамен + ещё %1$d экзаменов - Conferences - No upcoming conferences - An error occurred while loading the conferences + Конференции + Нет предстоящих конференций + Произошла ошибка при загрузке конференций - %1$d more conference - %1$d more conferences - %1$d more conferences - %1$d more conferences + Еще %1$d конференция + Еще %1$d конференция + Еще %1$d конференция + Еще %1$d конференций - An error occurred while loading data - None + Произошла ошибка при загрузке данных + Отсутствует Проверить наличие обновлений Прежде чем сообщать об ошибке, проверьте наличие обновлений @@ -615,7 +615,7 @@ Уведомления Показывать уведомления Показывать уведомления о будущих уроках - Open system notification settings + Открыть настройки уведомлений системы Исправить проблемы с синхронизацией и уведомлениями На вашем устройстве могут быть проблемы с синхронизацией данных и уведомлениями.\n\nЧтобы их исправить, вам необходимо добавить Wulkanowy в авто-старт и выключить оптимизацию/экономию батареи в настройках устройства. Перейти в настройски @@ -630,18 +630,18 @@ Синхронизировано! Синхронизация не удалась Идёт синхронизация - Last full sync: %s + Последняя полная синхронизация: %s Стоимость плюса Стоимость минуса Отвечать с историей сообщений - Show arithmetic average when no weights provided + Показывать среднее арифметическое при отсутствии весов Расширенные Внешний вид & Поведение Уведомления Синхронизация Оценки - Dashboard - Tiles visibility + Панель + Видимость плиток Посещаемость Расписание Оценки @@ -657,13 +657,13 @@ Версия приложения, участники, социальные порталы, лицензии Новые оценки - New homework - New conferences - New exams + Новая домашняя работа + Новые конференции + Новые экзамены Счастливый номер Новые сообщения Новые заметки - New school announcements + Объявления о новых школах Показывать push-уведомления Будущие уроки Дебаг @@ -677,7 +677,7 @@ Скопировано Отменить - Change + Изменить Загрузка обновлений началась… Только что было скачано обновление. diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 81a76cf35..72899b78b 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -201,10 +201,10 @@ Nové skúšky - You received %d new exam - You received %d new exams - You received %d new exams - You received %d new exams + Máte %d novú skúšku + Máte %d nové skúšky + Máte %d nových skúšok + Máte %d nových skúšok %d skúška @@ -335,10 +335,10 @@ Nové domáce úlohy - You received %d new homework - You received %d new homework - You received %d new homework - You received %d new homework + Máte %d novú domácu úlohu + Máte %d nové domáce úlohy + Máte %d nových domácich úloh + Máte %d nových domácich úloh %d domáci úloh From 72d8b4aa8480a4d7c32b1ccb225b7a2498dbe24c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 29 Aug 2021 21:08:08 +0200 Subject: [PATCH 0569/1526] Version 1.2.0 --- app/build.gradle | 10 +++++----- app/src/main/play/release-notes/pl-PL/default.txt | 10 +++++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c05aa0341..61e47534c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 30 - versionCode 92 - versionName "1.1.6" + versionCode 93 + versionName "1.2.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -133,8 +133,8 @@ play { serviceAccountEmail = System.getenv("PLAY_SERVICE_ACCOUNT_EMAIL") ?: "jan@fakelog.cf" serviceAccountCredentials = file('key.p12') defaultToAppBundles = false - track = 'production' - updatePriority = 5 + track = 'beta' + updatePriority = 3 } huaweiPublish { @@ -157,7 +157,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:b991d0c" + implementation "io.github.wulkanowy:sdk:1.2.0" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index a6f3f44ef..42fd22292 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,10 @@ -Wersja 1.1.6 +Wersja 1.2.0 -- naprawiliśmy błąd przy wysyłaniu wiadomości -- naprawiliśmy oznaczanie odwołanych lekcji jako zastępstwa +- dodaliśmy nowy ekran startowy 🎉 +- usprawniliśmy powiadomienia +- dodaliśmy wersje robocze, filtrowanie oraz informację o odczytaniu przez odbiorcę w wiadomościach +- dodaliśmy informacje o liczeniu średniej w podsumowaniu ocen +- dodaliśmy opcję generowania wiadomości z usprawiedliwieniem dni w szkołach pozbawionych funkcji usprawiedliwiania przez zakładkę frekwencja +- oraz wiele wiele innych ulepszeń i poprawek Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From e557021ad9793954563a4cf3c844f3f8227db060 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 29 Aug 2021 19:37:01 +0000 Subject: [PATCH 0570/1526] Bump huawei-publish-gradle-plugin from 1.2.4 to 1.3.0 (#1458) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index afe0285c8..840d90f42 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { classpath 'com.huawei.agconnect:agcp:1.6.0.300' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' classpath "com.github.triplet.gradle:play-publisher:2.8.0" - classpath "ru.cian:huawei-publish-gradle-plugin:1.2.4" + classpath "ru.cian:huawei-publish-gradle-plugin:1.3.0" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" From d139c22782660abb9452d1a6f6b7d51a4ba797d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 29 Aug 2021 19:37:18 +0000 Subject: [PATCH 0571/1526] Bump hianalytics from 6.1.1.300 to 6.2.0.300 (#1457) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 61e47534c..7b2b2e695 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -218,7 +218,7 @@ dependencies { playImplementation 'com.google.android.play:core:1.10.0' playImplementation 'com.google.android.play:core-ktx:1.8.1' - hmsImplementation 'com.huawei.hms:hianalytics:6.1.1.300' + hmsImplementation 'com.huawei.hms:hianalytics:6.2.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.0.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From d87283eb3151780fb85adc6f3458ec4d12f12b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 30 Aug 2021 00:20:13 +0200 Subject: [PATCH 0572/1526] Fix opening twitter link from about on android 11 (#1460) --- .../java/io/github/wulkanowy/utils/ContextExtension.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt index cb31389e0..68d3afe83 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.utils import android.annotation.SuppressLint +import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.graphics.Bitmap @@ -58,8 +59,11 @@ fun Context.getCompatBitmap(@DrawableRes drawableRes: Int, @ColorRes colorRes: I fun Context.openInternetBrowser(uri: String, onActivityNotFound: (uri: String) -> Unit = {}) { Intent.parseUri(uri, 0).let { - if (it.resolveActivity(packageManager) != null) startActivity(it) - else onActivityNotFound(uri) + try { + startActivity(it) + } catch (e: ActivityNotFoundException) { + onActivityNotFound(uri) + } } } From c3adb9b6d6f6b972656262f63a52efe1e9db80e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 3 Sep 2021 22:54:29 +0200 Subject: [PATCH 0573/1526] Bump agp to 7.0.2 (#1469) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 840d90f42..7fb02eb9d 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ buildscript { } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.android.tools.build:gradle:7.0.1' + classpath 'com.android.tools.build:gradle:7.0.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.10' classpath 'com.huawei.agconnect:agcp:1.6.0.300' From 8d7b611c4483326ee7e2cb999f811b80e0f3ba83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 4 Sep 2021 15:54:05 +0200 Subject: [PATCH 0574/1526] Fix showing error view in timetable (#1472) --- app/build.gradle | 2 +- .../github/wulkanowy/ui/modules/timetable/TimetableFragment.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7b2b2e695..4513be16d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -157,7 +157,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:1.2.0" + implementation "io.github.wulkanowy:sdk:7c399ffaea" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index a65d69211..a79661901 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -49,7 +49,7 @@ class TimetableFragment : BaseFragment(R.layout.fragme override val titleStringId get() = R.string.timetable_title - override val isViewEmpty get() = timetableAdapter.itemCount > 0 + override val isViewEmpty get() = timetableAdapter.itemCount == 0 override val currentStackSize get() = (activity as? MainActivity)?.currentStackSize From 45d1727dbeccaa66f08bd1822e665737c9d4cc25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 4 Sep 2021 15:54:37 +0200 Subject: [PATCH 0575/1526] Add missing school announcement dialog (#1470) --- .../SchoolAnnouncementAdapter.kt | 10 +- .../SchoolAnnouncementDialog.kt | 54 +++++++ .../SchoolAnnouncementFragment.kt | 9 +- .../SchoolAnnouncementPresenter.kt | 5 + .../SchoolAnnouncementView.kt | 2 + .../ui/modules/timetable/TimetableFragment.kt | 6 +- .../res/layout/dialog_school_announcement.xml | 148 ++++++++++++++++++ 7 files changed, 225 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementDialog.kt create mode 100644 app/src/main/res/layout/dialog_school_announcement.xml diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementAdapter.kt index e7c202676..62f6251ec 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementAdapter.kt @@ -2,7 +2,7 @@ package io.github.wulkanowy.ui.modules.schoolannouncement import android.view.LayoutInflater import android.view.ViewGroup -import androidx.core.text.HtmlCompat +import androidx.core.text.parseAsHtml import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.data.db.entities.SchoolAnnouncement import io.github.wulkanowy.databinding.ItemSchoolAnnouncementBinding @@ -14,6 +14,8 @@ class SchoolAnnouncementAdapter @Inject constructor() : var items = emptyList() + var onItemClickListener: (SchoolAnnouncement) -> Unit = {} + override fun getItemCount() = items.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( @@ -26,9 +28,9 @@ class SchoolAnnouncementAdapter @Inject constructor() : with(holder.binding) { schoolAnnouncementItemDate.text = item.date.toFormattedString() schoolAnnouncementItemType.text = item.subject - schoolAnnouncementItemContent.text = HtmlCompat.fromHtml( - item.content, HtmlCompat.FROM_HTML_MODE_COMPACT - ) + schoolAnnouncementItemContent.text = item.content.parseAsHtml() + + root.setOnClickListener { onItemClickListener(item) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementDialog.kt new file mode 100644 index 000000000..ed4b0ac98 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementDialog.kt @@ -0,0 +1,54 @@ +package io.github.wulkanowy.ui.modules.schoolannouncement + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.text.parseAsHtml +import androidx.fragment.app.DialogFragment +import io.github.wulkanowy.data.db.entities.SchoolAnnouncement +import io.github.wulkanowy.databinding.DialogSchoolAnnouncementBinding +import io.github.wulkanowy.utils.lifecycleAwareVariable +import io.github.wulkanowy.utils.toFormattedString + +class SchoolAnnouncementDialog : DialogFragment() { + + private var binding: DialogSchoolAnnouncementBinding by lifecycleAwareVariable() + + private lateinit var announcement: SchoolAnnouncement + + companion object { + + private const val ARGUMENT_KEY = "item" + + fun newInstance(exam: SchoolAnnouncement) = SchoolAnnouncementDialog().apply { + arguments = Bundle().apply { putSerializable(ARGUMENT_KEY, exam) } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, 0) + arguments?.run { + announcement = getSerializable(ARGUMENT_KEY) as SchoolAnnouncement + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ) = DialogSchoolAnnouncementBinding.inflate(inflater).apply { binding = this }.root + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + with(binding) { + announcementDialogSubjectValue.text = announcement.subject + announcementDialogDateValue.text = announcement.date.toFormattedString() + announcementDialogDescriptionValue.text = announcement.content.parseAsHtml() + + announcementDialogClose.setOnClickListener { dismiss() } + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementFragment.kt index a5a53aefc..baf2824ba 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementFragment.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.SchoolAnnouncement import io.github.wulkanowy.databinding.FragmentSchoolAnnouncementBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.getThemeAttrColor @@ -43,7 +44,9 @@ class SchoolAnnouncementFragment : override fun initView() { with(binding.directorInformationRecycler) { layoutManager = LinearLayoutManager(context) - adapter = schoolAnnouncementAdapter + adapter = schoolAnnouncementAdapter.apply { + onItemClickListener = presenter::onItemClickListener + } addItemDecoration(DividerItemDecoration(context)) } with(binding) { @@ -99,6 +102,10 @@ class SchoolAnnouncementFragment : binding.directorInformationSwipe.isRefreshing = show } + override fun openSchoolAnnouncementDialog(item: SchoolAnnouncement) { + (activity as? MainActivity)?.showDialogFragment(SchoolAnnouncementDialog.newInstance(item)) + } + override fun onDestroyView() { presenter.onDetachView() super.onDestroyView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementPresenter.kt index ba89ab1f4..88ad81465 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementPresenter.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.modules.schoolannouncement import io.github.wulkanowy.data.Status +import io.github.wulkanowy.data.db.entities.SchoolAnnouncement import io.github.wulkanowy.data.repositories.SchoolAnnouncementRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter @@ -46,6 +47,10 @@ class SchoolAnnouncementPresenter @Inject constructor( view?.showErrorDetailsDialog(lastError) } + fun onItemClickListener(item: SchoolAnnouncement) { + view?.openSchoolAnnouncementDialog(item) + } + private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading School announcement data started") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementView.kt index 0553df1e7..383d0f294 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementView.kt @@ -19,6 +19,8 @@ interface SchoolAnnouncementView : BaseView { fun setErrorDetails(message: String) + fun openSchoolAnnouncementDialog(item: SchoolAnnouncement) + fun showProgress(show: Boolean) fun enableSwipe(enable: Boolean) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index a79661901..1e1084a8d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -7,7 +7,7 @@ import android.view.MenuItem import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import androidx.core.text.HtmlCompat +import androidx.core.text.parseAsHtml import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.datepicker.CalendarConstraints import com.google.android.material.datepicker.MaterialDatePicker @@ -147,9 +147,7 @@ class TimetableFragment : BaseFragment(R.layout.fragme override fun setDayHeaderMessage(message: String?) { binding.timetableEmptyMessage.visibility = if (message.isNullOrEmpty()) GONE else VISIBLE - binding.timetableEmptyMessage.text = HtmlCompat.fromHtml( - message.orEmpty(), HtmlCompat.FROM_HTML_MODE_COMPACT - ) + binding.timetableEmptyMessage.text = message.orEmpty().parseAsHtml() } override fun showErrorView(show: Boolean) { diff --git a/app/src/main/res/layout/dialog_school_announcement.xml b/app/src/main/res/layout/dialog_school_announcement.xml new file mode 100644 index 000000000..cbce4e025 --- /dev/null +++ b/app/src/main/res/layout/dialog_school_announcement.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + From 3b9451184c60ff9feb1bad8b036f08b6603c85b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 5 Sep 2021 03:15:40 +0200 Subject: [PATCH 0576/1526] Fix preview of second student guardian when first guardian is null (#1473) --- .../modules/studentinfo/StudentInfoAdapter.kt | 4 +- .../studentinfo/StudentInfoFragment.kt | 69 ++++++++----------- .../ui/modules/studentinfo/StudentInfoItem.kt | 3 +- .../studentinfo/StudentInfoPresenter.kt | 25 ++++--- .../ui/modules/studentinfo/StudentInfoView.kt | 4 +- 5 files changed, 48 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoAdapter.kt index 2d8387491..60912200c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoAdapter.kt @@ -13,7 +13,7 @@ class StudentInfoAdapter @Inject constructor() : var items = listOf() - var onItemClickListener: (position: Int) -> Unit = {} + var onItemClickListener: (StudentInfoView.Type?) -> Unit = {} var onItemLongClickListener: (text: String) -> Unit = {} @@ -32,7 +32,7 @@ class StudentInfoAdapter @Inject constructor() : studentInfoItemArrow.visibility = if (item.showArrow) VISIBLE else GONE with(root) { - setOnClickListener { onItemClickListener(position) } + setOnClickListener { onItemClickListener(item.viewType) } setOnLongClickListener { onItemLongClickListener(studentInfoItemSubtitle.text.toString()) true diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt index e9ef41372..361a59440 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoFragment.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.studentinfo -import android.annotation.SuppressLint import android.content.ClipData import android.content.ClipboardManager import android.os.Bundle @@ -130,9 +129,9 @@ class StudentInfoFragment : getString(R.string.student_info_parents_name) to studentInfo.parentsNames ).map { StudentInfoItem( - it.first, - it.second.ifBlank { getString(R.string.all_no_data) }, - false, + title = it.first, + subtitle = it.second.ifBlank { getString(R.string.all_no_data) }, + showArrow = false, ) } ) @@ -146,25 +145,33 @@ class StudentInfoFragment : getString(R.string.student_info_email) to studentInfo.email ).map { StudentInfoItem( - it.first, - it.second.ifBlank { getString(R.string.all_no_data) }, - false, + title = it.first, + subtitle = it.second.ifBlank { getString(R.string.all_no_data) }, + showArrow = false, ) } ) } - @SuppressLint("DefaultLocale") + @OptIn(ExperimentalStdlibApi::class) override fun showFamilyTypeData(studentInfo: StudentInfo) { + val items = buildList { + add(studentInfo.firstGuardian?.let { + Triple(it.kinship.capitalise(), it.fullName, StudentInfoView.Type.FIRST_GUARDIAN) + }) + + add(studentInfo.secondGuardian?.let { + Triple(it.kinship.capitalise(), it.fullName, StudentInfoView.Type.SECOND_GUARDIAN) + }) + }.filterNotNull() + updateData( - listOfNotNull( - studentInfo.firstGuardian?.let { it.kinship.capitalise() to it.fullName }, - studentInfo.secondGuardian?.let { it.kinship.capitalise() to it.fullName }, - ).map { (title, value) -> + items.map { (title, value, type) -> StudentInfoItem( - title.ifBlank { getString(R.string.all_no_data) }, - value.ifBlank { getString(R.string.all_no_data) }, - true, + title = title.ifBlank { getString(R.string.all_no_data) }, + subtitle = value.ifBlank { getString(R.string.all_no_data) }, + showArrow = true, + viewType = type, ) } ) @@ -178,15 +185,15 @@ class StudentInfoFragment : getString(R.string.student_info_correspondence_address) to studentInfo.correspondenceAddress ).map { StudentInfoItem( - it.first, - it.second.ifBlank { getString(R.string.all_no_data) }, - false, + title = it.first, + subtitle = it.second.ifBlank { getString(R.string.all_no_data) }, + showArrow = false, ) } ) } - override fun showFirstGuardianTypeData(studentGuardian: StudentGuardian) { + override fun showGuardianTypeData(studentGuardian: StudentGuardian) { updateData( listOf( getString(R.string.student_info_full_name) to studentGuardian.fullName, @@ -196,27 +203,9 @@ class StudentInfoFragment : getString(R.string.student_info_email) to studentGuardian.email ).map { StudentInfoItem( - it.first, - it.second.ifBlank { getString(R.string.all_no_data) }, - false, - ) - } - ) - } - - override fun showSecondGuardianTypeData(studentGuardian: StudentGuardian) { - updateData( - listOf( - getString(R.string.student_info_full_name) to studentGuardian.fullName, - getString(R.string.student_info_kinship) to studentGuardian.kinship, - getString(R.string.student_info_guardian_address) to studentGuardian.address, - getString(R.string.student_info_phones) to studentGuardian.phones, - getString(R.string.student_info_email) to studentGuardian.email - ).map { - StudentInfoItem( - it.first, - it.second.ifBlank { getString(R.string.all_no_data) }, - false, + title = it.first, + subtitle = it.second.ifBlank { getString(R.string.all_no_data) }, + showArrow = false, ) } ) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoItem.kt index bb149b2b1..21226539b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoItem.kt @@ -3,5 +3,6 @@ package io.github.wulkanowy.ui.modules.studentinfo data class StudentInfoItem( val title: String, val subtitle: String, - val showArrow: Boolean + val showArrow: Boolean, + val viewType: StudentInfoView.Type? = null, ) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoPresenter.kt index 55ac66d0b..80798b11e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoPresenter.kt @@ -58,13 +58,12 @@ class StudentInfoPresenter @Inject constructor( view?.showErrorDetailsDialog(lastError) } - fun onItemSelected(position: Int) { - if (infoType != StudentInfoView.Type.FAMILY) return + fun onItemSelected(viewType: StudentInfoView.Type?) { + viewType ?: return view?.openStudentInfoView( - if (position == 0) StudentInfoView.Type.FIRST_GUARDIAN - else StudentInfoView.Type.SECOND_GUARDIAN, - studentWithSemesters + studentWithSemesters = studentWithSemesters, + infoType = viewType, ) } @@ -76,15 +75,19 @@ class StudentInfoPresenter @Inject constructor( flowWithResourceIn { val semester = studentWithSemesters.semesters.getCurrentOrLast() studentInfoRepository.getStudentInfo( - studentWithSemesters.student, - semester, - forceRefresh + student = studentWithSemesters.student, + semester = semester, + forceRefresh = forceRefresh ) }.onEach { when (it.status) { Status.LOADING -> Timber.i("Loading student info $infoType started") Status.SUCCESS -> { - if (it.data != null && !(infoType == StudentInfoView.Type.FAMILY && it.data.firstGuardian == null && it.data.secondGuardian == null)) { + val isFamily = infoType == StudentInfoView.Type.FAMILY + val isFirstGuardianEmpty = it.data?.firstGuardian == null + val isSecondGuardianEmpty = it.data?.secondGuardian == null + + if (it.data != null && !(isFamily && isFirstGuardianEmpty && isSecondGuardianEmpty)) { Timber.i("Loading student info $infoType result: Success") showCorrectData(it.data) view?.run { @@ -122,8 +125,8 @@ class StudentInfoPresenter @Inject constructor( StudentInfoView.Type.CONTACT -> view?.showContactTypeData(studentInfo) StudentInfoView.Type.ADDRESS -> view?.showAddressTypeData(studentInfo) StudentInfoView.Type.FAMILY -> view?.showFamilyTypeData(studentInfo) - StudentInfoView.Type.SECOND_GUARDIAN -> view?.showSecondGuardianTypeData(studentInfo.secondGuardian!!) - StudentInfoView.Type.FIRST_GUARDIAN -> view?.showFirstGuardianTypeData(studentInfo.firstGuardian!!) + StudentInfoView.Type.SECOND_GUARDIAN -> view?.showGuardianTypeData(studentInfo.secondGuardian!!) + StudentInfoView.Type.FIRST_GUARDIAN -> view?.showGuardianTypeData(studentInfo.firstGuardian!!) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoView.kt index 87613e626..c20359df1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/studentinfo/StudentInfoView.kt @@ -25,9 +25,7 @@ interface StudentInfoView : BaseView { fun showFamilyTypeData(studentInfo: StudentInfo) - fun showFirstGuardianTypeData(studentGuardian: StudentGuardian) - - fun showSecondGuardianTypeData(studentGuardian: StudentGuardian) + fun showGuardianTypeData(studentGuardian: StudentGuardian) fun openStudentInfoView(infoType: Type, studentWithSemesters: StudentWithSemesters) From e6c9abb4e5e7552a32a2c89f8088be709539d119 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Sep 2021 18:09:42 +0000 Subject: [PATCH 0577/1526] Bump core from 1.10.0 to 1.10.1 (#1480) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4513be16d..b175a274c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -215,7 +215,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' - playImplementation 'com.google.android.play:core:1.10.0' + playImplementation 'com.google.android.play:core:1.10.1' playImplementation 'com.google.android.play:core-ktx:1.8.1' hmsImplementation 'com.huawei.hms:hianalytics:6.2.0.300' From a43acaaa07e516c637ec61a2e4ce62912a378020 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Sep 2021 18:10:05 +0000 Subject: [PATCH 0578/1526] Bump kotlinx-coroutines-android from 1.5.1 to 1.5.2 (#1479) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b175a274c..17685c164 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -161,7 +161,7 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2" implementation "androidx.core:core-ktx:1.6.0" implementation "androidx.activity:activity-ktx:1.3.1" From 0008a72be127eae827a89c14a37db40dea1727c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Sep 2021 18:10:22 +0000 Subject: [PATCH 0579/1526] Bump kotlinx-coroutines-test from 1.5.1 to 1.5.2 (#1477) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 17685c164..57395372f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -228,7 +228,7 @@ dependencies { testImplementation "junit:junit:4.13.2" testImplementation "io.mockk:mockk:$mockk" - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.1' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.2' testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" testImplementation 'org.robolectric:robolectric:4.6.1' From 44a9db48a67a8ac9632f12ebe90711a0b52c4983 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Sep 2021 18:17:18 +0000 Subject: [PATCH 0580/1526] Bump hianalytics from 6.2.0.300 to 6.2.0.301 (#1476) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 57395372f..e1d1be79b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -218,7 +218,7 @@ dependencies { playImplementation 'com.google.android.play:core:1.10.1' playImplementation 'com.google.android.play:core-ktx:1.8.1' - hmsImplementation 'com.huawei.hms:hianalytics:6.2.0.300' + hmsImplementation 'com.huawei.hms:hianalytics:6.2.0.301' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.0.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 49ebae6e6381cae38240e523a4c2702ae57dd435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 5 Sep 2021 21:59:03 +0200 Subject: [PATCH 0581/1526] Fix overlaping empty and error view in grade statistics (#1475) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- .../res/layout/fragment_grade_statistics.xml | 170 ++++++++++-------- 1 file changed, 97 insertions(+), 73 deletions(-) diff --git a/app/src/main/res/layout/fragment_grade_statistics.xml b/app/src/main/res/layout/fragment_grade_statistics.xml index 3bd57b4b1..981ee48f3 100644 --- a/app/src/main/res/layout/fragment_grade_statistics.xml +++ b/app/src/main/res/layout/fragment_grade_statistics.xml @@ -36,7 +36,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - @@ -44,91 +44,115 @@ android:id="@+id/gradeStatisticsProgress" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:indeterminate="true" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" tools:visibility="gone" /> + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent" + tools:listitem="@layout/item_grade_statistics_pie" + tools:visibility="visible" /> - + android:layout_height="0dp" + android:layout_marginTop="12dp" + android:fillViewport="true" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/gradeStatisticsRecycler"> - - - - - - - - - - - - + android:layout_height="wrap_content"> - + android:gravity="center" + android:orientation="vertical" + android:visibility="invisible" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:ignore="UseCompoundDrawables" + tools:visibility="gone"> - + + + + + - - - + android:gravity="center" + android:orientation="vertical" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:ignore="UseCompoundDrawables" + tools:visibility="gone"> + + + + + + + + + + + + + + + From 2b55ec02ff5da46f8f3713f91032aa15ee827c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 5 Sep 2021 23:06:44 +0200 Subject: [PATCH 0582/1526] New translations strings.xml (Polish) (#1474) --- app/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 74627ed1f..2a0f3cb77 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -53,7 +53,7 @@ Nie znaleziono ucznia. Sprawdź poprawność symbolu i wybranej odmiany dziennika UONET+ To pole jest wymagane Wybrany uczeń jest już zalogowany - Symbol znajdziesz na stronie dziennika w Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne.\n\nUpewnij się, że w polu Dziennik UONET+ na poprzednim ekranie została ustawiona odpowiednia odmiana dziennika. Wulkanowy na chwilę obecną nie wykrywa uczniów przedszkolnych + Symbol znajdziesz na stronie dziennika w Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne.\n\nUpewnij się, że w polu Dziennik UONET+ na poprzednim ekranie została ustawiona odpowiednia odmiana dziennika.\n\nWulkanowy na chwilę obecną nie wykrywa uczniów przedszkolnych (z zerówki) Wybierz uczniów do zalogowania w aplikacji Inne opcje W tym trybie nie działa szczęśliwy numerek, uczeń na tle klasy, podsumowanie frekwencji, usprawiedliwianie nieobecności, lekcje zrealizowane, informacje o szkole i podgląd listy zarejestrowanych urządzeń From 77c5330f91f1f026fb6ebd9118b99e69f196bc39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 5 Sep 2021 23:24:03 +0200 Subject: [PATCH 0583/1526] Dashboard fixes (#1463) --- .../data/repositories/GradeRepository.kt | 29 +- .../data/repositories/SemesterRepository.kt | 30 +- .../github/wulkanowy/ui/base/BasePresenter.kt | 2 +- .../ui/modules/account/AccountFragment.kt | 8 +- .../ui/modules/account/AccountPresenter.kt | 2 +- .../ui/modules/account/AccountView.kt | 4 +- .../accountdetails/AccountDetailsFragment.kt | 6 +- .../accountdetails/AccountDetailsPresenter.kt | 5 +- .../ui/modules/dashboard/DashboardAdapter.kt | 74 +- .../ui/modules/dashboard/DashboardFragment.kt | 6 +- .../ui/modules/dashboard/DashboardItem.kt | 3 + .../modules/dashboard/DashboardPresenter.kt | 630 +++++++++--------- .../wulkanowy/utils/TimetableExtension.kt | 2 +- .../item_dashboard_horizontal_group.xml | 14 +- app/src/main/res/values-cs/strings.xml | 3 +- app/src/main/res/values-de/strings.xml | 3 +- app/src/main/res/values-pl/strings.xml | 3 +- app/src/main/res/values-ru/strings.xml | 3 +- app/src/main/res/values-sk/strings.xml | 3 +- app/src/main/res/values-uk/strings.xml | 3 +- app/src/main/res/values/strings.xml | 3 +- .../wulkanowy/utils/TimetableExtensionTest.kt | 17 +- 22 files changed, 433 insertions(+), 420 deletions(-) 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 0b8a0e710..d8417f8a9 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 @@ -33,10 +33,16 @@ class GradeRepository @Inject constructor( private val cacheKey = "grade" - fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + fun getGrades( + student: Student, + semester: Semester, + forceRefresh: Boolean, + notify: Boolean = false + ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { (details, summaries) -> - val isShouldBeRefreshed = refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) + val isShouldBeRefreshed = + refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) details.isEmpty() || summaries.isEmpty() || forceRefresh || isShouldBeRefreshed }, query = { @@ -59,8 +65,14 @@ class GradeRepository @Inject constructor( } ) - private suspend fun refreshGradeDetails(student: Student, oldGrades: List, newDetails: List, notify: Boolean) { - val notifyBreakDate = oldGrades.maxByOrNull { it.date }?.date ?: student.registrationDate.toLocalDate() + private suspend fun refreshGradeDetails( + student: Student, + oldGrades: List, + newDetails: List, + notify: Boolean + ) { + val notifyBreakDate = + oldGrades.maxByOrNull { it.date }?.date ?: student.registrationDate.toLocalDate() gradeDb.deleteAll(oldGrades uniqueSubtract newDetails) gradeDb.insertAll((newDetails uniqueSubtract oldGrades).onEach { if (it.date >= notifyBreakDate) it.apply { @@ -70,10 +82,15 @@ class GradeRepository @Inject constructor( }) } - private suspend fun refreshGradeSummaries(oldSummaries: List, newSummary: List, notify: Boolean) { + private suspend fun refreshGradeSummaries( + oldSummaries: List, + newSummary: List, + notify: Boolean + ) { gradeSummaryDb.deleteAll(oldSummaries uniqueSubtract newSummary) gradeSummaryDb.insertAll((newSummary uniqueSubtract oldSummaries).onEach { summary -> - val oldSummary = oldSummaries.find { oldSummary -> oldSummary.subject == summary.subject } + val oldSummary = + oldSummaries.find { oldSummary -> oldSummary.subject == summary.subject } summary.isPredictedGradeNotified = when { summary.predictedGrade.isEmpty() -> true notify && oldSummary?.predictedGrade != summary.predictedGrade -> false diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt index 8942391c8..4336877a5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt @@ -22,7 +22,11 @@ class SemesterRepository @Inject constructor( private val dispatchers: DispatchersProvider ) { - suspend fun getSemesters(student: Student, forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false) = withContext(dispatchers.backgroundThread) { + suspend fun getSemesters( + student: Student, + forceRefresh: Boolean = false, + refreshOnNoCurrent: Boolean = false + ) = withContext(dispatchers.backgroundThread) { val semesters = semesterDb.loadAll(student.studentId, student.classId) if (isShouldFetch(student, semesters, forceRefresh, refreshOnNoCurrent)) { @@ -31,14 +35,21 @@ class SemesterRepository @Inject constructor( } else semesters } - private fun isShouldFetch(student: Student, semesters: List, forceRefresh: Boolean, refreshOnNoCurrent: Boolean): Boolean { + private fun isShouldFetch( + student: Student, + semesters: List, + forceRefresh: Boolean, + refreshOnNoCurrent: Boolean + ): Boolean { val isNoSemesters = semesters.isEmpty() - val isRefreshOnModeChangeRequired = if (Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { - semesters.firstOrNull { it.isCurrent }?.diaryId == 0 - } else false + val isRefreshOnModeChangeRequired = + if (Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { + semesters.firstOrNull { it.isCurrent }?.diaryId == 0 + } else false - val isRefreshOnNoCurrentAppropriate = refreshOnNoCurrent && !semesters.any { semester -> semester.isCurrent } + val isRefreshOnNoCurrentAppropriate = + refreshOnNoCurrent && !semesters.any { semester -> semester.isCurrent } return forceRefresh || isNoSemesters || isRefreshOnModeChangeRequired || isRefreshOnNoCurrentAppropriate } @@ -52,7 +63,8 @@ class SemesterRepository @Inject constructor( semesterDb.insertSemesters(new.uniqueSubtract(old)) } - suspend fun getCurrentSemester(student: Student, forceRefresh: Boolean = false) = withContext(dispatchers.backgroundThread) { - getSemesters(student, forceRefresh).getCurrentOrLast() - } + suspend fun getCurrentSemester(student: Student, forceRefresh: Boolean = false) = + withContext(dispatchers.backgroundThread) { + getSemesters(student, forceRefresh).getCurrentOrLast() + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index be5300499..6f363bfc4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -18,7 +18,7 @@ open class BasePresenter( protected val studentRepository: StudentRepository ) : CoroutineScope { - private var job: Job = Job() + private var job = Job() private val jobs = mutableMapOf() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountFragment.kt index 7a8f8585f..051c93c95 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountFragment.kt @@ -8,7 +8,7 @@ import androidx.core.view.get import androidx.recyclerview.widget.LinearLayoutManager import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.StudentWithSemesters +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.databinding.FragmentAccountBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.account.accountdetails.AccountDetailsFragment @@ -75,9 +75,7 @@ class AccountFragment : BaseFragment(R.layout.fragment_a } } - override fun openAccountDetailsView(studentWithSemesters: StudentWithSemesters) { - (activity as? MainActivity)?.pushView( - AccountDetailsFragment.newInstance(studentWithSemesters) - ) + override fun openAccountDetailsView(student: Student) { + (activity as? MainActivity)?.pushView(AccountDetailsFragment.newInstance(student)) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt index 8d1651395..7fe77ca7a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt @@ -28,7 +28,7 @@ class AccountPresenter @Inject constructor( } fun onItemSelected(studentWithSemesters: StudentWithSemesters) { - view?.openAccountDetailsView(studentWithSemesters) + view?.openAccountDetailsView(studentWithSemesters.student) } private fun loadData() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt index d7deefafd..56fcb0a35 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountView.kt @@ -1,6 +1,6 @@ package io.github.wulkanowy.ui.modules.account -import io.github.wulkanowy.data.db.entities.StudentWithSemesters +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseView interface AccountView : BaseView { @@ -11,5 +11,5 @@ interface AccountView : BaseView { fun openLoginView() - fun openAccountDetailsView(studentWithSemesters: StudentWithSemesters) + fun openAccountDetailsView(student: Student) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt index f1c7f7bd1..a9890ad9a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt @@ -37,9 +37,9 @@ class AccountDetailsFragment : private const val ARGUMENT_KEY = "Data" - fun newInstance(studentWithSemesters: StudentWithSemesters) = + fun newInstance(student: Student) = AccountDetailsFragment().apply { - arguments = Bundle().apply { putSerializable(ARGUMENT_KEY, studentWithSemesters) } + arguments = Bundle().apply { putSerializable(ARGUMENT_KEY, student) } } } @@ -51,7 +51,7 @@ class AccountDetailsFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding = FragmentAccountDetailsBinding.bind(view) - presenter.onAttachView(this, requireArguments()[ARGUMENT_KEY] as StudentWithSemesters) + presenter.onAttachView(this, requireArguments()[ARGUMENT_KEY] as Student) } override fun initView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt index cc53c9b63..d4cba580a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt @@ -2,6 +2,7 @@ package io.github.wulkanowy.ui.modules.account.accountdetails import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.Status +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.services.sync.SyncManager @@ -27,9 +28,9 @@ class AccountDetailsPresenter @Inject constructor( private var studentId: Long? = null - fun onAttachView(view: AccountDetailsView, studentWithSemesters: StudentWithSemesters) { + fun onAttachView(view: AccountDetailsView, student: Student) { super.onAttachView(view) - studentId = studentWithSemesters.student.id + studentId = student.id view.initView() errorHandler.showErrorMessage = ::showErrorViewOnError diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt index fa081ce7f..56503d027 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.data.db.entities.TimetableHeader import io.github.wulkanowy.databinding.ItemDashboardAccountBinding @@ -41,7 +42,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter Unit = {} + var onAccountTileClickListener: (Student) -> Unit = {} var onLuckyNumberTileClickListener: () -> Unit = {} @@ -152,7 +153,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { + attendancePercentage == null || attendancePercentage == .0 -> { + context.getThemeAttrColor(R.attr.colorOnSurface) + } + attendancePercentage <= ATTENDANCE_SECOND_WARNING_THRESHOLD -> { context.getThemeAttrColor(R.attr.colorPrimary) } - attendancePercentage ?: 0.0 <= ATTENDANCE_FIRST_WARNING_THRESHOLD -> { + attendancePercentage <= ATTENDANCE_FIRST_WARNING_THRESHOLD -> { context.getThemeAttrColor(R.attr.colorTimetableChange) } else -> context.getThemeAttrColor(R.attr.colorOnSurface) } + val attendanceString = if (attendancePercentage == null || attendancePercentage == .0) { + context.getString(R.string.dashboard_horizontal_group_no_data) + } else { + "%.2f%%".format(attendancePercentage) + } with(binding.dashboardHorizontalGroupItemAttendanceValue) { - text = "%.2f%%".format(attendancePercentage) + text = attendanceString setTextColor(attendanceColor) } with(binding) { dashboardHorizontalGroupItemMessageValue.text = unreadMessagesCount.toString() - dashboardHorizontalGroupItemLuckyValue.text = if (luckyNumber == -1) { - context.getString(R.string.dashboard_horizontal_group_no_lukcy_number) + dashboardHorizontalGroupItemLuckyValue.text = if (luckyNumber == 0) { + context.getString(R.string.dashboard_horizontal_group_no_data) } else luckyNumber?.toString() - if (dashboardHorizontalGroupItemInfoContainer.isVisible != (error != null || isLoading)) { - dashboardHorizontalGroupItemInfoContainer.isVisible = error != null || isLoading - } - - if (dashboardHorizontalGroupItemInfoProgress.isVisible != isLoading) { - dashboardHorizontalGroupItemInfoProgress.isVisible = isLoading - } - + dashboardHorizontalGroupItemInfoContainer.isVisible = error != null || isLoading + dashboardHorizontalGroupItemInfoProgress.isVisible = + (isLoading && !item.isDataLoaded) || (isLoading && !item.isFullDataLoaded) dashboardHorizontalGroupItemInfoErrorText.isVisible = error != null with(dashboardHorizontalGroupItemLuckyContainer) { - isVisible = error == null && !isLoading && luckyNumber != null + isVisible = luckyNumber != null && luckyNumber != -1 setOnClickListener { onLuckyNumberTileClickListener() } updateLayoutParams { @@ -216,7 +220,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { matchConstraintPercentWidth = when { luckyNumber == null && unreadMessagesCount == null -> 1.0f @@ -228,7 +232,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { - updateLessonView(item, emptyList(), binding, currentDayHeader) - binding.dashboardLessonsItemTitleTomorrow.isVisible = false - } tomorrowTimetable.isNotEmpty() -> { updateLessonView(item, tomorrowTimetable, binding) binding.dashboardLessonsItemTitleTomorrow.isVisible = true } + currentDayHeader != null && currentDayHeader.content.isNotBlank() -> { + updateLessonView(item, emptyList(), binding, currentDayHeader) + binding.dashboardLessonsItemTitleTomorrow.isVisible = false + } tomorrowDayHeader != null && tomorrowDayHeader.content.isNotBlank() -> { updateLessonView(item, emptyList(), binding, tomorrowDayHeader) binding.dashboardLessonsItemTitleTomorrow.isVisible = true @@ -348,6 +352,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter 60) { val formattedStartTime = firstLesson.start.toFormattedString("HH:mm") val formattedEndTime = firstLesson.end.toFormattedString("HH:mm") - firstTimeRangeText = "${formattedStartTime}-${formattedEndTime}" + firstTimeRangeText = "$formattedStartTime - $formattedEndTime" firstTimeText = "" isFirstTimeRangeVisible = true @@ -421,7 +426,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter(R.layout.fragme ) dashboardAdapter.apply { - onAccountTileClickListener = { mainActivity.pushView(AccountFragment.newInstance()) } + onAccountTileClickListener = { + mainActivity.pushView(AccountDetailsFragment.newInstance(it)) + } onLuckyNumberTileClickListener = { mainActivity.pushView(LuckyNumberFragment.newInstance()) } 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 2948b42fa..cf99f0c9a 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 @@ -35,6 +35,9 @@ sealed class DashboardItem(val type: Type) { override val isDataLoaded get() = unreadMessagesCount != null || attendancePercentage != null || luckyNumber != null + + val isFullDataLoaded + get() = luckyNumber != -1 && attendancePercentage != -1.0 && unreadMessagesCount != -1 } data class Grades( 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 0e24f0a14..027bcc053 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 @@ -2,6 +2,8 @@ package io.github.wulkanowy.ui.modules.dashboard import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.Status +import io.github.wulkanowy.data.db.entities.LuckyNumber +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.enums.MessageFolder import io.github.wulkanowy.data.repositories.AttendanceSummaryRepository import io.github.wulkanowy.data.repositories.ConferenceRepository @@ -18,11 +20,18 @@ 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.calculatePercentage -import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.nextOrSameSchoolDay +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.filterNot +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch import timber.log.Timber import java.time.LocalDate import java.time.LocalDateTime @@ -48,9 +57,11 @@ class DashboardPresenter @Inject constructor( private val dashboardItemRefreshLoadedList = mutableListOf() - private lateinit var dashboardItemsToLoad: Set + private var dashboardItemsToLoad = emptySet() - private var dashboardTilesToLoad: Set = emptySet() + private var dashboardTileLoadedList = emptySet() + + private val firstLoadedItemList = mutableListOf() private lateinit var lastError: Throwable @@ -69,8 +80,10 @@ class DashboardPresenter @Inject constructor( } fun onDragAndDropEnd(list: List) { - dashboardItemLoadedList.clear() - dashboardItemLoadedList.addAll(list) + with(dashboardItemLoadedList) { + clear() + addAll(list) + } val positionList = list.mapIndexed { index, dashboardItem -> Pair(dashboardItem.type, index) }.toMap() @@ -78,87 +91,102 @@ class DashboardPresenter @Inject constructor( preferencesRepository.dashboardItemsPosition = positionList } - fun loadData(forceRefresh: Boolean = false, tilesToLoad: Set) { - val oldDashboardDataToLoad = dashboardTilesToLoad + fun loadData( + tilesToLoad: Set, + forceRefresh: Boolean = false, + ) { + val oldDashboardTileLoadedList = dashboardTileLoadedList + dashboardItemsToLoad = tilesToLoad.map { it.toDashboardItemType() }.toSet() + dashboardTileLoadedList = tilesToLoad - dashboardTilesToLoad = tilesToLoad - dashboardItemsToLoad = dashboardTilesToLoad.map { it.toDashboardItemType() }.toSet() + val itemsToLoad = generateDashboardTileListToLoad( + dashboardTilesToLoad = tilesToLoad, + dashboardLoadedTiles = oldDashboardTileLoadedList, + forceRefresh = forceRefresh + ).map { it.toDashboardItemType() } - removeUnselectedTiles() - - val newTileList = generateTileListToLoad(oldDashboardDataToLoad, forceRefresh) - loadTiles(forceRefresh, newTileList) + removeUnselectedTiles(tilesToLoad.toList()) + loadTiles(tileList = itemsToLoad, forceRefresh = forceRefresh) } - private fun removeUnselectedTiles() { - val isLuckyNumberToLoad = - dashboardTilesToLoad.any { it == DashboardItem.Tile.LUCKY_NUMBER } - val isMessagesToLoad = - dashboardTilesToLoad.any { it == DashboardItem.Tile.MESSAGES } - val isAttendanceToLoad = - dashboardTilesToLoad.any { it == DashboardItem.Tile.ATTENDANCE } + private fun generateDashboardTileListToLoad( + dashboardTilesToLoad: Set, + dashboardLoadedTiles: Set, + forceRefresh: Boolean + ) = dashboardTilesToLoad.filter { newItemToLoad -> + dashboardLoadedTiles.none { it == newItemToLoad } || forceRefresh + } + private fun removeUnselectedTiles(tilesToLoad: List) { dashboardItemLoadedList.removeAll { loadedTile -> dashboardItemsToLoad.none { it == loadedTile.type } } val horizontalGroup = dashboardItemLoadedList.find { it is DashboardItem.HorizontalGroup } as DashboardItem.HorizontalGroup? if (horizontalGroup != null) { - val horizontalIndex = dashboardItemLoadedList.indexOf(horizontalGroup) - dashboardItemLoadedList.remove(horizontalGroup) + val isLuckyNumberToLoad = DashboardItem.Tile.LUCKY_NUMBER in tilesToLoad + val isMessagesToLoad = DashboardItem.Tile.MESSAGES in tilesToLoad + val isAttendanceToLoad = DashboardItem.Tile.ATTENDANCE in tilesToLoad - var updatedHorizontalGroup = horizontalGroup + val horizontalGroupIndex = dashboardItemLoadedList.indexOf(horizontalGroup) - if (horizontalGroup.luckyNumber != null && !isLuckyNumberToLoad) { - updatedHorizontalGroup = updatedHorizontalGroup.copy(luckyNumber = null) + val newHorizontalGroup = horizontalGroup.copy( + attendancePercentage = horizontalGroup.attendancePercentage.takeIf { isAttendanceToLoad }, + unreadMessagesCount = horizontalGroup.unreadMessagesCount.takeIf { isMessagesToLoad }, + luckyNumber = horizontalGroup.luckyNumber.takeIf { isLuckyNumberToLoad } + ) + + with(dashboardItemLoadedList) { + removeAt(horizontalGroupIndex) + add(horizontalGroupIndex, newHorizontalGroup) } - - if (horizontalGroup.attendancePercentage != null && !isAttendanceToLoad) { - updatedHorizontalGroup = updatedHorizontalGroup.copy(attendancePercentage = null) - } - - if (horizontalGroup.unreadMessagesCount != null && !isMessagesToLoad) { - updatedHorizontalGroup = updatedHorizontalGroup.copy(unreadMessagesCount = null) - } - - if (horizontalGroup.error != null) { - updatedHorizontalGroup = updatedHorizontalGroup.copy(error = null, isLoading = true) - } - - dashboardItemLoadedList.add(horizontalIndex, updatedHorizontalGroup) } view?.updateData(dashboardItemLoadedList) } - private fun loadTiles(forceRefresh: Boolean, tileList: List) { - tileList.forEach { - when (it) { - DashboardItem.Tile.ACCOUNT -> loadCurrentAccount(forceRefresh) - DashboardItem.Tile.LUCKY_NUMBER -> loadLuckyNumber(forceRefresh) - DashboardItem.Tile.MESSAGES -> loadMessages(forceRefresh) - DashboardItem.Tile.ATTENDANCE -> loadAttendance(forceRefresh) - DashboardItem.Tile.LESSONS -> loadLessons(forceRefresh) - DashboardItem.Tile.GRADES -> loadGrades(forceRefresh) - DashboardItem.Tile.HOMEWORK -> loadHomework(forceRefresh) - DashboardItem.Tile.ANNOUNCEMENTS -> loadSchoolAnnouncements(forceRefresh) - DashboardItem.Tile.EXAMS -> loadExams(forceRefresh) - DashboardItem.Tile.CONFERENCES -> loadConferences(forceRefresh) - DashboardItem.Tile.ADS -> TODO() + private fun loadTiles( + tileList: List, + forceRefresh: Boolean + ) { + launch { + Timber.i("Loading dashboard account data started") + val student = runCatching { studentRepository.getCurrentStudent(true) } + .onFailure { + Timber.i("Loading dashboard account result: An exception occurred") + errorHandler.dispatch(it) + updateData(DashboardItem.Account(error = it), forceRefresh) + } + .onSuccess { Timber.i("Loading dashboard account result: Success") } + .getOrNull() ?: return@launch + + tileList.forEach { + when (it) { + DashboardItem.Type.ACCOUNT -> { + updateData(DashboardItem.Account(student), forceRefresh) + } + DashboardItem.Type.HORIZONTAL_GROUP -> { + loadHorizontalGroup(student, forceRefresh) + } + DashboardItem.Type.LESSONS -> loadLessons(student, forceRefresh) + DashboardItem.Type.GRADES -> loadGrades(student, forceRefresh) + DashboardItem.Type.HOMEWORK -> loadHomework(student, forceRefresh) + DashboardItem.Type.ANNOUNCEMENTS -> { + loadSchoolAnnouncements(student, forceRefresh) + } + DashboardItem.Type.EXAMS -> loadExams(student, forceRefresh) + DashboardItem.Type.CONFERENCES -> { + loadConferences(student, forceRefresh) + } + DashboardItem.Type.ADS -> TODO() + } } } } - private fun generateTileListToLoad( - oldDashboardTileToLoad: Set, - forceRefresh: Boolean - ) = dashboardTilesToLoad.filter { newTileToLoad -> - oldDashboardTileToLoad.none { it == newTileToLoad } || forceRefresh - } - fun onSwipeRefresh() { Timber.i("Force refreshing the dashboard") - loadData(true, preferencesRepository.selectedDashboardTiles) + loadData(preferencesRepository.selectedDashboardTiles, forceRefresh = true) } fun onRetry() { @@ -166,7 +194,7 @@ class DashboardPresenter @Inject constructor( showErrorView(false) showProgress(true) } - loadData(true, preferencesRepository.selectedDashboardTiles) + loadData(preferencesRepository.selectedDashboardTiles, forceRefresh = true) } fun onViewReselected() { @@ -192,139 +220,86 @@ class DashboardPresenter @Inject constructor( }.toSet() } - private fun loadCurrentAccount(forceRefresh: Boolean) { - flowWithResource { studentRepository.getCurrentStudent(false) } + private fun loadHorizontalGroup(student: Student, forceRefresh: Boolean) { + flow { + val semester = semesterRepository.getCurrentSemester(student) + val selectedTiles = preferencesRepository.selectedDashboardTiles + + val luckyNumberFlow = luckyNumberRepository.getLuckyNumber(student, forceRefresh) + .map { + if (it.data == null) { + it.copy(data = LuckyNumber(0, LocalDate.now(), 0)) + } else it + } + .takeIf { DashboardItem.Tile.LUCKY_NUMBER in selectedTiles } ?: flowOf(null) + + val messageFLow = messageRepository.getMessages( + student = student, + semester = semester, + folder = MessageFolder.RECEIVED, + forceRefresh = forceRefresh + ).takeIf { DashboardItem.Tile.MESSAGES in selectedTiles } ?: flowOf(null) + + val attendanceFlow = attendanceSummaryRepository.getAttendanceSummary( + student = student, + semester = semester, + subjectId = -1, + forceRefresh = forceRefresh + ).takeIf { DashboardItem.Tile.ATTENDANCE in selectedTiles } ?: flowOf(null) + + emitAll( + combine( + luckyNumberFlow, + messageFLow, + attendanceFlow + ) { luckyNumberResource, messageResource, attendanceResource -> + val error = + luckyNumberResource?.error ?: messageResource?.error ?: attendanceResource?.error + error?.let { throw it } + + val luckyNumber = luckyNumberResource?.data?.luckyNumber + val messageCount = messageResource?.data?.count { it.unread } + val attendancePercentage = attendanceResource?.data?.calculatePercentage() + + val isLoading = + luckyNumberResource?.status == Status.LOADING || messageResource?.status == Status.LOADING || attendanceResource?.status == Status.LOADING + + DashboardItem.HorizontalGroup( + isLoading = isLoading, + attendancePercentage = if (attendancePercentage == 0.0 && isLoading) -1.0 else attendancePercentage, + unreadMessagesCount = if (messageCount == 0 && isLoading) -1 else messageCount, + luckyNumber = if (luckyNumber == 0 && isLoading) -1 else luckyNumber + ) + }) + } + .filterNot { it.isLoading && forceRefresh } + .distinctUntilChanged() .onEach { - when (it.status) { - Status.LOADING -> { - Timber.i("Loading dashboard account data started") - if (forceRefresh) return@onEach - updateData(DashboardItem.Account(it.data, isLoading = true), forceRefresh) - } - Status.SUCCESS -> { - Timber.i("Loading dashboard account result: Success") - updateData(DashboardItem.Account(it.data), forceRefresh) - } - Status.ERROR -> { - Timber.i("Loading dashboard account result: An exception occurred") - errorHandler.dispatch(it.error!!) - updateData(DashboardItem.Account(error = it.error), forceRefresh) + updateData(it, forceRefresh) + + if (it.isLoading) { + Timber.i("Loading horizontal group data started") + + if (it.isFullDataLoaded) { + firstLoadedItemList += DashboardItem.Type.HORIZONTAL_GROUP } + } else { + Timber.i("Loading horizontal group result: Success") } } - .launch("dashboard_account") - } - - private fun loadLuckyNumber(forceRefresh: Boolean) { - flowWithResourceIn { - val student = studentRepository.getCurrentStudent(true) - - luckyNumberRepository.getLuckyNumber(student, forceRefresh) - }.onEach { - when (it.status) { - Status.LOADING -> { - Timber.i("Loading dashboard lucky number data started") - if (forceRefresh) return@onEach - processHorizontalGroupData( - luckyNumber = it.data?.luckyNumber, - isLoading = true, - forceRefresh = forceRefresh - ) - } - Status.SUCCESS -> { - Timber.i("Loading dashboard lucky number result: Success") - processHorizontalGroupData( - luckyNumber = it.data?.luckyNumber ?: -1, - forceRefresh = forceRefresh - ) - } - Status.ERROR -> { - Timber.i("Loading dashboard lucky number result: An exception occurred") - errorHandler.dispatch(it.error!!) - processHorizontalGroupData(error = it.error, forceRefresh = forceRefresh) - } + .catch { + Timber.i("Loading horizontal group result: An exception occurred") + updateData( + DashboardItem.HorizontalGroup(error = it), + forceRefresh, + ) + errorHandler.dispatch(it) } - }.launch("dashboard_lucky_number") + .launch("horizontal_group") } - private fun loadMessages(forceRefresh: Boolean) { + private fun loadGrades(student: Student, forceRefresh: Boolean) { flowWithResourceIn { - val student = studentRepository.getCurrentStudent(true) - val semester = semesterRepository.getCurrentSemester(student) - - messageRepository.getMessages(student, semester, MessageFolder.RECEIVED, forceRefresh) - }.onEach { - when (it.status) { - Status.LOADING -> { - Timber.i("Loading dashboard messages data started") - if (forceRefresh) return@onEach - val unreadMessagesCount = it.data?.count { message -> message.unread } - - processHorizontalGroupData( - unreadMessagesCount = unreadMessagesCount, - isLoading = true, - forceRefresh = forceRefresh - ) - } - Status.SUCCESS -> { - Timber.i("Loading dashboard messages result: Success") - val unreadMessagesCount = it.data?.count { message -> message.unread } - - processHorizontalGroupData( - unreadMessagesCount = unreadMessagesCount, - forceRefresh = forceRefresh - ) - } - Status.ERROR -> { - Timber.i("Loading dashboard messages result: An exception occurred") - errorHandler.dispatch(it.error!!) - processHorizontalGroupData(error = it.error, forceRefresh = forceRefresh) - } - } - }.launch("dashboard_messages") - } - - private fun loadAttendance(forceRefresh: Boolean) { - flowWithResourceIn { - val student = studentRepository.getCurrentStudent(true) - val semester = semesterRepository.getCurrentSemester(student) - - attendanceSummaryRepository.getAttendanceSummary(student, semester, -1, forceRefresh) - }.onEach { - when (it.status) { - Status.LOADING -> { - Timber.i("Loading dashboard attendance data started") - if (forceRefresh) return@onEach - val attendancePercentage = it.data?.calculatePercentage() - - processHorizontalGroupData( - attendancePercentage = attendancePercentage, - isLoading = true, - forceRefresh = forceRefresh - ) - } - Status.SUCCESS -> { - Timber.i("Loading dashboard attendance result: Success") - val attendancePercentage = it.data?.calculatePercentage() - - processHorizontalGroupData( - attendancePercentage = attendancePercentage, - forceRefresh = forceRefresh - ) - } - Status.ERROR -> { - Timber.i("Loading dashboard attendance result: An exception occurred") - errorHandler.dispatch(it.error!!) - - processHorizontalGroupData(error = it.error, forceRefresh = forceRefresh) - } - } - }.launch("dashboard_attendance") - } - - private fun loadGrades(forceRefresh: Boolean) { - flowWithResourceIn { - val student = studentRepository.getCurrentStudent(true) val semester = semesterRepository.getCurrentSemester(student) gradeRepository.getGrades(student, semester, forceRefresh) @@ -353,6 +328,7 @@ class DashboardPresenter @Inject constructor( Status.LOADING -> { Timber.i("Loading dashboard grades data started") if (forceRefresh) return@onEach + updateData( DashboardItem.Grades( subjectWithGrades = it.data, @@ -360,6 +336,10 @@ class DashboardPresenter @Inject constructor( isLoading = true ), forceRefresh ) + + if (!it.data.isNullOrEmpty()) { + firstLoadedItemList += DashboardItem.Type.GRADES + } } Status.SUCCESS -> { Timber.i("Loading dashboard grades result: Success") @@ -367,7 +347,8 @@ class DashboardPresenter @Inject constructor( DashboardItem.Grades( subjectWithGrades = it.data, gradeTheme = preferencesRepository.gradeColorTheme - ), forceRefresh + ), + forceRefresh ) } Status.ERROR -> { @@ -379,9 +360,8 @@ class DashboardPresenter @Inject constructor( }.launch("dashboard_grades") } - private fun loadLessons(forceRefresh: Boolean) { + private fun loadLessons(student: Student, forceRefresh: Boolean) { flowWithResourceIn { - val student = studentRepository.getCurrentStudent(true) val semester = semesterRepository.getCurrentSemester(student) val date = LocalDate.now().nextOrSameSchoolDay @@ -398,24 +378,34 @@ class DashboardPresenter @Inject constructor( Status.LOADING -> { Timber.i("Loading dashboard lessons data started") if (forceRefresh) return@onEach - updateData(DashboardItem.Lessons(it.data, isLoading = true), forceRefresh) + updateData( + DashboardItem.Lessons(it.data, isLoading = true), + forceRefresh + ) + + if (!it.data?.lessons.isNullOrEmpty()) { + firstLoadedItemList += DashboardItem.Type.LESSONS + } } Status.SUCCESS -> { Timber.i("Loading dashboard lessons result: Success") - updateData(DashboardItem.Lessons(it.data), forceRefresh) + updateData( + DashboardItem.Lessons(it.data), forceRefresh + ) } Status.ERROR -> { Timber.i("Loading dashboard lessons result: An exception occurred") errorHandler.dispatch(it.error!!) - updateData(DashboardItem.Lessons(error = it.error), forceRefresh) + updateData( + DashboardItem.Lessons(error = it.error), forceRefresh + ) } } }.launch("dashboard_lessons") } - private fun loadHomework(forceRefresh: Boolean) { + private fun loadHomework(student: Student, forceRefresh: Boolean) { flowWithResourceIn { - val student = studentRepository.getCurrentStudent(true) val semester = semesterRepository.getCurrentSemester(student) val date = LocalDate.now().nextOrSameSchoolDay @@ -443,6 +433,10 @@ class DashboardPresenter @Inject constructor( DashboardItem.Homework(it.data ?: emptyList(), isLoading = true), forceRefresh ) + + if (!it.data.isNullOrEmpty()) { + firstLoadedItemList += DashboardItem.Type.HOMEWORK + } } Status.SUCCESS -> { Timber.i("Loading dashboard homework result: Success") @@ -457,10 +451,8 @@ class DashboardPresenter @Inject constructor( }.launch("dashboard_homework") } - private fun loadSchoolAnnouncements(forceRefresh: Boolean) { + private fun loadSchoolAnnouncements(student: Student, forceRefresh: Boolean) { flowWithResourceIn { - val student = studentRepository.getCurrentStudent(true) - schoolAnnouncementRepository.getSchoolAnnouncements(student, forceRefresh) }.onEach { when (it.status) { @@ -468,11 +460,13 @@ class DashboardPresenter @Inject constructor( Timber.i("Loading dashboard announcements data started") if (forceRefresh) return@onEach updateData( - DashboardItem.Announcements( - it.data ?: emptyList(), - isLoading = true - ), forceRefresh + DashboardItem.Announcements(it.data ?: emptyList(), isLoading = true), + forceRefresh ) + + if (!it.data.isNullOrEmpty()) { + firstLoadedItemList += DashboardItem.Type.ANNOUNCEMENTS + } } Status.SUCCESS -> { Timber.i("Loading dashboard announcements result: Success") @@ -487,9 +481,8 @@ class DashboardPresenter @Inject constructor( }.launch("dashboard_announcements") } - private fun loadExams(forceRefresh: Boolean) { + private fun loadExams(student: Student, forceRefresh: Boolean) { flowWithResourceIn { - val student = studentRepository.getCurrentStudent(true) val semester = semesterRepository.getCurrentSemester(student) examRepository.getExams( @@ -508,6 +501,10 @@ class DashboardPresenter @Inject constructor( DashboardItem.Exams(it.data.orEmpty(), isLoading = true), forceRefresh ) + + if (!it.data.isNullOrEmpty()) { + firstLoadedItemList += DashboardItem.Type.EXAMS + } } Status.SUCCESS -> { Timber.i("Loading dashboard exams result: Success") @@ -522,9 +519,8 @@ class DashboardPresenter @Inject constructor( }.launch("dashboard_exams") } - private fun loadConferences(forceRefresh: Boolean) { + private fun loadConferences(student: Student, forceRefresh: Boolean) { flowWithResourceIn { - val student = studentRepository.getCurrentStudent(true) val semester = semesterRepository.getCurrentSemester(student) conferenceRepository.getConferences( @@ -542,6 +538,10 @@ class DashboardPresenter @Inject constructor( DashboardItem.Conferences(it.data ?: emptyList(), isLoading = true), forceRefresh ) + + if (!it.data.isNullOrEmpty()) { + firstLoadedItemList += DashboardItem.Type.CONFERENCES + } } Status.SUCCESS -> { Timber.i("Loading dashboard conferences result: Success") @@ -556,145 +556,119 @@ class DashboardPresenter @Inject constructor( }.launch("dashboard_conferences") } - private fun processHorizontalGroupData( - luckyNumber: Int? = null, - unreadMessagesCount: Int? = null, - attendancePercentage: Double? = null, - error: Throwable? = null, - isLoading: Boolean = false, - forceRefresh: Boolean - ) { - val isLuckyNumberToLoad = - dashboardTilesToLoad.any { it == DashboardItem.Tile.LUCKY_NUMBER } - val isMessagesToLoad = - dashboardTilesToLoad.any { it == DashboardItem.Tile.MESSAGES } - val isAttendanceToLoad = - dashboardTilesToLoad.any { it == DashboardItem.Tile.ATTENDANCE } - val isPushedToList = - dashboardItemLoadedList.any { it.type == DashboardItem.Type.HORIZONTAL_GROUP } + private fun updateData(dashboardItem: DashboardItem, forceRefresh: Boolean) { + val isForceRefreshError = forceRefresh && dashboardItem.error != null + val isFirstRunDataLoadedError = + dashboardItem.type in firstLoadedItemList && dashboardItem.error != null - if (error != null) { - updateData(DashboardItem.HorizontalGroup(error = error), forceRefresh) - return + with(dashboardItemLoadedList) { + removeAll { it.type == dashboardItem.type && !isForceRefreshError && !isFirstRunDataLoadedError } + if (!isForceRefreshError && !isFirstRunDataLoadedError) add(dashboardItem) } - if (isLoading) { - val horizontalGroup = - dashboardItemLoadedList.find { it is DashboardItem.HorizontalGroup } as DashboardItem.HorizontalGroup? - val updatedHorizontalGroup = - horizontalGroup?.copy(isLoading = true) ?: DashboardItem.HorizontalGroup(isLoading = true) + sortDashboardItems() - updateData(updatedHorizontalGroup, forceRefresh) - } - - if (forceRefresh && !isPushedToList) { - updateData(DashboardItem.HorizontalGroup(), forceRefresh) - } - - val horizontalGroup = - dashboardItemLoadedList.single { it is DashboardItem.HorizontalGroup } as DashboardItem.HorizontalGroup - - when { - luckyNumber != null -> { - updateData(horizontalGroup.copy(luckyNumber = luckyNumber), forceRefresh) - } - unreadMessagesCount != null -> { - updateData( - horizontalGroup.copy(unreadMessagesCount = unreadMessagesCount), - forceRefresh - ) - } - attendancePercentage != null -> { - updateData( - horizontalGroup.copy(attendancePercentage = attendancePercentage), - forceRefresh - ) - } - } - - val isHorizontalGroupLoaded = dashboardItemLoadedList.any { - if (it !is DashboardItem.HorizontalGroup) return@any false - - val isLuckyNumberStateCorrect = (it.luckyNumber != null) == isLuckyNumberToLoad - val isMessagesStateCorrect = (it.unreadMessagesCount != null) == isMessagesToLoad - val isAttendanceStateCorrect = (it.attendancePercentage != null) == isAttendanceToLoad - - isLuckyNumberStateCorrect && isAttendanceStateCorrect && isMessagesStateCorrect - } - - if (isHorizontalGroupLoaded) { - val updatedHorizontalGroup = - dashboardItemLoadedList.single { it is DashboardItem.HorizontalGroup } as DashboardItem.HorizontalGroup - - updateData(updatedHorizontalGroup.copy(isLoading = false, error = null), forceRefresh) + if (forceRefresh) { + updateForceRefreshData(dashboardItem) + } else { + updateNormalData() } } - private fun updateData(dashboardItem: DashboardItem, forceRefresh: Boolean) { - val isForceRefreshError = forceRefresh && dashboardItem.error != null - val dashboardItemsPosition = preferencesRepository.dashboardItemsPosition - - with(dashboardItemLoadedList) { - removeAll { it.type == dashboardItem.type && !isForceRefreshError } - if (!isForceRefreshError) add(dashboardItem) - sortBy { tile -> dashboardItemsToLoad.single { it == tile.type }.ordinal } + private fun updateNormalData() { + val isItemsLoaded = + dashboardItemsToLoad.all { type -> dashboardItemLoadedList.any { it.type == type } } + val isItemsDataLoaded = isItemsLoaded && dashboardItemLoadedList.all { + it.isDataLoaded || it.error != null } - if (forceRefresh) { - with(dashboardItemRefreshLoadedList) { - removeAll { it.type == dashboardItem.type } - add(dashboardItem) + if (isItemsDataLoaded) { + view?.run { + showProgress(false) + showErrorView(false) + showContent(true) + updateData(dashboardItemLoadedList.toList()) } } + showErrorIfExists( + isItemsLoaded = isItemsLoaded, + itemsLoadedList = dashboardItemLoadedList, + forceRefresh = false + ) + } + + private fun updateForceRefreshData(dashboardItem: DashboardItem) { + with(dashboardItemRefreshLoadedList) { + removeAll { it.type == dashboardItem.type } + add(dashboardItem) + } + + val isRefreshItemLoaded = + dashboardItemsToLoad.all { type -> dashboardItemRefreshLoadedList.any { it.type == type } } + val isRefreshItemsDataLoaded = isRefreshItemLoaded && dashboardItemRefreshLoadedList.all { + it.isDataLoaded || it.error != null + } + + if (isRefreshItemsDataLoaded) { + view?.run { + showRefresh(false) + showErrorView(false) + showContent(true) + updateData(dashboardItemLoadedList.toList()) + } + } + + showErrorIfExists( + isItemsLoaded = isRefreshItemLoaded, + itemsLoadedList = dashboardItemRefreshLoadedList, + forceRefresh = true + ) + + if (isRefreshItemsDataLoaded) dashboardItemRefreshLoadedList.clear() + } + + private fun showErrorIfExists( + isItemsLoaded: Boolean, + itemsLoadedList: List, + forceRefresh: Boolean + ) { + val filteredItems = itemsLoadedList.filterNot { it.type == DashboardItem.Type.ACCOUNT } + val isAccountItemError = + itemsLoadedList.find { it.type == DashboardItem.Type.ACCOUNT }?.error != null + val isGeneralError = + filteredItems.none { it.error == null } && filteredItems.isNotEmpty() || isAccountItemError + val errorMessage = itemsLoadedList.map { it.error?.stackTraceToString() }.toString() + + val filteredOriginalLoadedList = + dashboardItemLoadedList.filterNot { it.type == DashboardItem.Type.ACCOUNT } + val wasAccountItemError = + dashboardItemLoadedList.find { it.type == DashboardItem.Type.ACCOUNT }?.error != null + val wasGeneralError = + filteredOriginalLoadedList.none { it.error == null } && filteredOriginalLoadedList.isNotEmpty() || wasAccountItemError + + if (isGeneralError && isItemsLoaded) { + lastError = Exception(errorMessage) + + view?.run { + showProgress(false) + showRefresh(false) + if ((forceRefresh && wasGeneralError) || !forceRefresh) { + showContent(false) + showErrorView(true) + } + } + } + } + + private fun sortDashboardItems() { + val dashboardItemsPosition = preferencesRepository.dashboardItemsPosition + dashboardItemLoadedList.sortBy { tile -> dashboardItemsPosition?.getOrDefault( tile.type, tile.type.ordinal + 100 ) ?: tile.type.ordinal } - - val isItemsLoaded = - dashboardItemsToLoad.all { type -> dashboardItemLoadedList.any { it.type == type } } - val isRefreshItemLoaded = - dashboardItemsToLoad.all { type -> dashboardItemRefreshLoadedList.any { it.type == type } } - val isItemsDataLoaded = isItemsLoaded && dashboardItemLoadedList.all { - it.isDataLoaded || it.error != null - } - val isRefreshItemsDataLoaded = isRefreshItemLoaded && dashboardItemRefreshLoadedList.all { - it.isDataLoaded || it.error != null - } - - if (isRefreshItemsDataLoaded) { - view?.showRefresh(false) - dashboardItemRefreshLoadedList.clear() - } - - view?.run { - if (!forceRefresh) { - showProgress(!isItemsDataLoaded) - showContent(isItemsDataLoaded) - } - updateData(dashboardItemLoadedList.toList()) - } - - if (isItemsLoaded) { - val filteredItems = - dashboardItemLoadedList.filterNot { it.type == DashboardItem.Type.ACCOUNT } - val isAccountItemError = - dashboardItemLoadedList.single { it.type == DashboardItem.Type.ACCOUNT }.error != null - val isGeneralError = - filteredItems.all { it.error != null } && filteredItems.isNotEmpty() || isAccountItemError - - val errorMessage = filteredItems.map { it.error?.stackTraceToString() }.toString() - - lastError = Exception(errorMessage) - - view?.run { - showProgress(false) - showContent(!isGeneralError) - showErrorView(isGeneralError) - } - } } } \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt index f3591306e..9d15216c6 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/TimetableExtension.kt @@ -18,7 +18,7 @@ inline val Timetable.left: Duration? get() = when { canceled -> null !isStudentPlan -> null - end.isAfter(now()) && start.isBefore(now()) -> between(now(), end) + end >= now() && start <= now() -> between(now(), end) else -> null } diff --git a/app/src/main/res/layout/item_dashboard_horizontal_group.xml b/app/src/main/res/layout/item_dashboard_horizontal_group.xml index bbd8f3517..1d43d5115 100644 --- a/app/src/main/res/layout/item_dashboard_horizontal_group.xml +++ b/app/src/main/res/layout/item_dashboard_horizontal_group.xml @@ -4,14 +4,14 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingHorizontal="12dp" android:layout_marginVertical="2dp" - android:clipToPadding="false"> + android:clipToPadding="false" + android:paddingHorizontal="12dp"> Lekce (Zítra) - %1$s (%2$s) Za chvíli: Brzy: První: @@ -566,7 +565,7 @@ Ještě %1$d dalších setkání Při načítání dat došlo k chybě - Žádné + Žádné Zkontrolovat aktualizace Před hlášením chyby zkontrolujte, zda je k dispozici aktualizace s opravou chyb diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 29d5c7636..5f14a4258 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -432,7 +432,6 @@ Lektionen (Morgen) - %1$s (%2$s) Gleich: Bald: Erstens: @@ -488,7 +487,7 @@ %1$d weitere Konferenzen Fehler beim Laden der Daten - Keine + Keine Auf Updates prüfen Bevor Sie einen Fehler melden, prüfen Sie zuerst, ob ein Update mit der Fehlerbehebung verfügbar ist diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 2a0f3cb77..14f23cd29 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -496,7 +496,6 @@ Lekcje (Jutro) - %1$s (%2$s) Za chwilę: Wkrótce: Pierwsza: @@ -566,7 +565,7 @@ Jeszcze %1$d dodatkowych zebrań Wystąpił błąd podczas ładowania danych - Brak + Brak Sprawdź dostępność aktualizacji Przed zgłoszeniem błędu sprawdź wcześniej, czy dostępna jest już aktualizacja z poprawką błędu diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index db78f5952..09b8a146d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -496,7 +496,6 @@ Уроки (Завтра) - %1$s (%2$s) Сейчас: Скоро: Первый: @@ -566,7 +565,7 @@ Еще %1$d конференций Произошла ошибка при загрузке данных - Отсутствует + Отсутствует Проверить наличие обновлений Прежде чем сообщать об ошибке, проверьте наличие обновлений diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 72899b78b..ad078e33f 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -496,7 +496,6 @@ Lekcie (Zajtra) - %1$s (%2$s) Za chvíľu: Čoskoro: Prvá: @@ -566,7 +565,7 @@ Ešte %1$d ďalších stretnutí Pri načítaní dát došlo k chybe - Žiadne + Žiadne Skontrolovať aktualizácie Pred hlásením chyby skontrolujte, či je k dispozícii aktualizácia s opravou chýb diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 4850e2396..41f1c300c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -496,7 +496,6 @@ Уроки (Завтра) - %1$s (%2$s) Через мить: Незабаром: Перше: @@ -566,7 +565,7 @@ %1$d більше конференцій Помилка при завантаженні даних - Нічого + Нічого Провірити наявність оновлень Перед тим, як повідомлювати о помілці, перевірте наявність оновлень diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 08776c1ab..cf8a07604 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -495,7 +495,6 @@ Lessons (Tomorrow) - %1$s (%2$s) In a moment: Soon: First: @@ -557,7 +556,7 @@ An error occurred while loading data - None + None diff --git a/app/src/test/java/io/github/wulkanowy/utils/TimetableExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/TimetableExtensionTest.kt index 84b61a904..b7fa58c6f 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/TimetableExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/TimetableExtensionTest.kt @@ -32,7 +32,22 @@ class TimetableExtensionTest { assertEquals(null, getTimetableEntity(canceled = true).left) assertEquals(null, getTimetableEntity(start = now().plusMinutes(5), end = now().plusMinutes(50)).left) assertEquals(null, getTimetableEntity(start = now().minusMinutes(1), end = now().plusMinutes(44), isStudentPlan = false).left) - assertNotEquals(null, getTimetableEntity(start = now().minusMinutes(1), end = now().plusMinutes(44), isStudentPlan = true).left) + assertNotEquals( + null, + getTimetableEntity( + start = now().minusMinutes(1), + end = now().plusMinutes(44), + isStudentPlan = true + ).left + ) + assertNotEquals( + null, + getTimetableEntity( + start = now(), + end = now().plusMinutes(45), + isStudentPlan = true + ).left + ) } @Test From b64b41c11c0830d24e7f1c7adea48cb36895029f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 5 Sep 2021 23:29:15 +0200 Subject: [PATCH 0584/1526] Version 1.2.1 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 11 ++++------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e1d1be79b..695dc6399 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 30 - versionCode 93 - versionName "1.2.0" + versionCode 94 + versionName "1.2.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -133,7 +133,7 @@ play { serviceAccountEmail = System.getenv("PLAY_SERVICE_ACCOUNT_EMAIL") ?: "jan@fakelog.cf" serviceAccountCredentials = file('key.p12') defaultToAppBundles = false - track = 'beta' + track = 'production' updatePriority = 3 } @@ -157,7 +157,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:7c399ffaea" + implementation "io.github.wulkanowy:sdk:1.2.1" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 42fd22292..aeef2a77e 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,10 +1,7 @@ -Wersja 1.2.0 +Wersja 1.2.1 -- dodaliśmy nowy ekran startowy 🎉 -- usprawniliśmy powiadomienia -- dodaliśmy wersje robocze, filtrowanie oraz informację o odczytaniu przez odbiorcę w wiadomościach -- dodaliśmy informacje o liczeniu średniej w podsumowaniu ocen -- dodaliśmy opcję generowania wiadomości z usprawiedliwieniem dni w szkołach pozbawionych funkcji usprawiedliwiania przez zakładkę frekwencja -- oraz wiele wiele innych ulepszeń i poprawek +- dodaliśmy brakujące okienka z podglądem szczegółów ogłoszeń szkolnych +- naprawiliśmy rzucające się w oczy błędy na ekranie startowym +- naprawiliśmy też inne drobne błędy w wyglądzie i stabilności aplikacji Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From b47f26684b03c37a58564416d3694d3406ed62e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 6 Sep 2021 03:27:54 +0200 Subject: [PATCH 0585/1526] Change AppGallery deploy format to aab (#1483) --- .github/workflows/deploy-store.yml | 2 +- app/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-store.yml b/.github/workflows/deploy-store.yml index e7ed6b49a..8015ef640 100644 --- a/.github/workflows/deploy-store.yml +++ b/.github/workflows/deploy-store.yml @@ -71,4 +71,4 @@ jobs: PLAY_KEY_ALIAS: ${{ secrets.PLAY_KEY_ALIAS }} PLAY_KEY_PASSWORD: ${{ secrets.PLAY_KEY_PASSWORD }} PLAY_STORE_PASSWORD: ${{ secrets.PLAY_STORE_PASSWORD }} - run: ./gradlew assembleHmsRelease --stacktrace && ./gradlew publishHuaweiAppGalleryHmsRelease --stacktrace + run: ./gradlew bundleHmsRelease --stacktrace && ./gradlew publishHuaweiAppGalleryHmsRelease --stacktrace diff --git a/app/build.gradle b/app/build.gradle index 695dc6399..2b0f01514 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -141,7 +141,7 @@ huaweiPublish { instances { hmsRelease { credentialsPath = "$rootDir/app/src/release/agconnect-credentials.json" - buildFormat = "apk" + buildFormat = "aab" deployType = "draft" } } From f5e9197f98c5952d71de02fd83da226262eb049f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Sep 2021 23:38:10 +0000 Subject: [PATCH 0586/1526] Bump work_manager from 2.5.0 to 2.6.0 (#1478) --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2b0f01514..dac488b23 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -148,7 +148,7 @@ huaweiPublish { } ext { - work_manager = "2.5.0" + work_manager = "2.6.0" android_hilt = "1.0.0" room = "2.3.0" chucker = "3.5.2" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a331c41f6..ad5adaf2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -119,11 +119,9 @@ - Date: Wed, 8 Sep 2021 09:13:52 +0200 Subject: [PATCH 0587/1526] Update material chips input (#1495) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index dac488b23..d1975e1ab 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -177,7 +177,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.0" implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0" implementation "com.google.android.material:material:1.4.0" - implementation "com.github.wulkanowy:material-chips-input:2.2.0" + implementation "com.github.wulkanowy:material-chips-input:2.3.1" implementation "com.github.PhilJay:MPAndroidChart:v3.1.0" implementation 'com.github.lopspower:CircularImageView:4.2.0' From 16a5d88dfb39179565b12642c9f9f4a79a761d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 10 Sep 2021 00:25:23 +0200 Subject: [PATCH 0588/1526] Fix overlapping shadow in dashboard (#1494) --- .../ui/modules/dashboard/DashboardAdapter.kt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt index 56503d027..8c03e3644 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt @@ -170,6 +170,8 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { context.getThemeAttrColor(R.attr.colorOnSurface) @@ -199,13 +201,12 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { @@ -220,7 +221,8 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { matchConstraintPercentWidth = when { luckyNumber == null && unreadMessagesCount == null -> 1.0f @@ -232,7 +234,8 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter Date: Fri, 10 Sep 2021 00:27:48 +0200 Subject: [PATCH 0589/1526] Fix NPE in timetable dashboard tile (#1498) --- .../wulkanowy/ui/modules/dashboard/DashboardAdapter.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt index 8c03e3644..0eda49326 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt @@ -31,6 +31,7 @@ import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.left import io.github.wulkanowy.utils.nickOrName import io.github.wulkanowy.utils.toFormattedString +import timber.log.Timber import java.time.Duration import java.time.LocalDate import java.time.LocalDateTime @@ -429,7 +430,10 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter Date: Fri, 10 Sep 2021 00:36:44 +0200 Subject: [PATCH 0590/1526] Fix overlapping error view (#1493) --- .../wulkanowy/ui/modules/attendance/AttendancePresenter.kt | 1 + .../wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt | 1 + .../ui/modules/schoolannouncement/SchoolAnnouncementPresenter.kt | 1 + .../github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt | 1 + 4 files changed, 4 insertions(+) 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 9a1598128..fc37e50de 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 @@ -234,6 +234,7 @@ class AttendancePresenter @Inject constructor( enableSwipe(true) showRefresh(true) showProgress(false) + showErrorView(false) showEmpty(filteredAttendance.isEmpty()) showContent(filteredAttendance.isNotEmpty()) updateData(filteredAttendance.sortedBy { item -> item.number }) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 3e5e09b48..a24f9b79f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -117,6 +117,7 @@ class MessageTabPresenter @Inject constructor( if (!it.data.isNullOrEmpty()) { view?.run { enableSwipe(true) + showErrorView(false) showRefresh(true) showProgress(false) showContent(true) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementPresenter.kt index 88ad81465..d6a32e3cc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementPresenter.kt @@ -64,6 +64,7 @@ class SchoolAnnouncementPresenter @Inject constructor( view?.run { enableSwipe(true) showRefresh(true) + showErrorView(false) showProgress(false) showContent(true) updateData(it.data) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index fa1bbfb28..86e993982 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -149,6 +149,7 @@ class TimetablePresenter @Inject constructor( view?.run { enableSwipe(true) showRefresh(true) + showErrorView(false) showProgress(false) showContent(true) updateData(it.data!!.lessons) From e665a8f18b9a0bfea8629636b8501140912e1a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 10 Sep 2021 00:48:29 +0200 Subject: [PATCH 0591/1526] Fix error view in attendance summary (#1492) --- .../attendance/summary/AttendanceSummaryPresenter.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt index e53cda749..8b603837b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt @@ -82,7 +82,13 @@ class AttendanceSummaryPresenter @Inject constructor( flowWithResourceIn { val student = studentRepository.getCurrentStudent() val semester = semesterRepository.getCurrentSemester(student) - attendanceSummaryRepository.getAttendanceSummary(student, semester, subjectId, forceRefresh) + + attendanceSummaryRepository.getAttendanceSummary( + student = student, + semester = semester, + subjectId = subjectId, + forceRefresh = forceRefresh + ) }.onEach { when (it.status) { Status.LOADING -> { @@ -92,6 +98,7 @@ class AttendanceSummaryPresenter @Inject constructor( showRefresh(true) showProgress(false) showContent(true) + showErrorView(false) updateDataSet(sortItems(it.data)) } } @@ -99,6 +106,7 @@ class AttendanceSummaryPresenter @Inject constructor( Status.SUCCESS -> { Timber.i("Loading attendance summary result: Success") view?.apply { + showErrorView(false) showEmpty(it.data!!.isEmpty()) showContent(it.data.isNotEmpty()) updateDataSet(sortItems(it.data)) From 8528e0beff83ea39c678005879ffef77294d8451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 10 Sep 2021 11:49:22 +0200 Subject: [PATCH 0592/1526] Fix crash in school info when dialer is unavailable (#1500) --- .../main/java/io/github/wulkanowy/utils/ContextExtension.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt index 68d3afe83..2cd4459eb 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt @@ -102,7 +102,9 @@ fun Context.openNavigation(location: String) { fun Context.openDialer(phone: String) { val intentUri = Uri.parse("tel:$phone") val intent = Intent(Intent.ACTION_DIAL, intentUri) - startActivity(intent) + if (intent.resolveActivity(packageManager) != null) { + startActivity(intent) + } } fun Context.shareText(text: String, subject: String?) { From 0389642543f909a4fab31bbf6bf00b9d847bbdc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 11 Sep 2021 19:40:09 +0200 Subject: [PATCH 0593/1526] Fix empty list on excuse submit (#1501) --- .../wulkanowy/ui/modules/attendance/AttendancePresenter.kt | 2 ++ 1 file changed, 2 insertions(+) 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 fc37e50de..03545b25b 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 @@ -152,6 +152,8 @@ class AttendancePresenter @Inject constructor( fun onExcuseDialogSubmit(reason: String) { view?.finishActionMode() + if (attendanceToExcuseList.isEmpty()) return + if (isVulcanExcusedFunctionEnabled) { excuseAbsence( reason = reason.takeIf { it.isNotBlank() }, From 91f631089273c98eed453e581c2bc12cdacf3b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 11 Sep 2021 19:43:05 +0200 Subject: [PATCH 0594/1526] Restore lucky number in more view (#1504) --- .../io/github/wulkanowy/ui/modules/more/MoreFragment.kt | 8 ++++++++ .../io/github/wulkanowy/ui/modules/more/MorePresenter.kt | 2 ++ .../java/io/github/wulkanowy/ui/modules/more/MoreView.kt | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt index 2f0957c46..145b12a35 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MoreFragment.kt @@ -11,6 +11,7 @@ import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.conference.ConferenceFragment import io.github.wulkanowy.ui.modules.exam.ExamFragment import io.github.wulkanowy.ui.modules.homework.HomeworkFragment +import io.github.wulkanowy.ui.modules.luckynumber.LuckyNumberFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.message.MessageFragment @@ -66,6 +67,9 @@ class MoreFragment : BaseFragment(R.layout.fragment_more), override val examRes: Pair? get() = context?.run { getString(R.string.exam_title) to getCompatDrawable(R.drawable.ic_main_exam) } + override val luckyNumberRes: Pair? + get() = context?.run { getString(R.string.lucky_number_title) to getCompatDrawable(R.drawable.ic_more_lucky_number) } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding = FragmentMoreBinding.bind(view) @@ -128,6 +132,10 @@ class MoreFragment : BaseFragment(R.layout.fragment_more), (activity as? MainActivity)?.pushView(ExamFragment.newInstance()) } + override fun openLuckyNumberView() { + (activity as? MainActivity)?.pushView(LuckyNumberFragment.newInstance()) + } + override fun popView(depth: Int) { (activity as? MainActivity)?.popView(depth) } 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 a2b7f204e..92551d6e9 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 @@ -31,6 +31,7 @@ class MorePresenter @Inject constructor( schoolAndTeachersRes?.first -> openSchoolAndTeachersView() mobileDevicesRes?.first -> openMobileDevicesView() settingsRes?.first -> openSettingsView() + luckyNumberRes?.first -> openLuckyNumberView() } } } @@ -48,6 +49,7 @@ class MorePresenter @Inject constructor( examRes, homeworkRes, noteRes, + luckyNumberRes, conferencesRes, schoolAnnouncementRes, schoolAndTeachersRes, 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 c4a07bdcc..cb895de28 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 @@ -23,6 +23,8 @@ interface MoreView : BaseView { val examRes: Pair? + val luckyNumberRes: Pair? + fun initView() fun updateData(data: List>) @@ -46,4 +48,6 @@ interface MoreView : BaseView { fun openMobileDevicesView() fun openExamView() + + fun openLuckyNumberView() } From dddeff802ffd348958cebf6508ff0eb13ffd829b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 12 Sep 2021 17:29:46 +0200 Subject: [PATCH 0595/1526] Fix date picker crash after saved state (#1502) --- .../wulkanowy/ui/modules/attendance/AttendanceFragment.kt | 4 +++- .../modules/luckynumber/history/LuckyNumberHistoryFragment.kt | 4 +++- .../wulkanowy/ui/modules/timetable/TimetableFragment.kt | 4 +++- .../modules/timetable/additional/AdditionalLessonsFragment.kt | 4 +++- .../modules/timetable/completed/CompletedLessonsFragment.kt | 4 +++- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 058946796..3fbdaec5a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -245,7 +245,9 @@ class AttendanceFragment : BaseFragment(R.layout.frag presenter.onDateSet(date.year, date.monthValue, date.dayOfMonth) } - datePicker.show(this@AttendanceFragment.parentFragmentManager, null) + if (!parentFragmentManager.isStateSaved) { + datePicker.show(parentFragmentManager, null) + } } override fun showExcuseDialog() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt index dc141f8d3..3a84b2dd5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt @@ -131,7 +131,9 @@ class LuckyNumberHistoryFragment : presenter.onDateSet(date.year, date.monthValue, date.dayOfMonth) } - datePicker.show(this@LuckyNumberHistoryFragment.parentFragmentManager, null) + if (!parentFragmentManager.isStateSaved) { + datePicker.show(parentFragmentManager, null) + } } override fun showContent(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index 1e1084a8d..83218a0da 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -202,7 +202,9 @@ class TimetableFragment : BaseFragment(R.layout.fragme presenter.onDateSet(date.year, date.monthValue, date.dayOfMonth) } - datePicker.show(this@TimetableFragment.parentFragmentManager, null) + if (!parentFragmentManager.isStateSaved) { + datePicker.show(parentFragmentManager, null) + } } override fun openAdditionalLessonsView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt index a4e1f0fc0..47bee1e39 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt @@ -152,7 +152,9 @@ class AdditionalLessonsFragment : presenter.onDateSet(date.year, date.monthValue, date.dayOfMonth) } - datePicker.show(this@AdditionalLessonsFragment.parentFragmentManager, null) + if (!parentFragmentManager.isStateSaved) { + datePicker.show(parentFragmentManager, null) + } } override fun onSaveInstanceState(outState: Bundle) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt index ad698c1cf..b8da1c0fd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt @@ -173,7 +173,9 @@ class CompletedLessonsFragment : presenter.onDateSet(date.year, date.monthValue, date.dayOfMonth) } - datePicker.show(this@CompletedLessonsFragment.parentFragmentManager, null) + if (!parentFragmentManager.isStateSaved) { + datePicker.show(parentFragmentManager, null) + } } override fun onSaveInstanceState(outState: Bundle) { From 5a7f52c773aad5aba85b5086a78e5cd458ad7732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 13 Sep 2021 14:19:24 +0200 Subject: [PATCH 0596/1526] Update help email pre-filled content (#1507) --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cf8a07604..295d83193 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -69,7 +69,7 @@ Discord Send email Zgłoszenie: Problemy z logowaniem - Informacje o aplikacji:\n\nUrządzenie: %1$s\nWersja SDK: %2$s\nWersja aplikacji: %3$s\nDodatkowe informacje: %4$s\nOstatni błąd: %5$s\n\nOpis problemu: + Informacje o aplikacji:\n\nUrządzenie: %1$s\nWersja SDK: %2$s\nWersja aplikacji: %3$s\nDodatkowe informacje: %4$s\nOstatni błąd: %5$s\n\nOpis problemu (pełna nazwa szkoły, klasa ucznia): Make sure you select the correct UONET+ register variation! I forgot my password Recover your account From 19c96ee83ff7f6e5685ec41543c6f5d2460eb890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 13 Sep 2021 14:19:46 +0200 Subject: [PATCH 0597/1526] Unlock sunday in navigation datepicker (#1506) --- .../java/io/github/wulkanowy/utils/SchooldaysValidator.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/utils/SchooldaysValidator.kt b/app/src/main/java/io/github/wulkanowy/utils/SchooldaysValidator.kt index 00fccfc8d..b6dd528f5 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SchooldaysValidator.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SchooldaysValidator.kt @@ -2,7 +2,6 @@ package io.github.wulkanowy.utils import com.google.android.material.datepicker.CalendarConstraints import kotlinx.parcelize.Parcelize -import java.time.DayOfWeek import java.time.temporal.ChronoUnit @Parcelize @@ -12,7 +11,6 @@ class SchoolDaysValidator(val start: Long, val end: Long) : CalendarConstraints. val date = dateLong.toLocalDateTime() return date.until(end.toLocalDateTime(), ChronoUnit.DAYS) >= 0 && - date.until(start.toLocalDateTime(), ChronoUnit.DAYS) <= 0 && - date.dayOfWeek != DayOfWeek.SUNDAY + date.until(start.toLocalDateTime(), ChronoUnit.DAYS) <= 0 } -} \ No newline at end of file +} From 827fb33eeb382ceb0ddaa6d54807cb48a455c471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 13 Sep 2021 14:36:31 +0200 Subject: [PATCH 0598/1526] Fix login process after was interrupted (#1505) --- .../wulkanowy/data/db/dao/StudentDao.kt | 26 ++++---- .../data/repositories/StudentRepository.kt | 24 +++++--- .../modules/login/form/LoginFormPresenter.kt | 8 +-- .../LoginStudentSelectPresenter.kt | 60 ++++++++++--------- .../data/repositories/StudentTest.kt | 3 +- .../LoginStudentSelectPresenterTest.kt | 31 +++------- 6 files changed, 76 insertions(+), 76 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt index 0ad2ee590..3dda8a44b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt @@ -14,33 +14,39 @@ import javax.inject.Singleton @Singleton @Dao -interface StudentDao { +abstract class StudentDao { @Insert(onConflict = ABORT) - suspend fun insertAll(student: List): List + abstract suspend fun insertAll(student: List): List @Delete - suspend fun delete(student: Student) + abstract suspend fun delete(student: Student) @Update(entity = Student::class) - suspend fun update(studentNickAndAvatar: StudentNickAndAvatar) + abstract suspend fun update(studentNickAndAvatar: StudentNickAndAvatar) @Query("SELECT * FROM Students WHERE is_current = 1") - suspend fun loadCurrent(): Student? + abstract suspend fun loadCurrent(): Student? @Query("SELECT * FROM Students WHERE id = :id") - suspend fun loadById(id: Long): Student? + abstract suspend fun loadById(id: Long): Student? @Query("SELECT * FROM Students") - suspend fun loadAll(): List + abstract suspend fun loadAll(): List @Transaction @Query("SELECT * FROM Students") - suspend fun loadStudentsWithSemesters(): List + abstract suspend fun loadStudentsWithSemesters(): List @Query("UPDATE Students SET is_current = 1 WHERE id = :id") - suspend fun updateCurrent(id: Long) + abstract suspend fun updateCurrent(id: Long) @Query("UPDATE Students SET is_current = 0") - suspend fun resetCurrent() + abstract suspend fun resetCurrent() + + @Transaction + open suspend fun switchCurrent(id: Long) { + resetCurrent() + updateCurrent(id) + } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index c2f364b3d..2ac892d01 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -1,7 +1,9 @@ package io.github.wulkanowy.data.repositories import android.content.Context +import androidx.room.withTransaction import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.dao.StudentDao import io.github.wulkanowy.data.db.entities.Student @@ -25,7 +27,8 @@ class StudentRepository @Inject constructor( private val studentDb: StudentDao, private val semesterDb: SemesterDao, private val sdk: Sdk, - private val appInfo: AppInfo + private val appInfo: AppInfo, + private val appDatabase: AppDatabase ) { suspend fun isStudentSaved() = getSavedStudents(false).isNotEmpty() @@ -92,7 +95,7 @@ class StudentRepository @Inject constructor( return student } - suspend fun saveStudents(studentsWithSemesters: List): List { + suspend fun saveStudents(studentsWithSemesters: List) { val semesters = studentsWithSemesters.flatMap { it.semesters } val students = studentsWithSemesters.map { it.student } .map { @@ -104,16 +107,21 @@ class StudentRepository @Inject constructor( } } } + .mapIndexed { index, student -> + if (index == 0) { + student.copy(isCurrent = true).apply { avatarColor = student.avatarColor } + } else student + } - semesterDb.insertSemesters(semesters) - return studentDb.insertAll(students) + appDatabase.withTransaction { + studentDb.resetCurrent() + semesterDb.insertSemesters(semesters) + studentDb.insertAll(students) + } } suspend fun switchStudent(studentWithSemesters: StudentWithSemesters) { - with(studentDb) { - resetCurrent() - updateCurrent(studentWithSemesters.student.id) - } + studentDb.switchCurrent(studentWithSemesters.student.id) } suspend fun logoutStudent(student: Student) = studentDb.delete(student) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index 99dcf1bb3..d79c422d4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -90,10 +90,10 @@ class LoginFormPresenter @Inject constructor( flowWithResource { studentRepository.getStudentsScrapper( - email, - password, - host, - symbol + email = email, + password = password, + scrapperBaseUrl = host, + symbol = symbol ) }.onEach { when (it.status) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index c344bf441..f0f5586cc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -78,7 +78,9 @@ class LoginStudentSelectPresenter @Inject constructor( when (it.status) { Status.LOADING -> Timber.d("Login student select students load started") Status.SUCCESS -> view?.updateData(studentsWithSemesters.map { studentWithSemesters -> - studentWithSemesters to it.data!!.any { item -> compareStudents(studentWithSemesters.student, item.student) } + studentWithSemesters to it.data!!.any { item -> + compareStudents(studentWithSemesters.student, item.student) + } }) Status.ERROR -> { errorHandler.dispatch(it.error!!) @@ -95,35 +97,32 @@ class LoginStudentSelectPresenter @Inject constructor( } private fun registerStudents(studentsWithSemesters: List) { - flowWithResource { - val savedStudents = studentRepository.saveStudents(studentsWithSemesters) - val firstRegistered = studentsWithSemesters.first().apply { student.id = savedStudents.first() } - studentRepository.switchStudent(firstRegistered) - }.onEach { - when (it.status) { - Status.LOADING -> view?.run { - Timber.i("Registration started") - showProgress(true) - showContent(false) - } - Status.SUCCESS -> { - Timber.i("Registration result: Success") - view?.openMainView() - logRegisterEvent(studentsWithSemesters) - } - Status.ERROR -> { - Timber.i("Registration result: An exception occurred ") - view?.apply { - showProgress(false) - showContent(true) - showContact(true) + flowWithResource { studentRepository.saveStudents(studentsWithSemesters) } + .onEach { + when (it.status) { + Status.LOADING -> view?.run { + Timber.i("Registration started") + showProgress(true) + showContent(false) + } + Status.SUCCESS -> { + Timber.i("Registration result: Success") + view?.openMainView() + logRegisterEvent(studentsWithSemesters) + } + Status.ERROR -> { + Timber.i("Registration result: An exception occurred ") + view?.apply { + showProgress(false) + showContent(true) + showContact(true) + } + lastError = it.error + loginErrorHandler.dispatch(it.error!!) + logRegisterEvent(studentsWithSemesters, it.error) } - lastError = it.error - loginErrorHandler.dispatch(it.error!!) - logRegisterEvent(studentsWithSemesters, it.error) } - } - }.launch("register") + }.launch("register") } fun onDiscordClick() { @@ -134,7 +133,10 @@ class LoginStudentSelectPresenter @Inject constructor( view?.openEmail(lastError?.message.ifNullOrBlank { "empty" }) } - private fun logRegisterEvent(studentsWithSemesters: List, error: Throwable? = null) { + private fun logRegisterEvent( + studentsWithSemesters: List, + error: Throwable? = null + ) { studentsWithSemesters.forEach { student -> analytics.logEvent( "registration_student_select", diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt index 402b22723..b34bbf1b2 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt @@ -37,7 +37,8 @@ class StudentTest { studentDb, semesterDb, mockSdk, - AppInfo() + AppInfo(), + mockk() ) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index 9e34235e7..c79d739e8 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -89,24 +89,11 @@ class LoginStudentSelectPresenterTest { @Test fun onSelectedStudentTest() { coEvery { - studentRepository.saveStudents( - listOf( - StudentWithSemesters( - testStudent, - emptyList() - ) - ) - ) - } returns listOf(1L) - coEvery { - studentRepository.switchStudent( - StudentWithSemesters( - testStudent, - emptyList() - ) - ) + studentRepository.saveStudents(listOf(StudentWithSemesters(testStudent, emptyList()))) } just Runs + every { loginStudentSelectView.openMainView() } just Runs + presenter.onItemSelected(StudentWithSemesters(testStudent, emptyList()), false) presenter.onSignIn() @@ -118,18 +105,14 @@ class LoginStudentSelectPresenterTest { @Test fun onSelectedStudentErrorTest() { coEvery { - studentRepository.saveStudents( - listOf( - StudentWithSemesters( - testStudent, - emptyList() - ) - ) - ) + studentRepository.saveStudents(listOf(StudentWithSemesters(testStudent, emptyList()))) } throws testException + coEvery { studentRepository.logoutStudent(testStudent) } just Runs + presenter.onItemSelected(StudentWithSemesters(testStudent, emptyList()), false) presenter.onSignIn() + verify { loginStudentSelectView.showContent(false) } verify { loginStudentSelectView.showProgress(true) } verify { errorHandler.dispatch(match { testException.message == it.message }) } From 957adaf6ee2708c71dcc624bfce9409e3ff5e0db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 13 Sep 2021 14:53:27 +0200 Subject: [PATCH 0599/1526] Version 1.2.2 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d1975e1ab..745859988 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 30 - versionCode 94 - versionName "1.2.1" + versionCode 95 + versionName "1.2.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -157,7 +157,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:1.2.1" + implementation "io.github.wulkanowy:sdk:1.2.2" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index aeef2a77e..3456c3d03 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,7 +1,8 @@ -Wersja 1.2.1 +Wersja 1.2.2 -- dodaliśmy brakujące okienka z podglądem szczegółów ogłoszeń szkolnych -- naprawiliśmy rzucające się w oczy błędy na ekranie startowym -- naprawiliśmy też inne drobne błędy w wyglądzie i stabilności aplikacji +- naprawiliśmy problem z widocznością zadań w aplikacji gdy widoczne są one na stronie www dziennika (nadal pozostaje błąd z zadaniami widocznymi tylko w oficjalnej aplikacji - czekamy na poprawkę po stronie VULCANa) +- odblokowaliśmy niedzielę w wyborze daty w planie lekcji i innych zakładkach +- przywróciliśmy odnośnik do szczęśliwego numerka w menu Więcej +- naprawiliśmy drobne błędy ze stabilnością i wyglądem Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 7ec7afed87333af6ee460e87a57bb3bf3cb3a8fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Sep 2021 08:22:06 +0000 Subject: [PATCH 0600/1526] Bump firebase-bom from 28.4.0 to 28.4.1 (#1520) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 745859988..8e8be8bb1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -211,7 +211,7 @@ dependencies { implementation 'me.xdrop:fuzzywuzzy:1.3.1' implementation 'com.fredporciuncula:flow-preferences:1.5.0' - playImplementation platform('com.google.firebase:firebase-bom:28.4.0') + playImplementation platform('com.google.firebase:firebase-bom:28.4.1') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From 037dbd792f6d5b5381419ee6529cfc9156598e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 16 Sep 2021 10:51:38 +0200 Subject: [PATCH 0601/1526] Add conference dialog (#1519) --- .../modules/conference/ConferenceAdapter.kt | 7 +- .../ui/modules/conference/ConferenceDialog.kt | 60 +++++ .../modules/conference/ConferenceFragment.kt | 13 +- .../modules/conference/ConferencePresenter.kt | 5 + .../ui/modules/conference/ConferenceView.kt | 2 + .../SchoolAnnouncementDialog.kt | 2 +- app/src/main/res/layout/dialog_conference.xml | 211 ++++++++++++++++++ .../res/layout/dialog_school_announcement.xml | 1 + app/src/main/res/values/strings.xml | 6 +- 9 files changed, 303 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceDialog.kt create mode 100644 app/src/main/res/layout/dialog_conference.xml diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceAdapter.kt index c87286149..f63b293cf 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceAdapter.kt @@ -14,6 +14,8 @@ class ConferenceAdapter @Inject constructor() : var items = emptyList() + var onItemClickListener: (Conference) -> Unit = {} + override fun getItemCount() = items.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( @@ -28,7 +30,10 @@ class ConferenceAdapter @Inject constructor() : conferenceItemTitle.text = item.title conferenceItemSubject.text = item.subject conferenceItemContent.text = item.agenda - conferenceItemContent.visibility = if (item.agenda.isBlank()) View.GONE else View.VISIBLE + conferenceItemContent.visibility = + if (item.agenda.isBlank()) View.GONE else View.VISIBLE + + root.setOnClickListener { onItemClickListener(item) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceDialog.kt new file mode 100644 index 000000000..477b762b9 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceDialog.kt @@ -0,0 +1,60 @@ +package io.github.wulkanowy.ui.modules.conference + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.isVisible +import androidx.fragment.app.DialogFragment +import io.github.wulkanowy.data.db.entities.Conference +import io.github.wulkanowy.databinding.DialogConferenceBinding +import io.github.wulkanowy.utils.lifecycleAwareVariable +import io.github.wulkanowy.utils.toFormattedString + +class ConferenceDialog : DialogFragment() { + + private var binding: DialogConferenceBinding by lifecycleAwareVariable() + + private lateinit var conference: Conference + + companion object { + + private const val ARGUMENT_KEY = "item" + + fun newInstance(conference: Conference) = ConferenceDialog().apply { + arguments = Bundle().apply { putSerializable(ARGUMENT_KEY, conference) } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, 0) + arguments?.let { + conference = it.getSerializable(ARGUMENT_KEY) as Conference + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ) = DialogConferenceBinding.inflate(inflater).also { binding = it }.root + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + with(binding) { + conferenceDialogClose.setOnClickListener { dismiss() } + + conferenceDialogSubjectValue.text = conference.subject + conferenceDialogDateValue.text = conference.date.toFormattedString("dd.MM.yyyy HH:mm") + conferenceDialogHeaderValue.text = conference.title + conferenceDialogAgendaValue.text = conference.agenda + conferenceDialogPresentValue.text = conference.presentOnConference + conferenceDialogPresentValue.isVisible = conference.presentOnConference.isNotBlank() + conferenceDialogPresentTitle.isVisible = conference.presentOnConference.isNotBlank() + conferenceDialogAgendaValue.isVisible = conference.agenda.isNotBlank() + conferenceDialogAgendaTitle.isVisible = conference.agenda.isNotBlank() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceFragment.kt index dd10a65e0..b9642b1c7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceFragment.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Conference import io.github.wulkanowy.databinding.FragmentConferenceBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.getThemeAttrColor @@ -41,6 +42,8 @@ class ConferenceFragment : BaseFragment(R.layout.frag } override fun initView() { + conferencesAdapter.onItemClickListener = presenter::onItemSelected + with(binding.conferenceRecycler) { layoutManager = LinearLayoutManager(context) adapter = conferencesAdapter @@ -50,7 +53,11 @@ class ConferenceFragment : BaseFragment(R.layout.frag with(binding) { conferenceSwipe.setOnRefreshListener(presenter::onSwipeRefresh) conferenceSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) - conferenceSwipe.setProgressBackgroundColorSchemeColor(requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh)) + conferenceSwipe.setProgressBackgroundColorSchemeColor( + requireContext().getThemeAttrColor( + R.attr.colorSwipeRefresh + ) + ) conferenceErrorRetry.setOnClickListener { presenter.onRetry() } conferenceErrorDetails.setOnClickListener { presenter.onDetailsClick() } } @@ -98,6 +105,10 @@ class ConferenceFragment : BaseFragment(R.layout.frag binding.conferenceRecycler.visibility = if (show) View.VISIBLE else View.GONE } + override fun openConferenceDialog(conference: Conference) { + (activity as? MainActivity)?.showDialogFragment(ConferenceDialog.newInstance(conference)) + } + override fun onDestroyView() { presenter.onDetachView() super.onDestroyView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferencePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferencePresenter.kt index cc7e50db5..dab170daa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferencePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferencePresenter.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.modules.conference import io.github.wulkanowy.data.Status +import io.github.wulkanowy.data.db.entities.Conference import io.github.wulkanowy.data.repositories.ConferenceRepository import io.github.wulkanowy.data.repositories.SemesterRepository import io.github.wulkanowy.data.repositories.StudentRepository @@ -43,6 +44,10 @@ class ConferencePresenter @Inject constructor( loadData(true) } + fun onItemSelected(conference: Conference) { + view?.openConferenceDialog(conference) + } + fun onDetailsClick() { view?.showErrorDetailsDialog(lastError) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceView.kt index f3d1b3b3f..4f73394df 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceView.kt @@ -26,4 +26,6 @@ interface ConferenceView : BaseView { fun enableSwipe(enable: Boolean) fun showContent(show: Boolean) + + fun openConferenceDialog(conference: Conference) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementDialog.kt index ed4b0ac98..7dcd51cea 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementDialog.kt @@ -38,7 +38,7 @@ class SchoolAnnouncementDialog : DialogFragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ) = DialogSchoolAnnouncementBinding.inflate(inflater).apply { binding = this }.root + ) = DialogSchoolAnnouncementBinding.inflate(inflater).also { binding = it }.root override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/res/layout/dialog_conference.xml b/app/src/main/res/layout/dialog_conference.xml new file mode 100644 index 000000000..d08edf4f7 --- /dev/null +++ b/app/src/main/res/layout/dialog_conference.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_school_announcement.xml b/app/src/main/res/layout/dialog_school_announcement.xml index cbce4e025..96c11d4a4 100644 --- a/app/src/main/res/layout/dialog_school_announcement.xml +++ b/app/src/main/res/layout/dialog_school_announcement.xml @@ -118,6 +118,7 @@ android:layout_marginEnd="24dp" android:paddingStart="0dp" android:paddingEnd="16dp" + tools:maxLines="5" android:text="@string/all_no_data" android:textIsSelectable="true" android:textSize="16sp" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 295d83193..de85614bc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -336,10 +336,12 @@ Today\'s lucky number is: %s Show history + Lucky number history No info about lucky numbers + Mobile devices No devices @@ -388,7 +390,8 @@ You have %1$d new conference You have %1$d new conferences - + Present at conference + Agenda School announcements @@ -585,6 +588,7 @@ Yes No Save + Title From da668f93cf309f4ae4c86f492b23849ca3c66dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 16 Sep 2021 11:24:52 +0200 Subject: [PATCH 0602/1526] Fix bugs in dashboard (#1517) --- .../ui/modules/dashboard/DashboardAdapter.kt | 11 +++- .../ui/modules/dashboard/DashboardFragment.kt | 9 ++-- .../modules/dashboard/DashboardPresenter.kt | 50 +++++++++++-------- .../ui/modules/timetable/TimetableFragment.kt | 14 +++++- .../res/layout/subitem_dashboard_grades.xml | 4 +- 5 files changed, 56 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt index 0eda49326..11b575c1c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt @@ -53,7 +53,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter Unit = {} - var onLessonsTileClickListener: () -> Unit = {} + var onLessonsTileClickListener: (LocalDate) -> Unit = {} var onHomeworkTileClickListener: () -> Unit = {} @@ -275,10 +275,12 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { + dateToNavigate = currentDate updateLessonView(item, currentTimetable, binding) binding.dashboardLessonsItemTitleTomorrow.isVisible = false } tomorrowTimetable.isNotEmpty() -> { + dateToNavigate = tomorrowDate updateLessonView(item, tomorrowTimetable, binding) binding.dashboardLessonsItemTitleTomorrow.isVisible = true } currentDayHeader != null && currentDayHeader.content.isNotBlank() -> { + dateToNavigate = currentDate updateLessonView(item, emptyList(), binding, currentDayHeader) binding.dashboardLessonsItemTitleTomorrow.isVisible = false } tomorrowDayHeader != null && tomorrowDayHeader.content.isNotBlank() -> { + dateToNavigate = tomorrowDate updateLessonView(item, emptyList(), binding, tomorrowDayHeader) binding.dashboardLessonsItemTitleTomorrow.isVisible = true } else -> { + dateToNavigate = tomorrowDate updateLessonView(item, emptyList(), binding) binding.dashboardLessonsItemTitleTomorrow.isVisible = !(item.isLoading && item.error == null) @@ -326,7 +333,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter(R.layout.fragme override fun initView() { val mainActivity = requireActivity() as MainActivity val itemTouchHelper = ItemTouchHelper( - DashboardItemMoveCallback( - dashboardAdapter, - presenter::onDragAndDropEnd - ) + DashboardItemMoveCallback(dashboardAdapter, presenter::onDragAndDropEnd) ) dashboardAdapter.apply { @@ -87,7 +84,9 @@ class DashboardFragment : BaseFragment(R.layout.fragme onAttendanceTileClickListener = { mainActivity.pushView(AttendanceSummaryFragment.newInstance()) } - onLessonsTileClickListener = { mainActivity.pushView(TimetableFragment.newInstance()) } + onLessonsTileClickListener = { + mainActivity.pushView(TimetableFragment.newInstance(it)) + } onGradeTileClickListener = { mainActivity.pushView(GradeFragment.newInstance()) } onHomeworkTileClickListener = { mainActivity.pushView(HomeworkFragment.newInstance()) } onAnnouncementsTileClickListener = { 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 027bcc053..108a086b7 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 @@ -492,31 +492,37 @@ class DashboardPresenter @Inject constructor( end = LocalDate.now().plusDays(7), forceRefresh = forceRefresh ) - }.onEach { - when (it.status) { - Status.LOADING -> { - Timber.i("Loading dashboard exams data started") - if (forceRefresh) return@onEach - updateData( - DashboardItem.Exams(it.data.orEmpty(), isLoading = true), - forceRefresh - ) + } + .map { examResource -> + val sortedExams = examResource.data?.sortedBy { it.date } - if (!it.data.isNullOrEmpty()) { - firstLoadedItemList += DashboardItem.Type.EXAMS + examResource.copy(data = sortedExams) + } + .onEach { + when (it.status) { + Status.LOADING -> { + Timber.i("Loading dashboard exams data started") + if (forceRefresh) return@onEach + updateData( + DashboardItem.Exams(it.data.orEmpty(), isLoading = true), + forceRefresh + ) + + if (!it.data.isNullOrEmpty()) { + firstLoadedItemList += DashboardItem.Type.EXAMS + } + } + Status.SUCCESS -> { + Timber.i("Loading dashboard exams result: Success") + updateData(DashboardItem.Exams(it.data ?: emptyList()), forceRefresh) + } + Status.ERROR -> { + Timber.i("Loading dashboard exams result: An exception occurred") + errorHandler.dispatch(it.error!!) + updateData(DashboardItem.Exams(error = it.error), forceRefresh) } } - Status.SUCCESS -> { - Timber.i("Loading dashboard exams result: Success") - updateData(DashboardItem.Exams(it.data ?: emptyList()), forceRefresh) - } - Status.ERROR -> { - Timber.i("Loading dashboard exams result: An exception occurred") - errorHandler.dispatch(it.error!!) - updateData(DashboardItem.Exams(error = it.error), forceRefresh) - } - } - }.launch("dashboard_exams") + }.launch("dashboard_exams") } private fun loadConferences(student: Student, forceRefresh: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index 83218a0da..4478a2a66 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -44,7 +44,13 @@ class TimetableFragment : BaseFragment(R.layout.fragme companion object { private const val SAVED_DATE_KEY = "CURRENT_DATE" - fun newInstance() = TimetableFragment() + private const val ARGUMENT_DATE_KEY = "ARGUMENT_DATE" + + fun newInstance(date: LocalDate? = null) = TimetableFragment().apply { + arguments = Bundle().apply { + date?.let { putLong(ARGUMENT_DATE_KEY, it.toEpochDay()) } + } + } } override val titleStringId get() = R.string.timetable_title @@ -62,7 +68,11 @@ class TimetableFragment : BaseFragment(R.layout.fragme super.onViewCreated(view, savedInstanceState) binding = FragmentTimetableBinding.bind(view) messageContainer = binding.timetableRecycler - presenter.onAttachView(this, savedInstanceState?.getLong(SAVED_DATE_KEY)) + + val initDate = savedInstanceState?.getLong(SAVED_DATE_KEY) + ?: arguments?.getLong(ARGUMENT_DATE_KEY)?.takeUnless { it == 0L } + + presenter.onAttachView(this, initDate) } override fun initView() { diff --git a/app/src/main/res/layout/subitem_dashboard_grades.xml b/app/src/main/res/layout/subitem_dashboard_grades.xml index 61faa6ac2..9354be3d6 100644 --- a/app/src/main/res/layout/subitem_dashboard_grades.xml +++ b/app/src/main/res/layout/subitem_dashboard_grades.xml @@ -11,12 +11,13 @@ android:layout_height="wrap_content" android:ellipsize="end" android:includeFontPadding="false" + android:maxEms="15" android:maxLines="1" android:textSize="13sp" app:layout_constraintBottom_toBottomOf="@id/dashboard_grades_subitem_grade_container" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/dashboard_grades_subitem_grade_container" - tools:text="Urządzenia techniki kompu..." /> + tools:text="Urządzenia techniki komputerowych" /> From c568bc1515c3937e9b5bc5b3da959a27bdc28757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 16 Sep 2021 11:29:11 +0200 Subject: [PATCH 0603/1526] Fix ghost account after logout not current student (#1518) --- .../accountdetails/AccountDetailsFragment.kt | 6 +++++- .../accountdetails/AccountDetailsPresenter.kt | 15 +++++++++++---- .../account/accountdetails/AccountDetailsView.kt | 4 +++- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt index a9890ad9a..c3137ec58 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt @@ -121,10 +121,14 @@ class AccountDetailsFragment : } } - override fun popView() { + override fun popViewToMain() { (requireActivity() as MainActivity).popView(2) } + override fun popViewToAccounts() { + (requireActivity() as MainActivity).popView(1) + } + override fun recreateMainView() { requireActivity().recreate() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt index d4cba580a..1f44cbbc3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsPresenter.kt @@ -119,7 +119,7 @@ class AccountDetailsPresenter @Inject constructor( } } }.afterLoading { - view?.popView() + view?.popViewToMain() }.launch("switch") } @@ -152,11 +152,14 @@ class AccountDetailsPresenter @Inject constructor( syncManager.stopSyncWorker() openClearLoginView() } - studentWithSemesters!!.student.isCurrent -> { + studentWithSemesters?.student?.isCurrent == true -> { Timber.i("Logout result: Logout student and switch to another") recreateMainView() } - else -> Timber.i("Logout result: Logout student") + else -> { + Timber.i("Logout result: Logout student") + recreateMainView() + } } } Status.ERROR -> { @@ -165,7 +168,11 @@ class AccountDetailsPresenter @Inject constructor( } } }.afterLoading { - view?.popView() + if (studentWithSemesters?.student?.isCurrent == true) { + view?.popViewToMain() + } else { + view?.popViewToAccounts() + } }.launch("logout") } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsView.kt index 652f0c1aa..aeb743fa5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsView.kt @@ -15,7 +15,9 @@ interface AccountDetailsView : BaseView { fun showLogoutConfirmDialog() - fun popView() + fun popViewToMain() + + fun popViewToAccounts() fun recreateMainView() From 258782c6481e13935ca6724bbd17b820f5dead80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 16 Sep 2021 11:30:05 +0200 Subject: [PATCH 0604/1526] New Crowdin updates (#1482) --- app/src/main/res/values-cs/strings.xml | 43 ++++++++++++++------------ app/src/main/res/values-de/strings.xml | 3 ++ app/src/main/res/values-pl/strings.xml | 37 ++++++++++++---------- app/src/main/res/values-ru/strings.xml | 3 ++ app/src/main/res/values-sk/strings.xml | 43 ++++++++++++++------------ app/src/main/res/values-uk/strings.xml | 3 ++ 6 files changed, 75 insertions(+), 57 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index fedbc9037..33ac36161 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -402,6 +402,8 @@ Máte %1$d nových setkání Máte %1$d nových setkání + Present at conference + Agenda Školní oznámení Žádná školní oznámení @@ -516,10 +518,10 @@ Další: Později: - ještě %1$d další lekce - ještě %1$d další lekce - ještě %1$d dalších lekcí - ještě %1$d dalších lekcí + ještě %1$d lekce + ještě %1$d lekce + ještě %1$d lekcí + ještě %1$d lekcí do %1$s Žádné nadcházející lekce @@ -528,10 +530,10 @@ Žádné domácí úkoly do vykonána Při načítání domácích úkolů došlo k chybě - Ještě %1$d další domácí úkol - Ještě %1$d další domácí úkoly - Ještě %1$d dalších domácích úkolů - Ještě %1$d dalších domácích úkolů + Ještě %1$d domácí úkol + Ještě %1$d domácí úkoly + Ještě %1$d domácích úkolů + Ještě %1$d domácích úkolů do %1$s Poslední známky @@ -541,28 +543,28 @@ Žádná aktuální oznámení Při načítání oznámení došlo k chybě - Ještě %1$d další oznámení - Ještě %1$d další oznámení - Ještě %1$d dalších oznámení - Ještě %1$d dalších oznámení + Ještě %1$d oznámení + Ještě %1$d oznámení + Ještě %1$d oznámení + Ještě %1$d oznámení Zkoušky Žádné nadcházející zkoušky Při načítání zkoušek došlo k chybě - Ještě %1$d další zkouška - Ještě %1$d další zkoušky - Ještě %1$d dalších zkoušek - Ještě %1$d dalších zkoušek + Ještě %1$d zkouška + Ještě %1$d zkoušky + Ještě %1$d zkoušek + Ještě %1$d zkoušek Setkání Žádná nadcházející setkání Při načítání setkání došlo k chybě - Ještě %1$d další setkání - Ještě %1$d další setkání - Ještě %1$d dalších setkání - Ještě %1$d dalších setkání + Ještě %1$d setkání + Ještě %1$d setkání + Ještě %1$d setkání + Ještě %1$d setkání Při načítání dat došlo k chybě Žádné @@ -590,6 +592,7 @@ Ano Ne Uložit + Title Žádné lekce Vybrat motiv diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5f14a4258..f86c3076a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -344,6 +344,8 @@ Sie haben %1$d neue konferenz Sie haben %1$d neue konferenzen + Present at conference + Agenda Schulankündigungen Keine schulankündigungen @@ -512,6 +514,7 @@ Ja Nein Speichern + Title Keine Lektionen Thema wählen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 14f23cd29..cfc6810e7 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -402,6 +402,8 @@ Masz %1$d nowych zebrań Masz %1$d nowych zebrań + Obecność na zebraniu + Agenda Ogłoszenia szkolne Brak ogłoszeń szkolnych @@ -516,10 +518,10 @@ Następnie: Później: - jeszcze %1$d dodatkowa lekcja - jeszcze %1$d dodatkowe lekcje - jeszcze %1$d dodatkowych lekcji - jeszcze %1$d dodatkowych lekcji + jeszcze %1$d lekcja + jeszcze %1$d lekcje + jeszcze %1$d lekcji + jeszcze %1$d lekcji do %1$s Brak nadchodzących lekcji @@ -528,10 +530,10 @@ Brak prac domowych do wykonania Wystąpił błąd podczas ładowania zadań domowych - Jeszcze %1$d dodatkowe zadanie domowe - Jeszcze %1$d dodatkowe zadania domowe - Jeszcze %1$d dodatkowych zadań domowych - Jeszcze %1$d dodatkowych zadań domowych + Jeszcze %1$d zadanie domowe + Jeszcze %1$d zadania domowe + Jeszcze %1$d zadań domowych + Jeszcze %1$d zadań domowych do %1$s Ostatnie oceny @@ -541,19 +543,19 @@ Brak aktualnych ogłoszeń Wystąpił błąd podczas ładowania ogłoszeń - Jeszcze %1$d dodatkowe ogłoszenie - Jeszcze %1$d dodatkowe ogłoszenia - Jeszcze %1$d dodatkowych ogłoszeń - Jeszcze %1$d dodatkowych ogłoszeń + Jeszcze %1$d ogłoszenie + Jeszcze %1$d ogłoszenia + Jeszcze %1$d ogłoszeń + Jeszcze %1$d ogłoszeń Sprawdziany Brak nadchodzących sprawdzianów Wystąpił błąd podczas ładowania sprawdzianów - Jeszcze %1$d dodatkowy sprawdzian - Jeszcze %1$d dodatkowe sprawdziany - Jeszcze %1$d dodatkowych sprawdzianów - Jeszcze %1$d dodatkowych sprawdzianów + Jeszcze %1$d sprawdzian + Jeszcze %1$d sprawdziany + Jeszcze %1$d sprawdzianów + Jeszcze %1$d sprawdzianów Zebrania Brak nadchodzących zebrań @@ -562,7 +564,7 @@ Jeszcze %1$d dodatkowe zebranie Jeszcze %1$d dodatkowe zebrania Jeszcze %1$d dodatkowych zebrań - Jeszcze %1$d dodatkowych zebrań + Jeszcze %1$d zebrań Wystąpił błąd podczas ładowania danych Brak @@ -590,6 +592,7 @@ Tak Nie Zapisz + Tytuł Brak lekcji Wybierz motyw diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 09b8a146d..4e41088fd 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -402,6 +402,8 @@ У вас %1$d новая конференция У вас %1$d новых конференций + Present at conference + Agenda Объявления школ Нет объявлений о школе @@ -590,6 +592,7 @@ Да Нет Сохранить + Title Нет уроков Выбрать тему diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index ad078e33f..75a42467d 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -402,6 +402,8 @@ Máte %1$d nových stretnutí Máte %1$d nových stretnutí + Present at conference + Agenda Školské oznámenia Žiadne školské oznámenia @@ -516,10 +518,10 @@ Ďalej: Neskôr: - ešte %1$d ďalší lekcia - ešte %1$d ďalšie lekcie - ešte %1$d ďalších lekcií - ešte %1$d ďalších lekcií + ešte %1$d lekcia + ešte %1$d lekcie + ešte %1$d lekcií + ešte %1$d lekcií do %1$s Žiadne nadchádzajúce lekcie @@ -528,10 +530,10 @@ Žiadne domáce úlohy do vykonaná Pri načítaní domácich úloh došlo k chybe - Ešte %1$d ďalšia domáca úloha - Ešte %1$d ďalšie domáce úlohy - Ešte %1$d ďalších domácich úloh - Ešte %1$d ďalších domácich úloh + Ešte %1$d domáca úloha + Ešte %1$d domáce úlohy + Ešte %1$d domácich úloh + Ešte %1$d domácich úloh do %1$s Posledné známky @@ -541,28 +543,28 @@ Žiadne aktuálne oznámenia Pri načítaní oznámení došlo k chybe - Ešte %1$d ďalšie oznámenie - Ešte %1$d ďalšie oznámenia - Ešte %1$d ďalších oznámení - Ešte %1$d ďalších oznámení + Ešte %1$d oznámenie + Ešte %1$d oznámenia + Ešte %1$d oznámení + Ešte %1$d oznámení Skúšky Žiadne nadchádzajúce skúšky Pri načítaní skúšok došlo k chybe - Ešte %1$d ďalšia skúška - Ešte %1$d ďalšie skúšky - Ešte %1$d ďalších skúšok - Ešte %1$d ďalších skúšok + Ešte %1$d skúška + Ešte %1$d skúšky + Ešte %1$d skúšok + Ešte %1$d skúšok Stretnutie Žiadna nadchádzajúce stretnutie Pri načítaní stretnutí došlo k chybe - Ešte %1$d ďalšie stretnutie - Ešte %1$d ďalšie stretnutia - Ešte %1$d ďalších stretnutí - Ešte %1$d ďalších stretnutí + Ešte %1$d stretnutie + Ešte %1$d stretnutia + Ešte %1$d stretnutí + Ešte %1$d stretnutí Pri načítaní dát došlo k chybe Žiadne @@ -590,6 +592,7 @@ Áno Nie Uložiť + Title Žiadne lekcie Vybrať motív diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 41f1c300c..51f258818 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -402,6 +402,8 @@ У вас є %1$d нова конференція У вас є %1$d нових конференцій + Present at conference + Agenda Оголошення школи Жодних навчальних оголошень @@ -590,6 +592,7 @@ Так Ні Зберегти + Title Брак уроків Увібрати тему From 5ba8289c8707840ec45b1ba6d182d5052513c027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 16 Sep 2021 11:59:23 +0200 Subject: [PATCH 0605/1526] Display info in timetable as-is when lesson has change flag (#1521) --- app/build.gradle | 2 +- .../wulkanowy/ui/modules/timetable/TimetableDialog.kt | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8e8be8bb1..7436ffcda 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -157,7 +157,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:1.2.2" + implementation "io.github.wulkanowy:sdk:d74acd3989" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt index 3f8622f85..bead8fb2c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableDialog.kt @@ -13,7 +13,6 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.databinding.DialogTimetableBinding import io.github.wulkanowy.utils.capitalise -import io.github.wulkanowy.utils.decapitalise import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.lifecycleAwareVariable import io.github.wulkanowy.utils.toFormattedString @@ -52,7 +51,7 @@ class TimetableDialog : DialogFragment() { super.onViewCreated(view, savedInstanceState) with(lesson) { - setInfo(info, teacher, canceled, changes) + setInfo(info, canceled, changes) setSubject(subject, subjectOld) setTeacher(teacher, teacherOld) setGroup(group) @@ -80,7 +79,7 @@ class TimetableDialog : DialogFragment() { } @SuppressLint("DefaultLocale") - private fun setInfo(info: String, teacher: String, canceled: Boolean, changes: Boolean) { + private fun setInfo(info: String, canceled: Boolean, changes: Boolean) { with(binding) { when { info.isNotBlank() -> { @@ -102,8 +101,6 @@ class TimetableDialog : DialogFragment() { timetableDialogChangesValue.text = when { canceled && !changes -> "Lekcja odwołana: $info" - changes && teacher.isNotBlank() -> "Zastępstwo: $teacher" - changes && teacher.isBlank() -> "Zastępstwo, ${info.decapitalise()}" else -> info.capitalise() } } From 9cb4754132e5b787b29d47eabe6c8c7990b3e8a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 16 Sep 2021 12:01:49 +0200 Subject: [PATCH 0606/1526] Version 1.2.3 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7436ffcda..814fce3e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 30 - versionCode 95 - versionName "1.2.2" + versionCode 96 + versionName "1.2.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -157,7 +157,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:d74acd3989" + implementation "io.github.wulkanowy:sdk:1.2.3" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 3456c3d03..7de10a26b 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,8 +1,8 @@ -Wersja 1.2.2 +Wersja 1.2.3 -- naprawiliśmy problem z widocznością zadań w aplikacji gdy widoczne są one na stronie www dziennika (nadal pozostaje błąd z zadaniami widocznymi tylko w oficjalnej aplikacji - czekamy na poprawkę po stronie VULCANa) -- odblokowaliśmy niedzielę w wyborze daty w planie lekcji i innych zakładkach -- przywróciliśmy odnośnik do szczęśliwego numerka w menu Więcej -- naprawiliśmy drobne błędy ze stabilnością i wyglądem +- naprawiliśmy pomieszane imiona nauczycieli z salami w planie lekcji +- dodaliśmy brakujące okienka ze szczegółami na ekranie zebrań +- klikając w kafelek z lekcjami na jutro aplikacja teraz przekierowuje na ekran z planem na jutro +- naprawiliśmy błąd przy wylogowywaniu innego niż bieżący uczeń Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 6e5481f3459981d20ac989ca214cad6123528de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 20 Sep 2021 11:38:13 +0200 Subject: [PATCH 0607/1526] Upgrade Gradle Play Publisher to 3.6.0 (#1526) --- .github/workflows/deploy-store.yml | 10 ++++------ app/build.gradle | 7 +++++-- app/key.p12.gpg | Bin 5129 -> 0 bytes build.gradle | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) delete mode 100644 app/key.p12.gpg diff --git a/.github/workflows/deploy-store.yml b/.github/workflows/deploy-store.yml index 8015ef640..068b9c106 100644 --- a/.github/workflows/deploy-store.yml +++ b/.github/workflows/deploy-store.yml @@ -28,15 +28,14 @@ jobs: SERVICES_ENCRYPT_KEY: ${{ secrets.SERVICES_ENCRYPT_KEY }} run: | gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg - gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg - name: Upload apk to google play env: + PLAY_STORE_PASSWORD: ${{ secrets.PLAY_STORE_PASSWORD }} PLAY_KEY_ALIAS: ${{ secrets.PLAY_KEY_ALIAS }} PLAY_KEY_PASSWORD: ${{ secrets.PLAY_KEY_PASSWORD }} - PLAY_SERVICE_ACCOUNT_EMAIL: ${{ secrets.PLAY_SERVICE_ACCOUNT_EMAIL }} - PLAY_STORE_PASSWORD: ${{ secrets.PLAY_STORE_PASSWORD }} - run: ./gradlew publishPlayRelease -PenableFirebase --stacktrace; + ANDROID_PUBLISHER_CREDENTIALS: ${{ secrets.ANDROID_PUBLISHER_CREDENTIALS }} + run: ./gradlew publishPlayReleaseApps -PenableFirebase --stacktrace; deploy-app-gallery: name: Deploy to AppGallery @@ -60,7 +59,6 @@ jobs: SERVICES_ENCRYPT_KEY: ${{ secrets.SERVICES_ENCRYPT_KEY }} run: | gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/agconnect-services.json.gpg - gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg - name: Prepare credentials env: @@ -68,7 +66,7 @@ jobs: run: echo $AGC_CREDENTIALS > ./app/src/release/agconnect-credentials.json - name: Build and publish HMS version env: + PLAY_STORE_PASSWORD: ${{ secrets.PLAY_STORE_PASSWORD }} PLAY_KEY_ALIAS: ${{ secrets.PLAY_KEY_ALIAS }} PLAY_KEY_PASSWORD: ${{ secrets.PLAY_KEY_PASSWORD }} - PLAY_STORE_PASSWORD: ${{ secrets.PLAY_STORE_PASSWORD }} run: ./gradlew bundleHmsRelease --stacktrace && ./gradlew publishHuaweiAppGalleryHmsRelease --stacktrace diff --git a/app/build.gradle b/app/build.gradle index 814fce3e0..466924b0f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,6 +96,10 @@ android { } } + playConfigs { + play { enabled.set(true) } + } + buildFeatures { viewBinding true } @@ -130,11 +134,10 @@ kapt { } play { - serviceAccountEmail = System.getenv("PLAY_SERVICE_ACCOUNT_EMAIL") ?: "jan@fakelog.cf" - serviceAccountCredentials = file('key.p12') defaultToAppBundles = false track = 'production' updatePriority = 3 + enabled.set(false) } huaweiPublish { diff --git a/app/key.p12.gpg b/app/key.p12.gpg deleted file mode 100644 index e9b6d06ebe2c5f9e8f062549a09b948be52be482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5129 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 diff --git a/build.gradle b/build.gradle index 7fb02eb9d..e425974d8 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { classpath 'com.google.gms:google-services:4.3.10' classpath 'com.huawei.agconnect:agcp:1.6.0.300' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' - classpath "com.github.triplet.gradle:play-publisher:2.8.0" + classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.3.0" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" From 36daa7ccc1c25878fdcaf5f8475ecd6e6240745f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 22 Sep 2021 09:25:16 +0200 Subject: [PATCH 0608/1526] Always include all language resources in app bundle (#1527) --- app/build.gradle | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 466924b0f..bcb84c19b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,6 +104,12 @@ android { viewBinding true } + bundle { + language { + enableSplit = false + } + } + testOptions.unitTests { includeAndroidResources = true } From 6615e684303bc0938ed8e706ccd400cdc6877855 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Sep 2021 09:25:54 +0200 Subject: [PATCH 0609/1526] Bump kotlin_version from 1.5.30 to 1.5.31 (#1528) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e425974d8..15d3c792b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.5.30' + kotlin_version = '1.5.31' about_libraries = '8.9.1' hilt_version = "2.38.1" } From a43ffcdef482a295623dee33fb67e1c7e177aea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 24 Sep 2021 21:02:51 +0200 Subject: [PATCH 0610/1526] Display bad credentials error in the message box above login form (#1525) --- app/build.gradle | 2 +- .../ui/modules/login/LoginActivity.kt | 5 +- .../ui/modules/login/LoginErrorHandler.kt | 4 +- .../login/advanced/LoginAdvancedFragment.kt | 67 +++++++++++++------ .../login/advanced/LoginAdvancedPresenter.kt | 4 +- .../login/advanced/LoginAdvancedView.kt | 2 +- .../modules/login/form/LoginFormFragment.kt | 48 ++++++++++--- .../modules/login/form/LoginFormPresenter.kt | 2 +- .../ui/modules/login/form/LoginFormView.kt | 2 +- .../main/res/layout/fragment_login_form.xml | 28 +++++--- app/src/main/res/values-cs/strings.xml | 3 +- app/src/main/res/values-de/strings.xml | 3 +- app/src/main/res/values-pl/strings.xml | 3 +- app/src/main/res/values-ru/strings.xml | 3 +- app/src/main/res/values-sk/strings.xml | 3 +- app/src/main/res/values-uk/strings.xml | 3 +- app/src/main/res/values/strings.xml | 3 +- 17 files changed, 126 insertions(+), 59 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bcb84c19b..cea9ae810 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -166,7 +166,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:1.2.3" + implementation "io.github.wulkanowy:sdk:8f3721f1f9" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt index 8d96a498f..10f6c0737 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt @@ -103,9 +103,8 @@ class LoginActivity : BaseActivity(), Logi } override fun notifyInitSymbolFragment(loginData: Triple) { - (loginAdapter.getFragmentInstance(1) as? LoginSymbolFragment)?.onParentInitSymbolFragment( - loginData - ) + (loginAdapter.getFragmentInstance(1) as? LoginSymbolFragment) + ?.onParentInitSymbolFragment(loginData) } override fun notifyInitStudentSelectFragment(studentsWithSemesters: List) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt index ed4563246..2f76cd51e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt @@ -13,7 +13,7 @@ import javax.inject.Inject class LoginErrorHandler @Inject constructor(resources: Resources) : ErrorHandler(resources) { - var onBadCredentials: () -> Unit = {} + var onBadCredentials: (String?) -> Unit = {} var onInvalidToken: (String) -> Unit = {} @@ -25,7 +25,7 @@ class LoginErrorHandler @Inject constructor(resources: Resources) : ErrorHandler override fun proceed(error: Throwable) { when (error) { - is BadCredentialsException -> onBadCredentials() + is BadCredentialsException -> onBadCredentials(error.message) is SQLiteConstraintException -> onStudentDuplicate(resources.getString(R.string.login_duplicate_student)) is TokenDeadException -> onInvalidToken(resources.getString(R.string.login_expired_token)) is InvalidTokenException -> onInvalidToken(resources.getString(R.string.login_invalid_token)) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt index 9231914c8..0672d75fa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt @@ -51,10 +51,12 @@ class LoginAdvancedFragment : private lateinit var hostSymbols: Array override val formHostValue: String - get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty() + get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) + .orEmpty() override val formHostSymbol: String - get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty() + get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) + .orEmpty() override val formPinValue: String get() = binding.loginFormPin.text.toString().trim() @@ -92,39 +94,62 @@ class LoginAdvancedFragment : loginFormSignIn.setOnClickListener { presenter.onSignInClick() } loginTypeSwitch.setOnCheckedChangeListener { _, checkedId -> - presenter.onLoginModeSelected(when (checkedId) { - R.id.loginTypeApi -> Sdk.Mode.API - R.id.loginTypeScrapper -> Sdk.Mode.SCRAPPER - else -> Sdk.Mode.HYBRID - }) + presenter.onLoginModeSelected( + when (checkedId) { + R.id.loginTypeApi -> Sdk.Mode.API + R.id.loginTypeScrapper -> Sdk.Mode.SCRAPPER + else -> Sdk.Mode.HYBRID + } + ) } loginFormPin.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() } loginFormPass.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() } - loginFormSymbol.setAdapter(ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values))) + loginFormSymbol.setAdapter( + ArrayAdapter( + requireContext(), + android.R.layout.simple_list_item_1, + resources.getStringArray(R.array.symbols_values) + ) + ) } with(binding.loginFormHost) { setText(hostKeys.getOrNull(0).orEmpty()) - setAdapter(LoginSymbolAdapter(context, R.layout.support_simple_spinner_dropdown_item, hostKeys)) + setAdapter( + LoginSymbolAdapter( + context, + R.layout.support_simple_spinner_dropdown_item, + hostKeys + ) + ) setOnClickListener { if (binding.loginFormContainer.visibility == GONE) dismissDropDown() } } } override fun showMobileApiWarningMessage() { - binding.loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_mobile_api) + binding.loginFormAdvancedWarningInfo.text = + getString(R.string.login_advanced_warning_mobile_api) } override fun showScraperWarningMessage() { - binding.loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_scraper) + binding.loginFormAdvancedWarningInfo.text = + getString(R.string.login_advanced_warning_scraper) } override fun showHybridWarningMessage() { - binding.loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_hybrid) + binding.loginFormAdvancedWarningInfo.text = + getString(R.string.login_advanced_warning_hybrid) } - override fun setDefaultCredentials(username: String, pass: String, symbol: String, token: String, pin: String) { + override fun setDefaultCredentials( + username: String, + pass: String, + symbol: String, + token: String, + pin: String + ) { with(binding) { loginFormUsername.setText(username) loginFormPass.setText(pass) @@ -177,10 +202,10 @@ class LoginAdvancedFragment : } } - override fun setErrorPassIncorrect() { + override fun setErrorPassIncorrect(message: String?) { with(binding.loginFormPassLayout) { requestFocus() - error = getString(R.string.login_incorrect_password) + error = message ?: getString(R.string.login_incorrect_password) } } @@ -296,11 +321,13 @@ class LoginAdvancedFragment : } override fun notifyParentAccountLogged(studentsWithSemesters: List) { - (activity as? LoginActivity)?.onFormFragmentAccountLogged(studentsWithSemesters, Triple( - binding.loginFormUsername.text.toString(), - binding.loginFormPass.text.toString(), - resources.getStringArray(R.array.hosts_values)[1] - )) + (activity as? LoginActivity)?.onFormFragmentAccountLogged( + studentsWithSemesters, Triple( + binding.loginFormUsername.text.toString(), + binding.loginFormPass.text.toString(), + resources.getStringArray(R.array.hosts_values)[1] + ) + ) } override fun onResume() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt index 891a6b0bb..17d8c5ecb 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt @@ -34,9 +34,9 @@ class LoginAdvancedPresenter @Inject constructor( } } - private fun onBadCredentials() { + private fun onBadCredentials(message: String?) { view?.run { - setErrorPassIncorrect() + setErrorPassIncorrect(message) showSoftKeyboard() Timber.i("Entered wrong username or password") } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt index 029a6b4d4..1d2b2856d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt @@ -49,7 +49,7 @@ interface LoginAdvancedView : BaseView { fun setErrorPassInvalid(focus: Boolean) - fun setErrorPassIncorrect() + fun setErrorPassIncorrect(message: String?) fun clearUsernameError() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index e383072ec..6e0294a4e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.View import android.view.View.GONE import android.view.View.VISIBLE +import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R @@ -41,10 +42,12 @@ class LoginFormFragment : BaseFragment(R.layout.fragme get() = binding.loginFormPass.text.toString() override val formHostValue: String - get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty() + get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) + .orEmpty() override val formHostSymbol: String - get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty() + get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) + .orEmpty() override val nicknameLabel: String get() = getString(R.string.login_nickname_hint) @@ -88,7 +91,13 @@ class LoginFormFragment : BaseFragment(R.layout.fragme with(binding.loginFormHost) { setText(hostKeys.getOrNull(0).orEmpty()) - setAdapter(LoginSymbolAdapter(context, R.layout.support_simple_spinner_dropdown_item, hostKeys)) + setAdapter( + LoginSymbolAdapter( + context, + R.layout.support_simple_spinner_dropdown_item, + hostKeys + ) + ) setOnClickListener { if (binding.loginFormContainer.visibility == GONE) dismissDropDown() } } } @@ -142,24 +151,31 @@ class LoginFormFragment : BaseFragment(R.layout.fragme } } - override fun setErrorPassIncorrect() { - with(binding.loginFormPassLayout) { - error = getString(R.string.login_incorrect_password) + override fun setErrorPassIncorrect(message: String?) { + val error = message ?: getString(R.string.login_incorrect_password_default) + + with(binding) { + loginFormUsernameLayout.error = " " + loginFormPassLayout.error = " " + loginFormErrorBox.text = getString(R.string.login_incorrect_password, error) + loginFormErrorBox.isVisible = true } } override fun setErrorEmailInvalid(domain: String) { with(binding.loginFormUsernameLayout) { - error = getString(R.string.login_invalid_custom_email,domain) + error = getString(R.string.login_invalid_custom_email, domain) } } override fun clearUsernameError() { binding.loginFormUsernameLayout.error = null + binding.loginFormErrorBox.isVisible = false } override fun clearPassError() { binding.loginFormPassLayout.error = null + binding.loginFormErrorBox.isVisible = false } override fun showSoftKeyboard() { @@ -183,12 +199,18 @@ class LoginFormFragment : BaseFragment(R.layout.fragme binding.loginFormVersion.text = "v${appInfo.versionName}" } - override fun notifyParentAccountLogged(studentsWithSemesters: List, loginData: Triple) { + override fun notifyParentAccountLogged( + studentsWithSemesters: List, + loginData: Triple + ) { (activity as? LoginActivity)?.onFormFragmentAccountLogged(studentsWithSemesters, loginData) } override fun openPrivacyPolicyPage() { - context?.openInternetBrowser("https://wulkanowy.github.io/polityka-prywatnosci.html", ::showMessage) + context?.openInternetBrowser( + "https://wulkanowy.github.io/polityka-prywatnosci.html", + ::showMessage + ) } override fun showContact(show: Boolean) { @@ -210,7 +232,10 @@ class LoginFormFragment : BaseFragment(R.layout.fragme } override fun openFaqPage() { - context?.openInternetBrowser("https://wulkanowy.github.io/czesto-zadawane-pytania/dlaczego-nie-moge-sie-zalogowac", ::showMessage) + context?.openInternetBrowser( + "https://wulkanowy.github.io/czesto-zadawane-pytania/dlaczego-nie-moge-sie-zalogowac", + ::showMessage + ) } override fun onResume() { @@ -223,7 +248,8 @@ class LoginFormFragment : BaseFragment(R.layout.fragme chooserTitle = requireContext().getString(R.string.login_email_intent_title), email = "wulkanowyinc@gmail.com", subject = requireContext().getString(R.string.login_email_subject), - body = requireContext().getString(R.string.login_email_text, + body = requireContext().getString( + R.string.login_email_text, "${appInfo.systemManufacturer} ${appInfo.systemModel}", appInfo.systemVersion.toString(), appInfo.versionName, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index d79c422d4..bd876b849 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -30,7 +30,7 @@ class LoginFormPresenter @Inject constructor( showVersion() loginErrorHandler.onBadCredentials = { - setErrorPassIncorrect() + setErrorPassIncorrect(it) showSoftKeyboard() Timber.i("Entered wrong username or password") } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt index 079629ef6..efdaa082b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt @@ -37,7 +37,7 @@ interface LoginFormView : BaseView { fun setErrorPassInvalid(focus: Boolean) - fun setErrorPassIncorrect() + fun setErrorPassIncorrect(message: String?) fun setErrorEmailInvalid(domain: String) diff --git a/app/src/main/res/layout/fragment_login_form.xml b/app/src/main/res/layout/fragment_login_form.xml index 06d1fa5e9..d1c997ff8 100644 --- a/app/src/main/res/layout/fragment_login_form.xml +++ b/app/src/main/res/layout/fragment_login_form.xml @@ -110,10 +110,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="32dp" - android:layout_marginLeft="32dp" android:layout_marginTop="32dp" android:layout_marginEnd="32dp" - android:layout_marginRight="32dp" android:gravity="center_horizontal" android:text="@string/login_header_default" android:textSize="16sp" @@ -126,6 +124,20 @@ app:layout_constraintVertical_chainStyle="packed" app:layout_goneMarginTop="64dp" /> + + app:layout_constraintTop_toBottomOf="@+id/loginFormErrorBox" + app:layout_goneMarginTop="48dp"> @@ -217,7 +227,6 @@ android:layout_marginRight="24dp" android:hint="@string/login_host_hint" android:orientation="vertical" - app:layout_constraintBottom_toTopOf="@+id/loginFormAdvancedButton" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/loginFormRecoverLink"> @@ -262,14 +271,13 @@ android:id="@+id/loginFormPrivacyLink" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="24dp" android:gravity="start|center_vertical" android:text="@string/login_privacy_policy" android:textColor="?android:textColorSecondary" android:textSize="12sp" app:fontFamily="sans-serif-medium" app:layout_constraintStart_toStartOf="@id/loginFormAdvancedButton" - app:layout_constraintTop_toBottomOf="@+id/loginFormAdvancedButton" + app:layout_constraintTop_toTopOf="@+id/loginFormVersion" tools:visibility="visible" /> Symbol Přihlásit Toto heslo je příliš krátké - Přihlašovací údaje jsou nesprávné. Ujistěte se, že je v poli níže vybrána správná variace deníku UONET+ + Přihlašovací údaje jsou nesprávné + %1$s. Ujistěte se, že je v poli níže vybrána správná variace deníku UONET+ Neplatný PIN Neplatný token Token vypršel diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f86c3076a..8c30c7a99 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -42,7 +42,8 @@ Symbol Anmelden Passwort ist zu kurz - Anmeldedaten sind falsch. Stellen Sie sicher, dass die richtige UONET+ Registervariation im unteren Feld ausgewählt ist + Anmeldedaten sind falsch + %1$s. Stellen Sie sicher, dass die richtige UONET+ Registervariation im unteren Feld ausgewählt ist Ungültige PIN Ungültige token Token ist nicht mehr gültig diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index cfc6810e7..6ac94a4ed 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -42,7 +42,8 @@ Symbol Zaloguj To hasło jest za krótkie - Dane logowania są niepoprawne. Upewnij się, że została wybrana odpowiednia odmiana dziennika UONET+ w polu poniżej + Dane logowania są niepoprawne + %1$s. Upewnij się, że poniżej została wybrana odpowiednia odmiana dziennika UONET+ Nieprawidłowy PIN Nieprawidłowy token Token stracił ważność diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4e41088fd..54ae5e1ba 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -42,7 +42,8 @@ Symbol Войти Слишком короткий пароль - Данные для входа неверны. Убедитесь, что в поле ниже выбран правильный вариант регистра UONET+ + Данные для входа неверны + %1$s. Убедитесь, что в поле ниже выбран правильный вариант регистра UONET+ Неправильный PIN Неверный token Token просрочен diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 75a42467d..b1fd78ae3 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -42,7 +42,8 @@ Symbol Prihlásiť Toto heslo je príliš krátke - Prihlasovacie údaje sú nesprávne. Uistite sa, že je v poli nižšie vybraná správna variácie denníka UONET+ + Prihlasovacie údaje sú nesprávne + %1$s. Uistite sa, že je v poli nižšie vybraná správna variácie denníka UONET+ Neplatný PIN Neplatný token Platnosť tokenu vypršala diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 51f258818..70f40b66c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -42,7 +42,8 @@ Symbol Увійти Занадто короткий пароль - Дані для входу неправильні. Переконайтеся, що у полі нижче вказано правильний варіант реєстрації UONET+ + Дані для входу неправильні + %1$s. Переконайтеся, що у полі нижче вказано правильний варіант реєстрації UONET+ Неправильний PIN Неправильний token Минув термін дії токену diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index de85614bc..575401100 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,7 +46,8 @@ Symbol Sign in Password too short - Login details are incorrect. Make sure the correct UONET+ register variation is selected in the field below + Login details are incorrect + %1$s. Make sure the correct UONET+ register variation is selected below Invalid PIN Invalid token Token expired From 2cb11e443cadde38b90b01f6946644a0f4b3a193 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sat, 25 Sep 2021 13:46:11 +0200 Subject: [PATCH 0611/1526] Mark teacher with yellow when new and old are the same (#1529) --- app/build.gradle | 2 +- .../ui/modules/timetable/TimetableAdapter.kt | 2 +- .../ui/modules/timetable/TimetableDialog.kt | 21 +++++++++++++++++-- .../timetablewidget/TimetableWidgetFactory.kt | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cea9ae810..435a2f567 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -166,7 +166,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:8f3721f1f9" + implementation "io.github.wulkanowy:sdk:230d2075df" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index 87b3362db..4a5a06995 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -360,7 +360,7 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter { + timetableDialogTeacherValue.run { + visibility = GONE + } + timetableDialogTeacherNewValue.run { + visibility = VISIBLE + text = teacher + } + } teacher.isNotBlank() -> timetableDialogTeacherValue.text = teacher else -> { timetableDialogTeacherTitle.visibility = GONE diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index 45b79b50f..c8dda23ce 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -173,7 +173,7 @@ class TimetableWidgetFactory( updateNotCanceledLessonNumberColor(this, lesson) updateNotCanceledSubjectColor(this, lesson) - val teacherChange = lesson.teacherOld.isNotBlank() && lesson.teacher != lesson.teacherOld + val teacherChange = lesson.teacherOld.isNotBlank() updateNotCanceledRoom(this, lesson, teacherChange) updateNotCanceledTeacher(this, lesson, teacherChange) } From de6131f4f574540357537429985e27cc8247b6dc Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sat, 25 Sep 2021 13:46:35 +0200 Subject: [PATCH 0612/1526] Add transparency to lucky number widget (#1530) --- app/src/main/res/drawable/background_luckynumber_widget.xml | 4 ++-- .../main/res/drawable/background_luckynumber_widget_dark.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/drawable/background_luckynumber_widget.xml b/app/src/main/res/drawable/background_luckynumber_widget.xml index f29744d0c..367c55275 100644 --- a/app/src/main/res/drawable/background_luckynumber_widget.xml +++ b/app/src/main/res/drawable/background_luckynumber_widget.xml @@ -1,6 +1,6 @@ - - + + diff --git a/app/src/main/res/drawable/background_luckynumber_widget_dark.xml b/app/src/main/res/drawable/background_luckynumber_widget_dark.xml index fa15fd857..cb094b57e 100644 --- a/app/src/main/res/drawable/background_luckynumber_widget_dark.xml +++ b/app/src/main/res/drawable/background_luckynumber_widget_dark.xml @@ -1,6 +1,6 @@ - - + + From 9211baf7ec54d1e4774e53340e43a997bead1e6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 25 Sep 2021 14:02:38 +0200 Subject: [PATCH 0613/1526] Add notification piggyback (#1503) --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 7 ++++ .../repositories/PreferencesRepository.kt | 21 ++++++---- .../VulcanNotificationListenerService.kt | 24 +++++++++++ .../wulkanowy/services/sync/SyncManager.kt | 24 +++++++---- .../notifications/NotificationsFragment.kt | 41 +++++++++++++++++-- .../notifications/NotificationsPresenter.kt | 22 ++++++++++ .../notifications/NotificationsView.kt | 6 +++ app/src/main/res/values-pl/strings.xml | 4 ++ .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 4 ++ .../xml/scheme_preferences_notifications.xml | 6 +++ 13 files changed, 145 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/services/piggyback/VulcanNotificationListenerService.kt diff --git a/app/build.gradle b/app/build.gradle index 435a2f567..713756583 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -166,7 +166,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:230d2075df" + implementation "io.github.wulkanowy:sdk:49c2071d10" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ad5adaf2e..77ce3506c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -93,6 +93,13 @@ + + + + + ? @@ -230,8 +235,10 @@ class PreferencesRepository @Inject constructor( set(value) = sharedPref.edit().putInt(PREF_KEY_IN_APP_REVIEW_COUNT, value).apply() var inAppReviewDate: LocalDate? - get() = sharedPref.getLong(PREF_KEY_IN_APP_REVIEW_DATE, 0).takeIf { it != 0L }?.toLocalDate() - set(value) = sharedPref.edit().putLong(PREF_KEY_IN_APP_REVIEW_DATE, value!!.toTimestamp()).apply() + get() = sharedPref.getLong(PREF_KEY_IN_APP_REVIEW_DATE, 0).takeIf { it != 0L } + ?.toLocalDate() + set(value) = sharedPref.edit().putLong(PREF_KEY_IN_APP_REVIEW_DATE, value!!.toTimestamp()) + .apply() var isAppReviewDone: Boolean get() = sharedPref.getBoolean(PREF_KEY_IN_APP_REVIEW_DONE, false) diff --git a/app/src/main/java/io/github/wulkanowy/services/piggyback/VulcanNotificationListenerService.kt b/app/src/main/java/io/github/wulkanowy/services/piggyback/VulcanNotificationListenerService.kt new file mode 100644 index 000000000..c7df2dbc1 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/piggyback/VulcanNotificationListenerService.kt @@ -0,0 +1,24 @@ +package io.github.wulkanowy.services.piggyback + +import android.service.notification.NotificationListenerService +import android.service.notification.StatusBarNotification +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.data.repositories.PreferencesRepository +import io.github.wulkanowy.services.sync.SyncManager +import javax.inject.Inject + +@AndroidEntryPoint +class VulcanNotificationListenerService : NotificationListenerService() { + + @Inject + lateinit var syncManager: SyncManager + + @Inject + lateinit var preferenceRepository: PreferencesRepository + + override fun onNotificationPosted(statusBarNotification: StatusBarNotification?) { + if (statusBarNotification?.packageName == "pl.edu.vulcan.hebe" && preferenceRepository.isNotificationPiggybackEnabled) { + syncManager.startOneTimeSyncWorker() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt index b94d97e33..02d8b964f 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt @@ -57,14 +57,20 @@ class SyncManager @Inject constructor( fun startPeriodicSyncWorker(restart: Boolean = false) { if (preferencesRepository.isServiceEnabled && !now().isHolidays) { - workManager.enqueueUniquePeriodicWork(SyncWorker::class.java.simpleName, if (restart) REPLACE else KEEP, - PeriodicWorkRequestBuilder(preferencesRepository.servicesInterval, MINUTES) + val serviceInterval = preferencesRepository.servicesInterval + + workManager.enqueueUniquePeriodicWork( + SyncWorker::class.java.simpleName, if (restart) REPLACE else KEEP, + PeriodicWorkRequestBuilder(serviceInterval, MINUTES) .setInitialDelay(10, MINUTES) .setBackoffCriteria(EXPONENTIAL, 30, MINUTES) - .setConstraints(Constraints.Builder() - .setRequiredNetworkType(if (preferencesRepository.isServicesOnlyWifi) UNMETERED else CONNECTED) - .build()) - .build()) + .setConstraints( + Constraints.Builder() + .setRequiredNetworkType(if (preferencesRepository.isServicesOnlyWifi) UNMETERED else CONNECTED) + .build() + ) + .build() + ) } } @@ -77,7 +83,11 @@ class SyncManager @Inject constructor( ) .build() - workManager.enqueueUniqueWork("${SyncWorker::class.java.simpleName}_one_time", ExistingWorkPolicy.REPLACE, work) + workManager.enqueueUniqueWork( + "${SyncWorker::class.java.simpleName}_one_time", + ExistingWorkPolicy.REPLACE, + work + ) return workManager.getWorkInfoByIdLiveData(work.id).asFlow() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt index 0fc7e68e7..207d587de 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt @@ -10,9 +10,12 @@ import android.provider.Settings import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog +import androidx.core.app.NotificationManagerCompat import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreferenceCompat import androidx.recyclerview.widget.RecyclerView import com.thelittlefireman.appkillermanager.AppKillerManager import com.thelittlefireman.appkillermanager.exceptions.NoActionFoundException @@ -43,6 +46,21 @@ class NotificationsFragment : PreferenceFragmentCompat(), override val titleStringId get() = R.string.pref_settings_notifications_title + override val isNotificationPermissionGranted: Boolean + get() { + val packageNameList = + NotificationManagerCompat.getEnabledListenerPackages(requireContext()) + val appPackageName = requireContext().packageName + + return appPackageName in packageNameList + } + + private val notificationSettingsContract = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + + presenter.onNotificationPermissionResult() + } + override fun initView(showDebugNotificationSwitch: Boolean) { findPreference(getString(R.string.pref_key_notification_debug))?.isVisible = showDebugNotificationSwitch @@ -57,12 +75,11 @@ class NotificationsFragment : PreferenceFragmentCompat(), } } - findPreference(getString(R.string.pref_key_notifications_system_settings))?.run { - setOnPreferenceClickListener { + findPreference(getString(R.string.pref_key_notifications_system_settings)) + ?.setOnPreferenceClickListener { presenter.onOpenSystemSettingsClicked() true } - } } override fun onCreateRecyclerView( @@ -157,6 +174,24 @@ class NotificationsFragment : PreferenceFragmentCompat(), } } + override fun openNotificationPermissionDialog() { + AlertDialog.Builder(requireContext()) + .setTitle(getString(R.string.pref_notification_piggyback_popup_title)) + .setMessage(getString(R.string.pref_notification_piggyback_popup_description)) + .setPositiveButton(getString(R.string.pref_notification_piggyback_popup_positive)) { _, _ -> + notificationSettingsContract.launch(Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")) + } + .setNegativeButton(android.R.string.cancel) { _, _ -> + setNotificationPiggybackPreferenceChecked(false) + } + .show() + } + + override fun setNotificationPiggybackPreferenceChecked(isChecked: Boolean) { + findPreference(getString(R.string.pref_key_notifications_piggyback))?.isChecked = + isChecked + } + override fun onResume() { super.onResume() preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt index 8366d3094..19d2f5591 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt @@ -31,6 +31,9 @@ class NotificationsPresenter @Inject constructor( ) initView(appInfo.isDebug) } + + checkNotificationPiggybackState() + Timber.i("Settings notifications view was initialized") } @@ -47,6 +50,11 @@ class NotificationsPresenter @Inject constructor( isDebugNotificationEnableKey -> { chuckerCollector.showNotification = isDebugNotificationEnable } + isNotificationPiggybackEnabledKey -> { + if (isNotificationPiggybackEnabled && view?.isNotificationPermissionGranted == false) { + view?.openNotificationPermissionDialog() + } + } } } analytics.logEvent("setting_changed", "name" to key) @@ -59,4 +67,18 @@ class NotificationsPresenter @Inject constructor( fun onOpenSystemSettingsClicked() { view?.openSystemSettings() } + + fun onNotificationPermissionResult() { + view?.run { + setNotificationPiggybackPreferenceChecked(isNotificationPermissionGranted) + } + } + + private fun checkNotificationPiggybackState() { + if (preferencesRepository.isNotificationPiggybackEnabled) { + view?.run { + setNotificationPiggybackPreferenceChecked(isNotificationPermissionGranted) + } + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsView.kt index 2ab9b0352..42862b380 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsView.kt @@ -4,6 +4,8 @@ import io.github.wulkanowy.ui.base.BaseView interface NotificationsView : BaseView { + val isNotificationPermissionGranted: Boolean + fun initView(showDebugNotificationSwitch: Boolean) fun showFixSyncDialog() @@ -11,4 +13,8 @@ interface NotificationsView : BaseView { fun openSystemSettings() fun enableNotification(notificationKey: String, enable: Boolean) + + fun openNotificationPermissionDialog() + + fun setNotificationPiggybackPreferenceChecked(isChecked: Boolean) } diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 6ac94a4ed..d1f44e5c2 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -624,6 +624,10 @@ Przejdź do ustawień Pokazuj powiadomienia debugowania Synchronizacja jest wyłączona + Przechwytywanie powiadomień oficjalnej aplikacji + Przechwytywanie powiadomień + Dzięki tej funkcji możesz zyskać namiastkę powiadomień push takich, jak w oficjalnej aplikacji. Wystarczy że zezwolisz Wulkanowemu na odbieranie wszystkich powiadomień w ustawieniach systemowych.\n\nJak to działa?\nGdy dostaniesz powiadomienie w Dzienniczku VULCANa Wulkanowy zostanie o tym powiadomiony (po to te dodatkowe uprawnienia) i uruchomi synchronizację, dzięki czemu będzie mógł wysłać własne powiadomienie.\n\nTYLKO DLA ZAAWANSOWANYCH UŻYTKOWNIKÓW + Przejdź do ustawień Synchronizacja Automatyczna aktualizacja Zawieszona na wakacjach diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 1ba9359cd..9286052d8 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -26,6 +26,7 @@ false false 0 + false LUCKY_NUMBER MESSAGES diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 09dac7002..bae6a617b 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -32,4 +32,5 @@ message_send_is_draft message_send_recipients last_sync_date + notifications_piggyback diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 575401100..af2006037 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -625,6 +625,10 @@ Go to settings Show debug notifications Synchronization is disabled + Capture official app notifications + Capture notifications + With this feature you can gain a substitute of push notifications like in the official app. All you need to do is allow Wulkanowy to receive all notifications in your system settings.\n\nHow it works?\nWhen you get a notification in Dziennik VULCAN, Wulkanowy will be notified (that\'s what these extra permissions are for) and will trigger a sync so that can send its own notification.\n\nFOR ADVANCED USERS ONLY + Go to settings Synchronization Automatic update diff --git a/app/src/main/res/xml/scheme_preferences_notifications.xml b/app/src/main/res/xml/scheme_preferences_notifications.xml index ac88746c0..24b83169b 100644 --- a/app/src/main/res/xml/scheme_preferences_notifications.xml +++ b/app/src/main/res/xml/scheme_preferences_notifications.xml @@ -14,6 +14,12 @@ app:key="@string/pref_key_notifications_upcoming_lessons_enable" app:singleLineTitle="false" app:title="@string/pref_notify_upcoming_lessons_switch" /> + Date: Sat, 25 Sep 2021 15:18:40 +0200 Subject: [PATCH 0614/1526] Don't stop loading the timetable when error occurs in upcoming lessons notification scheduling (#1532) --- .../TimetableNotificationSchedulerHelper.kt | 67 +++++++++++-------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt index 98bd93eb8..a42a0ab4b 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt @@ -31,6 +31,7 @@ import io.github.wulkanowy.utils.nickOrName import io.github.wulkanowy.utils.toTimestamp import kotlinx.coroutines.withContext import timber.log.Timber +import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalDateTime.now import javax.inject.Inject @@ -57,10 +58,13 @@ class TimetableNotificationSchedulerHelper @Inject constructor( lessons.sortedBy { it.start }.forEachIndexed { index, lesson -> val upcomingTime = getUpcomingLessonTime(index, lessons, lesson) cancelScheduledTo( - upcomingTime..lesson.start, - getRequestCode(upcomingTime, studentId) + range = upcomingTime..lesson.start, + requestCode = getRequestCode(upcomingTime, studentId) + ) + cancelScheduledTo( + range = lesson.start..lesson.end, + requestCode = getRequestCode(lesson.start, 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") } @@ -82,6 +86,11 @@ class TimetableNotificationSchedulerHelper @Inject constructor( return cancelScheduled(lessons, student) } + if (lessons.firstOrNull()?.date?.isAfter(LocalDate.now().plusDays(2)) == true) { + Timber.d("Timetable notification scheduling skipped - lessons are too far") + return + } + withContext(dispatchersProvider.backgroundThread) { lessons.groupBy { it.date } .map { it.value.sortedBy { lesson -> lesson.start } } @@ -96,26 +105,26 @@ class TimetableNotificationSchedulerHelper @Inject constructor( if (lesson.start > now()) { scheduleBroadcast( - intent, - student.studentId, - NOTIFICATION_TYPE_UPCOMING, - getUpcomingLessonTime(index, active, lesson) + intent = intent, + studentId = student.studentId, + notificationType = NOTIFICATION_TYPE_UPCOMING, + time = getUpcomingLessonTime(index, active, lesson) ) } if (lesson.end > now()) { scheduleBroadcast( - intent, - student.studentId, - NOTIFICATION_TYPE_CURRENT, - lesson.start + intent = intent, + studentId = student.studentId, + notificationType = NOTIFICATION_TYPE_CURRENT, + time = lesson.start ) if (active.lastIndex == index) { scheduleBroadcast( - intent, - student.studentId, - NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION, - lesson.end + intent = intent, + studentId = student.studentId, + notificationType = NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION, + time = lesson.end ) } } @@ -143,17 +152,21 @@ class TimetableNotificationSchedulerHelper @Inject constructor( notificationType: Int, time: LocalDateTime ) { - AlarmManagerCompat.setExactAndAllowWhileIdle( - alarmManager, RTC_WAKEUP, time.toTimestamp(), - PendingIntent.getBroadcast(context, getRequestCode(time, studentId), intent.also { - it.putExtra(NOTIFICATION_ID, MainView.Section.TIMETABLE.id) - it.putExtra(LESSON_TYPE, notificationType) - }, FLAG_UPDATE_CURRENT) - ) - Timber.d( - "TimetableNotification scheduled: type: $notificationType, subject: ${ - intent.getStringExtra(LESSON_TITLE) - }, start: $time, student: $studentId" - ) + try { + AlarmManagerCompat.setExactAndAllowWhileIdle( + alarmManager, RTC_WAKEUP, time.toTimestamp(), + PendingIntent.getBroadcast(context, getRequestCode(time, studentId), intent.also { + it.putExtra(NOTIFICATION_ID, MainView.Section.TIMETABLE.id) + it.putExtra(LESSON_TYPE, notificationType) + }, FLAG_UPDATE_CURRENT) + ) + Timber.d( + "TimetableNotification scheduled: type: $notificationType, subject: ${ + intent.getStringExtra(LESSON_TITLE) + }, start: $time, student: $studentId" + ) + } catch (e: IllegalStateException) { + Timber.e(e) + } } } From 7a46ef5f1924dcb7b4a470c9c801bc0a0d07142f Mon Sep 17 00:00:00 2001 From: Piotr Romanowski Date: Sat, 25 Sep 2021 17:19:21 +0200 Subject: [PATCH 0615/1526] Add calculated average help dialog (#1379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rafał Borcz --- .../ui/modules/grade/GradeAverageProvider.kt | 10 ++- .../grade/summary/GradeSummaryAdapter.kt | 11 +++- .../grade/summary/GradeSummaryFragment.kt | 28 ++++++++- .../grade/summary/GradeSummaryPresenter.kt | 8 +++ .../modules/grade/summary/GradeSummaryView.kt | 4 ++ .../message/preview/MessagePreviewAdapter.kt | 7 +-- .../github/wulkanowy/utils/GradeExtension.kt | 5 +- app/src/main/res/drawable/ic_help.xml | 10 +++ .../scrollable_header_grade_summary.xml | 61 +++++++++++++++---- .../main/res/values-pl/preferences_values.xml | 2 +- app/src/main/res/values-pl/strings.xml | 6 +- .../main/res/values/preferences_values.xml | 4 +- app/src/main/res/values/strings.xml | 11 ++-- .../wulkanowy/utils/GradeExtensionTest.kt | 16 ++--- 14 files changed, 139 insertions(+), 44 deletions(-) create mode 100644 app/src/main/res/drawable/ic_help.xml diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index 4a3049721..2784f429f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -131,7 +131,9 @@ class GradeAverageProvider @Inject constructor( val updatedFirstSemesterGrades = firstSemesterSubject?.grades?.updateModifiers(student).orEmpty() - (updatedSecondSemesterGrades + updatedFirstSemesterGrades).calcAverage(isOptionalArithmeticAverage) + (updatedSecondSemesterGrades + updatedFirstSemesterGrades).calcAverage( + isOptionalArithmeticAverage + ) } else { secondSemesterSubject.average } @@ -147,7 +149,8 @@ class GradeAverageProvider @Inject constructor( return if (!isAnyVulcanAverage || isGradeAverageForceCalc) { val secondSemesterAverage = - secondSemesterSubject.grades.updateModifiers(student).calcAverage(isOptionalArithmeticAverage) + secondSemesterSubject.grades.updateModifiers(student) + .calcAverage(isOptionalArithmeticAverage) val firstSemesterAverage = firstSemesterSubject?.grades?.updateModifiers(student) ?.calcAverage(isOptionalArithmeticAverage) ?: secondSemesterAverage @@ -213,7 +216,8 @@ class GradeAverageProvider @Inject constructor( proposedPoints = "", finalPoints = "", pointsSum = "", - average = if (calcAverage) details.updateModifiers(student).calcAverage(isOptionalArithmeticAverage) else .0 + average = if (calcAverage) details.updateModifiers(student) + .calcAverage(isOptionalArithmeticAverage) else .0 ) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt index 0754361c9..082c847e5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt @@ -10,7 +10,7 @@ import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.ItemGradeSummaryBinding import io.github.wulkanowy.databinding.ScrollableHeaderGradeSummaryBinding -import io.github.wulkanowy.utils.calcAverage +import io.github.wulkanowy.utils.calcFinalAverage import java.util.Locale import javax.inject.Inject @@ -25,6 +25,10 @@ class GradeSummaryAdapter @Inject constructor( var items = emptyList() + var onCalculatedHelpClickListener: () -> Unit = {} + + var onFinalHelpClickListener: () -> Unit = {} + override fun getItemCount() = items.size + if (items.isNotEmpty()) 1 else 0 override fun getItemViewType(position: Int) = when (position) { @@ -60,7 +64,7 @@ class GradeSummaryAdapter @Inject constructor( val finalItemsCount = items.count { it.finalGrade.matches("[0-6][+-]?".toRegex()) } val calculatedItemsCount = items.count { value -> value.average != 0.0 } val allItemsCount = items.count { !it.subject.equals("zachowanie", true) } - val finalAverage = items.calcAverage( + val finalAverage = items.calcFinalAverage( preferencesRepository.gradePlusModifier, preferencesRepository.gradeMinusModifier ) @@ -83,6 +87,9 @@ class GradeSummaryAdapter @Inject constructor( calculatedItemsCount, allItemsCount ) + + gradeSummaryCalculatedAverageHelp.setOnClickListener { onCalculatedHelpClickListener() } + gradeSummaryFinalAverageHelp.setOnClickListener { onFinalHelpClickListener() } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt index 0ac16fb36..3810902ff 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE +import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R @@ -48,6 +49,11 @@ class GradeSummaryFragment : } override fun initView() { + with(gradeSummaryAdapter) { + onCalculatedHelpClickListener = presenter::onCalculatedAverageHelpClick + onFinalHelpClickListener = presenter::onFinalAverageHelpClick + } + with(binding.gradeSummaryRecycler) { layoutManager = LinearLayoutManager(context) adapter = gradeSummaryAdapter @@ -55,7 +61,11 @@ class GradeSummaryFragment : with(binding) { gradeSummarySwipe.setOnRefreshListener(presenter::onSwipeRefresh) gradeSummarySwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) - gradeSummarySwipe.setProgressBackgroundColorSchemeColor(requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh)) + gradeSummarySwipe.setProgressBackgroundColorSchemeColor( + requireContext().getThemeAttrColor( + R.attr.colorSwipeRefresh + ) + ) gradeSummaryErrorRetry.setOnClickListener { presenter.onRetry() } gradeSummaryErrorDetails.setOnClickListener { presenter.onDetailsClick() } } @@ -107,6 +117,22 @@ class GradeSummaryFragment : binding.gradeSummarySwipe.isRefreshing = show } + override fun showCalculatedAverageHelpDialog() { + AlertDialog.Builder(requireContext()) + .setTitle(R.string.grade_summary_calculated_average_help_dialog_title) + .setMessage(R.string.grade_summary_calculated_average_help_dialog_message) + .setPositiveButton(R.string.all_close) { _, _ -> } + .show() + } + + override fun showFinalAverageHelpDialog() { + AlertDialog.Builder(requireContext()) + .setTitle(R.string.grade_summary_final_average_help_dialog_title) + .setMessage(R.string.grade_summary_final_average_help_dialog_message) + .setPositiveButton(R.string.all_close) { _, _ -> } + .show() + } + override fun onParentLoadData(semesterId: Int, forceRefresh: Boolean) { presenter.onParentViewLoadData(semesterId, forceRefresh) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 7adfd7e58..933633dca 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -135,6 +135,14 @@ class GradeSummaryPresenter @Inject constructor( cancelJobs("load") } + fun onCalculatedAverageHelpClick() { + view?.showCalculatedAverageHelpDialog() + } + + fun onFinalAverageHelpClick() { + view?.showFinalAverageHelpDialog() + } + private fun createGradeSummaryItems(items: List): List { return items .filter { !checkEmpty(it) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt index 974d91415..156731c31 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt @@ -33,6 +33,10 @@ interface GradeSummaryView : BaseView { fun showEmpty(show: Boolean) + fun showCalculatedAverageHelpDialog() + + fun showFinalAverageHelpDialog() + fun notifyParentDataLoaded(semesterId: Int) fun notifyParentRefresh() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt index 421453c94..d75128be1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt @@ -79,12 +79,7 @@ class MessagePreviewAdapter @Inject constructor() : val readText = when { recipientCount > 1 -> { - context.resources.getQuantityString( - R.plurals.message_read_by, - message.readBy, - message.readBy, - recipientCount - ) + context.getString(R.string.message_read_by, message.readBy, recipientCount) } message.readBy == 1 -> { context.getString(R.string.message_read, context.getString(R.string.all_yes)) diff --git a/app/src/main/java/io/github/wulkanowy/utils/GradeExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/GradeExtension.kt index 820e7f435..1be3093fe 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/GradeExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/GradeExtension.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.utils import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary -import io.github.wulkanowy.sdk.scrapper.grades.* +import io.github.wulkanowy.sdk.scrapper.grades.isGradeValid fun List.calcAverage(isOptionalArithmeticAverage: Boolean): Double { val isArithmeticAverage = isOptionalArithmeticAverage && !any { it.weightValue != .0 } @@ -18,8 +18,7 @@ fun List.calcAverage(isOptionalArithmeticAverage: Boolean): Double { return if (denominator != 0.0) counter / denominator else 0.0 } -@JvmName("calcSummaryAverage") -fun List.calcAverage(plusModifier: Double, minusModifier: Double) = asSequence() +fun List.calcFinalAverage(plusModifier: Double, minusModifier: Double) = asSequence() .mapNotNull { if (it.finalGrade.matches("[0-6][+-]?".toRegex())) { when { diff --git a/app/src/main/res/drawable/ic_help.xml b/app/src/main/res/drawable/ic_help.xml new file mode 100644 index 000000000..9c6ba2925 --- /dev/null +++ b/app/src/main/res/drawable/ic_help.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/scrollable_header_grade_summary.xml b/app/src/main/res/layout/scrollable_header_grade_summary.xml index 29657ba1a..049219a98 100644 --- a/app/src/main/res/layout/scrollable_header_grade_summary.xml +++ b/app/src/main/res/layout/scrollable_header_grade_summary.xml @@ -1,5 +1,6 @@ - + android:layout_gravity="center" + android:orientation="horizontal"> + + + + + - + android:layout_gravity="center" + android:orientation="horizontal"> + + + + + Kolory ocen w dzienniku - Średnia ocen z drugiego semestru + Średnia ocen z wybranego semestru Średnia średnich z obu semestrów Średnia wszystkich ocen z całego roku diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d1f44e5c2..d7a49c11d 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -91,7 +91,11 @@ Ocena końcowa Przewidywana ocena Obliczona średnia + Jak działa Obliczona średnia? + Obliczona średnia to średnia arytmetyczna wyliczona ze średnich przedmiotów. Pozwala ona na poznanie przybliżonej średniej końcowej. Jest obliczana w sposób wybrany przez użytkownika w ustawieniach aplikacji. Zalecane jest, aby wybrać odpowiednią opcję. Wynika to z tego, że sposoby obliczania średnich w szkołach różnią się. Dodatkowo jeśli twoja szkoła podaje średnią z przedmiotów na stronie dziennika aplikacja pobiera je i nie wylicza tych średnich. Można to zmienić wymuszając liczenie średniej w ustawieniach aplikacji.\n\nŚrednia ocen z aktualnie wybranego semestru:\n1. Obliczanie średniej ważonej dla każdego przedmiotu w danym semestrze\n2. Sumowanie obliczonych średnich\n3. Obliczenie średniej arytmetycznej z zsumowanych średnich\n\nŚrednia średnich z obu semestrów:\n1. Obliczanie średniej ważonej dla każdego przedmiotu w semestrze 1 i 2\n2. Obliczanie średniej arytmetycznej z obliczonych średnich semestrów 1 i 2 dla każdego przedmiotu.\n3. Sumowanie obliczonych średnich\n4. Obliczenie średniej arytmetycznej z zsumowanych średnich\n\nŚrednia wszystkich ocen z całego roku:\n1. Obliczanie średniej ważonej z całego roku dla każdego przedmiotu. Średnia końcowa w 1 semestrze jest bez znaczenia.\n3. Sumowanie obliczonych średnich\n4. Obliczenie średniej arytmetycznej z zsumowanych średnich Końcowa średnia + Jak działa Końcowa średnia? + Końcowa średnia to średnia arytmetyczna wyliczona ze wszystkich aktualnie dostępnych ocen końcowych w danym semestrze.\n\nSchemat obliczania składa się z następujących kroków:\n1. Zsumowanie ocen końcowych wystawionych przez nauczycieli\n2. Podzielenie przez liczbę przedmiotów, z których oceny zostały już wystawione z %1$d na %2$d przedmiotów Podsumowanie Klasa @@ -603,7 +607,7 @@ Wygląd i zachowanie aplikacji Domyślny widok - Obliczanie średniej końcoworocznej + Opcje średniej obliczonej Wymuś obliczanie średniej przez aplikację Pokazuj obecność Motyw diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index 9c1a0421a..bd3e8b47d 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -100,8 +100,8 @@ - Average of grades only from the 2nd semester - Average of grades from both semesters + Average of grades only from selected semester + Average of averages from both semesters Average of grades from the whole year diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index af2006037..ed2369322 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,6 +101,10 @@ Final grade Predicted grade Calculated average + How does Calculated Average work? + The Calculated Average is the arithmetic average calculated from the subjects averages. It allows you to know the approximate final average. It is calculated in a way selected by the user in the application settings. It is recommended that you choose the appropriate option. This is because the calculation of school averages differs. Additionally, if your school reports the average of the subjects on the Vulcan page, the application downloads them and does not calculate these averages. This can be changed by forcing the calculation of the average in the application settings.\n\nAverage of grades only from selected semester:\n1. Calculating the weighted average for each subject in a given semester\n2.Adding calculated averages\n3. Calculation of the arithmetic average of the summed averages\n\nAverage of averages from both semesters:\n1.Calculating the weighted average for each subject in semester 1 and 2\n2. Calculating the arithmetic average of the calculated averages for semesters 1 and 2 for each subject.\n3. Adding calculated averages\n4. Calculation of the arithmetic average of the summed averages\n\nAverage of grades from the whole year:\n1. Calculating weighted average over the year for each subject. The final average in the 1st semester is irrelevant.\n3. Adding calculated averages\n4. Calculating the arithmetic average of summed averages + How does the Final Average work? + The Final Average is the arithmetic average calculated from all currently available final grades in the given semester.\n\nThe calculation scheme consists of the following steps:\n1. Summing up the final grades given by teachers\n2. Divide by the number of subjects that have already been graded Final average from %1$d of %2$d subjects Summary @@ -245,10 +249,7 @@ Only unread Only with attachments Read: %s - - Read by: %1$d of %2$d people - Read by: %1$d of %2$d people - + Read by: %1$d of %2$d people %d message %d messages @@ -603,7 +604,7 @@ App appearance & behavior Default view - Calculation of the end-of-year average + Calculated average options Force average calculation by app Show presence Theme diff --git a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt index 32b1602e9..39d4c3bdb 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt @@ -33,13 +33,15 @@ class GradeExtensionTest { @Test fun calcSummaryAverage() { - assertEquals(3.5, listOf( - createGradeSummary("4"), - createGradeSummary("5+"), - createGradeSummary("5-"), - createGradeSummary("test"), - createGradeSummary("0") - ).calcAverage(0.5, 0.5), 0.005) + assertEquals( + 3.5, listOf( + createGradeSummary("4"), + createGradeSummary("5+"), + createGradeSummary("5-"), + createGradeSummary("test"), + createGradeSummary("0") + ).calcFinalAverage(0.5, 0.5), 0.005 + ) } @Test From a6a1678b47ebc694d89d47a6b090a1f478cbde75 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Sep 2021 15:51:06 +0000 Subject: [PATCH 0616/1526] Bump core from 1.10.1 to 1.10.2 (#1536) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 713756583..09c9e8e12 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -224,7 +224,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' - playImplementation 'com.google.android.play:core:1.10.1' + playImplementation 'com.google.android.play:core:1.10.2' playImplementation 'com.google.android.play:core-ktx:1.8.1' hmsImplementation 'com.huawei.hms:hianalytics:6.2.0.301' From b552dbc9048231f5923aec8f509c0de6e75332cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Sep 2021 15:56:11 +0000 Subject: [PATCH 0617/1526] Bump constraintlayout from 2.1.0 to 2.1.1 (#1535) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 09c9e8e12..8414ff5d0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -183,7 +183,7 @@ dependencies { implementation "androidx.recyclerview:recyclerview:1.2.1" implementation "androidx.viewpager:viewpager:1.0.0" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" - implementation "androidx.constraintlayout:constraintlayout:2.1.0" + implementation "androidx.constraintlayout:constraintlayout:2.1.1" implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0" implementation "com.google.android.material:material:1.4.0" implementation "com.github.wulkanowy:material-chips-input:2.3.1" From dc90549b9da55d606664cfeac516708e4d31c16c Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Mon, 27 Sep 2021 17:56:43 +0200 Subject: [PATCH 0618/1526] Fix hiding last element in messages (#1538) --- app/src/main/res/layout/fragment_message_tab.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/layout/fragment_message_tab.xml b/app/src/main/res/layout/fragment_message_tab.xml index 4a6948f09..3a30cff8a 100644 --- a/app/src/main/res/layout/fragment_message_tab.xml +++ b/app/src/main/res/layout/fragment_message_tab.xml @@ -13,6 +13,8 @@ android:id="@+id/messageTabRecycler" android:layout_width="match_parent" android:layout_height="match_parent" + android:clipToPadding="false" + android:paddingBottom="64dp" tools:listitem="@layout/item_message" /> From d69118b0859640fa8b783b9fb38ca959fba0e3e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 27 Sep 2021 20:58:25 +0200 Subject: [PATCH 0619/1526] Add notifications center (#1524) --- .../40.json | 2316 +++++++++++++++++ app/src/main/AndroidManifest.xml | 13 + .../github/wulkanowy/data/RepositoryModule.kt | 6 +- .../github/wulkanowy/data/db/AppDatabase.kt | 13 +- .../wulkanowy/data/db/dao/NotificationDao.kt | 15 + .../data/db/entities/Notification.kt | 27 + .../data/db/migrations/Migration40.kt | 23 + .../{Notification.kt => NotificationData.kt} | 10 +- .../repositories/NotificationRepository.kt | 15 + .../notifications/AppNotificationManager.kt | 145 ++ .../sync/notifications/BaseNotification.kt | 102 - .../NewConferenceNotification.kt | 16 +- .../sync/notifications/NewExamNotification.kt | 16 +- .../notifications/NewGradeNotification.kt | 28 +- .../notifications/NewHomeworkNotification.kt | 16 +- .../NewLuckyNumberNotification.kt | 30 +- .../notifications/NewMessageNotification.kt | 16 +- .../sync/notifications/NewNoteNotification.kt | 16 +- .../NewSchoolAnnouncementNotification.kt | 34 +- .../sync/notifications/NotificationType.kt | 4 +- .../services/sync/works/AttendanceWork.kt | 7 +- .../ui/modules/dashboard/DashboardFragment.kt | 6 + .../modules/dashboard/DashboardPresenter.kt | 5 + .../ui/modules/dashboard/DashboardView.kt | 2 + .../NotificationDebugPresenter.kt | 2 +- .../NotificationsCenterAdapter.kt | 62 + .../NotificationsCenterFragment.kt | 108 + .../NotificationsCenterPresenter.kt | 83 + .../NotificationsCenterView.kt | 23 + .../notifications/NotificationsFragment.kt | 1 + .../layout/fragment_notifications_center.xml | 106 + .../res/layout/item_notifications_center.xml | 70 + .../main/res/menu/action_menu_dashboard.xml | 9 +- app/src/main/res/menu/action_menu_main.xml | 2 +- app/src/main/res/values/strings.xml | 1 + .../services/messaging/AppMessagingService.kt | 57 + 36 files changed, 3186 insertions(+), 219 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/40.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/dao/NotificationDao.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/entities/Notification.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration40.kt rename app/src/main/java/io/github/wulkanowy/data/pojos/{Notification.kt => NotificationData.kt} (87%) create mode 100644 app/src/main/java/io/github/wulkanowy/data/repositories/NotificationRepository.kt create mode 100644 app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/services/sync/notifications/BaseNotification.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterAdapter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterFragment.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterPresenter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterView.kt create mode 100644 app/src/main/res/layout/fragment_notifications_center.xml create mode 100644 app/src/main/res/layout/item_notifications_center.xml create mode 100644 app/src/play/java/io/github/wulkanowy/services/messaging/AppMessagingService.kt diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/40.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/40.json new file mode 100644 index 000000000..362c7f0e0 --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/40.json @@ -0,0 +1,2316 @@ +{ + "formatVersion": 1, + "database": { + "version": 40, + "identityHash": "e2fba6244951713b4e9b217adc5d1a23", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "semester_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `recipient_name` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `removed` INTEGER NOT NULL, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `unread_by` INTEGER NOT NULL, `read_by` INTEGER NOT NULL, `content` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "recipient", + "columnName": "recipient_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "removed", + "columnName": "removed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `one_drive_id` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`real_id`))", + "fields": [ + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "oneDriveId", + "columnName": "one_drive_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "real_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ReportingUnits", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `short` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `roles` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "senderName", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roles", + "columnName": "roles", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` TEXT NOT NULL, `name` TEXT NOT NULL, `real_name` TEXT NOT NULL, `login_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `role` INTEGER NOT NULL, `hash` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "realName", + "columnName": "real_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginId", + "columnName": "login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "role", + "columnName": "role", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hash", + "columnName": "hash", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e2fba6244951713b4e9b217adc5d1a23')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 77ce3506c..84c50523c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -45,6 +45,7 @@ tools:ignore="GoogleAppIndexingWarning,UnusedAttribute"> @@ -74,6 +75,7 @@ @@ -83,6 +85,7 @@ @@ -95,11 +98,20 @@ android:permission="android.permission.BIND_REMOTEVIEWS" /> + + + + + + diff --git a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt index a1c3cbbb7..f1b719e54 100644 --- a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt @@ -8,8 +8,8 @@ import androidx.preference.PreferenceManager import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.chuckerteam.chucker.api.RetentionManager -import com.squareup.moshi.Moshi import com.fredporciuncula.flow.preferences.FlowSharedPreferences +import com.squareup.moshi.Moshi import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -202,4 +202,8 @@ internal class RepositoryModule { @Singleton @Provides fun provideSchoolAnnouncementDao(database: AppDatabase) = database.schoolAnnouncementDao + + @Singleton + @Provides + fun provideNotificationDao(database: AppDatabase) = database.notificationDao } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 0dca9aa18..09aa972f0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -10,7 +10,6 @@ import io.github.wulkanowy.data.db.dao.AttendanceDao import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao import io.github.wulkanowy.data.db.dao.CompletedLessonsDao import io.github.wulkanowy.data.db.dao.ConferenceDao -import io.github.wulkanowy.data.db.dao.SchoolAnnouncementDao import io.github.wulkanowy.data.db.dao.ExamDao import io.github.wulkanowy.data.db.dao.GradeDao import io.github.wulkanowy.data.db.dao.GradePartialStatisticsDao @@ -23,8 +22,10 @@ import io.github.wulkanowy.data.db.dao.MessageAttachmentDao import io.github.wulkanowy.data.db.dao.MessagesDao import io.github.wulkanowy.data.db.dao.MobileDeviceDao import io.github.wulkanowy.data.db.dao.NoteDao +import io.github.wulkanowy.data.db.dao.NotificationDao import io.github.wulkanowy.data.db.dao.RecipientDao import io.github.wulkanowy.data.db.dao.ReportingUnitDao +import io.github.wulkanowy.data.db.dao.SchoolAnnouncementDao import io.github.wulkanowy.data.db.dao.SchoolDao import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.dao.StudentDao @@ -38,7 +39,6 @@ import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Conference -import io.github.wulkanowy.data.db.entities.SchoolAnnouncement import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradePartialStatistics @@ -51,9 +51,11 @@ import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Note +import io.github.wulkanowy.data.db.entities.Notification import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.School +import io.github.wulkanowy.data.db.entities.SchoolAnnouncement import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentInfo @@ -95,6 +97,7 @@ import io.github.wulkanowy.data.db.migrations.Migration37 import io.github.wulkanowy.data.db.migrations.Migration38 import io.github.wulkanowy.data.db.migrations.Migration39 import io.github.wulkanowy.data.db.migrations.Migration4 +import io.github.wulkanowy.data.db.migrations.Migration40 import io.github.wulkanowy.data.db.migrations.Migration5 import io.github.wulkanowy.data.db.migrations.Migration6 import io.github.wulkanowy.data.db.migrations.Migration7 @@ -134,6 +137,7 @@ import javax.inject.Singleton StudentInfo::class, TimetableHeader::class, SchoolAnnouncement::class, + Notification::class ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -142,7 +146,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 39 + const val VERSION_SCHEMA = 40 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), @@ -183,6 +187,7 @@ abstract class AppDatabase : RoomDatabase() { Migration37(), Migration38(), Migration39(), + Migration40() ) fun newInstance( @@ -252,4 +257,6 @@ abstract class AppDatabase : RoomDatabase() { abstract val timetableHeaderDao: TimetableHeaderDao abstract val schoolAnnouncementDao: SchoolAnnouncementDao + + abstract val notificationDao: NotificationDao } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/NotificationDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/NotificationDao.kt new file mode 100644 index 000000000..c5ae21bc2 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/NotificationDao.kt @@ -0,0 +1,15 @@ +package io.github.wulkanowy.data.db.dao + +import androidx.room.Dao +import androidx.room.Query +import io.github.wulkanowy.data.db.entities.Notification +import kotlinx.coroutines.flow.Flow +import javax.inject.Singleton + +@Singleton +@Dao +interface NotificationDao : BaseDao { + + @Query("SELECT * FROM Notifications WHERE student_id = :studentId OR student_id = -1") + fun loadAll(studentId: Long): Flow> +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Notification.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Notification.kt new file mode 100644 index 000000000..740137f0f --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Notification.kt @@ -0,0 +1,27 @@ +package io.github.wulkanowy.data.db.entities + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import io.github.wulkanowy.services.sync.notifications.NotificationType +import java.time.LocalDateTime + +@Entity(tableName = "Notifications") +data class Notification( + + @ColumnInfo(name = "student_id") + val studentId: Long, + + val title: String, + + val content: String, + + val type: NotificationType, + + val date: LocalDateTime, + + val data: String? = null +) { + @PrimaryKey(autoGenerate = true) + var id: Long = 0 +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration40.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration40.kt new file mode 100644 index 000000000..6d2795c7c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration40.kt @@ -0,0 +1,23 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +class Migration40 : Migration(39, 40) { + + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL( + """ + CREATE TABLE IF NOT EXISTS `Notifications` ( + `student_id` INTEGER NOT NULL, + `title` TEXT NOT NULL, + `content` TEXT NOT NULL, + `type` TEXT NOT NULL, + `date` INTEGER NOT NULL, + `data` TEXT, + `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL + ) + """ + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/Notification.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/NotificationData.kt similarity index 87% rename from app/src/main/java/io/github/wulkanowy/data/pojos/Notification.kt rename to app/src/main/java/io/github/wulkanowy/data/pojos/NotificationData.kt index ca2749374..0b4603ef7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/pojos/Notification.kt +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/NotificationData.kt @@ -6,7 +6,7 @@ import androidx.annotation.StringRes import io.github.wulkanowy.services.sync.notifications.NotificationType import io.github.wulkanowy.ui.modules.main.MainView -sealed interface Notification { +sealed interface NotificationData { val type: NotificationType val startMenu: MainView.Section val icon: Int @@ -14,7 +14,7 @@ sealed interface Notification { val contentStringRes: Int } -data class MultipleNotifications( +data class MultipleNotificationsData( override val type: NotificationType, override val startMenu: MainView.Section, @DrawableRes override val icon: Int, @@ -23,9 +23,9 @@ data class MultipleNotifications( @PluralsRes val summaryStringRes: Int, val lines: List, -) : Notification +) : NotificationData -data class OneNotification( +data class OneNotificationData( override val type: NotificationType, override val startMenu: MainView.Section, @DrawableRes override val icon: Int, @@ -33,4 +33,4 @@ data class OneNotification( @StringRes override val contentStringRes: Int, val contentValues: List, -) : Notification +) : NotificationData diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/NotificationRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/NotificationRepository.kt new file mode 100644 index 000000000..36bc7c25a --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/NotificationRepository.kt @@ -0,0 +1,15 @@ +package io.github.wulkanowy.data.repositories + +import io.github.wulkanowy.data.db.dao.NotificationDao +import io.github.wulkanowy.data.db.entities.Notification +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class NotificationRepository @Inject constructor(private val notificationDao: NotificationDao) { + + fun getNotifications(studentId: Long) = notificationDao.loadAll(studentId) + + suspend fun saveNotification(notification: Notification) = + notificationDao.insertAll(listOf(notification)) +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt new file mode 100644 index 000000000..69d0092c1 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt @@ -0,0 +1,145 @@ +package io.github.wulkanowy.services.sync.notifications + +import android.annotation.SuppressLint +import android.app.PendingIntent +import android.content.Context +import android.os.Build +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Notification +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.pojos.MultipleNotificationsData +import io.github.wulkanowy.data.pojos.NotificationData +import io.github.wulkanowy.data.pojos.OneNotificationData +import io.github.wulkanowy.data.repositories.NotificationRepository +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.getCompatBitmap +import io.github.wulkanowy.utils.getCompatColor +import io.github.wulkanowy.utils.nickOrName +import java.time.LocalDateTime +import javax.inject.Inject +import kotlin.random.Random + +class AppNotificationManager @Inject constructor( + private val notificationManager: NotificationManagerCompat, + @ApplicationContext private val context: Context, + private val appInfo: AppInfo, + private val notificationRepository: NotificationRepository +) { + + suspend fun sendNotification(notificationData: NotificationData, student: Student) = + when (notificationData) { + is OneNotificationData -> sendOneNotification(notificationData, student) + is MultipleNotificationsData -> sendMultipleNotifications(notificationData, student) + } + + private suspend fun sendOneNotification( + notificationData: OneNotificationData, + student: Student + ) { + val content = context.getString( + notificationData.contentStringRes, + *notificationData.contentValues.toTypedArray() + ) + + val title = context.getString(notificationData.titleStringRes) + + val notification = getDefaultNotificationBuilder(notificationData) + .setContentTitle(title) + .setContentText(content) + .setStyle( + NotificationCompat.BigTextStyle() + .setSummaryText(student.nickOrName) + .bigText(content) + ) + .build() + + notificationManager.notify(Random.nextInt(Int.MAX_VALUE), notification) + + saveNotification(title, content, notificationData, student) + } + + private suspend fun sendMultipleNotifications( + notificationData: MultipleNotificationsData, + student: Student + ) { + val groupType = notificationData.type.group ?: return + val group = "${groupType}_${student.id}" + val groupId = student.id * 100 + notificationData.type.ordinal + + notificationData.lines.forEach { item -> + val title = context.resources.getQuantityString(notificationData.titleStringRes, 1) + + val notification = getDefaultNotificationBuilder(notificationData) + .setContentTitle(title) + .setContentText(item) + .setStyle( + NotificationCompat.BigTextStyle() + .setSummaryText(student.nickOrName) + .bigText(item) + ) + .setGroup(group) + .build() + + notificationManager.notify(Random.nextInt(Int.MAX_VALUE), notification) + + saveNotification(title, item, notificationData, student) + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return + + val summaryNotification = getDefaultNotificationBuilder(notificationData) + .setSmallIcon(notificationData.icon) + .setGroup(group) + .setStyle(NotificationCompat.InboxStyle().setSummaryText(student.nickOrName)) + .setGroupSummary(true) + .build() + + notificationManager.notify(groupId.toInt(), summaryNotification) + } + + @SuppressLint("InlinedApi") + private fun getDefaultNotificationBuilder(notificationData: NotificationData): NotificationCompat.Builder { + val pendingIntentsFlags = if (appInfo.systemVersion >= Build.VERSION_CODES.M) { + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + } else { + PendingIntent.FLAG_UPDATE_CURRENT + } + + return NotificationCompat.Builder(context, notificationData.type.channel) + .setLargeIcon(context.getCompatBitmap(notificationData.icon, R.color.colorPrimary)) + .setSmallIcon(R.drawable.ic_stat_all) + .setAutoCancel(true) + .setDefaults(NotificationCompat.DEFAULT_ALL) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setColor(context.getCompatColor(R.color.colorPrimary)) + .setContentIntent( + PendingIntent.getActivity( + context, + notificationData.startMenu.id, + MainActivity.getStartIntent(context, notificationData.startMenu, true), + pendingIntentsFlags + ) + ) + } + + private suspend fun saveNotification( + title: String, + content: String, + notificationData: NotificationData, + student: Student + ) { + val notificationEntity = Notification( + studentId = student.id, + title = title, + content = content, + type = notificationData.type, + date = LocalDateTime.now() + ) + + notificationRepository.saveNotification(notificationEntity) + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/BaseNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/BaseNotification.kt deleted file mode 100644 index 8c9cb471d..000000000 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/BaseNotification.kt +++ /dev/null @@ -1,102 +0,0 @@ -package io.github.wulkanowy.services.sync.notifications - -import android.app.PendingIntent -import android.content.Context -import android.os.Build -import androidx.annotation.PluralsRes -import androidx.core.app.NotificationCompat -import androidx.core.app.NotificationManagerCompat -import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotifications -import io.github.wulkanowy.data.pojos.Notification -import io.github.wulkanowy.data.pojos.OneNotification -import io.github.wulkanowy.ui.modules.main.MainActivity -import io.github.wulkanowy.utils.getCompatBitmap -import io.github.wulkanowy.utils.getCompatColor -import io.github.wulkanowy.utils.nickOrName -import kotlin.random.Random - -abstract class BaseNotification( - private val context: Context, - private val notificationManager: NotificationManagerCompat, -) { - - protected fun sendNotification(notification: Notification, student: Student) = - when (notification) { - is OneNotification -> sendOneNotification(notification, student) - is MultipleNotifications -> sendMultipleNotifications(notification, student) - } - - private fun sendOneNotification(notification: OneNotification, student: Student?) { - notificationManager.notify( - Random.nextInt(Int.MAX_VALUE), - getNotificationBuilder(notification).apply { - val content = context.getString( - notification.contentStringRes, - *notification.contentValues.toTypedArray() - ) - setContentTitle(context.getString(notification.titleStringRes)) - setContentText(content) - setStyle( - NotificationCompat.BigTextStyle() - .setSummaryText(student?.nickOrName) - .bigText(content) - ) - }.build() - ) - } - - private fun sendMultipleNotifications(notification: MultipleNotifications, student: Student) { - val group = notification.type.group + student.id - val groupId = student.id * 100 + notification.type.ordinal - - notification.lines.forEach { item -> - notificationManager.notify( - Random.nextInt(Int.MAX_VALUE), - getNotificationBuilder(notification).apply { - setContentTitle(getQuantityString(notification.titleStringRes, 1)) - setContentText(item) - setStyle( - NotificationCompat.BigTextStyle() - .setSummaryText(student.nickOrName) - .bigText(item) - ) - setGroup(group) - }.build() - ) - } - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return - - notificationManager.notify( - groupId.toInt(), - getNotificationBuilder(notification).apply { - setSmallIcon(notification.icon) - setGroup(group) - setStyle(NotificationCompat.InboxStyle().setSummaryText(student.nickOrName)) - setGroupSummary(true) - }.build() - ) - } - - private fun getNotificationBuilder(notification: Notification) = NotificationCompat - .Builder(context, notification.type.channel) - .setLargeIcon(context.getCompatBitmap(notification.icon, R.color.colorPrimary)) - .setSmallIcon(R.drawable.ic_stat_all) - .setAutoCancel(true) - .setDefaults(NotificationCompat.DEFAULT_ALL) - .setPriority(NotificationCompat.PRIORITY_HIGH) - .setColor(context.getCompatColor(R.color.colorPrimary)) - .setContentIntent( - PendingIntent.getActivity( - context, notification.startMenu.id, - MainActivity.getStartIntent(context, notification.startMenu, true), - PendingIntent.FLAG_UPDATE_CURRENT - ) - ) - - private fun getQuantityString(@PluralsRes id: Int, value: Int): String { - return context.resources.getQuantityString(id, value, value) - } -} diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt index fda2922f9..994cb8d4b 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt @@ -1,29 +1,25 @@ package io.github.wulkanowy.services.sync.notifications -import android.content.Context -import androidx.core.app.NotificationManagerCompat -import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Conference import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotifications +import io.github.wulkanowy.data.pojos.MultipleNotificationsData import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDateTime import javax.inject.Inject class NewConferenceNotification @Inject constructor( - @ApplicationContext private val context: Context, - notificationManager: NotificationManagerCompat, -) : BaseNotification(context, notificationManager) { + private val appNotificationManager: AppNotificationManager +) { - fun notify(items: List, student: Student) { + suspend fun notify(items: List, student: Student) { val today = LocalDateTime.now() val lines = items.filter { !it.date.isBefore(today) }.map { "${it.date.toFormattedString("dd.MM")} - ${it.title}: ${it.subject}" }.ifEmpty { return } - val notification = MultipleNotifications( + val notification = MultipleNotificationsData( type = NotificationType.NEW_CONFERENCE, icon = R.drawable.ic_more_conferences, titleStringRes = R.plurals.conference_notify_new_item_title, @@ -33,6 +29,6 @@ class NewConferenceNotification @Inject constructor( lines = lines ) - sendNotification(notification, student) + appNotificationManager.sendNotification(notification, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt index d493c4d2e..f148fa34f 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt @@ -1,29 +1,25 @@ package io.github.wulkanowy.services.sync.notifications -import android.content.Context -import androidx.core.app.NotificationManagerCompat -import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotifications +import io.github.wulkanowy.data.pojos.MultipleNotificationsData import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDate import javax.inject.Inject class NewExamNotification @Inject constructor( - @ApplicationContext private val context: Context, - notificationManager: NotificationManagerCompat, -) : BaseNotification(context, notificationManager) { + private val appNotificationManager: AppNotificationManager +) { - fun notify(items: List, student: Student) { + suspend fun notify(items: List, student: Student) { val today = LocalDate.now() val lines = items.filter { !it.date.isBefore(today) }.map { "${it.date.toFormattedString("dd.MM")} - ${it.subject}: ${it.description}" }.ifEmpty { return } - val notification = MultipleNotifications( + val notification = MultipleNotificationsData( type = NotificationType.NEW_EXAM, icon = R.drawable.ic_main_exam, titleStringRes = R.plurals.exam_notify_new_item_title, @@ -33,6 +29,6 @@ class NewExamNotification @Inject constructor( lines = lines ) - sendNotification(notification, student) + appNotificationManager.sendNotification(notification, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt index 415ba3434..52bdff588 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt @@ -1,23 +1,19 @@ package io.github.wulkanowy.services.sync.notifications -import android.content.Context -import androidx.core.app.NotificationManagerCompat -import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotifications +import io.github.wulkanowy.data.pojos.MultipleNotificationsData import io.github.wulkanowy.ui.modules.main.MainView import javax.inject.Inject class NewGradeNotification @Inject constructor( - @ApplicationContext private val context: Context, - notificationManager: NotificationManagerCompat, -) : BaseNotification(context, notificationManager) { + private val appNotificationManager: AppNotificationManager +) { - fun notifyDetails(items: List, student: Student) { - val notification = MultipleNotifications( + suspend fun notifyDetails(items: List, student: Student) { + val notification = MultipleNotificationsData( type = NotificationType.NEW_GRADE_DETAILS, icon = R.drawable.ic_stat_grade, titleStringRes = R.plurals.grade_new_items, @@ -29,11 +25,11 @@ class NewGradeNotification @Inject constructor( } ) - sendNotification(notification, student) + appNotificationManager.sendNotification(notification, student) } - fun notifyPredicted(items: List, student: Student) { - val notification = MultipleNotifications( + suspend fun notifyPredicted(items: List, student: Student) { + val notification = MultipleNotificationsData( type = NotificationType.NEW_GRADE_PREDICTED, icon = R.drawable.ic_stat_grade, titleStringRes = R.plurals.grade_new_items_predicted, @@ -45,11 +41,11 @@ class NewGradeNotification @Inject constructor( } ) - sendNotification(notification, student) + appNotificationManager.sendNotification(notification, student) } - fun notifyFinal(items: List, student: Student) { - val notification = MultipleNotifications( + suspend fun notifyFinal(items: List, student: Student) { + val notification = MultipleNotificationsData( type = NotificationType.NEW_GRADE_FINAL, icon = R.drawable.ic_stat_grade, titleStringRes = R.plurals.grade_new_items_final, @@ -61,6 +57,6 @@ class NewGradeNotification @Inject constructor( } ) - sendNotification(notification, student) + appNotificationManager.sendNotification(notification, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt index fe973cade..4c34cb8ff 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt @@ -1,29 +1,25 @@ package io.github.wulkanowy.services.sync.notifications -import android.content.Context -import androidx.core.app.NotificationManagerCompat -import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotifications +import io.github.wulkanowy.data.pojos.MultipleNotificationsData import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDate import javax.inject.Inject class NewHomeworkNotification @Inject constructor( - @ApplicationContext private val context: Context, - notificationManager: NotificationManagerCompat, -) : BaseNotification(context, notificationManager) { + private val appNotificationManager: AppNotificationManager +) { - fun notify(items: List, student: Student) { + suspend fun notify(items: List, student: Student) { val today = LocalDate.now() val lines = items.filter { !it.date.isBefore(today) }.map { "${it.date.toFormattedString("dd.MM")} - ${it.subject}: ${it.content}" }.ifEmpty { return } - val notification = MultipleNotifications( + val notification = MultipleNotificationsData( type = NotificationType.NEW_HOMEWORK, icon = R.drawable.ic_more_homework, titleStringRes = R.plurals.homework_notify_new_item_title, @@ -33,6 +29,6 @@ class NewHomeworkNotification @Inject constructor( lines = lines ) - sendNotification(notification, student) + appNotificationManager.sendNotification(notification, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt index 95156c451..08c985106 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt @@ -1,30 +1,26 @@ package io.github.wulkanowy.services.sync.notifications -import android.content.Context -import androidx.core.app.NotificationManagerCompat -import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.OneNotification +import io.github.wulkanowy.data.pojos.OneNotificationData import io.github.wulkanowy.ui.modules.main.MainView import javax.inject.Inject class NewLuckyNumberNotification @Inject constructor( - @ApplicationContext private val context: Context, - notificationManager: NotificationManagerCompat, -) : BaseNotification(context, notificationManager) { + private val appNotificationManager: AppNotificationManager +) { - fun notify(item: LuckyNumber, student: Student) { - val notification = OneNotification( - type = NotificationType.NEW_LUCKY_NUMBER, - icon = R.drawable.ic_stat_luckynumber, - titleStringRes = R.string.lucky_number_notify_new_item_title, - contentStringRes = R.string.lucky_number_notify_new_item, - startMenu = MainView.Section.LUCKY_NUMBER, - contentValues = listOf(item.luckyNumber.toString()) - ) + suspend fun notify(item: LuckyNumber, student: Student) { + val notification = OneNotificationData( + type = NotificationType.NEW_LUCKY_NUMBER, + icon = R.drawable.ic_stat_luckynumber, + titleStringRes = R.string.lucky_number_notify_new_item_title, + contentStringRes = R.string.lucky_number_notify_new_item, + startMenu = MainView.Section.LUCKY_NUMBER, + contentValues = listOf(item.luckyNumber.toString()) + ) - sendNotification(notification, student) + appNotificationManager.sendNotification(notification, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt index fc3641983..a6d503aa0 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt @@ -1,22 +1,18 @@ package io.github.wulkanowy.services.sync.notifications -import android.content.Context -import androidx.core.app.NotificationManagerCompat -import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotifications +import io.github.wulkanowy.data.pojos.MultipleNotificationsData import io.github.wulkanowy.ui.modules.main.MainView import javax.inject.Inject class NewMessageNotification @Inject constructor( - @ApplicationContext private val context: Context, - notificationManager: NotificationManagerCompat, -) : BaseNotification(context, notificationManager) { + private val appNotificationManager: AppNotificationManager +) { - fun notify(items: List, student: Student) { - val notification = MultipleNotifications( + suspend fun notify(items: List, student: Student) { + val notification = MultipleNotificationsData( type = NotificationType.NEW_MESSAGE, icon = R.drawable.ic_stat_message, titleStringRes = R.plurals.message_new_items, @@ -28,6 +24,6 @@ class NewMessageNotification @Inject constructor( } ) - sendNotification(notification, student) + appNotificationManager.sendNotification(notification, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt index f355341b7..ffa3cc9cb 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt @@ -1,23 +1,19 @@ package io.github.wulkanowy.services.sync.notifications -import android.content.Context -import androidx.core.app.NotificationManagerCompat -import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotifications +import io.github.wulkanowy.data.pojos.MultipleNotificationsData import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory import io.github.wulkanowy.ui.modules.main.MainView import javax.inject.Inject class NewNoteNotification @Inject constructor( - @ApplicationContext private val context: Context, - notificationManager: NotificationManagerCompat, -) : BaseNotification(context, notificationManager) { + private val appNotificationManager: AppNotificationManager +) { - fun notify(items: List, student: Student) { - val notification = MultipleNotifications( + suspend fun notify(items: List, student: Student) { + val notification = MultipleNotificationsData( type = NotificationType.NEW_NOTE, icon = R.drawable.ic_stat_note, titleStringRes = when (NoteCategory.getByValue(items.first().categoryType)) { @@ -41,6 +37,6 @@ class NewNoteNotification @Inject constructor( } ) - sendNotification(notification, student) + appNotificationManager.sendNotification(notification, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt index b38e4f609..990a950b1 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt @@ -1,33 +1,29 @@ package io.github.wulkanowy.services.sync.notifications -import android.content.Context -import androidx.core.app.NotificationManagerCompat -import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.SchoolAnnouncement import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotifications +import io.github.wulkanowy.data.pojos.MultipleNotificationsData import io.github.wulkanowy.ui.modules.main.MainView import javax.inject.Inject class NewSchoolAnnouncementNotification @Inject constructor( - @ApplicationContext private val context: Context, - notificationManager: NotificationManagerCompat, -) : BaseNotification(context, notificationManager) { + private val appNotificationManager: AppNotificationManager +) { - fun notify(items: List, student: Student) { - val notification = MultipleNotifications( - type = NotificationType.NEW_ANNOUNCEMENT, - icon = R.drawable.ic_all_about, - titleStringRes = R.plurals.school_announcement_notify_new_item_title, - contentStringRes = R.plurals.school_announcement_notify_new_items, - summaryStringRes = R.plurals.school_announcement_number_item, - startMenu = MainView.Section.SCHOOL_ANNOUNCEMENT, - lines = items.map { - "${it.subject}: ${it.content}" - } + suspend fun notify(items: List, student: Student) { + val notification = MultipleNotificationsData( + type = NotificationType.NEW_ANNOUNCEMENT, + icon = R.drawable.ic_all_about, + titleStringRes = R.plurals.school_announcement_notify_new_item_title, + contentStringRes = R.plurals.school_announcement_notify_new_items, + summaryStringRes = R.plurals.school_announcement_number_item, + startMenu = MainView.Section.SCHOOL_ANNOUNCEMENT, + lines = items.map { + "${it.subject}: ${it.content}" + } ) - sendNotification(notification, student) + appNotificationManager.sendNotification(notification, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt index c3df1960f..49cbcfe9e 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt @@ -8,8 +8,9 @@ import io.github.wulkanowy.services.sync.channels.NewHomeworkChannel import io.github.wulkanowy.services.sync.channels.NewMessagesChannel import io.github.wulkanowy.services.sync.channels.NewNotesChannel import io.github.wulkanowy.services.sync.channels.NewSchoolAnnouncementsChannel +import io.github.wulkanowy.services.sync.channels.PushChannel -enum class NotificationType(val group: String, val channel: String) { +enum class NotificationType(val group: String?, val channel: String) { NEW_CONFERENCE("new_conferences_group", NewConferencesChannel.CHANNEL_ID), NEW_EXAM("new_exam_group", NewExamChannel.CHANNEL_ID), NEW_GRADE_DETAILS("new_grade_details_group", NewGradesChannel.CHANNEL_ID), @@ -20,4 +21,5 @@ enum class NotificationType(val group: String, val channel: String) { NEW_MESSAGE("new_message_group", NewMessagesChannel.CHANNEL_ID), NEW_NOTE("new_notes_group", NewNotesChannel.CHANNEL_ID), NEW_ANNOUNCEMENT("new_school_announcements_group", NewSchoolAnnouncementsChannel.CHANNEL_ID), + PUSH(null, PushChannel.CHANNEL_ID) } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt index 788e4ea2c..4823b2b5b 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt @@ -9,9 +9,12 @@ import io.github.wulkanowy.utils.waitForResult import java.time.LocalDate.now import javax.inject.Inject -class AttendanceWork @Inject constructor(private val attendanceRepository: AttendanceRepository) : Work { +class AttendanceWork @Inject constructor( + private val attendanceRepository: AttendanceRepository +) : Work { override suspend fun doWork(student: Student, semester: Semester) { - attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true).waitForResult() + attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true) + .waitForResult() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt index 59d9c8e4a..096c1b77a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt @@ -24,6 +24,7 @@ import io.github.wulkanowy.ui.modules.luckynumber.LuckyNumberFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.message.MessageFragment +import io.github.wulkanowy.ui.modules.notificationscenter.NotificationsCenterFragment import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragment import io.github.wulkanowy.ui.modules.timetable.TimetableFragment import io.github.wulkanowy.utils.capitalise @@ -120,6 +121,7 @@ class DashboardFragment : BaseFragment(R.layout.fragme override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.dashboard_menu_tiles -> presenter.onDashboardTileSettingsSelected() + R.id.dashboard_menu_notifaction_list -> presenter.onNotificationsCenterSelected() else -> false } } @@ -182,6 +184,10 @@ class DashboardFragment : BaseFragment(R.layout.fragme if (::presenter.isInitialized) presenter.onViewReselected() } + override fun openNotificationsCenterView() { + (requireActivity() as MainActivity).pushView(NotificationsCenterFragment.newInstance()) + } + override fun onDestroyView() { dashboardAdapter.clearTimers() presenter.onDetachView() 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 108a086b7..c513a9f6f 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 @@ -209,6 +209,11 @@ class DashboardPresenter @Inject constructor( view?.showErrorDetailsDialog(lastError) } + fun onNotificationsCenterSelected(): Boolean { + view?.openNotificationsCenterView() + return true + } + fun onDashboardTileSettingsSelected(): Boolean { view?.showDashboardTileSettings(preferencesRepository.selectedDashboardTiles.toList()) return true diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt index d5c5e5a70..899eb3202 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt @@ -23,4 +23,6 @@ interface DashboardView : BaseView { fun resetView() fun popViewToRoot() + + fun openNotificationsCenterView() } \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt index 07468daa6..6103317d2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt @@ -87,7 +87,7 @@ class NotificationDebugPresenter @Inject constructor( } } - private fun withStudent(block: (Student) -> Unit) { + private fun withStudent(block: suspend (Student) -> Unit) { launch { block(studentRepository.getCurrentStudent(false)) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterAdapter.kt new file mode 100644 index 000000000..7ee326f8f --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterAdapter.kt @@ -0,0 +1,62 @@ +package io.github.wulkanowy.ui.modules.notificationscenter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Notification +import io.github.wulkanowy.databinding.ItemNotificationsCenterBinding +import io.github.wulkanowy.services.sync.notifications.NotificationType +import io.github.wulkanowy.utils.toFormattedString +import javax.inject.Inject + +class NotificationsCenterAdapter @Inject constructor() : + ListAdapter(DiffUtilCallback()) { + + var onItemClickListener: (NotificationType) -> Unit = {} + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( + ItemNotificationsCenterBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val item = getItem(position) + + with(holder.binding) { + notificationsCenterItemTitle.text = item.title + notificationsCenterItemContent.text = item.content + notificationsCenterItemDate.text = item.date.toFormattedString("HH:mm, d MMM") + notificationsCenterItemIcon.setImageResource(item.type.toDrawableResId()) + + root.setOnClickListener { onItemClickListener(item.type) } + } + } + + private fun NotificationType.toDrawableResId() = when (this) { + NotificationType.NEW_CONFERENCE -> R.drawable.ic_more_conferences + NotificationType.NEW_EXAM -> R.drawable.ic_main_exam + NotificationType.NEW_GRADE_DETAILS -> R.drawable.ic_stat_grade + NotificationType.NEW_GRADE_PREDICTED -> R.drawable.ic_stat_grade + NotificationType.NEW_GRADE_FINAL -> R.drawable.ic_stat_grade + NotificationType.NEW_HOMEWORK -> R.drawable.ic_more_homework + NotificationType.NEW_LUCKY_NUMBER -> R.drawable.ic_stat_luckynumber + NotificationType.NEW_MESSAGE -> R.drawable.ic_stat_message + NotificationType.NEW_NOTE -> R.drawable.ic_stat_note + NotificationType.NEW_ANNOUNCEMENT -> R.drawable.ic_all_about + NotificationType.PUSH -> R.drawable.ic_stat_all + } + + class ViewHolder(val binding: ItemNotificationsCenterBinding) : + RecyclerView.ViewHolder(binding.root) + + private class DiffUtilCallback : DiffUtil.ItemCallback() { + + override fun areContentsTheSame(oldItem: Notification, newItem: Notification) = + oldItem == newItem + + override fun areItemsTheSame(oldItem: Notification, newItem: Notification) = + oldItem.id == newItem.id + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterFragment.kt new file mode 100644 index 000000000..b9bfb447e --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterFragment.kt @@ -0,0 +1,108 @@ +package io.github.wulkanowy.ui.modules.notificationscenter + +import android.os.Bundle +import android.view.View +import androidx.core.view.isVisible +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Notification +import io.github.wulkanowy.databinding.FragmentNotificationsCenterBinding +import io.github.wulkanowy.services.sync.notifications.NotificationType +import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.conference.ConferenceFragment +import io.github.wulkanowy.ui.modules.exam.ExamFragment +import io.github.wulkanowy.ui.modules.grade.GradeFragment +import io.github.wulkanowy.ui.modules.homework.HomeworkFragment +import io.github.wulkanowy.ui.modules.luckynumber.LuckyNumberFragment +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.modules.message.MessageFragment +import io.github.wulkanowy.ui.modules.note.NoteFragment +import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragment +import javax.inject.Inject + +@AndroidEntryPoint +class NotificationsCenterFragment : + BaseFragment(R.layout.fragment_notifications_center), + NotificationsCenterView, MainView.TitledView { + + @Inject + lateinit var presenter: NotificationsCenterPresenter + + @Inject + lateinit var notificationsCenterAdapter: NotificationsCenterAdapter + + companion object { + + fun newInstance() = NotificationsCenterFragment() + } + + override val titleStringId: Int + get() = R.string.notifications_center_title + + override val isViewEmpty: Boolean + get() = notificationsCenterAdapter.itemCount == 0 + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentNotificationsCenterBinding.bind(view) + presenter.onAttachView(this) + } + + override fun initView() { + notificationsCenterAdapter.onItemClickListener = { notificationType -> + notificationType.toDestinationFragment() + ?.let { (requireActivity() as MainActivity).pushView(it) } + } + + with(binding.notificationsCenterRecycler) { + layoutManager = LinearLayoutManager(context) + adapter = notificationsCenterAdapter + } + } + + override fun updateData(data: List) { + notificationsCenterAdapter.submitList(data) + } + + override fun showEmpty(show: Boolean) { + binding.notificationsCenterEmpty.isVisible = show + } + + override fun showProgress(show: Boolean) { + binding.notificationsCenterProgress.isVisible = show + } + + override fun showContent(show: Boolean) { + binding.notificationsCenterRecycler.isVisible = show + } + + override fun showErrorView(show: Boolean) { + binding.notificationCenterError.isVisible = show + } + + override fun setErrorDetails(message: String) { + binding.notificationCenterErrorMessage.text = message + } + + override fun onDestroyView() { + presenter.onDetachView() + super.onDestroyView() + } + + private fun NotificationType.toDestinationFragment(): Fragment? = when (this) { + NotificationType.NEW_CONFERENCE -> ConferenceFragment.newInstance() + NotificationType.NEW_EXAM -> ExamFragment.newInstance() + NotificationType.NEW_GRADE_DETAILS -> GradeFragment.newInstance() + NotificationType.NEW_GRADE_PREDICTED -> GradeFragment.newInstance() + NotificationType.NEW_GRADE_FINAL -> GradeFragment.newInstance() + NotificationType.NEW_HOMEWORK -> HomeworkFragment.newInstance() + NotificationType.NEW_LUCKY_NUMBER -> LuckyNumberFragment.newInstance() + NotificationType.NEW_MESSAGE -> MessageFragment.newInstance() + NotificationType.NEW_NOTE -> NoteFragment.newInstance() + NotificationType.NEW_ANNOUNCEMENT -> SchoolAnnouncementFragment.newInstance() + NotificationType.PUSH -> null + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterPresenter.kt new file mode 100644 index 000000000..394c23101 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterPresenter.kt @@ -0,0 +1,83 @@ +package io.github.wulkanowy.ui.modules.notificationscenter + +import io.github.wulkanowy.data.repositories.NotificationRepository +import io.github.wulkanowy.data.repositories.StudentRepository +import io.github.wulkanowy.ui.base.BasePresenter +import io.github.wulkanowy.ui.base.ErrorHandler +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach +import timber.log.Timber +import javax.inject.Inject + +class NotificationsCenterPresenter @Inject constructor( + private val notificationRepository: NotificationRepository, + errorHandler: ErrorHandler, + studentRepository: StudentRepository +) : BasePresenter(errorHandler, studentRepository) { + + private lateinit var lastError: Throwable + + override fun onAttachView(view: NotificationsCenterView) { + super.onAttachView(view) + view.initView() + Timber.i("Notifications centre view was initialized") + errorHandler.showErrorMessage = ::showErrorViewOnError + loadData() + } + + fun onRetry() { + view?.run { + showErrorView(false) + showProgress(true) + } + loadData() + } + + fun onDetailsClick() { + view?.showErrorDetailsDialog(lastError) + } + + private fun loadData() { + Timber.i("Loading notifications data started") + + flow { + val studentId = studentRepository.getCurrentStudent(false).id + emitAll(notificationRepository.getNotifications(studentId)) + } + .map { notificationList -> notificationList.sortedByDescending { it.date } } + .catch { Timber.i("Loading notifications result: An exception occurred") } + .onEach { + Timber.i("Loading notifications result: Success") + + if (it.isEmpty()) { + view?.run { + showContent(false) + showProgress(false) + showEmpty(true) + } + } else { + view?.run { + showContent(true) + showProgress(false) + showEmpty(false) + updateData(it) + } + } + } + .launch() + } + + private fun showErrorViewOnError(message: String, error: Throwable) { + view?.run { + if (isViewEmpty) { + lastError = error + setErrorDetails(message) + showErrorView(true) + showEmpty(false) + } else showError(message, error) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterView.kt new file mode 100644 index 000000000..1bfbe75e1 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterView.kt @@ -0,0 +1,23 @@ +package io.github.wulkanowy.ui.modules.notificationscenter + +import io.github.wulkanowy.data.db.entities.Notification +import io.github.wulkanowy.ui.base.BaseView + +interface NotificationsCenterView : BaseView { + + val isViewEmpty: Boolean + + fun initView() + + fun updateData(data: List) + + fun showProgress(show: Boolean) + + fun showEmpty(show: Boolean) + + fun showContent(show: Boolean) + + fun showErrorView(show: Boolean) + + fun setErrorDetails(message: String) +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt index 207d587de..8470d1a5b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt @@ -184,6 +184,7 @@ class NotificationsFragment : PreferenceFragmentCompat(), .setNegativeButton(android.R.string.cancel) { _, _ -> setNotificationPiggybackPreferenceChecked(false) } + .setOnDismissListener { setNotificationPiggybackPreferenceChecked(false) } .show() } diff --git a/app/src/main/res/layout/fragment_notifications_center.xml b/app/src/main/res/layout/fragment_notifications_center.xml new file mode 100644 index 000000000..f59ce33c9 --- /dev/null +++ b/app/src/main/res/layout/fragment_notifications_center.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_notifications_center.xml b/app/src/main/res/layout/item_notifications_center.xml new file mode 100644 index 000000000..ae3f5586d --- /dev/null +++ b/app/src/main/res/layout/item_notifications_center.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/action_menu_dashboard.xml b/app/src/main/res/menu/action_menu_dashboard.xml index dbdd6e812..13565a196 100644 --- a/app/src/main/res/menu/action_menu_dashboard.xml +++ b/app/src/main/res/menu/action_menu_dashboard.xml @@ -1,10 +1,17 @@

+ diff --git a/app/src/main/res/menu/action_menu_main.xml b/app/src/main/res/menu/action_menu_main.xml index 219059391..f14d1f749 100644 --- a/app/src/main/res/menu/action_menu_main.xml +++ b/app/src/main/res/menu/action_menu_main.xml @@ -5,7 +5,7 @@ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ed2369322..ae11d493e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,6 +24,7 @@ Account details Student info Dashboard + Notifications center diff --git a/app/src/play/java/io/github/wulkanowy/services/messaging/AppMessagingService.kt b/app/src/play/java/io/github/wulkanowy/services/messaging/AppMessagingService.kt new file mode 100644 index 000000000..6e5c7e89c --- /dev/null +++ b/app/src/play/java/io/github/wulkanowy/services/messaging/AppMessagingService.kt @@ -0,0 +1,57 @@ +package io.github.wulkanowy.services.messaging + +import android.annotation.SuppressLint +import com.google.firebase.messaging.FirebaseMessagingService +import com.google.firebase.messaging.RemoteMessage +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.data.db.entities.Notification +import io.github.wulkanowy.data.repositories.NotificationRepository +import io.github.wulkanowy.services.sync.notifications.NotificationType +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import timber.log.Timber +import java.time.LocalDateTime +import javax.inject.Inject + +@SuppressLint("MissingFirebaseInstanceTokenRefresh") +@AndroidEntryPoint +class AppMessagingService : FirebaseMessagingService() { + + @Inject + lateinit var notificationRepository: NotificationRepository + + private val job = Job() + + private val serviceScope = CoroutineScope(Dispatchers.Main + job) + + override fun onMessageReceived(remoteMessage: RemoteMessage) { + val remoteMessageData = remoteMessage.data + val title = remoteMessageData["title"] ?: return + val content = remoteMessageData["content"] ?: return + val customData = remoteMessageData["custom_data"] + + val notification = Notification( + title = title, + content = content, + data = customData, + date = LocalDateTime.now(), + type = NotificationType.PUSH, + studentId = -1 + ) + + serviceScope.launch { + try { + notificationRepository.saveNotification(notification) + } catch (e: Throwable) { + Timber.e(e) + } + } + } + + override fun onDestroy() { + job.cancel() + super.onDestroy() + } +} \ No newline at end of file From e10e530dee7972dbe8e58993e15c904c444259a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 27 Sep 2021 23:03:59 +0200 Subject: [PATCH 0620/1526] Remove seconds from timetable timer (#1539) --- .../ui/modules/timetable/TimetableAdapter.kt | 41 +++++++------------ 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index 4a5a06995..2228aaf46 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -1,12 +1,13 @@ package io.github.wulkanowy.ui.modules.timetable import android.graphics.Paint +import android.os.Handler +import android.os.Looper import android.view.LayoutInflater import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.TextView -import androidx.core.view.ViewCompat import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R @@ -151,8 +152,8 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter Date: Tue, 28 Sep 2021 11:48:25 +0200 Subject: [PATCH 0621/1526] Add option to make upcoming lesson notification not persistent (#1537) --- .../repositories/PreferencesRepository.kt | 8 ++ .../alarm/TimetableNotificationReceiver.kt | 77 +++++++++++++------ .../notifications/NotificationsPresenter.kt | 2 +- .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 + .../xml/scheme_preferences_notifications.xml | 8 ++ 7 files changed, 74 insertions(+), 25 deletions(-) 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 f0f1c32dd..a08045f85 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 @@ -107,6 +107,14 @@ class PreferencesRepository @Inject constructor( R.bool.pref_default_notification_upcoming_lessons_enable ) + val isUpcomingLessonsNotificationsPersistentKey = + context.getString(R.string.pref_key_notifications_upcoming_lessons_persistent) + val isUpcomingLessonsNotificationsPersistent: Boolean + get() = getBoolean( + isUpcomingLessonsNotificationsPersistentKey, + R.bool.pref_default_notification_upcoming_lessons_persistent + ) + val isNotificationPiggybackEnabledKey = context.getString(R.string.pref_key_notifications_piggyback) val isNotificationPiggybackEnabled: Boolean diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt index 406d91f5f..5e4bad8cf 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt @@ -11,6 +11,7 @@ import androidx.core.app.NotificationManagerCompat import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.Status +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.services.HiltBroadcastReceiver import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel.Companion.CHANNEL_ID @@ -32,6 +33,9 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { @Inject lateinit var studentRepository: StudentRepository + @Inject + lateinit var preferencesRepository: PreferencesRepository + companion object { const val NOTIFICATION_TYPE_CURRENT = 1 const val NOTIFICATION_TYPE_UPCOMING = 2 @@ -68,6 +72,7 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { private fun prepareNotification(context: Context, intent: Intent) { val type = intent.getIntExtra(LESSON_TYPE, 0) val notificationId = intent.getIntExtra(NOTIFICATION_ID, MainView.Section.TIMETABLE.id) + val isPersistent = preferencesRepository.isUpcomingLessonsNotificationsPersistent if (type == NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION) { return NotificationManagerCompat.from(context).cancel(notificationId) @@ -87,33 +92,57 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { Timber.d("TimetableNotification receive: type: $type, subject: $subject, start: ${start.toLocalDateTime()}, student: $studentId") - showNotification(context, notificationId, studentName, + showNotification(context, notificationId, isPersistent, studentName, if (type == NOTIFICATION_TYPE_CURRENT) end else start, end - start, - context.getString(if (type == NOTIFICATION_TYPE_CURRENT) R.string.timetable_now else R.string.timetable_next, "($room) $subject".removePrefix("()")), - nextSubject?.let { context.getString(R.string.timetable_later, "($nextRoom) $nextSubject".removePrefix("()")) } + context.getString( + if (type == NOTIFICATION_TYPE_CURRENT) R.string.timetable_now else R.string.timetable_next, + "($room) $subject".removePrefix("()") + ), + nextSubject?.let { + context.getString( + R.string.timetable_later, + "($nextRoom) $nextSubject".removePrefix("()") + ) + } ) } - private fun showNotification(context: Context, notificationId: Int, studentName: String?, countDown: Long, timeout: Long, title: String, next: String?) { - NotificationManagerCompat.from(context).notify(notificationId, NotificationCompat.Builder(context, CHANNEL_ID) - .setContentTitle(title) - .setContentText(next) - .setAutoCancel(false) - .setOngoing(true) - .setWhen(countDown) - .apply { - if (Build.VERSION.SDK_INT >= N) setUsesChronometer(true) - } - .setTimeoutAfter(timeout) - .setSmallIcon(R.drawable.ic_stat_timetable) - .setColor(context.getCompatColor(R.color.colorPrimary)) - .setStyle(NotificationCompat.InboxStyle().also { - it.setSummaryText(studentName) - it.addLine(next) - }) - .setContentIntent(PendingIntent.getActivity(context, MainView.Section.TIMETABLE.id, - MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true), FLAG_UPDATE_CURRENT)) - .build() - ) + private fun showNotification( + context: Context, + notificationId: Int, + isPersistent: Boolean, + studentName: String?, + countDown: Long, + timeout: Long, + title: String, + next: String? + ) { + NotificationManagerCompat.from(context) + .notify(notificationId, NotificationCompat.Builder(context, CHANNEL_ID) + .setContentTitle(title) + .setContentText(next) + .setAutoCancel(false) + .setWhen(countDown) + .setOngoing(isPersistent) + .apply { + if (Build.VERSION.SDK_INT >= N) setUsesChronometer(true) + } + .setTimeoutAfter(timeout) + .setSmallIcon(R.drawable.ic_stat_timetable) + .setColor(context.getCompatColor(R.color.colorPrimary)) + .setStyle(NotificationCompat.InboxStyle().also { + it.setSummaryText(studentName) + it.addLine(next) + }) + .setContentIntent( + PendingIntent.getActivity( + context, + MainView.Section.TIMETABLE.id, + MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true), + FLAG_UPDATE_CURRENT + ) + ) + .build() + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt index 19d2f5591..722ee96d1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt @@ -42,7 +42,7 @@ class NotificationsPresenter @Inject constructor( preferencesRepository.apply { when (key) { - isUpcomingLessonsNotificationsEnableKey -> { + isUpcomingLessonsNotificationsEnableKey, isUpcomingLessonsNotificationsPersistentKey -> { if (!isUpcomingLessonsNotificationsEnable) { timetableNotificationHelper.cancelNotification() } diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 9286052d8..df84d37d6 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -14,6 +14,7 @@ false true false + true false 0.33 0.33 diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index bae6a617b..c512a5f21 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -18,6 +18,7 @@ notifications_system_settings notifications_enable notifications_upcoming_lessons_enable + notifications_upcoming_lessons_persistent notification_debug grade_modifier_plus grade_modifier_minus diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ae11d493e..63d4fc423 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -621,6 +621,8 @@ Notifications Show notifications Show upcoming lesson notifications + Make upcoming lesson notification persistent + Turn off when notification is not showing in your watch/band Open system notification settings Fix synchronization & notifications issues Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. diff --git a/app/src/main/res/xml/scheme_preferences_notifications.xml b/app/src/main/res/xml/scheme_preferences_notifications.xml index 24b83169b..78e91cf06 100644 --- a/app/src/main/res/xml/scheme_preferences_notifications.xml +++ b/app/src/main/res/xml/scheme_preferences_notifications.xml @@ -14,6 +14,14 @@ app:key="@string/pref_key_notifications_upcoming_lessons_enable" app:singleLineTitle="false" app:title="@string/pref_notify_upcoming_lessons_switch" /> + Date: Tue, 28 Sep 2021 21:55:40 +0200 Subject: [PATCH 0622/1526] Update License (#1542) --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 5dd9cacf7..2fb96cee8 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2019 Wulkanowy + Copyright 2021 Wulkanowy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From f8cb7599e6f82eaebf2d62470e9736307426b8ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 28 Sep 2021 22:40:43 +0200 Subject: [PATCH 0623/1526] Add missing auto refresh to recipients, subjects and teachers (#1540) --- app/build.gradle | 2 +- .../data/repositories/AttendanceRepository.kt | 30 ++++++++--- .../AttendanceSummaryRepository.kt | 6 +-- .../CompletedLessonsRepository.kt | 24 +++++++-- .../data/repositories/ConferenceRepository.kt | 6 +-- .../data/repositories/ExamRepository.kt | 6 +-- .../data/repositories/GradeRepository.kt | 14 +++-- .../repositories/GradeStatisticsRepository.kt | 54 +++++++++++++++---- .../data/repositories/HomeworkRepository.kt | 13 +++-- .../repositories/LuckyNumberRepository.kt | 20 ++++--- .../data/repositories/MessageRepository.kt | 25 ++++++--- .../repositories/MobileDeviceRepository.kt | 11 +++- .../data/repositories/NoteRepository.kt | 15 ++++-- .../repositories/NotificationRepository.kt | 6 ++- .../data/repositories/RecipientRepository.kt | 20 +++++-- .../data/repositories/RecoverRepository.kt | 6 +-- .../SchoolAnnouncementRepository.kt | 16 +++--- .../data/repositories/SchoolRepository.kt | 52 +++++++++++------- .../repositories/StudentInfoRepository.kt | 39 +++++++------- .../data/repositories/SubjectRepository.kt | 20 +++++-- .../data/repositories/TeacherRepository.kt | 20 +++++-- .../data/repositories/TimetableRepository.kt | 21 +++++--- .../io/github/wulkanowy/utils/RefreshUtils.kt | 2 +- app/src/main/res/values/api_hosts.xml | 2 +- .../repositories/AttendanceRepositoryTest.kt | 2 +- .../CompletedLessonsRepositoryTest.kt | 2 +- .../data/repositories/ExamRemoteTest.kt | 2 +- .../data/repositories/GradeRepositoryTest.kt | 2 +- .../GradeStatisticsRepositoryTest.kt | 2 +- .../repositories/MessageRepositoryTest.kt | 2 +- .../MobileDeviceRepositoryTest.kt | 2 +- .../data/repositories/RecipientLocalTest.kt | 8 ++- .../repositories/TimetableRepositoryTest.kt | 2 +- 33 files changed, 312 insertions(+), 142 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8414ff5d0..e8680fe25 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -166,7 +166,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:49c2071d10" + implementation "io.github.wulkanowy:sdk:f62736adb0" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' 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 ffccb059e..d21ffb5fb 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 @@ -32,10 +32,23 @@ class AttendanceRepository @Inject constructor( private val cacheKey = "attendance" - fun getAttendance(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + fun getAttendance( + student: Student, + semester: Semester, + start: LocalDate, + end: LocalDate, + forceRefresh: Boolean, + ) = networkBoundResource( mutex = saveFetchResultMutex, - shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester, start, end)) }, - query = { attendanceDb.loadAll(semester.diaryId, semester.studentId, start.monday, end.sunday) }, + shouldFetch = { + val isExpired = refreshHelper.shouldBeRefreshed( + key = getRefreshKey(cacheKey, semester, start, end) + ) + it.isEmpty() || forceRefresh || isExpired + }, + query = { + attendanceDb.loadAll(semester.diaryId, semester.studentId, start.monday, end.sunday) + }, fetch = { sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getAttendance(start.monday, end.sunday, semester.semesterId) @@ -50,12 +63,17 @@ class AttendanceRepository @Inject constructor( filterResult = { it.filter { item -> item.date in start..end } } ) - suspend fun excuseForAbsence(student: Student, semester: Semester, absenceList: List, reason: String? = null) { - sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear).excuseForAbsence(absenceList.map { attendance -> + suspend fun excuseForAbsence( + student: Student, semester: Semester, + absenceList: List, reason: String? = null + ) { + val items = absenceList.map { attendance -> Absent( date = LocalDateTime.of(attendance.date, LocalTime.of(0, 0)), timeId = attendance.timeId ) - }, reason) + } + sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) + .excuseForAbsence(items, reason) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt index 58659914f..bc1fb2343 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt @@ -29,12 +29,12 @@ class AttendanceSummaryRepository @Inject constructor( student: Student, semester: Semester, subjectId: Int, - forceRefresh: Boolean + forceRefresh: Boolean, ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { - it.isEmpty() || forceRefresh - || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) + val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, semester)) + it.isEmpty() || forceRefresh || isExpired }, query = { attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId) }, fetch = { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt index 99ef56f4b..c2e5a7217 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt @@ -28,10 +28,28 @@ class CompletedLessonsRepository @Inject constructor( private val cacheKey = "completed" - fun getCompletedLessons(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean) = networkBoundResource( + fun getCompletedLessons( + student: Student, + semester: Semester, + start: LocalDate, + end: LocalDate, + forceRefresh: Boolean, + ) = networkBoundResource( mutex = saveFetchResultMutex, - shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester, start, end)) }, - query = { completedLessonsDb.loadAll(semester.studentId, semester.diaryId, start.monday, end.sunday) }, + shouldFetch = { + val isExpired = refreshHelper.shouldBeRefreshed( + key = getRefreshKey(cacheKey, semester, start, end) + ) + it.isEmpty() || forceRefresh || isExpired + }, + query = { + completedLessonsDb.loadAll( + studentId = semester.studentId, + diaryId = semester.diaryId, + from = start.monday, + end = end.sunday + ) + }, fetch = { sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getCompletedLessons(start.monday, end.sunday) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt index 16d7c3c6c..e32271833 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt @@ -35,12 +35,12 @@ class ConferenceRepository @Inject constructor( semester: Semester, forceRefresh: Boolean, notify: Boolean = false, - startDate: LocalDateTime = LocalDateTime.ofInstant(Instant.EPOCH, ZoneOffset.UTC) + startDate: LocalDateTime = LocalDateTime.ofInstant(Instant.EPOCH, ZoneOffset.UTC), ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { - it.isEmpty() || forceRefresh - || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) + val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, semester)) + it.isEmpty() || forceRefresh || isExpired }, query = { conferenceDb.loadAll(semester.diaryId, student.studentId, startDate) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt index 93d5a47cb..9bdac0658 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt @@ -36,14 +36,14 @@ class ExamRepository @Inject constructor( start: LocalDate, end: LocalDate, forceRefresh: Boolean, - notify: Boolean = false + notify: Boolean = false, ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { - val isShouldBeRefreshed = refreshHelper.isShouldBeRefreshed( + val isExpired = refreshHelper.shouldBeRefreshed( key = getRefreshKey(cacheKey, semester, start, end) ) - it.isEmpty() || forceRefresh || isShouldBeRefreshed + it.isEmpty() || forceRefresh || isExpired }, query = { examDb.loadAll( 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 d8417f8a9..6c574b48a 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 @@ -37,13 +37,12 @@ class GradeRepository @Inject constructor( student: Student, semester: Semester, forceRefresh: Boolean, - notify: Boolean = false + notify: Boolean = false, ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { (details, summaries) -> - val isShouldBeRefreshed = - refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) - details.isEmpty() || summaries.isEmpty() || forceRefresh || isShouldBeRefreshed + val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, semester)) + details.isEmpty() || summaries.isEmpty() || forceRefresh || isExpired }, query = { val detailsFlow = gradeDb.loadAll(semester.semesterId, semester.studentId) @@ -71,8 +70,8 @@ class GradeRepository @Inject constructor( newDetails: List, notify: Boolean ) { - val notifyBreakDate = - oldGrades.maxByOrNull { it.date }?.date ?: student.registrationDate.toLocalDate() + val notifyBreakDate = oldGrades.maxByOrNull {it.date } + ?.date ?: student.registrationDate.toLocalDate() gradeDb.deleteAll(oldGrades uniqueSubtract newDetails) gradeDb.insertAll((newDetails uniqueSubtract oldGrades).onEach { if (it.date >= notifyBreakDate) it.apply { @@ -89,8 +88,7 @@ class GradeRepository @Inject constructor( ) { gradeSummaryDb.deleteAll(oldSummaries uniqueSubtract newSummary) gradeSummaryDb.insertAll((newSummary uniqueSubtract oldSummaries).onEach { summary -> - val oldSummary = - oldSummaries.find { oldSummary -> oldSummary.subject == summary.subject } + val oldSummary = oldSummaries.find { old -> old.subject == summary.subject } summary.isPredictedGradeNotified = when { summary.predictedGrade.isEmpty() -> true notify && oldSummary?.predictedGrade != summary.predictedGrade -> false diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt index 9cd8e711d..6c36f163b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt @@ -39,9 +39,19 @@ class GradeStatisticsRepository @Inject constructor( private val semesterCacheKey = "grade_stats_semester" private val pointsCacheKey = "grade_stats_points" - fun getGradesPartialStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean) = networkBoundResource( + fun getGradesPartialStatistics( + student: Student, + semester: Semester, + subjectName: String, + forceRefresh: Boolean, + ) = networkBoundResource( mutex = partialMutex, - shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(partialCacheKey, semester)) }, + shouldFetch = { + val isExpired = refreshHelper.shouldBeRefreshed( + key = getRefreshKey(partialCacheKey, semester) + ) + it.isEmpty() || forceRefresh || isExpired + }, query = { gradePartialStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) @@ -76,9 +86,19 @@ class GradeStatisticsRepository @Inject constructor( } ) - fun getGradesSemesterStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean) = networkBoundResource( + fun getGradesSemesterStatistics( + student: Student, + semester: Semester, + subjectName: String, + forceRefresh: Boolean, + ) = networkBoundResource( mutex = semesterMutex, - shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(semesterCacheKey, semester)) }, + shouldFetch = { + val isExpired = refreshHelper.shouldBeRefreshed( + key = getRefreshKey(semesterCacheKey, semester) + ) + it.isEmpty() || forceRefresh || isExpired + }, query = { gradeSemesterStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) @@ -94,10 +114,12 @@ class GradeStatisticsRepository @Inject constructor( val itemsWithAverage = items.map { item -> item.copy().apply { val denominator = item.amounts.sum() - average = if (denominator == 0) "" else (item.amounts.mapIndexed { gradeValue, amount -> - (gradeValue + 1) * amount - }.sum().toDouble() / denominator).let { - "%.2f".format(Locale.FRANCE, it) + average = if (denominator == 0) "" else { + (item.amounts.mapIndexed { gradeValue, amount -> + (gradeValue + 1) * amount + }.sum().toDouble() / denominator).let { + "%.2f".format(Locale.FRANCE, it) + } } } } @@ -109,7 +131,9 @@ class GradeStatisticsRepository @Inject constructor( amounts = itemsWithAverage.map { it.amounts }.sumGradeAmounts(), studentGrade = 0 ).apply { - average = itemsWithAverage.mapNotNull { it.average.replace(",", ".").toDoubleOrNull() }.average().let { + average = itemsWithAverage.mapNotNull { + it.average.replace(",", ".").toDoubleOrNull() + }.average().let { "%.2f".format(Locale.FRANCE, it) } }).reversed() @@ -118,9 +142,17 @@ class GradeStatisticsRepository @Inject constructor( } ) - fun getGradesPointsStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean) = networkBoundResource( + fun getGradesPointsStatistics( + student: Student, + semester: Semester, + subjectName: String, + forceRefresh: Boolean, + ) = networkBoundResource( mutex = pointsMutex, - shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(pointsCacheKey, semester)) }, + shouldFetch = { + val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(pointsCacheKey, semester)) + it.isEmpty() || forceRefresh || isExpired + }, query = { gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt index 23dd74c2c..a04085fb7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt @@ -30,16 +30,19 @@ class HomeworkRepository @Inject constructor( private val cacheKey = "homework" fun getHomework( - student: Student, semester: Semester, - start: LocalDate, end: LocalDate, - forceRefresh: Boolean, notify: Boolean = false + student: Student, + semester: Semester, + start: LocalDate, + end: LocalDate, + forceRefresh: Boolean, + notify: Boolean = false, ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { - val isShouldBeRefreshed = refreshHelper.isShouldBeRefreshed( + val isExpired = refreshHelper.shouldBeRefreshed( key = getRefreshKey(cacheKey, semester, start, end) ) - it.isEmpty() || forceRefresh || isShouldBeRefreshed + it.isEmpty() || forceRefresh || isExpired }, query = { homeworkDb.loadAll( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt index b904b7dba..41e824e57 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt @@ -23,11 +23,17 @@ class LuckyNumberRepository @Inject constructor( private val saveFetchResultMutex = Mutex() - fun getLuckyNumber(student: Student, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + fun getLuckyNumber( + student: Student, + forceRefresh: Boolean, + notify: Boolean = false, + ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { it == null || forceRefresh }, query = { luckyNumberDb.load(student.studentId, now()) }, - fetch = { sdk.init(student).getLuckyNumber(student.schoolShortName)?.mapToEntity(student) }, + fetch = { + sdk.init(student).getLuckyNumber(student.schoolShortName)?.mapToEntity(student) + }, saveFetchResult = { old, new -> if (new != old) { old?.let { luckyNumberDb.deleteAll(listOfNotNull(it)) } @@ -41,9 +47,11 @@ class LuckyNumberRepository @Inject constructor( fun getLuckyNumberHistory(student: Student, start: LocalDate, end: LocalDate) = luckyNumberDb.getAll(student.studentId, start, end) - suspend fun getNotNotifiedLuckyNumber(student: Student) = luckyNumberDb.load(student.studentId, now()).map { - if (it?.isNotified == false) it else null - }.first() + suspend fun getNotNotifiedLuckyNumber(student: Student) = + luckyNumberDb.load(student.studentId, now()).map { + if (it?.isNotified == false) it else null + }.first() - suspend fun updateLuckyNumber(luckyNumber: LuckyNumber?) = luckyNumberDb.updateAll(listOfNotNull(luckyNumber)) + suspend fun updateLuckyNumber(luckyNumber: LuckyNumber?) = + luckyNumberDb.updateAll(listOfNotNull(luckyNumber)) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index 9977e1d57..ee5164957 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -51,14 +51,18 @@ class MessageRepository @Inject constructor( @Suppress("UNUSED_PARAMETER") fun getMessages( - student: Student, semester: Semester, - folder: MessageFolder, forceRefresh: Boolean, notify: Boolean = false + student: Student, + semester: Semester, + folder: MessageFolder, + forceRefresh: Boolean, + notify: Boolean = false, ): Flow>> = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { - it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed( - getRefreshKey(cacheKey, student, folder) + val isExpired = refreshHelper.shouldBeRefreshed( + key = getRefreshKey(cacheKey, student, folder) ) + it.isEmpty() || forceRefresh || isExpired }, query = { messagesDb.loadAll(student.id.toInt(), folder.id) }, fetch = { @@ -77,7 +81,8 @@ class MessageRepository @Inject constructor( ) private fun getMessagesWithReadByChange( - old: List, new: List, + old: List, + new: List, setNotified: Boolean ): List { val oldMeta = old.map { Triple(it, it.readBy, it.unreadBy) } @@ -96,7 +101,9 @@ class MessageRepository @Inject constructor( } fun getMessage( - student: Student, message: Message, markAsRead: Boolean = false + student: Student, + message: Message, + markAsRead: Boolean = false, ): Flow> = networkBoundResource( shouldFetch = { checkNotNull(it, { "This message no longer exist!" }) @@ -135,8 +142,10 @@ class MessageRepository @Inject constructor( } suspend fun sendMessage( - student: Student, subject: String, content: String, - recipients: List + student: Student, + subject: String, + content: String, + recipients: List, ): SentMessage = sdk.init(student).sendMessage( subject = subject, content = content, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt index 4b333bc6d..bf17cbbc5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt @@ -28,9 +28,16 @@ class MobileDeviceRepository @Inject constructor( private val cacheKey = "devices" - fun getDevices(student: Student, semester: Semester, forceRefresh: Boolean) = networkBoundResource( + fun getDevices( + student: Student, + semester: Semester, + forceRefresh: Boolean, + ) = networkBoundResource( mutex = saveFetchResultMutex, - shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, student)) }, + shouldFetch = { + val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, student)) + it.isEmpty() || forceRefresh || isExpired + }, query = { mobileDb.loadAll(student.userLoginId.takeIf { it != 0 } ?: student.studentId) }, fetch = { sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) 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 d43cdbc0c..c1738b36e 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 @@ -12,7 +12,6 @@ import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -28,9 +27,19 @@ class NoteRepository @Inject constructor( private val cacheKey = "note" - fun getNotes(student: Student, semester: Semester, forceRefresh: Boolean, notify: Boolean = false) = networkBoundResource( + fun getNotes( + student: Student, + semester: Semester, + forceRefresh: Boolean, + notify: Boolean = false, + ) = networkBoundResource( mutex = saveFetchResultMutex, - shouldFetch = { it.isEmpty() || forceRefresh || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, semester)) }, + shouldFetch = { + val isExpired = refreshHelper.shouldBeRefreshed( + getRefreshKey(cacheKey, semester) + ) + it.isEmpty() || forceRefresh || isExpired + }, query = { noteDb.loadAll(student.studentId) }, fetch = { sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/NotificationRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/NotificationRepository.kt index 36bc7c25a..fca263782 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/NotificationRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/NotificationRepository.kt @@ -6,10 +6,12 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class NotificationRepository @Inject constructor(private val notificationDao: NotificationDao) { +class NotificationRepository @Inject constructor( + private val notificationDao: NotificationDao, +) { fun getNotifications(studentId: Long) = notificationDao.loadAll(studentId) suspend fun saveNotification(notification: Notification) = notificationDao.insertAll(listOf(notification)) -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt index 975a30a20..60e6f248f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt @@ -7,6 +7,8 @@ import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.AutoRefreshHelper +import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.uniqueSubtract import javax.inject.Inject @@ -15,26 +17,34 @@ import javax.inject.Singleton @Singleton class RecipientRepository @Inject constructor( private val recipientDb: RecipientDao, - private val sdk: Sdk + private val sdk: Sdk, + private val refreshHelper: AutoRefreshHelper, ) { + private val cacheKey = "recipient" + suspend fun refreshRecipients(student: Student, unit: ReportingUnit, role: Int) { val new = sdk.init(student).getRecipients(unit.unitId, role).mapToEntities(unit.studentId) val old = recipientDb.loadAll(unit.studentId, unit.unitId, role) recipientDb.deleteAll(old uniqueSubtract new) recipientDb.insertAll(new uniqueSubtract old) + + refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, student)) } suspend fun getRecipients(student: Student, unit: ReportingUnit, role: Int): List { - return recipientDb.loadAll(unit.studentId, unit.unitId, role).ifEmpty { - refreshRecipients(student, unit, role) + val cached = recipientDb.loadAll(unit.studentId, unit.unitId, role) + val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, student)) + return if (cached.isEmpty() || isExpired) { + refreshRecipients(student, unit, role) recipientDb.loadAll(unit.studentId, unit.unitId, role) - } + } else cached } suspend fun getMessageRecipients(student: Student, message: Message): List { - return sdk.init(student).getMessageRecipients(message.messageId, message.senderId).mapToEntities(student.studentId) + return sdk.init(student).getMessageRecipients(message.messageId, message.senderId) + .mapToEntities(student.studentId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt index 5e1063558..5940f477b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt @@ -11,7 +11,7 @@ class RecoverRepository @Inject constructor(private val sdk: Sdk) { return sdk.getPasswordResetCaptchaCode(host, symbol) } - suspend fun sendRecoverRequest(url: String, symbol: String, email: String, reCaptchaResponse: String): String { - return sdk.sendPasswordResetRequest(url, symbol, email, reCaptchaResponse) - } + suspend fun sendRecoverRequest( + url: String, symbol: String, email: String, reCaptchaResponse: String + ): String = sdk.sendPasswordResetRequest(url, symbol, email, reCaptchaResponse) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt index 62d806ac2..b6724ed34 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt @@ -2,7 +2,6 @@ package io.github.wulkanowy.data.repositories import io.github.wulkanowy.data.db.dao.SchoolAnnouncementDao import io.github.wulkanowy.data.db.entities.SchoolAnnouncement -import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.sdk.Sdk @@ -12,7 +11,6 @@ import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -30,17 +28,15 @@ class SchoolAnnouncementRepository @Inject constructor( fun getSchoolAnnouncements( student: Student, - forceRefresh: Boolean, - notify: Boolean = false + forceRefresh: Boolean, notify: Boolean = false ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { - it.isEmpty() || forceRefresh - || refreshHelper.isShouldBeRefreshed(getRefreshKey(cacheKey, student)) + val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, student)) + it.isEmpty() || forceRefresh || isExpired }, query = { - schoolAnnouncementDb.loadAll( - student.studentId) + schoolAnnouncementDb.loadAll(student.studentId) }, fetch = { sdk.init(student) @@ -57,9 +53,11 @@ class SchoolAnnouncementRepository @Inject constructor( refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, student)) } ) + fun getSchoolAnnouncementFromDatabase(student: Student): Flow> { return schoolAnnouncementDb.loadAll(student.studentId) } - suspend fun updateSchoolAnnouncement(schoolAnnouncement: List) = schoolAnnouncementDb.updateAll(schoolAnnouncement) + suspend fun updateSchoolAnnouncement(schoolAnnouncement: List) = + schoolAnnouncementDb.updateAll(schoolAnnouncement) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt index 8b59cb589..288a1fb67 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt @@ -5,6 +5,8 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.AutoRefreshHelper +import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import kotlinx.coroutines.sync.Mutex @@ -14,29 +16,41 @@ import javax.inject.Singleton @Singleton class SchoolRepository @Inject constructor( private val schoolDb: SchoolDao, - private val sdk: Sdk + private val sdk: Sdk, + private val refreshHelper: AutoRefreshHelper, ) { private val saveFetchResultMutex = Mutex() - fun getSchoolInfo(student: Student, semester: Semester, forceRefresh: Boolean) = - networkBoundResource( - mutex = saveFetchResultMutex, - shouldFetch = { it == null || forceRefresh }, - query = { schoolDb.load(semester.studentId, semester.classId) }, - fetch = { - sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear).getSchool() - .mapToEntity(semester) - }, - saveFetchResult = { old, new -> - if (old != null && new != old) { - with(schoolDb) { - deleteAll(listOf(old)) - insertAll(listOf(new)) - } - } else if (old == null) { - schoolDb.insertAll(listOf(new)) + private val cacheKey = "school_info" + + fun getSchoolInfo( + student: Student, + semester: Semester, + forceRefresh: Boolean, + ) = networkBoundResource( + mutex = saveFetchResultMutex, + shouldFetch = { + val isExpired = refreshHelper.shouldBeRefreshed( + key = getRefreshKey(cacheKey, student) + ) + it == null || forceRefresh || isExpired + }, + query = { schoolDb.load(semester.studentId, semester.classId) }, + fetch = { + sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear).getSchool() + .mapToEntity(semester) + }, + saveFetchResult = { old, new -> + if (old != null && new != old) { + with(schoolDb) { + deleteAll(listOf(old)) + insertAll(listOf(new)) } + } else if (old == null) { + schoolDb.insertAll(listOf(new)) } - ) + refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, student)) + } + ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt index de66ad20f..e98daedf2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt @@ -19,24 +19,27 @@ class StudentInfoRepository @Inject constructor( private val saveFetchResultMutex = Mutex() - fun getStudentInfo(student: Student, semester: Semester, forceRefresh: Boolean) = - networkBoundResource( - mutex = saveFetchResultMutex, - shouldFetch = { it == null || forceRefresh }, - query = { studentInfoDao.loadStudentInfo(student.studentId) }, - fetch = { - sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) - .getStudentInfo().mapToEntity(semester) - }, - saveFetchResult = { old, new -> - if (old != null && new != old) { - with(studentInfoDao) { - deleteAll(listOf(old)) - insertAll(listOf(new)) - } - } else if (old == null) { - studentInfoDao.insertAll(listOf(new)) + fun getStudentInfo( + student: Student, + semester: Semester, + forceRefresh: Boolean, + ) = networkBoundResource( + mutex = saveFetchResultMutex, + shouldFetch = { it == null || forceRefresh }, + query = { studentInfoDao.loadStudentInfo(student.studentId) }, + fetch = { + sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) + .getStudentInfo().mapToEntity(semester) + }, + saveFetchResult = { old, new -> + if (old != null && new != old) { + with(studentInfoDao) { + deleteAll(listOf(old)) + insertAll(listOf(new)) } + } else if (old == null) { + studentInfoDao.insertAll(listOf(new)) } - ) + } + ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt index b4bfef188..d81cb7c92 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt @@ -5,6 +5,8 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.AutoRefreshHelper +import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract @@ -15,14 +17,24 @@ import javax.inject.Singleton @Singleton class SubjectRepository @Inject constructor( private val subjectDao: SubjectDao, - private val sdk: Sdk + private val sdk: Sdk, + private val refreshHelper: AutoRefreshHelper, ) { private val saveFetchResultMutex = Mutex() - fun getSubjects(student: Student, semester: Semester, forceRefresh: Boolean = false) = networkBoundResource( + private val cacheKey = "subjects" + + fun getSubjects( + student: Student, + semester: Semester, + forceRefresh: Boolean = false, + ) = networkBoundResource( mutex = saveFetchResultMutex, - shouldFetch = { it.isEmpty() || forceRefresh }, + shouldFetch = { + val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, semester)) + it.isEmpty() || forceRefresh || isExpired + }, query = { subjectDao.loadAll(semester.diaryId, semester.studentId) }, fetch = { sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) @@ -31,6 +43,8 @@ class SubjectRepository @Inject constructor( saveFetchResult = { old, new -> subjectDao.deleteAll(old uniqueSubtract new) subjectDao.insertAll(new uniqueSubtract old) + + refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester)) } ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt index 7135edbe9..029b2707a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt @@ -5,6 +5,8 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.AutoRefreshHelper +import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract @@ -15,14 +17,24 @@ import javax.inject.Singleton @Singleton class TeacherRepository @Inject constructor( private val teacherDb: TeacherDao, - private val sdk: Sdk + private val sdk: Sdk, + private val refreshHelper: AutoRefreshHelper, ) { private val saveFetchResultMutex = Mutex() - fun getTeachers(student: Student, semester: Semester, forceRefresh: Boolean) = networkBoundResource( + private val cacheKey = "teachers" + + fun getTeachers( + student: Student, + semester: Semester, + forceRefresh: Boolean, + ) = networkBoundResource( mutex = saveFetchResultMutex, - shouldFetch = { it.isEmpty() || forceRefresh }, + shouldFetch = { + val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, semester)) + it.isEmpty() || forceRefresh || isExpired + }, query = { teacherDb.loadAll(semester.studentId, semester.classId) }, fetch = { sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) @@ -32,6 +44,8 @@ class TeacherRepository @Inject constructor( saveFetchResult = { old, new -> teacherDb.deleteAll(old uniqueSubtract new) teacherDb.insertAll(new uniqueSubtract old) + + refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester)) } ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index 5495d0778..1540d3cc7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -41,18 +41,22 @@ class TimetableRepository @Inject constructor( private val cacheKey = "timetable" fun getTimetable( - student: Student, semester: Semester, start: LocalDate, end: LocalDate, - forceRefresh: Boolean, refreshAdditional: Boolean = false + student: Student, + semester: Semester, + start: LocalDate, + end: LocalDate, + forceRefresh: Boolean, + refreshAdditional: Boolean = false, ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { (timetable, additional, headers) -> val refreshKey = getRefreshKey(cacheKey, semester, start, end) - val isShouldRefresh = refreshHelper.isShouldBeRefreshed(refreshKey) + val isExpired = refreshHelper.shouldBeRefreshed(refreshKey) val isRefreshAdditional = additional.isEmpty() && refreshAdditional val isNoData = timetable.isEmpty() || isRefreshAdditional || headers.isEmpty() - isNoData || forceRefresh || isShouldRefresh + isNoData || forceRefresh || isExpired }, query = { getFullTimetableFromDatabase(student, semester, start, end) }, fetch = { @@ -79,8 +83,10 @@ class TimetableRepository @Inject constructor( ) private fun getFullTimetableFromDatabase( - student: Student, semester: Semester, - start: LocalDate, end: LocalDate + student: Student, + semester: Semester, + start: LocalDate, + end: LocalDate, ): Flow { val timetableFlow = timetableDb.loadAll( diaryId = semester.diaryId, @@ -113,7 +119,8 @@ class TimetableRepository @Inject constructor( private suspend fun refreshTimetable( student: Student, - lessonsOld: List, lessonsNew: List + lessonsOld: List, + lessonsNew: List, ) { val lessonsToRemove = lessonsOld uniqueSubtract lessonsNew val lessonsToAdd = (lessonsNew uniqueSubtract lessonsOld).map { new -> diff --git a/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt index cd59b8648..6bf97bae7 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt @@ -33,7 +33,7 @@ class AutoRefreshHelper @Inject constructor( private val sharedPref: SharedPrefProvider ) { - fun isShouldBeRefreshed(key: String): Boolean { + fun shouldBeRefreshed(key: String): Boolean { val timestamp = sharedPref.getLong(key, 0).toLocalDateTime() val servicesInterval = sharedPref.getString(context.getString(R.string.pref_key_services_interval), context.getString(R.string.pref_default_services_interval)).toLong() diff --git a/app/src/main/res/values/api_hosts.xml b/app/src/main/res/values/api_hosts.xml index 158490471..dac94c3ff 100644 --- a/app/src/main/res/values/api_hosts.xml +++ b/app/src/main/res/values/api_hosts.xml @@ -40,7 +40,7 @@ https://vulcan.net.pl/?login https://vulcan.net.pl/?login https://vulcan.net.pl/?login - http://fakelog.cf/?email + http://fakelog.tk/?email Default diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt index 1c592c09f..f3c7fba77 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt @@ -53,7 +53,7 @@ class AttendanceRepositoryTest { @Before fun setUp() { MockKAnnotations.init(this) - every { refreshHelper.isShouldBeRefreshed(any()) } returns false + every { refreshHelper.shouldBeRefreshed(any()) } returns false attendanceRepository = AttendanceRepository(attendanceDb, sdk, refreshHelper) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt index b116a623d..fa54522a8 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt @@ -53,7 +53,7 @@ class CompletedLessonsRepositoryTest { @Before fun initApi() { MockKAnnotations.init(this) - every { refreshHelper.isShouldBeRefreshed(any()) } returns false + every { refreshHelper.shouldBeRefreshed(any()) } returns false completedLessonRepository = CompletedLessonsRepository(completedLessonDb, sdk, refreshHelper) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt index ead6dc5d1..8bf4deee3 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt @@ -54,7 +54,7 @@ class ExamRemoteTest { @Before fun setUp() { MockKAnnotations.init(this) - every { refreshHelper.isShouldBeRefreshed(any()) } returns false + every { refreshHelper.shouldBeRefreshed(any()) } returns false examRepository = ExamRepository(examDb, sdk, refreshHelper) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt index 8a19d6337..6dd30a579 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt @@ -50,7 +50,7 @@ class GradeRepositoryTest { @Before fun initApi() { MockKAnnotations.init(this) - every { refreshHelper.isShouldBeRefreshed(any()) } returns false + every { refreshHelper.shouldBeRefreshed(any()) } returns false gradeRepository = GradeRepository(gradeDb, gradeSummaryDb, sdk, refreshHelper) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt index 73dd4cfaa..cce3794de 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt @@ -56,7 +56,7 @@ class GradeStatisticsRepositoryTest { @Before fun setUp() { MockKAnnotations.init(this) - every { refreshHelper.isShouldBeRefreshed(any()) } returns false + every { refreshHelper.shouldBeRefreshed(any()) } returns false gradeStatisticsRepository = GradeStatisticsRepository(gradePartialStatisticsDb, gradePointsStatisticsDb, gradeSemesterStatisticsDb, sdk, refreshHelper) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt index cadc4225a..25774d74c 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt @@ -69,7 +69,7 @@ class MessageRepositoryTest { @Before fun setUp() { MockKAnnotations.init(this) - every { refreshHelper.isShouldBeRefreshed(any()) } returns false + every { refreshHelper.shouldBeRefreshed(any()) } returns false repository = MessageRepository( messagesDb = messageDb, diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt index e5b3d1015..52a076d3c 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt @@ -48,7 +48,7 @@ class MobileDeviceRepositoryTest { @Before fun initTest() { MockKAnnotations.init(this) - every { refreshHelper.isShouldBeRefreshed(any()) } returns false + every { refreshHelper.shouldBeRefreshed(any()) } returns false mobileDeviceRepository = MobileDeviceRepository(mobileDeviceDb, sdk, refreshHelper) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt index 82406ef46..980abac0a 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt @@ -5,10 +5,12 @@ import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.AutoRefreshHelper import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK import io.mockk.just @@ -26,6 +28,9 @@ class RecipientLocalTest { @MockK private lateinit var recipientDb: RecipientDao + @MockK(relaxUnitFun = true) + private lateinit var refreshHelper: AutoRefreshHelper + private val student = getStudentEntity() private lateinit var recipientRepository: RecipientRepository @@ -39,8 +44,9 @@ class RecipientLocalTest { @Before fun setUp() { MockKAnnotations.init(this) + every { refreshHelper.shouldBeRefreshed(any()) } returns false - recipientRepository = RecipientRepository(recipientDb, sdk) + recipientRepository = RecipientRepository(recipientDb, sdk, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt index 2c56a1b69..75c75a66c 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt @@ -62,7 +62,7 @@ class TimetableRepositoryTest { @Before fun initApi() { MockKAnnotations.init(this) - every { refreshHelper.isShouldBeRefreshed(any()) } returns false + every { refreshHelper.shouldBeRefreshed(any()) } returns false timetableRepository = TimetableRepository(timetableDb, timetableAdditionalDao, timetableHeaderDao, sdk, timetableNotificationSchedulerHelper, refreshHelper) } From 9711cc868c4583f1cc169b361e229f90631a3ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 28 Sep 2021 22:42:06 +0200 Subject: [PATCH 0624/1526] New Crowdin updates (#1522) --- .../main/res/values-cs/preferences_values.xml | 4 +-- app/src/main/res/values-cs/strings.xml | 28 +++++++++------- .../main/res/values-de/preferences_values.xml | 2 +- app/src/main/res/values-de/strings.xml | 32 ++++++++++++------- .../main/res/values-pl/preferences_values.xml | 4 +-- app/src/main/res/values-pl/strings.xml | 24 +++++++------- .../main/res/values-ru/preferences_values.xml | 4 +-- app/src/main/res/values-ru/strings.xml | 30 ++++++++++------- .../main/res/values-sk/preferences_values.xml | 4 +-- app/src/main/res/values-sk/strings.xml | 28 +++++++++------- .../main/res/values-uk/preferences_values.xml | 4 +-- app/src/main/res/values-uk/strings.xml | 30 ++++++++++------- 12 files changed, 112 insertions(+), 82 deletions(-) diff --git a/app/src/main/res/values-cs/preferences_values.xml b/app/src/main/res/values-cs/preferences_values.xml index fb938f092..5e2f10fb8 100644 --- a/app/src/main/res/values-cs/preferences_values.xml +++ b/app/src/main/res/values-cs/preferences_values.xml @@ -41,8 +41,8 @@ Barvy známek v deníku - Průměrná známka od druhého semestru - Průměr známek z obou semestrů + Průměr známek pouze z vybraného semestru + Průměr z průměrů z obou semestrů Průměr známek z celého roku diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 0367efdd8..1557ecc14 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -12,7 +12,7 @@ O aplikaci Prohlížeč protokolů Ladění - Ladění oznámení + Ladění upozornění Tvůrci Licence Zprávy @@ -24,6 +24,7 @@ Podrobnosti účtu Informace o žáku Domů + Centrum upozornění Semestr %1$d, %2$d/%3$d @@ -43,7 +44,7 @@ Přihlásit Toto heslo je příliš krátké Přihlašovací údaje jsou nesprávné - %1$s. Ujistěte se, že je v poli níže vybrána správná variace deníku UONET+ + %1$s. Zkontrolujte, zda je níže vybrána správná variace deníku UONET+ Neplatný PIN Neplatný token Token vypršel @@ -91,6 +92,10 @@ Konečná známka Předpokládaná známka Vypočítaný průměr + Jak funguje vypočítaný průměr? + Vypočítaný průměr je aritmetický průměr vypočítaný z průměrů předmětů. Umožňuje vám to znát přibližný konečný průměr. Vypočítává se způsobem zvoleným uživatelem v nastavení aplikaci. Doporučuje se vybrat příslušnou možnost. Důvodem je rozdílný výpočet školních průměrů. Pokud vaše škola navíc uvádí průměr předmětů na stránce deníku Vulcan, aplikace si je stáhne a tyto průměry nepočítá. To lze změnit vynucením výpočtu průměru v nastavení aplikaci.\n\nPrůměr známek pouze z vybraného semestru:\n1. Výpočet váženého průměru pro každý předmět v daném semestru\n2. Sčítání vypočítaných průměrů\n3. Výpočet aritmetického průměru součtených průměrů\n\nPrůměr průměrů z obou semestrů:\n1. Výpočet váženého průměru pro každý předmět v semestru 1 a 2\n2. Výpočet aritmetického průměru vypočítaných průměrů za semestry 1 a 2 pro každý předmět.\n3. Sčítání vypočítaných průměrů\n4. Výpočet aritmetického průměru součtených průměrů\n\nPrůměr známek z celého roku:\n1. Výpočet váženého průměru za rok pro každý předmět. Konečný průměr v 1. semestru je nepodstatný.\n3. Sčítání vypočítaných průměrů\n4. Výpočet aritmetického průměru součtených průměrů + Jak funguje konečný průměr? + Konečný průměr je aritmetický průměr vypočítaný ze všech aktuálně dostupných konečných známek v daném semestru.\n\nSchéma výpočtu se skládá z následujících kroků:\n1. Sčítání konečných známek zadaných učiteli\n2. Děleno počtem předmětů, pro které už byly vydány známky Konečný průměr z %1$d z %2$d předmětů Shrnutí @@ -239,12 +244,7 @@ Pouze nepřečtené Pouze s přílohami Přečtena: %s - - Přečtena přes: %1$d z %2$d osob - Přečtena přes: %1$d z %2$d osob - Přečtena přes: %1$d z %2$d osob - Přečtena přes: %1$d z %2$d osob - + Přečtena přes: %1$d z %2$d osob %d zpráva %d zprávy @@ -403,7 +403,7 @@ Máte %1$d nových setkání Máte %1$d nových setkání - Present at conference + Přítomnost na setkání Agenda Školní oznámení @@ -593,7 +593,7 @@ Ano Ne Uložit - Title + Titul Žádné lekce Vybrat motiv @@ -603,7 +603,7 @@ Vzhled a chování aplikací Výchozí zobrazení - Výpočet koncoročního průměru + Možnosti vypočítaného průměru Vynutit průměrný výpočet podle aplikace Zobrazit přítomnost Motiv @@ -618,12 +618,18 @@ Upozornění Zobrazit upozornění Zobrazit upozornění o nadcházející lekci + Nastavit upozornění o nadcházející lekci jako trvalé + Vypnout, když upozornění není ve vašem hodinkách/náramku viditelné Otevřít systémová nastavení upozornění Opravte problémy se synchronizací a upozorněním Vaše zařízení může mít problémy se synchronizací dat as upozorněními.\n\nChcete-li je opravit, přidejte Wulkanového do funkce Autostart a vypněte optimalizaci/úsporu baterie v nastavení systému telefonu. Přejít do nastavení Zobrazit upozornění o ladění Synchronizace je vypnutá + Zachytit upozornění oficiální aplikací + Zachytit upozornění + S touto funkcí můžete získat náhradu push upozornění jako v oficiální aplikaci. Vše, co musíte udělat, je povolit Wulkanowému číst všechna vaše upozornění v nastaveních systému.\n\nJak to funguje?\nKdyž obdržíte oznámení v Deníčku VULCAN, Wulkanowy bude o tom informován (k tomu je to dodatečné povolení) a spustí synchronizaci, aby mohl zaslat vlastní upozornění.\n\nPOUZE PRO POKROČILÉ UŽIVATELE + Přejít do nastavení Synchronizace Automatická aktualizace Pozastaveno na dovolené diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 1e0df8dea..699ca8240 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -41,8 +41,8 @@ Farben der Bewertungen im Logbuch - Durchschnittsnote für das 2. Semester Durchschnitt der Noten aus beiden Semestern + Durchschnittswert der Durchschnittswerte beider Semester Durchschnitt der Noten aus dem ganzen Jahr diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8c30c7a99..de73e7828 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -24,6 +24,7 @@ Kontodetails Schülerinfo Übersicht + Benachrichtigungszentrum Semester %1$d, %2$d/%3$d @@ -43,7 +44,7 @@ Anmelden Passwort ist zu kurz Anmeldedaten sind falsch - %1$s. Stellen Sie sicher, dass die richtige UONET+ Registervariation im unteren Feld ausgewählt ist + %1$s. Stellen Sie sicher, dass die korrekte UONET+ Registervariation unten ausgewählt ist Ungültige PIN Ungültige token Token ist nicht mehr gültig @@ -91,6 +92,10 @@ Finaler Note Vorhergesagte Note Berechnender Durchschnitt + Wie funktioniert der berechnete Durchschnitt? + The Calculated Average is the arithmetic average calculated from the subjects averages. It allows you to know the approximate final average. It is calculated in a way selected by the user in the application settings. It is recommended that you choose the appropriate option. This is because the calculation of school averages differs. Additionally, if your school reports the average of the subjects on the Vulcan page, the application downloads them and does not calculate these averages. This can be changed by forcing the calculation of the average in the application settings.\n\nAverage of grades only from selected semester:\n1. Calculating the weighted average for each subject in a given semester\n2.Adding calculated averages\n3. Calculation of the arithmetic average of the summed averages\n\nAverage of averages from both semesters:\n1.Calculating the weighted average for each subject in semester 1 and 2\n2. Calculating the arithmetic average of the calculated averages for semesters 1 and 2 for each subject.\n3. Adding calculated averages\n4. Calculation of the arithmetic average of the summed averages\n\nAverage of grades from the whole year:\n1. Calculating weighted average over the year for each subject. The final average in the 1st semester is irrelevant.\n3. Adding calculated averages\n4. Calculating the arithmetic average of summed averages + Wie funktioniert der endgültige Durchschnitt? + The Final Average is the arithmetic average calculated from all currently available final grades in the given semester.\n\nThe calculation scheme consists of the following steps:\n1. Summing up the final grades given by teachers\n2. Divide by the number of subjects that have already been graded Finaler Durchschnitt aus %1$d von %2$d Schulfächern Zusammenfassung @@ -156,7 +161,7 @@ Zusätzliche Lektionen Zusätzliche Lektionen anzeigen - Keine Infos zu zusätzlichen Lektionen + Keine Informationen über zusätzlichen Lektionen Übersicht über die Schulbesuch Aus schulischen Gründen abwesend @@ -186,8 +191,8 @@ Neue prüfungen - Du hast %d neue Prüfung erhalten - Sie haben %d neue Prüfungen erhalten + Du hast %d neue Prüfung + Du hast %d neue Prüfungen %d prüfung @@ -213,16 +218,13 @@ Thema Inhalt Nachricht erfolgreich gesendet - Nachricht existiert nicht + Nachricht nicht vorhanden Sie müssen mindestens 1 Empfänger auswählen. Der Inhalt der Nachricht muss mindestens 3 Zeichen lang sein. Nur ungelesen Nur mit Anhängen Lesen: %s - - Lesen von: %1$d von %2$d Personen - Lesen von: %1$d von %2$d Personen - + Lesen von: %1$d von %2$d Personen %d nachricht %d nachrichten @@ -345,7 +347,7 @@ Sie haben %1$d neue konferenz Sie haben %1$d neue konferenzen - Present at conference + Teilnahme an einem Meeting Agenda Schulankündigungen @@ -515,7 +517,7 @@ Ja Nein Speichern - Title + Titel Keine Lektionen Thema wählen @@ -525,7 +527,7 @@ Aussehen & Verhalten Standard Ansicht - Berechnung des Jahresenddurchschnitts + Berechnete Durchschnittsoptionen Mittelwertberechnung durch App erzwingen Anwesendheit zeigen Thema @@ -540,12 +542,18 @@ Benachrichtigungen Benachrichtigungen anzeigen Benachrichtigungen über bevorstehende Lektionen anzeigen + Festlegen einer Benachrichtigung über die bevorstehende Lektion dauerhaft + Deaktivieren wenn die Benachrichtigung nicht in deiner Uhr/Band angezeigt wird Systembenachrichtigungseinstellungen öffnen Synchronisierungs- und Benachrichtigungsprobleme reparieren Ihr Gerät hat möglicherweise Probleme mit der Datensynchronisierung und Benachrichtigungen.\n\nUm diese zu reparieren, fügen Sie Wulkanowy zum Autostart hinzu und deaktivieren Sie die Batterieoptimierung in den Systemeinstellungen des Geräts. Gehe zu den Einstellungen Debug-Benachrichtigungen anzeigen Synchronisierung ist deaktiviert + Offizielle App-Benachrichtigungen erfassen + Benachrichtigungen erfassen + With this feature you can gain a substitute of push notifications like in the official app. All you need to do is allow Wulkanowy to receive all notifications in your system settings.\n\nHow it works?\nWhen you get a notification in Dziennik VULCAN, Wulkanowy will be notified (that\'s what these extra permissions are for) and will trigger a sync so that can send its own notification.\n\nFOR ADVANCED USERS ONLY + Gehe zu Einstellungen Synchronisierung Automatische Aktualisierung An Feiertagen suspendiert diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 51e185f79..5b0a90c6d 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -41,8 +41,8 @@ Kolory ocen w dzienniku - Średnia ocen z wybranego semestru - Średnia średnich z obu semestrów + Średnia ocen tylko z wybranego semestru + Średnia ze średnich z obu semestrów Średnia wszystkich ocen z całego roku diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d7a49c11d..0a231606e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -24,6 +24,7 @@ Szczegóły konta Informacje o uczniu Start + Centrum powiadomień Semestr %1$d, %2$d/%3$d @@ -43,7 +44,7 @@ Zaloguj To hasło jest za krótkie Dane logowania są niepoprawne - %1$s. Upewnij się, że poniżej została wybrana odpowiednia odmiana dziennika UONET+ + %1$s. Upewnij się, że wybrano poprawną odmianę dziennika UONET+ poniżej Nieprawidłowy PIN Nieprawidłowy token Token stracił ważność @@ -91,11 +92,11 @@ Ocena końcowa Przewidywana ocena Obliczona średnia - Jak działa Obliczona średnia? - Obliczona średnia to średnia arytmetyczna wyliczona ze średnich przedmiotów. Pozwala ona na poznanie przybliżonej średniej końcowej. Jest obliczana w sposób wybrany przez użytkownika w ustawieniach aplikacji. Zalecane jest, aby wybrać odpowiednią opcję. Wynika to z tego, że sposoby obliczania średnich w szkołach różnią się. Dodatkowo jeśli twoja szkoła podaje średnią z przedmiotów na stronie dziennika aplikacja pobiera je i nie wylicza tych średnich. Można to zmienić wymuszając liczenie średniej w ustawieniach aplikacji.\n\nŚrednia ocen z aktualnie wybranego semestru:\n1. Obliczanie średniej ważonej dla każdego przedmiotu w danym semestrze\n2. Sumowanie obliczonych średnich\n3. Obliczenie średniej arytmetycznej z zsumowanych średnich\n\nŚrednia średnich z obu semestrów:\n1. Obliczanie średniej ważonej dla każdego przedmiotu w semestrze 1 i 2\n2. Obliczanie średniej arytmetycznej z obliczonych średnich semestrów 1 i 2 dla każdego przedmiotu.\n3. Sumowanie obliczonych średnich\n4. Obliczenie średniej arytmetycznej z zsumowanych średnich\n\nŚrednia wszystkich ocen z całego roku:\n1. Obliczanie średniej ważonej z całego roku dla każdego przedmiotu. Średnia końcowa w 1 semestrze jest bez znaczenia.\n3. Sumowanie obliczonych średnich\n4. Obliczenie średniej arytmetycznej z zsumowanych średnich + Jak działa obliczona średnia? + Obliczona średnia jest średnią arytmetyczną obliczoną ze średnich przedmiotów. Pozwala ona na poznanie przybliżonej średniej końcowej. Jest obliczana w sposób wybrany przez użytkownika w ustawieniach aplikacji. Zaleca się wybranie odpowiedniej opcji. Dzieje się tak dlatego, że obliczanie średnich w szkołach różni się. Dodatkowo, jeśli twoja szkoła ma włączone średnie przedmiotów na stronie dziennika Vulcan, aplikacja pobiera je i ich nie oblicza. Można to zmienić, wymuszając obliczanie średniej w ustawieniach aplikacji.\n\nŚrednia ocen tylko z wybranego semestru:\n1. Obliczanie średniej arytmetycznej każdego przedmiotu w danym semestrze\n2. Zsumowanie obliczonych średnich\n3. Obliczanie średniej arytmetycznej zsumowanych średnich\n\nŚrednia ze średnich z obu semestrów:\n1.Obliczanie średniej arytmetycznej każdego przedmiotu w semestrze 1 i 2\n2. Obliczanie średniej arytmetycznej obliczonych średnich w semetrze 1 i 2 każdego przedmiotu.\n3. Zsumowanie obliczonych średnich\n4. Obliczanie średniej arytmetycznej zsumowanych średnich\n\nŚrednia wszystkich ocen z całego roku:\n1. Obliczanie średniej arytmetycznej z każdego przedmiotu w ciągu całego roku. Końcowa ocena w 1 semestrze jest bez znaczenia.\n3. Zsumowanie obliczonych średnich\n4. Obliczanie średniej arytmetycznej z zsumowanych średnich + Jak działa końcowa średnia? + Średnią końcową jest średnia arytmetyczna obliczona na podstawie wszystkich obecnie dostępnych ocen końcowych w danym semestrze.\n\nSchemat obliczeń składa się z następujących kroków:\n1. Sumowanie końcowych ocen wpisanych przez nauczycieli\n2. Dzielenie przez liczbę przedmiotów, z których oceny zostały już wystawione Końcowa średnia - Jak działa Końcowa średnia? - Końcowa średnia to średnia arytmetyczna wyliczona ze wszystkich aktualnie dostępnych ocen końcowych w danym semestrze.\n\nSchemat obliczania składa się z następujących kroków:\n1. Zsumowanie ocen końcowych wystawionych przez nauczycieli\n2. Podzielenie przez liczbę przedmiotów, z których oceny zostały już wystawione z %1$d na %2$d przedmiotów Podsumowanie Klasa @@ -243,12 +244,7 @@ Tylko nieprzeczytane Tylko z załącznikami Przeczytana: %s - - Przeczytana przez: %1$d z %2$d osób - Przeczytana przez: %1$d z %2$d osób - Przeczytana przez: %1$d z %2$d osób - Przeczytana przez: %1$d z %2$d osób - + Przeczytana przez: %1$d z %2$d osób %d wiadomość %d wiadomości @@ -607,7 +603,7 @@ Wygląd i zachowanie aplikacji Domyślny widok - Opcje średniej obliczonej + Opcje obliczonej średniej Wymuś obliczanie średniej przez aplikację Pokazuj obecność Motyw @@ -622,6 +618,8 @@ Powiadomienia Pokazuj powiadomienia Pokazuj powiadomienia o nadchodzących lekcjach + Ustaw powiadomienie o nadchodzącej lekcji jako trwałe + Wyłącz, gdy powiadomienie nie jest widoczne na zegarku/opasce Otwórz systemowe ustawienia powiadomień Napraw problemy z synchronizacją i powiadomieniami Na twoim urządzeniu mogą występować problemy z synchronizacją danych i powiadomieniami.\n\nBy je naprawić, dodaj Wulkanowego do autostartu i wyłącz optymalizację/oszczędzanie baterii w ustawieniach systemowych telefonu. @@ -630,7 +628,7 @@ Synchronizacja jest wyłączona Przechwytywanie powiadomień oficjalnej aplikacji Przechwytywanie powiadomień - Dzięki tej funkcji możesz zyskać namiastkę powiadomień push takich, jak w oficjalnej aplikacji. Wystarczy że zezwolisz Wulkanowemu na odbieranie wszystkich powiadomień w ustawieniach systemowych.\n\nJak to działa?\nGdy dostaniesz powiadomienie w Dzienniczku VULCANa Wulkanowy zostanie o tym powiadomiony (po to te dodatkowe uprawnienia) i uruchomi synchronizację, dzięki czemu będzie mógł wysłać własne powiadomienie.\n\nTYLKO DLA ZAAWANSOWANYCH UŻYTKOWNIKÓW + Dzięki tej funkcji możesz uzyskać namiastkę powiadomień push, takich jak w oficjalnej aplikacji. Wszystko, co musisz zrobić, to zezwolić Wulkanowemu na odczytywanie wszystkich powiadomień w ustawieniach systemowych.\n\nJak to działa?\nKiedy otrzymasz powiadomienie w Dzienniczku VULCAN, Wulkanowy zostanie o tym powiadomiony (do tego jest to dodatkowe uprawnienie) i uruchomi synchronizację, aby mógł wysłać własne powiadomienie.\n\nWYŁĄCZNIE DLA ZAAWANSOWANYCH UŻYTKOWNIKÓW Przejdź do ustawień Synchronizacja Automatyczna aktualizacja diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index 7c4d14df6..4920068e7 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -41,8 +41,8 @@ Цвета оценок в дневнике - Средняя оценка со 2 семестра - Средняя оценка с двух семестров + Средние оценки только с выбранного семестра + Средние значения для обоих семестров Средняя оценок со всего года diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 54ae5e1ba..48d8a21a7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -24,6 +24,7 @@ Данные аккаунта Информация о студенте Панель + Центр уведомлений %1$d семестр, %2$d/%3$d @@ -42,8 +43,8 @@ Symbol Войти Слишком короткий пароль - Данные для входа неверны - %1$s. Убедитесь, что в поле ниже выбран правильный вариант регистра UONET+ + Данные для входа указаны неверно + %1$s. Убедитесь, что ниже выбран правильный UONET+ вариант регистра Неправильный PIN Неверный token Token просрочен @@ -91,6 +92,10 @@ Итоговая оценка Ожидаемая оценка Рассчитанная средняя оценка + Как рассчитывается средняя работа? + Расчетное среднее - это среднее арифметическое, рассчитанное на основе средних значений испытуемых. Это позволяет узнать приблизительное итоговое среднее значение. Он рассчитывается способом, выбранным пользователем в настройках приложения. Рекомендуется выбрать подходящий вариант. Это потому, что расчет средних показателей школы отличается. Кроме того, если ваша школа сообщает среднее значение по предметам на странице Vulcan, приложение загружает их и не вычисляет эти средние значения. Это можно изменить, принудительно вычисляя среднее значение в настройках приложения. \ N \ n Среднее значение только за выбранный семестр : \ n1. Вычисление средневзвешенного значения по каждому предмету за семестр \ n2.Добавление вычисленных средних \ n3. Вычисление среднего арифметического суммарных средних \ n \ n Среднее из средних значений за оба семестра : \ n1.Расчет средневзвешенного значения для каждого предмета в семестрах 1 и 2 \ n2. Вычисление среднего арифметического рассчитанных средних значений для семестров 1 и 2 по каждому предмету. \ N3. Добавление вычисленных средних \ n4. Расчет среднего арифметического суммированных средних \ n \ n Среднее значение оценок за весь год: \ n1. Расчет средневзвешенного значения за год по каждому предмету. Итоговое среднее значение за 1 семестр не имеет значения. \ N3. Добавление вычисленных средних \ n4. Расчет среднего арифметического + Как работает окончательный средний показатель? + Среднее арифметическое - это среднее арифметическое, рассчитанное по всем имеющимся на данный момент итоговым классам данного семестра.\n\nСхема расчета состоит из следующих шагов:\n1. Суммирование итоговых классов преподавателей\n2. Деление по количеству уже оцененных предметов Итоговая средняя оценка от %1$d из %2$d субъектов Итоги @@ -239,12 +244,7 @@ Только непрочитанные Только с вложениями Чтение: %s - - Прочитано: %1$d из %2$d человек - Прочитано: %1$d из %2$d человек - Прочитано: %1$d из %2$d человек - Прочитано: %1$d из %2$d человек - + Прочитано: %1$d из %2$d человек %d сообщение %d сообщения @@ -403,8 +403,8 @@ У вас %1$d новая конференция У вас %1$d новых конференций - Present at conference - Agenda + Присутствует на конференции + Повестка дня Объявления школ Нет объявлений о школе @@ -593,7 +593,7 @@ Да Нет Сохранить - Title + Тема Нет уроков Выбрать тему @@ -603,7 +603,7 @@ Внешний вид приложения & поведение Окно по умолчанию - Способ определения средней годовой оценки + Рассчитанные средние параметры Принудительно высчитать среднюю оценку через приложение Показать присутствие Тема @@ -618,12 +618,18 @@ Уведомления Показывать уведомления Показывать уведомления о будущих уроках + Сделать уведомления о предстоящем уроке постоянным + Выключить, когда уведомление не отображается в чата/полосе Открыть настройки уведомлений системы Исправить проблемы с синхронизацией и уведомлениями На вашем устройстве могут быть проблемы с синхронизацией данных и уведомлениями.\n\nЧтобы их исправить, вам необходимо добавить Wulkanowy в авто-старт и выключить оптимизацию/экономию батареи в настройках устройства. Перейти в настройски Показывать дебаг-уведомления Синхронизация отключена + Записывать официальные уведомления + Показывать push-уведомления + С помощью этой функции вы можете получить замену push-уведомлений, как в официальном приложении. Все, что вам нужно сделать, это разрешить Wulkanowy получать все уведомления в настройках системы.\n\nКак это работает?\nКогда вы получаете уведомление в Dziennik VULCAN, Wulkanowy будет уведомлен (это требует дополнительных прав) и запустит синхронизацию, чтобы отправить свое уведомление.\n\nТОЛЬКО ДЛЯ ПОЛЬЗОВАТЕЛЯ + Перейти к настройкам Синхронизация Автоматическая синхронизация Приостановить синхронизации во время каникул diff --git a/app/src/main/res/values-sk/preferences_values.xml b/app/src/main/res/values-sk/preferences_values.xml index 108af555d..b8974f23e 100644 --- a/app/src/main/res/values-sk/preferences_values.xml +++ b/app/src/main/res/values-sk/preferences_values.xml @@ -41,8 +41,8 @@ Farby známok v denníku - Priemer známok až od druhého semestra - Priemer známok z oboch semestrov + Priemer známok iba z vybraného semestra + Priemer z priemerov z oboch semestrov Priemer známok z celého roka diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index b1fd78ae3..19e9735f9 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -12,7 +12,7 @@ O aplikácii Prehliadač protokolov Ladenie - Ladenie oznámení + Ladenie upozornení Prispievatelia Licencie Správy @@ -24,6 +24,7 @@ Podrobnosti účtu Informácie o žiakovi Domov + Centrum upozornení Semester %1$d, %2$d/%3$d @@ -43,7 +44,7 @@ Prihlásiť Toto heslo je príliš krátke Prihlasovacie údaje sú nesprávne - %1$s. Uistite sa, že je v poli nižšie vybraná správna variácie denníka UONET+ + %1$s. Skontrolujte, či je nižšie vybratá správna variácie denníka UONET+ Neplatný PIN Neplatný token Platnosť tokenu vypršala @@ -91,6 +92,10 @@ Konečná známka Predpokladaná známka Vypočítaný priemer + Ako funguje vypočítaný priemer? + Vypočítaný priemer je aritmetický priemer vypočítaný z priemerov predmetov. Umožňuje vám to poznať približný konečný priemer. Vypočítava sa spôsobom zvoleným užívateľom v nastaveniach aplikácii. Odporúča sa vybrať príslušnú možnosť. Dôvodom je rozdielny výpočet školských priemerov. Ak vaša škola navyše uvádza priemer predmetov na stránke denníka Vulcan, aplikácia si ich stiahne a tieto priemery nepočíta. To možno zmeniť vynútením výpočtu priemeru v nastavení aplikácii.\n\nPriemer známok iba z vybraného semestra:\n1. Výpočet váženého priemeru pre každý predmet v danom semestri\n2. Sčítanie vypočítaných priemerov\n3. Výpočet aritmetického priemeru součtených priemerov\n\nPriemer priemerov z oboch semestrov:\n1. Výpočet váženého priemeru pre každý predmet v semestri 1 a 2\n2. Výpočet aritmetického priemeru vypočítaných priemerov za semestre 1 a 2 pre každý predmet.\n3. Sčítanie vypočítaných priemerov\n4. Výpočet aritmetického priemeru součtených priemerov\n\nPriemer známok z celého roka:\n1. Výpočet váženého priemeru za rok pre každý predmet. Konečný priemer v 1. semestri je nepodstatný.\n3. Sčítanie vypočítaných priemerov\n4. Výpočet aritmetického priemeru součtených priemerov + Ako funguje konečný priemer? + Konečný priemer je aritmetický priemer vypočítaný zo všetkých aktuálne dostupných konečných známok v danom semestri.\n\nSchéma výpočtu sa skladá z nasledujúcich krokov:\n1. Sčítanie konečných známok zadaných učiteľmi\n2. Delené počtom predmetov, pre ktoré už boli vydané známky Konečný priemer z %1$d z %2$d predmetov Zhrnutie @@ -239,12 +244,7 @@ Iba neprečítané Iba s prílohami Prečítaná: %s - - Prečítaná cez: %1$d z %2$d osôb - Prečítaná cez: %1$d z %2$d osôb - Prečítaná cez: %1$d z %2$d osôb - Prečítaná cez: %1$d z %2$d osôb - + Prečítaná cez: %1$d z %2$d osôb %d správa %d správy @@ -403,7 +403,7 @@ Máte %1$d nových stretnutí Máte %1$d nových stretnutí - Present at conference + Prítomnosť na stretnutí Agenda Školské oznámenia @@ -593,7 +593,7 @@ Áno Nie Uložiť - Title + Titul Žiadne lekcie Vybrať motív @@ -603,7 +603,7 @@ Vzhľad a správanie aplikácií Predvolené zobrazenie - Výpočet koncoročního priemeru + Možnosti vypočítaného priemeru Vynútiť priemerný výpočet podľa aplikácie Zobraziť prítomnosť Motív @@ -618,12 +618,18 @@ Upozornenia Zobraziť upozornenia Zobraziť upozornenia o nadchádzajúcej lekciu + Nastaviť upozornenia o nadchádzajúcej lekcii ako trvalé + Vypnúť, keď upozornenia nie je vo vašom hodinkách/náramku viditeľné Otvoriť systémové nastavenia upozornení Opravte problémy so synchronizáciou a upozornením Vaše zariadenie môže mať problémy so synchronizáciou dát as upozorneniami.\n\nAk ich chcete opraviť, pridajte Wulkanového do funkcie Autostart a vypnite optimalizáciu/úsporu batérie v nastavení systému telefóne. Prejsť do nastavení Zobraziť upozornenia o ladení Synchronizácia je vypnutá + Zachytiť upozornenia oficiálnej aplikácie + Zachytiť upozornenia + S touto funkciou môžete získať náhradu push upozornení ako v oficiálnej aplikácii. Všetko, čo musíte urobiť, je povoliť Wulkanowému čítať všetky vaše upozornenia v nastaveniach systému.\n\nAko to funguje?\nKeď dostanete oznámenie v Deníčku VULCAN, Wulkanowy bude o tom informovaný (k tomu je to dodatočné povolenie) a spustí synchronizáciu, aby mohol zaslať vlastné upozornenie.\n\nLEN PRE POKROČILÝCH POUŽĺVATEĹOV + Prejsť do nastavení Synchronizácia Automatická aktualizácia Pozastavený počas dovolenky diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index f6f5b984f..f21ad819b 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -41,8 +41,8 @@ Кольори оцінок в щоденнику - Середня оцінка з 2 семестру - Середнє оцінювання за обидва семестри + Середні оцінки тільки від обраного семестру + Середнє значення для обох семестів Середнє оцінювання за весь рік diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 70f40b66c..58fed9881 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -24,6 +24,7 @@ Деталі облікового запису Інформація про учня Дошка + Журнал сповіщень %1$d семестр, %2$d/%3$d @@ -42,8 +43,8 @@ Symbol Увійти Занадто короткий пароль - Дані для входу неправильні - %1$s. Переконайтеся, що у полі нижче вказано правильний варіант реєстрації UONET+ + Вказані невірні дані + %1$s. Переконайтеся, що обрано правильну варіацію запису UONET+ Неправильний PIN Неправильний token Минув термін дії токену @@ -91,6 +92,10 @@ Підсумкова оцінка Очікувана оцінка Розрахована середня оцінка + Як розраховується середньо? + Розрахункове середнє - це середнє арифметичне, обчислене з середніх показників для випробуваних. Це дозволяє дізнатися приблизну кінцеву середню величину. Він розраховується способом, обраним користувачем у налаштуваннях програми. Рекомендується вибрати відповідний варіант. Це пояснюється тим, що розрахунок середніх показників за школою відрізняється. Крім того, якщо у вашій школі повідомляється середнє значення предметів на сторінці Вулкан, програма завантажує їх і не обчислює ці середні значення. Це можна змінити шляхом примусового розрахунку середнього значення в налаштуваннях програми. \ N \ n Середні оцінки лише за вибраний семестр : \ n1. Розрахунок середньозваженого для кожного предмета в даному семестрі \ n2.Додавання розрахункових середніх \ n3. Розрахунок середнього арифметичного підсумованих середніх значень \ n \ n Середнє значення середніх показників за обидва семестри : \ n1.Обчислення середньозваженого значення для кожного предмета у 1 та 2 семестрах \ n2. Обчислення середнього арифметичного розрахункових середніх показників за 1 та 2 семестри для кожного предмета. \ N3. Додавання розрахункових середніх \ n4. Розрахунок середнього арифметичного підсумованих середніх значень \ n \ n Середнє значення оцінок за весь рік: \ n1. Розрахунок середньозваженого показника за рік для кожного предмета. Остаточний середній показник у 1 -му семестрі не має значення. \ N3. Додавання розрахункових середніх \ n4. Обчислення середнього арифметичного середніх суммованих середніх + Як працює кінцевий середній показник? + Підсумкове середнє значення - це середнє арифметичне, обчислене з усіх наявних наразі підсумкових оцінок у даному семестрі. \ N \ nСхема обчислення складається з таких кроків: \ n1. Підбиття підсумкових оцінок викладачів \ n2. Поділіть на кількість предметів, які вже оцінені Підсумкова середня оцінка з %1$d із %2$d тем Підсумок @@ -239,12 +244,7 @@ Лише непрочитані Тільки з вкладеннями Читання: %s - - Прочитані: %1$d з %2$d осіб - Прочитані: %1$d з %2$d осіб - Прочитані: %1$d з %2$d осіб - Прочитані: %1$d з %2$d осіб - + Прочитанно:%1$d через %2$d людей %d повідомлення %d повідомлення @@ -403,8 +403,8 @@ У вас є %1$d нова конференція У вас є %1$d нових конференцій - Present at conference - Agenda + Присутність на конференції + Порядок денний Оголошення школи Жодних навчальних оголошень @@ -593,7 +593,7 @@ Так Ні Зберегти - Title + Титул Брак уроків Увібрати тему @@ -603,7 +603,7 @@ Поява додатка & amp; поведінки Вікно за замовчуванням - Спосіб облічування оцінки на кінець року + Розрахункові середні параметри Примусово розрахувати середню оцінку через додаток Показати присутність Тема @@ -618,12 +618,18 @@ Повідомлення Показувати повідомлення Показувати повідомлення о наступних уроках + Зробити сповіщення майбутнього уроку нестійкими + Вимкнути коли сповіщення не показуються у відстежувачі/темпі Відкрити налаштування сповіщень системи Виправити помилки з синхронізацією і повідомленнями На вашому пристрої можуть бути помилки з синхронізацією і повідомленнями\n\nЩоб виправити іх, вам необхідно додати Wulkanowy в авто-старт и вимкнути оптимізацію/экономію батареї в налаштуваннях пристрою. Перейти до налаштувань Показувати дебаг-повідомлення Синхронізація вимкнена + Захоплювати офіційні сповіщення програм + Показувати push-повідомлення + За допомогою цієї функції ви можете отримати заміну push -повідомлень, як у офіційному додатку. Все, що вам потрібно зробити, це дозволити Wulkanowy отримувати всі сповіщення у налаштуваннях вашої системи. \ N \ nЯк це працює? \ NКоли ви отримаєте сповіщення у Dziennik VULCAN, Wulkanowy отримає сповіщення (для цього призначені ці додаткові дозволи) і запустить синхронізація, яка може надсилати власне сповіщення. \ n \ n ТІЛЬКИ ДЛЯ РОЗШИРЕНИХ КОРИСТУВАЧІВ + Перейти до налаштувань Синхронізація Автоматична синхронізація Призупинено на час канікул From 0b83a66b85a16d5e590078825fee4f6cf461959f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 28 Sep 2021 23:10:11 +0200 Subject: [PATCH 0625/1526] Remove disappearing teachers workaround from timetable repository (#1545) --- .../data/repositories/TimetableRepository.kt | 12 +- .../repositories/TimetableRepositoryTest.kt | 129 +----------------- 2 files changed, 3 insertions(+), 138 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index 1540d3cc7..769fa0f0d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -123,17 +123,7 @@ class TimetableRepository @Inject constructor( lessonsNew: List, ) { val lessonsToRemove = lessonsOld uniqueSubtract lessonsNew - val lessonsToAdd = (lessonsNew uniqueSubtract lessonsOld).map { new -> - val matchingOld = lessonsOld.singleOrNull { new.start == it.start } - if (matchingOld != null) { - val useOldTeacher = new.teacher.isEmpty() && !new.changes && !matchingOld.changes - new.copy( - room = if (new.room.isEmpty()) matchingOld.room else new.room, - teacher = if (useOldTeacher) matchingOld.teacher - else new.teacher - ) - } else new - } + val lessonsToAdd = lessonsNew uniqueSubtract lessonsOld timetableDb.deleteAll(lessonsToRemove) timetableDb.insertAll(lessonsToAdd) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt index 75c75a66c..edb3125eb 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt @@ -67,136 +67,11 @@ class TimetableRepositoryTest { timetableRepository = TimetableRepository(timetableDb, timetableAdditionalDao, timetableHeaderDao, sdk, timetableNotificationSchedulerHelper, refreshHelper) } - @Test - fun copyRoomToCompletedFromPrevious() { - // prepare - val remoteList = listOf( - createTimetableRemote(of(2021, 1, 4, 8, 0), 1, "", "Przyroda"), - createTimetableRemote(of(2021, 1, 4, 8, 50), 2, "", "Religia"), - createTimetableRemote(of(2021, 1, 4, 9, 40), 3, "", "W-F"), - createTimetableRemote(of(2021, 1, 4, 10, 30), 4, "", "W-F") - ) - coEvery { sdk.getTimetableFull(any(), any()) } returns TimetableFull(emptyList(), remoteList, emptyList()) - - val localList = listOf( - createTimetableRemote(of(2021, 1, 4, 8, 0), 1, "123", "Przyroda"), - createTimetableRemote(of(2021, 1, 4, 8, 50), 2, "321", "Religia"), - createTimetableRemote(of(2021, 1, 4, 9, 40), 3, "213", "W-F"), - createTimetableRemote(of(2021, 1, 4, 10, 30), 3, "213", "W-F", "Jan Kowalski") - ) - coEvery { timetableDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) } returns flowOf(localList.mapToEntities(semester)) - coEvery { timetableDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { timetableDb.deleteAll(any()) } just Runs - - coEvery { timetableAdditionalDao.loadAll(1, 1, startDate, endDate) } returns flowOf(listOf()) - coEvery { timetableAdditionalDao.insertAll(emptyList()) } returns listOf(1, 2, 3) - coEvery { timetableAdditionalDao.deleteAll(emptyList()) } just Runs - - coEvery { timetableHeaderDao.loadAll(1, 1, startDate, endDate) } returns flowOf(listOf()) - coEvery { timetableHeaderDao.insertAll(emptyList()) } returns listOf(1, 2, 3) - coEvery { timetableHeaderDao.deleteAll(emptyList()) } just Runs - - // execute - val res = runBlocking { - timetableRepository.getTimetable(student, semester, startDate, endDate, true).toFirstResult() - } - - // verify - assertEquals(4, res.data?.lessons.orEmpty().size) - coVerify { - timetableDb.insertAll(withArg { - assertEquals(4, it.size) - assertEquals("123", it[0].room) - assertEquals("321", it[1].room) - assertEquals("213", it[2].room) - }) - } - coVerify { timetableDb.deleteAll(match { it.size == 4 }) } - } - - @Test - fun copyTeacherToCompletedFromPrevious() { - // prepare - val remoteList = listOf( - createTimetableRemote(of(2021, 1, 4, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false), // skip - createTimetableRemote(of(2021, 1, 4, 8, 50), 2, "124", "Matematyka", "Jakub Wtorkowski", true), - createTimetableRemote(of(2021, 1, 4, 9, 40), 3, "125", "Język polski", "Joanna Poniedziałkowska", false), - createTimetableRemote(of(2021, 1, 4, 10, 40), 4, "126", "Język polski", "Joanna Wtorkowska", true), // skip - - createTimetableRemote(of(2021, 1, 5, 8, 0), 1, "123", "Język polski", "", false), - createTimetableRemote(of(2021, 1, 5, 8, 50), 2, "124", "Język polski", "", true), - createTimetableRemote(of(2021, 1, 5, 9, 40), 3, "125", "Język polski", "", false), - createTimetableRemote(of(2021, 1, 5, 10, 40), 4, "126", "Język polski", "", true), - - createTimetableRemote(of(2021, 1, 6, 8, 0), 1, "123", "Matematyka", "Paweł Środowski", false), - createTimetableRemote(of(2021, 1, 6, 8, 50), 2, "124", "Matematyka", "Paweł Czwartkowski", true), - createTimetableRemote(of(2021, 1, 6, 9, 40), 3, "125", "Matematyka", "Paweł Środowski", false), - createTimetableRemote(of(2021, 1, 6, 10, 40), 4, "126", "Matematyka", "Paweł Czwartkowski", true) - ) - coEvery { sdk.getTimetableFull(startDate, endDate) } returns TimetableFull(emptyList(), remoteList, emptyList()) - - val localList = listOf( - createTimetableRemote(of(2021, 1, 4, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false), - createTimetableRemote(of(2021, 1, 4, 8, 50), 2, "124", "Matematyka", "Paweł Poniedziałkowski", false), - createTimetableRemote(of(2021, 1, 4, 9, 40), 3, "125", "Język polski", "Joanna Wtorkowska", true), - createTimetableRemote(of(2021, 1, 4, 10, 40), 4, "126", "Język polski", "Joanna Wtorkowska", true), - - createTimetableRemote(of(2021, 1, 5, 8, 0), 1, "123", "Język polski", "Joanna Wtorkowska", false), - createTimetableRemote(of(2021, 1, 5, 8, 50), 2, "124", "Język polski", "Joanna Wtorkowska", false), - createTimetableRemote(of(2021, 1, 5, 9, 40), 3, "125", "Język polski", "Joanna Środowska", true), - createTimetableRemote(of(2021, 1, 5, 10, 40), 4, "126", "Język polski", "Joanna Środowska", true), - - createTimetableRemote(of(2021, 1, 6, 8, 0), 1, "123", "Matematyka", "", false), - createTimetableRemote(of(2021, 1, 6, 8, 50), 2, "124", "Matematyka", "", false), - createTimetableRemote(of(2021, 1, 6, 9, 40), 3, "125", "Matematyka", "", true), - createTimetableRemote(of(2021, 1, 6, 10, 40), 4, "126", "Matematyka", "", true) - ) - coEvery { timetableDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) } returns flowOf(localList.mapToEntities(semester)) - coEvery { timetableDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { timetableDb.deleteAll(any()) } just Runs - - coEvery { timetableAdditionalDao.loadAll(1, 1, startDate, endDate) } returns flowOf(listOf()) - coEvery { timetableAdditionalDao.insertAll(emptyList()) } returns listOf(1, 2, 3) - coEvery { timetableAdditionalDao.deleteAll(emptyList()) } just Runs - - coEvery { timetableHeaderDao.loadAll(1, 1, startDate, endDate) } returns flowOf(listOf()) - coEvery { timetableHeaderDao.insertAll(emptyList()) } returns listOf(1, 2, 3) - coEvery { timetableHeaderDao.deleteAll(emptyList()) } just Runs - - // execute - val res = runBlocking { timetableRepository.getTimetable(student, semester, startDate, endDate, true).toFirstResult() } - - // verify - assertEquals(null, res.error) - assertEquals(12, res.data!!.lessons.size) - - coVerify { - timetableDb.insertAll(withArg { - assertEquals(10, it.size) -// assertEquals("Paweł Poniedziałkowski", it[0].teacher) // skip - assertEquals("Jakub Wtorkowski", it[0].teacher) - assertEquals("Joanna Poniedziałkowska", it[1].teacher) -// assertEquals("Joanna Wtorkowska", it[3].teacher) // skip - - assertEquals("Joanna Wtorkowska", it[2].teacher) - assertEquals("", it[3].teacher) - assertEquals("", it[4].teacher) - assertEquals("", it[5].teacher) - - assertEquals("Paweł Środowski", it[6].teacher) - assertEquals("Paweł Czwartkowski", it[7].teacher) - assertEquals("Paweł Środowski", it[8].teacher) - assertEquals("Paweł Czwartkowski", it[9].teacher) - }) - } - coVerify { timetableDb.deleteAll(match { it.size == 10 }) } - } - @Test fun `force refresh without difference`() { val remoteList = listOf( - createTimetableRemote(of(2021, 1, 4, 8, 0), 1, "123", "Język polski", "", false), - createTimetableRemote(of(2021, 1, 4, 8, 50), 2, "124", "Język polski", "", true) + createTimetableRemote(of(2021, 1, 4, 8, 0), 1, "123", "Język polski", "Jan Kowalski", false), + createTimetableRemote(of(2021, 1, 4, 8, 50), 2, "124", "Język niemiecki", "Joanna Czarniecka", true) ) // prepare From 9c8bcbfdd38ae9c1289aa59efb218b126b6cde89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 28 Sep 2021 23:11:59 +0200 Subject: [PATCH 0626/1526] New Crowdin updates (#1544) --- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 48d8a21a7..92af176f2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -93,7 +93,7 @@ Ожидаемая оценка Рассчитанная средняя оценка Как рассчитывается средняя работа? - Расчетное среднее - это среднее арифметическое, рассчитанное на основе средних значений испытуемых. Это позволяет узнать приблизительное итоговое среднее значение. Он рассчитывается способом, выбранным пользователем в настройках приложения. Рекомендуется выбрать подходящий вариант. Это потому, что расчет средних показателей школы отличается. Кроме того, если ваша школа сообщает среднее значение по предметам на странице Vulcan, приложение загружает их и не вычисляет эти средние значения. Это можно изменить, принудительно вычисляя среднее значение в настройках приложения. \ N \ n Среднее значение только за выбранный семестр : \ n1. Вычисление средневзвешенного значения по каждому предмету за семестр \ n2.Добавление вычисленных средних \ n3. Вычисление среднего арифметического суммарных средних \ n \ n Среднее из средних значений за оба семестра : \ n1.Расчет средневзвешенного значения для каждого предмета в семестрах 1 и 2 \ n2. Вычисление среднего арифметического рассчитанных средних значений для семестров 1 и 2 по каждому предмету. \ N3. Добавление вычисленных средних \ n4. Расчет среднего арифметического суммированных средних \ n \ n Среднее значение оценок за весь год: \ n1. Расчет средневзвешенного значения за год по каждому предмету. Итоговое среднее значение за 1 семестр не имеет значения. \ N3. Добавление вычисленных средних \ n4. Расчет среднего арифметического + Расчетное среднее - это среднее арифметическое, рассчитанное на основе средних значений испытуемых. Это позволяет узнать приблизительное итоговое среднее значение. Он рассчитывается способом, выбранным пользователем в настройках приложения. Рекомендуется выбрать подходящий вариант. Это потому, что расчет средних показателей школы отличается. Кроме того, если ваша школа сообщает среднее значение по предметам на странице Vulcan, приложение загружает их и не вычисляет эти средние значения. Это можно изменить, принудительно вычисляя среднее значение в настройках приложения.\n\nСреднее значение только за выбранный семестр :\n1. Вычисление средневзвешенного значения по каждому предмету за семестр\n2.Добавление вычисленных средних\n3. Вычисление среднего арифметического суммарных средних\n\nСреднее из средних значений за оба семестра:\n1.Расчет средневзвешенного значения для каждого предмета в семестрах 1 и 2\n2. Вычисление среднего арифметического рассчитанных средних значений для семестров 1 и 2 по каждому предмету.\n3. Добавление вычисленных средних\n4. Расчет среднего арифметического суммированных средних\n\nСреднее значение оценок за весь год: \n1. Расчет средневзвешенного значения за год по каждому предмету. Итоговое среднее значение за 1 семестр не имеет значения.\n3. Добавление вычисленных средних\n4. Расчет среднего арифметического Как работает окончательный средний показатель? Среднее арифметическое - это среднее арифметическое, рассчитанное по всем имеющимся на данный момент итоговым классам данного семестра.\n\nСхема расчета состоит из следующих шагов:\n1. Суммирование итоговых классов преподавателей\n2. Деление по количеству уже оцененных предметов Итоговая средняя оценка diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 58fed9881..741755486 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -93,7 +93,7 @@ Очікувана оцінка Розрахована середня оцінка Як розраховується середньо? - Розрахункове середнє - це середнє арифметичне, обчислене з середніх показників для випробуваних. Це дозволяє дізнатися приблизну кінцеву середню величину. Він розраховується способом, обраним користувачем у налаштуваннях програми. Рекомендується вибрати відповідний варіант. Це пояснюється тим, що розрахунок середніх показників за школою відрізняється. Крім того, якщо у вашій школі повідомляється середнє значення предметів на сторінці Вулкан, програма завантажує їх і не обчислює ці середні значення. Це можна змінити шляхом примусового розрахунку середнього значення в налаштуваннях програми. \ N \ n Середні оцінки лише за вибраний семестр : \ n1. Розрахунок середньозваженого для кожного предмета в даному семестрі \ n2.Додавання розрахункових середніх \ n3. Розрахунок середнього арифметичного підсумованих середніх значень \ n \ n Середнє значення середніх показників за обидва семестри : \ n1.Обчислення середньозваженого значення для кожного предмета у 1 та 2 семестрах \ n2. Обчислення середнього арифметичного розрахункових середніх показників за 1 та 2 семестри для кожного предмета. \ N3. Додавання розрахункових середніх \ n4. Розрахунок середнього арифметичного підсумованих середніх значень \ n \ n Середнє значення оцінок за весь рік: \ n1. Розрахунок середньозваженого показника за рік для кожного предмета. Остаточний середній показник у 1 -му семестрі не має значення. \ N3. Додавання розрахункових середніх \ n4. Обчислення середнього арифметичного середніх суммованих середніх + Розрахункове середнє - це середнє арифметичне, обчислене з середніх показників для випробуваних. Це дозволяє дізнатися приблизну кінцеву середню величину. Він розраховується способом, обраним користувачем у налаштуваннях програми. Рекомендується вибрати відповідний варіант. Це пояснюється тим, що розрахунок середніх показників за школою відрізняється. Крім того, якщо у вашій школі повідомляється середнє значення предметів на сторінці Вулкан, програма завантажує їх і не обчислює ці середні значення. Це можна змінити шляхом примусового розрахунку середнього значення в налаштуваннях програми.\n\nСередні оцінки лише за вибраний семестр :\n1. Розрахунок середньозваженого для кожного предмета в даному семестрі\n2.Додавання розрахункових середніх\n3. Розрахунок середнього арифметичного підсумованих середніх значень\n\nСереднє значення середніх показників за обидва семестри :\n1.Обчислення середньозваженого значення для кожного предмета у 1 та 2 семестрах\n2. Обчислення середнього арифметичного розрахункових середніх показників за 1 та 2 семестри для кожного предмета.\n3. Додавання розрахункових середніх\n4. Розрахунок середнього арифметичного підсумованих середніх значень\n\nСереднє значення оцінок за весь рік: \n1. Розрахунок середньозваженого показника за рік для кожного предмета. Остаточний середній показник у 1 -му семестрі не має значення.\n3. Додавання розрахункових середніх \n4. Обчислення середнього арифметичного середніх суммованих середніх Як працює кінцевий середній показник? Підсумкове середнє значення - це середнє арифметичне, обчислене з усіх наявних наразі підсумкових оцінок у даному семестрі. \ N \ nСхема обчислення складається з таких кроків: \ n1. Підбиття підсумкових оцінок викладачів \ n2. Поділіть на кількість предметів, які вже оцінені Підсумкова середня оцінка From 6cdcf927824380da83700e79cf88da5e903ecc97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 28 Sep 2021 23:26:10 +0200 Subject: [PATCH 0627/1526] Version 1.3.0 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e8680fe25..1d6e56b11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 30 - versionCode 96 - versionName "1.2.3" + versionCode 97 + versionName "1.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -166,7 +166,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:f62736adb0" + implementation "io.github.wulkanowy:sdk:1.3.0" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 7de10a26b..fc9fab88e 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,8 +1,9 @@ -Wersja 1.2.3 +Wersja 1.3.0 -- naprawiliśmy pomieszane imiona nauczycieli z salami w planie lekcji -- dodaliśmy brakujące okienka ze szczegółami na ekranie zebrań -- klikając w kafelek z lekcjami na jutro aplikacja teraz przekierowuje na ekran z planem na jutro -- naprawiliśmy błąd przy wylogowywaniu innego niż bieżący uczeń +- naprawiliśmy logowanie na platformę Opolskiej eSzkoły +- dodaliśmy centrum powiadomień i opcję odbierania pushy z oficjalnej aplikacji (dla zaawansowanych) +- dodaliśmy objaśnienie do informacji o obliczonych średnich w podsumowaniu +- poprawiliśmy wyświetlanie zmian w planie lekcji +- dokonaliśmy też kilka innych zmian i kosmetycznych poprawek poprawiających komfort używania aplikacji Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From e02d93f9797c8ada9bb48372e9363d697e298140 Mon Sep 17 00:00:00 2001 From: Damian Czupryn <60961958+Daxxxis@users.noreply.github.com> Date: Sun, 3 Oct 2021 01:07:45 +0200 Subject: [PATCH 0628/1526] Add Czech and Slovak listings (#1555) --- .../main/play/listings/cs-CZ/full-description.txt | 14 ++++++++++++++ .../main/play/listings/cs-CZ/short-description.txt | 1 + app/src/main/play/listings/cs-CZ/title.txt | 1 + app/src/main/play/listings/sk/full-description.txt | 14 ++++++++++++++ .../main/play/listings/sk/short-description.txt | 1 + app/src/main/play/listings/sk/title.txt | 1 + 6 files changed, 32 insertions(+) create mode 100644 app/src/main/play/listings/cs-CZ/full-description.txt create mode 100644 app/src/main/play/listings/cs-CZ/short-description.txt create mode 100644 app/src/main/play/listings/cs-CZ/title.txt create mode 100644 app/src/main/play/listings/sk/full-description.txt create mode 100644 app/src/main/play/listings/sk/short-description.txt create mode 100644 app/src/main/play/listings/sk/title.txt diff --git a/app/src/main/play/listings/cs-CZ/full-description.txt b/app/src/main/play/listings/cs-CZ/full-description.txt new file mode 100644 index 000000000..1420f5d67 --- /dev/null +++ b/app/src/main/play/listings/cs-CZ/full-description.txt @@ -0,0 +1,14 @@ +Aplikace je určena pro uživatele deníku VULCAN UONET+. + +Zvýrazněné vlastnosti a funkce: +- výpočet váženého průměru, +- procentuální zobrazení docházky, +- šťastné číslo, +- náhled na další a dokončené lekce, +- tmavý motiv, +- žádné reklamy, +- offline režim, +- upozornění. + +GitHub: https://github.com/wulkanowy/wulkanowy +Discord: https://discord.gg/vccAQBr diff --git a/app/src/main/play/listings/cs-CZ/short-description.txt b/app/src/main/play/listings/cs-CZ/short-description.txt new file mode 100644 index 000000000..0f29ab1b5 --- /dev/null +++ b/app/src/main/play/listings/cs-CZ/short-description.txt @@ -0,0 +1 @@ +Neoficiální aplikace žáka a rodiče pro deníku VULCAN UONET+ diff --git a/app/src/main/play/listings/cs-CZ/title.txt b/app/src/main/play/listings/cs-CZ/title.txt new file mode 100644 index 000000000..b7f42a5b0 --- /dev/null +++ b/app/src/main/play/listings/cs-CZ/title.txt @@ -0,0 +1 @@ +Wulkanowy Deníček diff --git a/app/src/main/play/listings/sk/full-description.txt b/app/src/main/play/listings/sk/full-description.txt new file mode 100644 index 000000000..2a4787d2d --- /dev/null +++ b/app/src/main/play/listings/sk/full-description.txt @@ -0,0 +1,14 @@ +Aplikácia je určená pre užívateľov denníka VULCAN UONET+. + +Zvýraznené vlastnosti a funkcie: +- výpočet váženého priemeru, +- percentuálne zobrazenie dochádzky, +- šťastné číslo, +- náhľad na ďalšie a dokončené lekcie, +- tmavý motív, +- žiadne reklamy, +- offline režim, +- upozornenia. + +GitHub: https://github.com/wulkanowy/wulkanowy +Discord: https://discord.gg/vccAQBr diff --git a/app/src/main/play/listings/sk/short-description.txt b/app/src/main/play/listings/sk/short-description.txt new file mode 100644 index 000000000..645ebbb6a --- /dev/null +++ b/app/src/main/play/listings/sk/short-description.txt @@ -0,0 +1 @@ +Neoficiálna aplikácia žiaka a rodiča pre denníka VULCAN UONET+ diff --git a/app/src/main/play/listings/sk/title.txt b/app/src/main/play/listings/sk/title.txt new file mode 100644 index 000000000..aa50ce77a --- /dev/null +++ b/app/src/main/play/listings/sk/title.txt @@ -0,0 +1 @@ +Wulkanowy Denníček From 8e607d48f7388db76e359d44192e9d01118a5f32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 3 Oct 2021 10:36:17 +0200 Subject: [PATCH 0629/1526] Add coroutines scope to presenter (#1554) --- .../github/wulkanowy/ui/base/BasePresenter.kt | 26 +++++++++---------- .../modules/dashboard/DashboardPresenter.kt | 2 +- .../NotificationDebugPresenter.kt | 2 +- .../ui/modules/message/MessagePresenter.kt | 2 +- .../message/send/SendMessagePresenter.kt | 4 +-- .../message/tab/MessageTabPresenter.kt | 4 +-- .../mobiledevice/MobileDevicePresenter.kt | 3 +-- .../ui/modules/note/NotePresenter.kt | 19 +++++++------- .../SchoolAndTeachersPresenter.kt | 2 +- 9 files changed, 31 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index 6f363bfc4..5cd5d0109 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -6,29 +6,27 @@ import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import timber.log.Timber -import kotlin.coroutines.CoroutineContext open class BasePresenter( protected val errorHandler: ErrorHandler, protected val studentRepository: StudentRepository -) : CoroutineScope { +) { + private val job = SupervisorJob() - private var job = Job() + protected val presenterScope = CoroutineScope(job + Dispatchers.Main) - private val jobs = mutableMapOf() - - override val coroutineContext: CoroutineContext - get() = Dispatchers.Main + job + private val childrenJobs = mutableMapOf() var view: T? = null open fun onAttachView(view: T) { - job = Job() this.view = view errorHandler.apply { showErrorMessage = view::showError @@ -64,22 +62,22 @@ open class BasePresenter( } fun Flow.launch(individualJobTag: String = "load"): Job { - jobs[individualJobTag]?.cancel() - val job = catch { errorHandler.dispatch(it) }.launchIn(this@BasePresenter) - jobs[individualJobTag] = job + childrenJobs[individualJobTag]?.cancel() + val job = catch { errorHandler.dispatch(it) }.launchIn(presenterScope) + childrenJobs[individualJobTag] = job Timber.d("Job $individualJobTag launched in ${this@BasePresenter.javaClass.simpleName}: $job") return job } fun cancelJobs(vararg names: String) { names.forEach { - jobs[it]?.cancel() + childrenJobs[it]?.cancel() } } open fun onDetachView() { - view = null - job.cancel() + job.cancelChildren() errorHandler.clear() + view = null } } 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 c513a9f6f..d6d533e28 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 @@ -149,7 +149,7 @@ class DashboardPresenter @Inject constructor( tileList: List, forceRefresh: Boolean ) { - launch { + presenterScope.launch { Timber.i("Loading dashboard account data started") val student = runCatching { studentRepository.getCurrentStudent(true) } .onFailure { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt index 6103317d2..26eca18fd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt @@ -88,7 +88,7 @@ class NotificationDebugPresenter @Inject constructor( } private fun withStudent(block: suspend (Student) -> Unit) { - launch { + presenterScope.launch { block(studentRepository.getCurrentStudent(false)) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt index 7b8c3d0f5..be6940520 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt @@ -15,7 +15,7 @@ class MessagePresenter @Inject constructor( override fun onAttachView(view: MessageView) { super.onAttachView(view) - launch { + presenterScope.launch { delay(150) view.initView() Timber.i("Message view was initialized") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt index 60a23e58a..77fa82316 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt @@ -224,14 +224,14 @@ class SendMessagePresenter @Inject constructor( } fun onMessageContentChange() { - launch { + presenterScope.launch { messageUpdateChannel.send(Unit) } } @OptIn(FlowPreview::class) private fun initializeSubjectStream() { - launch { + presenterScope.launch { messageUpdateChannel.consumeAsFlow() .debounce(250) .catch { Timber.e(it) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index a24f9b79f..4571390b5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -173,14 +173,14 @@ class MessageTabPresenter @Inject constructor( } fun onSearchQueryTextChange(query: String) { - launch { + presenterScope.launch { searchChannel.send(query) } } @OptIn(FlowPreview::class) private fun initializeSearchStream() { - launch { + presenterScope.launch { searchChannel.consumeAsFlow() .debounce(250) .map { query -> diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt index 9591867df..53049891a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt @@ -11,7 +11,6 @@ import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn -import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -148,6 +147,6 @@ class MobileDevicePresenter @Inject constructor( errorHandler.dispatch(it.error!!) } } - }.launchIn(this) + }.launch("unregister") } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt index c441231e0..10a391820 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt @@ -11,7 +11,6 @@ import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn -import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -123,15 +122,17 @@ class NotePresenter @Inject constructor( } private fun updateNote(note: Note) { - flowWithResource { noteRepository.updateNote(note) }.onEach { - when (it.status) { - Status.LOADING -> Timber.i("Attempt to update note ${note.id}") - Status.SUCCESS -> Timber.i("Update note result: Success") - Status.ERROR -> { - Timber.i("Update note result: An exception occurred") - errorHandler.dispatch(it.error!!) + flowWithResource { noteRepository.updateNote(note) } + .onEach { + when (it.status) { + Status.LOADING -> Timber.i("Attempt to update note ${note.id}") + Status.SUCCESS -> Timber.i("Update note result: Success") + Status.ERROR -> { + Timber.i("Update note result: An exception occurred") + errorHandler.dispatch(it.error!!) + } } } - }.launchIn(this) + .launch("update_note") } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt index 915cc4213..c14272b9d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt @@ -15,7 +15,7 @@ class SchoolAndTeachersPresenter @Inject constructor( override fun onAttachView(view: SchoolAndTeachersView) { super.onAttachView(view) - launch { + presenterScope.launch { delay(150) view.initView() Timber.i("Message view was initialized") From 60501fcd728bae993c110a4ed500b5dd66012ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 3 Oct 2021 14:13:42 +0200 Subject: [PATCH 0630/1526] Set buildTimestamp through manifest meta (#1556) --- app/build.gradle | 4 ++-- app/src/main/AndroidManifest.xml | 10 ++++++++-- .../java/io/github/wulkanowy/utils/AppInfo.kt | 16 +++++++++++++--- .../data/db/migrations/AbstractMigrationTest.kt | 5 +++-- .../data/db/migrations/Migration35Test.kt | 6 +++--- .../wulkanowy/data/repositories/StudentTest.kt | 14 +++++++------- 6 files changed, 36 insertions(+), 19 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1d6e56b11..e8762ddae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,10 +27,10 @@ android { vectorDrawables.useSupportLibrary = true resValue "string", "app_name", "Wulkanowy" - buildConfigField "long", "BUILD_TIMESTAMP", String.valueOf(System.currentTimeMillis()) manifestPlaceholders = [ - firebase_enabled: project.hasProperty("enableFirebase") + firebase_enabled: project.hasProperty("enableFirebase"), + buildTimestamp: String.valueOf(System.currentTimeMillis()) ] javaCompileOptions { annotationProcessorOptions { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 84c50523c..bebe33c62 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -106,7 +106,8 @@ + android:exported="false" + tools:ignore="MissingClass"> @@ -152,6 +153,10 @@ android:resource="@xml/provider_paths" /> + + @@ -162,7 +167,8 @@ android:name="com.google.firebase.provider.FirebaseInitProvider" android:authorities="${applicationId}.firebaseinitprovider" android:enabled="${firebase_enabled}" - android:exported="false" /> + android:exported="false" + tools:ignore="MissingClass" /> () + @get:Rule val helper: MigrationTestHelper = MigrationTestHelper( InstrumentationRegistry.getInstrumentation(), @@ -24,7 +26,6 @@ abstract class AbstractMigrationTest { ) fun getMigratedRoomDatabase(): AppDatabase { - val context = ApplicationProvider.getApplicationContext() val database = Room.databaseBuilder( ApplicationProvider.getApplicationContext(), AppDatabase::class.java, @@ -32,7 +33,7 @@ abstract class AbstractMigrationTest { ).addMigrations( *AppDatabase.getMigrations( SharedPrefProvider(PreferenceManager.getDefaultSharedPreferences(context)), - AppInfo() + AppInfo(context) ) ).build() // close the database and release any stream resources when the test finishes diff --git a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration35Test.kt b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration35Test.kt index 883cdb81c..9a38f4286 100644 --- a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration35Test.kt +++ b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration35Test.kt @@ -29,15 +29,15 @@ class Migration35Test : AbstractMigrationTest() { close() } - helper.runMigrationsAndValidate(dbName, 35, true, Migration35(AppInfo())) + helper.runMigrationsAndValidate(dbName, 35, true, Migration35(AppInfo(context))) val db = getMigratedRoomDatabase() val students = runBlocking { db.studentDao.loadAll() } assertEquals(2, students.size) - assertTrue { students[0].avatarColor in AppInfo().defaultColorsForAvatar } - assertTrue { students[1].avatarColor in AppInfo().defaultColorsForAvatar } + assertTrue { students[0].avatarColor in AppInfo(context).defaultColorsForAvatar } + assertTrue { students[1].avatarColor in AppInfo(context).defaultColorsForAvatar } } private fun createStudent(db: SupportSQLiteDatabase, id: Long) { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt index b34bbf1b2..39ebb4a19 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt @@ -32,13 +32,13 @@ class StudentTest { fun initApi() { MockKAnnotations.init(this) studentRepository = StudentRepository( - mockk(), - TestDispatchersProvider(), - studentDb, - semesterDb, - mockSdk, - AppInfo(), - mockk() + context = mockk(), + dispatchers = TestDispatchersProvider(), + studentDb = studentDb, + semesterDb = semesterDb, + sdk = mockSdk, + appInfo = AppInfo(mockk()), + appDatabase = mockk() ) } From 031a17ea502159fc33e1e8564abd503ba38ae08a Mon Sep 17 00:00:00 2001 From: Damian Czupryn <60961958+Daxxxis@users.noreply.github.com> Date: Mon, 4 Oct 2021 16:35:37 +0200 Subject: [PATCH 0631/1526] Change text to bold in notifications center (#1546) --- app/src/main/res/layout/item_notifications_center.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/item_notifications_center.xml b/app/src/main/res/layout/item_notifications_center.xml index ae3f5586d..16a7ae0c0 100644 --- a/app/src/main/res/layout/item_notifications_center.xml +++ b/app/src/main/res/layout/item_notifications_center.xml @@ -33,6 +33,7 @@ android:layout_marginStart="16dp" android:layout_marginTop="6dp" android:layout_marginEnd="16dp" + android:fontFamily="sans-serif-medium" android:textSize="15sp" app:layout_constraintEnd_toStartOf="@id/notifications_center_item_icon" app:layout_constraintStart_toStartOf="parent" From 04393e60bb860566442712a08893400169eb160a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Oct 2021 14:43:46 +0000 Subject: [PATCH 0632/1526] Bump agconnect-crash from 1.6.0.300 to 1.6.1.200 (#1563) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e8762ddae..9cfa670eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -228,7 +228,7 @@ dependencies { playImplementation 'com.google.android.play:core-ktx:1.8.1' hmsImplementation 'com.huawei.hms:hianalytics:6.2.0.301' - hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.0.300' + hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.1.200' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 8315759c83b967ddbd82cfb5a9e39f1261e03039 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Oct 2021 14:44:15 +0000 Subject: [PATCH 0633/1526] Bump agcp from 1.6.0.300 to 1.6.1.200 (#1562) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 15d3c792b..370fe296c 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { classpath 'com.android.tools.build:gradle:7.0.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.10' - classpath 'com.huawei.agconnect:agcp:1.6.0.300' + classpath 'com.huawei.agconnect:agcp:1.6.1.200' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.3.0" From 426379ec17f2bb6c74d583d2d2185f242f1b5b01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Oct 2021 14:45:09 +0000 Subject: [PATCH 0634/1526] Bump about_libraries from 8.9.1 to 8.9.3 (#1560) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 370fe296c..fbd127192 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.5.31' - about_libraries = '8.9.1' + about_libraries = '8.9.3' hilt_version = "2.38.1" } repositories { From 2d84b0775a9586a9119bbed6133a254497e3a20f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Oct 2021 14:51:31 +0000 Subject: [PATCH 0635/1526] Bump hilt_version from 2.38.1 to 2.39.1 (#1561) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fbd127192..118efd398 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.5.31' about_libraries = '8.9.3' - hilt_version = "2.38.1" + hilt_version = "2.39.1" } repositories { mavenCentral() From 1839d7cb8f4b4dd4f0bb99dcfecde86ed6d6d9bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 4 Oct 2021 17:13:31 +0200 Subject: [PATCH 0636/1526] Migrate from moshi to kotlinx serialization (#1557) --- app/build.gradle | 12 ++-- .../github/wulkanowy/data/RepositoryModule.kt | 6 +- .../io/github/wulkanowy/data/db/Converters.kt | 29 ++++---- .../data/db/adapters/PairAdapterFactory.kt | 68 ------------------- .../wulkanowy/data/db/entities/Recipient.kt | 3 +- .../wulkanowy/data/pojos/Contributor.kt | 4 +- .../wulkanowy/data/pojos/MessageDraft.kt | 4 +- .../data/repositories/AppCreatorRepository.kt | 15 ++-- .../data/repositories/MessageRepository.kt | 11 +-- .../repositories/PreferencesRepository.kt | 20 +++--- .../modules/message/send/RecipientChipItem.kt | 4 +- .../wulkanowy/data/db/ConvertersTest.kt | 4 +- .../repositories/MessageRepositoryTest.kt | 7 +- build.gradle | 1 + 14 files changed, 56 insertions(+), 132 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt diff --git a/app/build.gradle b/app/build.gradle index 9cfa670eb..91ce5f24a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' apply plugin: 'kotlin-parcelize' apply plugin: 'kotlin-kapt' apply plugin: 'dagger.hilt.android.plugin' @@ -162,7 +163,7 @@ ext { room = "2.3.0" chucker = "3.5.2" mockk = "1.12.0" - moshi = "1.12.0" + coroutines = "1.5.2" } dependencies { @@ -170,7 +171,8 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.0" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" implementation "androidx.core:core-ktx:1.6.0" implementation "androidx.activity:activity-ktx:1.3.1" @@ -207,10 +209,6 @@ dependencies { implementation 'com.github.ncapdevi:FragNav:3.3.0' implementation "com.github.YarikSOffice:lingver:1.3.0" - implementation "com.squareup.moshi:moshi:$moshi" - implementation "com.squareup.moshi:moshi-adapters:$moshi" - kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi" - implementation "com.jakewharton.timber:timber:5.0.1" implementation "at.favre.lib:slf4j-timber:1.0.1" implementation 'com.github.bastienpaulfr:Treessence:1.0.4' @@ -237,7 +235,7 @@ dependencies { testImplementation "junit:junit:4.13.2" testImplementation "io.mockk:mockk:$mockk" - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.2' + testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines" testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" testImplementation 'org.robolectric:robolectric:4.6.1' diff --git a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt index f1b719e54..863bb5950 100644 --- a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt @@ -9,7 +9,6 @@ import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.chuckerteam.chucker.api.RetentionManager import com.fredporciuncula.flow.preferences.FlowSharedPreferences -import com.squareup.moshi.Moshi import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -21,6 +20,7 @@ import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AppInfo import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.serialization.json.Json import timber.log.Timber import javax.inject.Singleton @@ -88,7 +88,9 @@ internal class RepositoryModule { @Singleton @Provides - fun provideMoshi() = Moshi.Builder().build() + fun provideJson() = Json { + ignoreUnknownKeys = true + } @Singleton @Provides diff --git a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt index def0b3715..1993c4338 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt @@ -1,9 +1,10 @@ package io.github.wulkanowy.data.db import androidx.room.TypeConverter -import com.squareup.moshi.Moshi -import com.squareup.moshi.Types -import io.github.wulkanowy.data.db.adapters.PairAdapterFactory +import kotlinx.serialization.SerializationException +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime @@ -13,15 +14,7 @@ import java.util.Date class Converters { - private val moshi by lazy { Moshi.Builder().add(PairAdapterFactory).build() } - - private val integerListAdapter by lazy { - moshi.adapter>(Types.newParameterizedType(List::class.java, Integer::class.java)) - } - - private val stringListPairAdapter by lazy { - moshi.adapter>>(Types.newParameterizedType(List::class.java, Pair::class.java, String::class.java, String::class.java)) - } + private val json = Json @TypeConverter fun timestampToDate(value: Long?): LocalDate? = value?.run { @@ -51,21 +44,25 @@ class Converters { @TypeConverter fun intListToJson(list: List): String { - return integerListAdapter.toJson(list) + return json.encodeToString(list) } @TypeConverter fun jsonToIntList(value: String): List { - return integerListAdapter.fromJson(value).orEmpty() + return json.decodeFromString(value) } @TypeConverter fun stringPairListToJson(list: List>): String { - return stringListPairAdapter.toJson(list) + return json.encodeToString(list) } @TypeConverter fun jsonToStringPairList(value: String): List> { - return stringListPairAdapter.fromJson(value).orEmpty() + return try { + json.decodeFromString(value) + } catch (e: SerializationException) { + emptyList() // handle errors from old gson Pair serialized data + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt b/app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt deleted file mode 100644 index 4a9b168dd..000000000 --- a/app/src/main/java/io/github/wulkanowy/data/db/adapters/PairAdapterFactory.kt +++ /dev/null @@ -1,68 +0,0 @@ -package io.github.wulkanowy.data.db.adapters - -import com.squareup.moshi.JsonAdapter -import com.squareup.moshi.JsonReader -import com.squareup.moshi.JsonWriter -import com.squareup.moshi.Moshi -import com.squareup.moshi.Types -import java.lang.reflect.ParameterizedType -import java.lang.reflect.Type - -object PairAdapterFactory : JsonAdapter.Factory { - - override fun create(type: Type, annotations: MutableSet, moshi: Moshi): JsonAdapter<*>? { - if (type !is ParameterizedType || List::class.java != type.rawType) return null - if (type.actualTypeArguments[0] != Pair::class.java) return null - - val listType = Types.newParameterizedType(List::class.java, Map::class.java, String::class.java) - val listAdapter = moshi.adapter>>(listType) - - val mapType = Types.newParameterizedType(MutableMap::class.java, String::class.java, String::class.java) - val mapAdapter = moshi.adapter>(mapType) - - return PairAdapter(listAdapter, mapAdapter) - } - - private class PairAdapter( - private val listAdapter: JsonAdapter>>, - private val mapAdapter: JsonAdapter>, - ) : JsonAdapter>>() { - - override fun toJson(writer: JsonWriter, value: List>?) { - writer.beginArray() - value?.forEach { - writer.beginObject() - writer.name("first").value(it.first) - writer.name("second").value(it.second) - writer.endObject() - } - writer.endArray() - } - - override fun fromJson(reader: JsonReader): List>? { - return if (reader.peek() == JsonReader.Token.BEGIN_OBJECT) deserializeMoshiMap(reader) - else deserializeGsonPair(reader) - } - - // for compatibility with 0.21.0 - private fun deserializeMoshiMap(reader: JsonReader): List>? { - val map = mapAdapter.fromJson(reader) ?: return null - - return map.entries.map { - it.key to it.value - } - } - - private fun deserializeGsonPair(reader: JsonReader): List>? { - val list = listAdapter.fromJson(reader) ?: return null - - return list.map { - require(it.size == 2) { - "pair with more or less than two elements: $list" - } - - it["first"].orEmpty() to it["second"].orEmpty() - } - } - } -} diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Recipient.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Recipient.kt index 60e67d32f..223322705 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Recipient.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Recipient.kt @@ -3,10 +3,9 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.squareup.moshi.JsonClass import java.io.Serializable -@JsonClass(generateAdapter = true) +@kotlinx.serialization.Serializable @Entity(tableName = "Recipients") data class Recipient( diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt index d2338c281..4165b3f14 100644 --- a/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt @@ -1,8 +1,8 @@ package io.github.wulkanowy.data.pojos -import com.squareup.moshi.JsonClass +import kotlinx.serialization.Serializable -@JsonClass(generateAdapter = true) +@Serializable class Contributor( val displayName: String, val githubUsername: String diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/MessageDraft.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/MessageDraft.kt index a79b70cd4..2e568e376 100644 --- a/app/src/main/java/io/github/wulkanowy/data/pojos/MessageDraft.kt +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/MessageDraft.kt @@ -1,9 +1,9 @@ package io.github.wulkanowy.data.pojos -import com.squareup.moshi.JsonClass import io.github.wulkanowy.ui.modules.message.send.RecipientChipItem +import kotlinx.serialization.Serializable -@JsonClass(generateAdapter = true) +@Serializable data class MessageDraft( val recipients: List, val subject: String, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt index 71b7ea94e..f1fdbfed3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt @@ -1,25 +1,26 @@ package io.github.wulkanowy.data.repositories import android.content.res.AssetManager -import com.squareup.moshi.Moshi -import com.squareup.moshi.Types import io.github.wulkanowy.data.pojos.Contributor import io.github.wulkanowy.utils.DispatchersProvider import kotlinx.coroutines.withContext +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream import javax.inject.Inject import javax.inject.Singleton @Singleton class AppCreatorRepository @Inject constructor( private val assets: AssetManager, - private val dispatchers: DispatchersProvider + private val dispatchers: DispatchersProvider, + private val json: Json, ) { + @OptIn(ExperimentalSerializationApi::class) @Suppress("BlockingMethodInNonBlockingContext") suspend fun getAppCreators() = withContext(dispatchers.backgroundThread) { - val moshi = Moshi.Builder().build() - val type = Types.newParameterizedType(List::class.java, Contributor::class.java) - val adapter = moshi.adapter>(type) - adapter.fromJson(assets.open("contributors.json").bufferedReader().use { it.readText() }) + val inputStream = assets.open("contributors.json").buffered() + json.decodeFromStream>(inputStream) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index ee5164957..224c69bd7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.data.repositories import android.content.Context -import com.squareup.moshi.Moshi import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.Resource @@ -18,7 +17,6 @@ import io.github.wulkanowy.data.enums.MessageFolder.RECEIVED import io.github.wulkanowy.data.mappers.mapFromEntities import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.pojos.MessageDraft -import io.github.wulkanowy.data.pojos.MessageDraftJsonAdapter import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Folder import io.github.wulkanowy.sdk.pojo.SentMessage @@ -29,6 +27,9 @@ import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import timber.log.Timber import java.time.LocalDateTime.now import javax.inject.Inject @@ -42,7 +43,7 @@ class MessageRepository @Inject constructor( @ApplicationContext private val context: Context, private val refreshHelper: AutoRefreshHelper, private val sharedPrefProvider: SharedPrefProvider, - private val moshi: Moshi, + private val json: Json, ) { private val saveFetchResultMutex = Mutex() @@ -168,9 +169,9 @@ class MessageRepository @Inject constructor( var draftMessage: MessageDraft? get() = sharedPrefProvider.getString(context.getString(R.string.pref_key_message_send_draft)) - ?.let { MessageDraftJsonAdapter(moshi).fromJson(it) } + ?.let { json.decodeFromString(it) } set(value) = sharedPrefProvider.putString( context.getString(R.string.pref_key_message_send_draft), - value?.let { MessageDraftJsonAdapter(moshi).toJson(it) } + value?.let { json.encodeToString(it) } ) } 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 a08045f85..65edd53f0 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 @@ -5,9 +5,6 @@ import android.content.SharedPreferences import androidx.core.content.edit import com.fredporciuncula.flow.preferences.FlowSharedPreferences import com.fredporciuncula.flow.preferences.Preference -import com.squareup.moshi.JsonAdapter -import com.squareup.moshi.Moshi -import com.squareup.moshi.adapter import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.sdk.toLocalDate @@ -19,6 +16,9 @@ import io.github.wulkanowy.utils.toTimestamp import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import java.time.LocalDate import java.time.LocalDateTime import javax.inject.Inject @@ -27,16 +27,12 @@ import javax.inject.Singleton @OptIn(ExperimentalCoroutinesApi::class) @Singleton class PreferencesRepository @Inject constructor( + @ApplicationContext val context: Context, private val sharedPref: SharedPreferences, private val flowSharedPref: FlowSharedPreferences, - @ApplicationContext val context: Context, - moshi: Moshi + private val json: Json, ) { - @OptIn(ExperimentalStdlibApi::class) - private val dashboardItemsPositionAdapter: JsonAdapter> = - moshi.adapter() - val startMenuIndex: Int get() = getString(R.string.pref_key_start_menu, R.string.pref_default_startup).toInt() @@ -197,14 +193,14 @@ class PreferencesRepository @Inject constructor( var dashboardItemsPosition: Map? get() { - val json = sharedPref.getString(PREF_KEY_DASHBOARD_ITEMS_POSITION, null) ?: return null + val value = sharedPref.getString(PREF_KEY_DASHBOARD_ITEMS_POSITION, null) ?: return null - return dashboardItemsPositionAdapter.fromJson(json) + return json.decodeFromString(value) } set(value) = sharedPref.edit { putString( PREF_KEY_DASHBOARD_ITEMS_POSITION, - dashboardItemsPositionAdapter.toJson(value) + json.encodeToString(value) ) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/RecipientChipItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/RecipientChipItem.kt index 26ab7f488..bd14bc893 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/RecipientChipItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/RecipientChipItem.kt @@ -1,10 +1,10 @@ package io.github.wulkanowy.ui.modules.message.send -import com.squareup.moshi.JsonClass import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.materialchipsinput.ChipItem +import kotlinx.serialization.Serializable -@JsonClass(generateAdapter = true) +@Serializable data class RecipientChipItem( override val title: String, diff --git a/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt b/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt index 3b0d7c841..a044a4299 100644 --- a/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/db/ConvertersTest.kt @@ -23,8 +23,8 @@ class ConvertersTest { @Test fun jsonToStringPairList_0210() { - assertEquals(Converters().jsonToStringPairList("{\"aaa\":\"bbb\",\"ccc\":\"ddd\"}"), listOf("aaa" to "bbb", "ccc" to "ddd")) - assertEquals(Converters().jsonToStringPairList("{\"aaa\":\"bbb\"}"), listOf("aaa" to "bbb")) + assertEquals(Converters().jsonToStringPairList("{\"aaa\":\"bbb\",\"ccc\":\"ddd\"}"), listOf>()) + assertEquals(Converters().jsonToStringPairList("{\"aaa\":\"bbb\"}"), listOf>()) assertEquals(Converters().jsonToStringPairList("{}"), listOf>()) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt index 25774d74c..052f08f00 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.data.repositories import android.content.Context -import com.squareup.moshi.Moshi import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.dao.MessageAttachmentDao @@ -30,6 +29,7 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking +import kotlinx.serialization.json.Json import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -63,9 +63,6 @@ class MessageRepositoryTest { private lateinit var repository: MessageRepository - @MockK - private lateinit var moshi: Moshi - @Before fun setUp() { MockKAnnotations.init(this) @@ -78,7 +75,7 @@ class MessageRepositoryTest { context = context, refreshHelper = refreshHelper, sharedPrefProvider = sharedPrefProvider, - moshi = moshi, + json = Json, ) } diff --git a/build.gradle b/build.gradle index 118efd398..153088a6d 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ buildscript { } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath 'com.android.tools.build:gradle:7.0.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.10' From e8075e30e4f3d6203d66e0dccd8921df97fd71a7 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Fri, 8 Oct 2021 11:19:49 +0200 Subject: [PATCH 0637/1526] Add "add homework" feature (#1564) --- .../41.json | 2322 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 6 +- .../wulkanowy/data/db/entities/Homework.kt | 3 + .../data/db/migrations/Migration41.kt | 11 + .../data/repositories/HomeworkRepository.kt | 7 +- .../ui/modules/homework/HomeworkFragment.kt | 9 +- .../ui/modules/homework/HomeworkPresenter.kt | 6 +- .../ui/modules/homework/HomeworkView.kt | 4 +- .../modules/homework/add/HomeworkAddDialog.kt | 124 + .../homework/add/HomeworkAddPresenter.kt | 92 + .../modules/homework/add/HomeworkAddView.kt | 21 + .../details/HomeworkDetailsAdapter.kt | 28 +- .../homework/details/HomeworkDetailsDialog.kt | 8 + .../details/HomeworkDetailsPresenter.kt | 19 + .../homework/details/HomeworkDetailsView.kt | 4 + .../login/advanced/LoginAdvancedFragment.kt | 10 +- .../modules/login/form/LoginFormFragment.kt | 4 +- .../login/recover/LoginRecoverFragment.kt | 2 +- .../login/symbol/LoginSymbolFragment.kt | 2 +- app/src/main/res/layout/dialog_homework.xml | 17 +- .../main/res/layout/dialog_homework_add.xml | 134 + app/src/main/res/layout/fragment_homework.xml | 22 +- .../layout/item_homework_dialog_details.xml | 26 +- app/src/main/res/values/strings.xml | 16 +- 24 files changed, 2850 insertions(+), 47 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/41.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddDialog.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddPresenter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddView.kt create mode 100644 app/src/main/res/layout/dialog_homework_add.xml diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/41.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/41.json new file mode 100644 index 000000000..9d008060a --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/41.json @@ -0,0 +1,2322 @@ +{ + "formatVersion": 1, + "database": { + "version": 41, + "identityHash": "d9ce44a78495a358606612bd91603c0f", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "semester_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `recipient_name` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `removed` INTEGER NOT NULL, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `unread_by` INTEGER NOT NULL, `read_by` INTEGER NOT NULL, `content` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "recipient", + "columnName": "recipient_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "removed", + "columnName": "removed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `one_drive_id` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`real_id`))", + "fields": [ + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "oneDriveId", + "columnName": "one_drive_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "real_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ReportingUnits", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `short` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `roles` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "senderName", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roles", + "columnName": "roles", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` TEXT NOT NULL, `name` TEXT NOT NULL, `real_name` TEXT NOT NULL, `login_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `role` INTEGER NOT NULL, `hash` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "realName", + "columnName": "real_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginId", + "columnName": "login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "role", + "columnName": "role", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hash", + "columnName": "hash", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd9ce44a78495a358606612bd91603c0f')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 09aa972f0..b93d00881 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -97,6 +97,7 @@ import io.github.wulkanowy.data.db.migrations.Migration37 import io.github.wulkanowy.data.db.migrations.Migration38 import io.github.wulkanowy.data.db.migrations.Migration39 import io.github.wulkanowy.data.db.migrations.Migration4 +import io.github.wulkanowy.data.db.migrations.Migration41 import io.github.wulkanowy.data.db.migrations.Migration40 import io.github.wulkanowy.data.db.migrations.Migration5 import io.github.wulkanowy.data.db.migrations.Migration6 @@ -146,7 +147,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 40 + const val VERSION_SCHEMA = 41 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), @@ -187,7 +188,8 @@ abstract class AppDatabase : RoomDatabase() { Migration37(), Migration38(), Migration39(), - Migration40() + Migration40(), + Migration41() ) fun newInstance( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt index 04ee1e8c6..4538cf31f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt @@ -40,4 +40,7 @@ data class Homework( @ColumnInfo(name = "is_notified") var isNotified: Boolean = true + + @ColumnInfo(name = "is_added_by_user") + var isAddedByUser: Boolean = false } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt new file mode 100644 index 000000000..17773efdb --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt @@ -0,0 +1,11 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +class Migration41 : Migration(40, 41) { + + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE Homework ADD COLUMN is_added_by_user INTEGER NOT NULL DEFAULT 0") + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt index a04085fb7..95a375a45 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt @@ -61,8 +61,9 @@ class HomeworkRepository @Inject constructor( val homeWorkToSave = (new uniqueSubtract old).onEach { if (notify) it.isNotified = false } + val filteredOld = old.filterNot { it.isAddedByUser } - homeworkDb.deleteAll(old uniqueSubtract new) + homeworkDb.deleteAll(filteredOld uniqueSubtract new) homeworkDb.insertAll(homeWorkToSave) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester, start, end)) @@ -79,4 +80,8 @@ class HomeworkRepository @Inject constructor( homeworkDb.loadAll(semester.semesterId, semester.studentId, start.monday, end.sunday) suspend fun updateHomework(homework: List) = homeworkDb.updateAll(homework) + + suspend fun saveHomework(homework: Homework) = homeworkDb.insertAll(listOf(homework)) + + suspend fun deleteHomework(homework: Homework) = homeworkDb.deleteAll(listOf(homework)) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt index 1d9434dc7..a723b0483 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt @@ -10,6 +10,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.databinding.FragmentHomeworkBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.homework.add.HomeworkAddDialog import io.github.wulkanowy.ui.modules.homework.details.HomeworkDetailsDialog import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView @@ -64,6 +65,8 @@ class HomeworkFragment : BaseFragment(R.layout.fragment homeworkPreviousButton.setOnClickListener { presenter.onPreviousDay() } homeworkNextButton.setOnClickListener { presenter.onNextDay() } + openAddHomeworkButton.setOnClickListener { presenter.onHomeworkAddButtonClicked() } + homeworkNavContainer.setElevationCompat(requireContext().dpToPx(8f)) } } @@ -122,10 +125,14 @@ class HomeworkFragment : BaseFragment(R.layout.fragment binding.homeworkNextButton.visibility = if (show) VISIBLE else View.INVISIBLE } - override fun showTimetableDialog(homework: Homework) { + override fun showHomeworkDialog(homework: Homework) { (activity as? MainActivity)?.showDialogFragment(HomeworkDetailsDialog.newInstance(homework)) } + override fun showAddHomeworkDialog() { + (activity as? MainActivity)?.showDialogFragment(HomeworkAddDialog()) + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putLong(SAVED_DATE_KEY, presenter.currentDate.toEpochDay()) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index 11c54dc24..d7d5d7cb9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -78,7 +78,11 @@ class HomeworkPresenter @Inject constructor( fun onHomeworkItemSelected(homework: Homework) { Timber.i("Select homework item ${homework.id}") - view?.showTimetableDialog(homework) + view?.showHomeworkDialog(homework) + } + + fun onHomeworkAddButtonClicked() { + view?.showAddHomeworkDialog() } private fun setBaseDateOnHolidays() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkView.kt index a1d6a04a9..7c05ab865 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkView.kt @@ -33,5 +33,7 @@ interface HomeworkView : BaseView { fun showNextButton(show: Boolean) - fun showTimetableDialog(homework: Homework) + fun showHomeworkDialog(homework: Homework) + + fun showAddHomeworkDialog() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddDialog.kt new file mode 100644 index 000000000..12168f142 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddDialog.kt @@ -0,0 +1,124 @@ +package io.github.wulkanowy.ui.modules.homework.add + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.widget.doOnTextChanged +import com.google.android.material.datepicker.CalendarConstraints +import com.google.android.material.datepicker.MaterialDatePicker +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R +import io.github.wulkanowy.databinding.DialogHomeworkAddBinding +import io.github.wulkanowy.ui.base.BaseDialogFragment +import io.github.wulkanowy.utils.toFormattedString +import io.github.wulkanowy.utils.toLocalDateTime +import io.github.wulkanowy.utils.toTimestamp +import java.time.LocalDate +import javax.inject.Inject + +@AndroidEntryPoint +class HomeworkAddDialog : BaseDialogFragment(), HomeworkAddView { + + @Inject + lateinit var presenter: HomeworkAddPresenter + + private var date: LocalDate? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, 0) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ) = DialogHomeworkAddBinding.inflate(inflater).apply { binding = this }.root + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + presenter.onAttachView(this) + } + + override fun initView() { + with(binding) { + homeworkDialogSubjectEdit.doOnTextChanged { _, _, _, _ -> + homeworkDialogSubject.error = null + homeworkDialogSubject.isErrorEnabled = false + } + homeworkDialogDateEdit.doOnTextChanged { _, _, _, _ -> + homeworkDialogDate.error = null + homeworkDialogDate.isErrorEnabled = false + } + homeworkDialogContentEdit.doOnTextChanged { _, _, _, _ -> + homeworkDialogContent.error = null + homeworkDialogContent.isErrorEnabled = false + } + homeworkDialogClose.setOnClickListener { dismiss() } + homeworkDialogDateEdit.setOnClickListener { presenter.showDatePicker(date) } + homeworkDialogAdd.setOnClickListener { + presenter.onAddHomeworkClicked( + subject = homeworkDialogSubjectEdit.text?.toString(), + teacher = homeworkDialogTeacherEdit.text?.toString(), + date = homeworkDialogDateEdit.text?.toString(), + content = homeworkDialogContentEdit.text?.toString() + ) + } + } + } + + override fun showSuccessMessage() { + showMessage(getString(R.string.homework_add_success)) + } + + override fun setErrorSubjectRequired() { + with(binding.homeworkDialogSubject) { + isErrorEnabled = true + error = getString(R.string.error_field_required) + } + } + + override fun setErrorDateRequired() { + with(binding.homeworkDialogDate) { + isErrorEnabled = true + error = getString(R.string.error_field_required) + } + } + + override fun setErrorContentRequired() { + with(binding.homeworkDialogContent) { + isErrorEnabled = true + error = getString(R.string.error_field_required) + } + } + + override fun closeDialog() { + dismiss() + } + + override fun showDatePickerDialog(currentDate: LocalDate) { + val constraintsBuilder = CalendarConstraints.Builder().apply { + setStart(LocalDate.now().toEpochDay()) + } + val datePicker = + MaterialDatePicker.Builder.datePicker() + .setCalendarConstraints(constraintsBuilder.build()) + .setSelection(currentDate.toTimestamp()) + .build() + + datePicker.addOnPositiveButtonClickListener { + date = it.toLocalDateTime().toLocalDate() + binding.homeworkDialogDate.editText?.setText(date!!.toFormattedString()) + } + + if (!parentFragmentManager.isStateSaved) { + datePicker.show(this.parentFragmentManager, null) + } + } + + override fun onDestroyView() { + presenter.onDetachView() + super.onDestroyView() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddPresenter.kt new file mode 100644 index 000000000..3639c2fef --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddPresenter.kt @@ -0,0 +1,92 @@ +package io.github.wulkanowy.ui.modules.homework.add + +import io.github.wulkanowy.data.Status +import io.github.wulkanowy.data.db.entities.Homework +import io.github.wulkanowy.data.repositories.HomeworkRepository +import io.github.wulkanowy.data.repositories.SemesterRepository +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.utils.flowWithResource +import io.github.wulkanowy.utils.toLocalDate +import kotlinx.coroutines.flow.onEach +import timber.log.Timber +import java.time.LocalDate +import javax.inject.Inject + +class HomeworkAddPresenter @Inject constructor( + errorHandler: ErrorHandler, + studentRepository: StudentRepository, + private val homeworkRepository: HomeworkRepository, + private val semesterRepository: SemesterRepository +) : BasePresenter(errorHandler, studentRepository) { + + override fun onAttachView(view: HomeworkAddView) { + super.onAttachView(view) + view.initView() + Timber.i("Homework details view was initialized") + } + + fun showDatePicker(date: LocalDate?) { + view?.showDatePickerDialog(date ?: LocalDate.now()) + } + + fun onAddHomeworkClicked(subject: String?, teacher: String?, date: String?, content: String?) { + var isError = false + + if (subject.isNullOrBlank()) { + view?.setErrorSubjectRequired() + isError = true + } + + if (date.isNullOrBlank()) { + view?.setErrorDateRequired() + isError = true + } + + if (content.isNullOrBlank()) { + view?.setErrorContentRequired() + isError = true + } + + if (!isError) { + saveHomework(subject!!, teacher.orEmpty(), date!!.toLocalDate(), content!!) + } + } + + private fun saveHomework(subject: String, teacher: String, date: LocalDate, content: String) { + flowWithResource { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + val entryDate = LocalDate.now() + homeworkRepository.saveHomework( + Homework( + semesterId = semester.semesterId, + studentId = student.studentId, + date = date, + entryDate = entryDate, + subject = subject, + content = content, + teacher = teacher, + teacherSymbol = "", + attachments = emptyList(), + ).apply { isAddedByUser = true } + ) + }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Homework insert start") + Status.SUCCESS -> { + Timber.i("Homework insert: Success") + view?.run { + showSuccessMessage() + closeDialog() + } + } + Status.ERROR -> { + Timber.i("Homework insert result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.launch("add_homework") + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddView.kt new file mode 100644 index 000000000..3bb304d9c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddView.kt @@ -0,0 +1,21 @@ +package io.github.wulkanowy.ui.modules.homework.add + +import io.github.wulkanowy.ui.base.BaseView +import java.time.LocalDate + +interface HomeworkAddView : BaseView { + + fun initView() + + fun showSuccessMessage() + + fun setErrorSubjectRequired() + + fun setErrorDateRequired() + + fun setErrorContentRequired() + + fun closeDialog() + + fun showDatePickerDialog(currentDate: LocalDate) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt index cd9a7e851..e03707a5c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt @@ -5,10 +5,12 @@ import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.databinding.ItemHomeworkDialogAttachmentBinding import io.github.wulkanowy.databinding.ItemHomeworkDialogAttachmentsHeaderBinding import io.github.wulkanowy.databinding.ItemHomeworkDialogDetailsBinding +import io.github.wulkanowy.utils.ifNullOrBlank import io.github.wulkanowy.utils.toFormattedString import javax.inject.Inject @@ -37,6 +39,8 @@ class HomeworkDetailsAdapter @Inject constructor() : var onFullScreenExitClickListener = {} + var onDeleteClickListener: (homework: Homework) -> Unit = {} + override fun getItemCount() = 1 + if (attachments.isNotEmpty()) attachments.size + 1 else 0 override fun getItemViewType(position: Int) = when (position) { @@ -49,9 +53,15 @@ class HomeworkDetailsAdapter @Inject constructor() : val inflater = LayoutInflater.from(parent.context) return when (viewType) { - ViewType.ATTACHMENTS_HEADER.id -> AttachmentsHeaderViewHolder(ItemHomeworkDialogAttachmentsHeaderBinding.inflate(inflater, parent, false)) - ViewType.ATTACHMENT.id -> AttachmentViewHolder(ItemHomeworkDialogAttachmentBinding.inflate(inflater, parent, false)) - else -> DetailsViewHolder(ItemHomeworkDialogDetailsBinding.inflate(inflater, parent, false)) + ViewType.ATTACHMENTS_HEADER.id -> AttachmentsHeaderViewHolder( + ItemHomeworkDialogAttachmentsHeaderBinding.inflate(inflater, parent, false) + ) + ViewType.ATTACHMENT.id -> AttachmentViewHolder( + ItemHomeworkDialogAttachmentBinding.inflate(inflater, parent, false) + ) + else -> DetailsViewHolder( + ItemHomeworkDialogDetailsBinding.inflate(inflater, parent, false) + ) } } @@ -63,12 +73,15 @@ class HomeworkDetailsAdapter @Inject constructor() : } private fun bindDetailsViewHolder(holder: DetailsViewHolder) { + val noDataString = holder.binding.root.context.getString(R.string.all_no_data) + with(holder.binding) { homeworkDialogDate.text = homework?.date?.toFormattedString() homeworkDialogEntryDate.text = homework?.entryDate?.toFormattedString() - homeworkDialogSubject.text = homework?.subject - homeworkDialogTeacher.text = homework?.teacher - homeworkDialogContent.text = homework?.content + homeworkDialogSubject.text = homework?.subject.ifNullOrBlank { noDataString } + homeworkDialogTeacher.text = homework?.teacher.ifNullOrBlank { noDataString } + homeworkDialogContent.text = homework?.content.ifNullOrBlank { noDataString } + homeworkDialogDelete.visibility = if (homework?.isAddedByUser == true) VISIBLE else GONE homeworkDialogFullScreen.visibility = if (isHomeworkFullscreen) GONE else VISIBLE homeworkDialogFullScreenExit.visibility = if (isHomeworkFullscreen) VISIBLE else GONE homeworkDialogFullScreen.setOnClickListener { @@ -81,6 +94,9 @@ class HomeworkDetailsAdapter @Inject constructor() : homeworkDialogFullScreenExit.visibility = GONE onFullScreenExitClickListener() } + homeworkDialogDelete.setOnClickListener { + onDeleteClickListener(homework!!) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt index 93045a481..f9d463510 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt @@ -25,6 +25,9 @@ class HomeworkDetailsDialog : BaseDialogFragment(), Homew @Inject lateinit var detailsAdapter: HomeworkDetailsAdapter + override val homeworkDeleteSuccess: String + get() = getString(R.string.homework_delete_success) + private lateinit var homework: Homework companion object { @@ -82,12 +85,17 @@ class HomeworkDetailsDialog : BaseDialogFragment(), Homew dialog?.window?.setLayout(WRAP_CONTENT, WRAP_CONTENT) presenter.isHomeworkFullscreen = false } + onDeleteClickListener = { homework -> presenter.deleteHomework(homework) } isHomeworkFullscreen = presenter.isHomeworkFullscreen homework = this@HomeworkDetailsDialog.homework } } } + override fun closeDialog() { + dismiss() + } + override fun updateMarkAsDoneLabel(isDone: Boolean) { binding.homeworkDialogRead.text = view?.context?.getString(if (isDone) R.string.homework_mark_as_undone else R.string.homework_mark_as_done) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt index ca6fc71ee..ea9b47a05 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt @@ -33,6 +33,25 @@ class HomeworkDetailsPresenter @Inject constructor( Timber.i("Homework details view was initialized") } + fun deleteHomework(homework: Homework) { + flowWithResource { homeworkRepository.deleteHomework(homework) }.onEach { + when (it.status) { + Status.LOADING -> Timber.i("Homework delete start") + Status.SUCCESS -> { + Timber.i("Homework delete: Success") + view?.run { + showMessage(homeworkDeleteSuccess) + closeDialog() + } + } + Status.ERROR -> { + Timber.i("Homework delete result: An exception occurred") + errorHandler.dispatch(it.error!!) + } + } + }.launch("delete") + } + fun toggleDone(homework: Homework) { flowWithResource { homeworkRepository.toggleDone(homework) }.onEach { when (it.status) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsView.kt index 697f22335..4a47de43b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsView.kt @@ -4,7 +4,11 @@ import io.github.wulkanowy.ui.base.BaseView interface HomeworkDetailsView : BaseView { + val homeworkDeleteSuccess: String + fun initView() + fun closeDialog() + fun updateMarkAsDoneLabel(isDone: Boolean) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt index 0672d75fa..4a93d4ca8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt @@ -170,7 +170,7 @@ class LoginAdvancedFragment : override fun setErrorUsernameRequired() { with(binding.loginFormUsernameLayout) { requestFocus() - error = getString(R.string.login_field_required) + error = getString(R.string.error_field_required) } } @@ -191,7 +191,7 @@ class LoginAdvancedFragment : override fun setErrorPassRequired(focus: Boolean) { with(binding.loginFormPassLayout) { if (focus) requestFocus() - error = getString(R.string.login_field_required) + error = getString(R.string.error_field_required) } } @@ -212,7 +212,7 @@ class LoginAdvancedFragment : override fun setErrorPinRequired() { with(binding.loginFormPinLayout) { requestFocus() - error = getString(R.string.login_field_required) + error = getString(R.string.error_field_required) } } @@ -226,7 +226,7 @@ class LoginAdvancedFragment : override fun setErrorSymbolRequired() { with(binding.loginFormSymbolLayout) { requestFocus() - error = getString(R.string.login_field_required) + error = getString(R.string.error_field_required) } } @@ -240,7 +240,7 @@ class LoginAdvancedFragment : override fun setErrorTokenRequired() { with(binding.loginFormTokenLayout) { requestFocus() - error = getString(R.string.login_field_required) + error = getString(R.string.error_field_required) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index 6e0294a4e..78cc6db09 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -123,7 +123,7 @@ class LoginFormFragment : BaseFragment(R.layout.fragme override fun setErrorUsernameRequired() { with(binding.loginFormUsernameLayout) { - error = getString(R.string.login_field_required) + error = getString(R.string.error_field_required) } } @@ -141,7 +141,7 @@ class LoginFormFragment : BaseFragment(R.layout.fragme override fun setErrorPassRequired(focus: Boolean) { with(binding.loginFormPassLayout) { - error = getString(R.string.login_field_required) + error = getString(R.string.error_field_required) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt index 2e2f9f5ce..a91dfb618 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt @@ -99,7 +99,7 @@ class LoginRecoverFragment : override fun setErrorNameRequired() { with(bindingLocal.loginRecoverNameLayout) { requestFocus() - error = getString(R.string.login_field_required) + error = getString(R.string.error_field_required) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt index e2c37db61..ae0f75a5e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt @@ -77,7 +77,7 @@ class LoginSymbolFragment : override fun setErrorSymbolRequire() { binding.loginSymbolNameLayout.apply { requestFocus() - error = getString(R.string.login_field_required) + error = getString(R.string.error_field_required) } } diff --git a/app/src/main/res/layout/dialog_homework.xml b/app/src/main/res/layout/dialog_homework.xml index 22a03cb21..341cec544 100644 --- a/app/src/main/res/layout/dialog_homework.xml +++ b/app/src/main/res/layout/dialog_homework.xml @@ -4,6 +4,7 @@ android:id="@+id/parent" android:layout_width="match_parent" android:layout_height="match_parent" + android:minWidth="300dp" android:orientation="vertical"> + android:layout_height="1dp" + android:background="@drawable/ic_all_divider" /> @@ -52,6 +53,9 @@ style="@style/Widget.MaterialComponents.Button.TextButton.Dialog" android:layout_width="wrap_content" android:layout_height="36dp" + android:layout_alignParentEnd="true" + android:layout_alignParentBottom="true" + android:layout_gravity="center_vertical" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" @@ -60,9 +64,6 @@ android:insetRight="0dp" android:insetBottom="0dp" android:minWidth="88dp" - android:layout_gravity="center_vertical" - android:layout_alignParentEnd="true" - android:layout_alignParentBottom="true" android:text="@string/all_close" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/dialog_homework_add.xml b/app/src/main/res/layout/dialog_homework_add.xml new file mode 100644 index 000000000..b9b8d1a2e --- /dev/null +++ b/app/src/main/res/layout/dialog_homework_add.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_homework.xml b/app/src/main/res/layout/fragment_homework.xml index c0b5698d5..e1f0a16be 100644 --- a/app/src/main/res/layout/fragment_homework.xml +++ b/app/src/main/res/layout/fragment_homework.xml @@ -26,6 +26,8 @@ android:id="@+id/homeworkRecycler" android:layout_width="match_parent" android:layout_height="match_parent" + android:clipToPadding="false" + android:paddingBottom="70dp" tools:listitem="@layout/item_homework" /> @@ -105,6 +107,18 @@ android:text="@string/all_retry" /> + + + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/item_homework_dialog_details.xml b/app/src/main/res/layout/item_homework_dialog_details.xml index abc371da8..9d560ba51 100644 --- a/app/src/main/res/layout/item_homework_dialog_details.xml +++ b/app/src/main/res/layout/item_homework_dialog_details.xml @@ -10,26 +10,37 @@ + android:orientation="horizontal"> + + - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 63d4fc423..b662d4ad5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,6 +17,7 @@ Licenses Messages New message + New homework Notes and achievements Homework Accounts manager @@ -57,7 +58,6 @@ Use the assigned login or email in @%1$s Invalid symbol Student not found. Validate the symbol and the chosen variation of the UONET+ register - This field is required Selected student is already logged in The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Zarejestruj urządzenie mobilne.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the previous screen. Wulkanowy does not detect pre-school students at the moment Select students to log in to the application @@ -316,6 +316,9 @@ No info about homework Mark as done Mark as undone + Add homework + Homework added successfully + Homework deleted successfully Attachments New homework @@ -592,6 +595,10 @@ No Save Title + Add + Copied + Undo + Change @@ -697,12 +704,6 @@ No color - - Copied - Undo - Change - - Download of updates has started… An update has just been downloaded. @@ -721,4 +722,5 @@ An unexpected error occurred Feature disabled by your school Feature not available. Login in a mode other than Mobile API + This field is required From ebf9e741c2cc19d0cb8287878e9d789cf480575e Mon Sep 17 00:00:00 2001 From: Damian Czupryn <60961958+Daxxxis@users.noreply.github.com> Date: Sat, 9 Oct 2021 01:04:04 +0200 Subject: [PATCH 0638/1526] Fix homework last item padding (#1568) --- app/src/main/res/layout/fragment_homework.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_homework.xml b/app/src/main/res/layout/fragment_homework.xml index e1f0a16be..ae8270ab1 100644 --- a/app/src/main/res/layout/fragment_homework.xml +++ b/app/src/main/res/layout/fragment_homework.xml @@ -27,7 +27,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - android:paddingBottom="70dp" + android:paddingBottom="64dp" tools:listitem="@layout/item_homework" /> From 2ab0a57a4168b172f21a5f686c12feeb95756eb2 Mon Sep 17 00:00:00 2001 From: Damian Czupryn <60961958+Daxxxis@users.noreply.github.com> Date: Sat, 9 Oct 2021 01:55:00 +0200 Subject: [PATCH 0639/1526] Separate calculated average settings (#1558) --- app/src/main/res/values/strings.xml | 1 + .../main/res/xml/scheme_preferences_advanced.xml | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b662d4ad5..d8674705a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -668,6 +668,7 @@ Attendance Timetable Grades + Calculated average Messages Appearance & Behavior diff --git a/app/src/main/res/xml/scheme_preferences_advanced.xml b/app/src/main/res/xml/scheme_preferences_advanced.xml index 461037871..95f6f383a 100644 --- a/app/src/main/res/xml/scheme_preferences_advanced.xml +++ b/app/src/main/res/xml/scheme_preferences_advanced.xml @@ -19,18 +19,16 @@ app:key="@string/pref_key_grade_modifier_minus" app:title="@string/pref_other_grade_modifier_minus" app:useSimpleSummaryProvider="true" /> + + - + Date: Sat, 9 Oct 2021 17:36:22 +0200 Subject: [PATCH 0640/1526] Change text when there are no lessons today and tomorrow in dashboard (#1571) --- .../ui/modules/dashboard/DashboardAdapter.kt | 9 +++++++-- app/src/main/res/layout/item_dashboard_lessons.xml | 13 +++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt index 11b575c1c..7bd6ed0ca 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt @@ -301,26 +301,31 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { dateToNavigate = tomorrowDate updateLessonView(item, tomorrowTimetable, binding) binding.dashboardLessonsItemTitleTomorrow.isVisible = true + binding.dashboardLessonsItemTitleTodayAndTomorrow.isVisible = false } currentDayHeader != null && currentDayHeader.content.isNotBlank() -> { dateToNavigate = currentDate updateLessonView(item, emptyList(), binding, currentDayHeader) binding.dashboardLessonsItemTitleTomorrow.isVisible = false + binding.dashboardLessonsItemTitleTodayAndTomorrow.isVisible = false } tomorrowDayHeader != null && tomorrowDayHeader.content.isNotBlank() -> { dateToNavigate = tomorrowDate updateLessonView(item, emptyList(), binding, tomorrowDayHeader) binding.dashboardLessonsItemTitleTomorrow.isVisible = true + binding.dashboardLessonsItemTitleTodayAndTomorrow.isVisible = false } else -> { - dateToNavigate = tomorrowDate + dateToNavigate = currentDate updateLessonView(item, emptyList(), binding) - binding.dashboardLessonsItemTitleTomorrow.isVisible = + binding.dashboardLessonsItemTitleTomorrow.isVisible = false + binding.dashboardLessonsItemTitleTodayAndTomorrow.isVisible = !(item.isLoading && item.error == null) } } diff --git a/app/src/main/res/layout/item_dashboard_lessons.xml b/app/src/main/res/layout/item_dashboard_lessons.xml index a2a92c54c..39bd317a7 100644 --- a/app/src/main/res/layout/item_dashboard_lessons.xml +++ b/app/src/main/res/layout/item_dashboard_lessons.xml @@ -42,6 +42,19 @@ app:layout_constraintBottom_toBottomOf="@id/dashboard_lessons_item_title" app:layout_constraintStart_toEndOf="@id/dashboard_lessons_item_title" /> + + Lessons (Tomorrow) + (Today and tomorrow) In a moment: Soon: First: From a240fd5d5f1cbe1bdf90f39c6bebdeeb0a05a1c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 9 Oct 2021 18:37:27 +0200 Subject: [PATCH 0641/1526] Add build timestamp as build config field (#1567) --- app/build.gradle | 11 +++++++---- app/src/main/AndroidManifest.xml | 12 ++++-------- .../java/io/github/wulkanowy/utils/AppInfo.kt | 16 +++------------- .../data/db/migrations/AbstractMigrationTest.kt | 4 ++-- .../data/db/migrations/Migration35Test.kt | 6 +++--- .../wulkanowy/data/repositories/StudentTest.kt | 2 +- 6 files changed, 20 insertions(+), 31 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 91ce5f24a..031385feb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,10 +29,7 @@ android { resValue "string", "app_name", "Wulkanowy" - manifestPlaceholders = [ - firebase_enabled: project.hasProperty("enableFirebase"), - buildTimestamp: String.valueOf(System.currentTimeMillis()) - ] + manifestPlaceholders = [firebase_enabled: project.hasProperty("enableFirebase")] javaCompileOptions { annotationProcessorOptions { arguments += [ @@ -41,6 +38,12 @@ android { ] } } + + if (System.env.SET_BUILD_TIMESTAMP) { + buildConfigField "long", "BUILD_TIMESTAMP", String.valueOf(System.currentTimeMillis()) + } else { + buildConfigField "long", "BUILD_TIMESTAMP", "1486235849000" + } } sourceSets { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bebe33c62..8c7eb8527 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -153,14 +153,6 @@ android:resource="@xml/provider_paths" /> - - - - + + diff --git a/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt b/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt index 4875425f1..a3961aed8 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt @@ -1,12 +1,10 @@ package io.github.wulkanowy.utils -import android.content.Context -import android.content.pm.PackageManager import android.content.res.Resources import android.os.Build.MANUFACTURER import android.os.Build.MODEL import android.os.Build.VERSION.SDK_INT -import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.BuildConfig.BUILD_TIMESTAMP import io.github.wulkanowy.BuildConfig.DEBUG import io.github.wulkanowy.BuildConfig.FLAVOR import io.github.wulkanowy.BuildConfig.VERSION_CODE @@ -15,21 +13,13 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -open class AppInfo @Inject constructor( - @ApplicationContext private val context: Context, -) { +open class AppInfo @Inject constructor() { open val isDebug get() = DEBUG open val versionCode get() = VERSION_CODE - open val buildTimestamp: Long - get() { - val info = context.packageManager.getApplicationInfo( - context.packageName, PackageManager.GET_META_DATA, - ) - return info.metaData?.getFloat("buildTimestamp")?.toLong() ?: 0 - } + open val buildTimestamp get() = BUILD_TIMESTAMP open val buildFlavor get() = FLAVOR diff --git a/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt b/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt index 5897af738..cc31d8933 100644 --- a/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt @@ -16,7 +16,7 @@ abstract class AbstractMigrationTest { val dbName = "migration-test" - val context: Context get() = ApplicationProvider.getApplicationContext() + val context: Context get() = ApplicationProvider.getApplicationContext() @get:Rule val helper: MigrationTestHelper = MigrationTestHelper( @@ -33,7 +33,7 @@ abstract class AbstractMigrationTest { ).addMigrations( *AppDatabase.getMigrations( SharedPrefProvider(PreferenceManager.getDefaultSharedPreferences(context)), - AppInfo(context) + AppInfo() ) ).build() // close the database and release any stream resources when the test finishes diff --git a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration35Test.kt b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration35Test.kt index 9a38f4286..883cdb81c 100644 --- a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration35Test.kt +++ b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration35Test.kt @@ -29,15 +29,15 @@ class Migration35Test : AbstractMigrationTest() { close() } - helper.runMigrationsAndValidate(dbName, 35, true, Migration35(AppInfo(context))) + helper.runMigrationsAndValidate(dbName, 35, true, Migration35(AppInfo())) val db = getMigratedRoomDatabase() val students = runBlocking { db.studentDao.loadAll() } assertEquals(2, students.size) - assertTrue { students[0].avatarColor in AppInfo(context).defaultColorsForAvatar } - assertTrue { students[1].avatarColor in AppInfo(context).defaultColorsForAvatar } + assertTrue { students[0].avatarColor in AppInfo().defaultColorsForAvatar } + assertTrue { students[1].avatarColor in AppInfo().defaultColorsForAvatar } } private fun createStudent(db: SupportSQLiteDatabase, id: Long) { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt index 39ebb4a19..9d3d7a2ec 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt @@ -37,7 +37,7 @@ class StudentTest { studentDb = studentDb, semesterDb = semesterDb, sdk = mockSdk, - appInfo = AppInfo(mockk()), + appInfo = AppInfo(), appDatabase = mockk() ) } From 539be586ce402d74bdfc2ce195a175c02726007d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Oct 2021 14:39:54 +0200 Subject: [PATCH 0642/1526] Fix text color of time left indicator on dashboard timetable card (#1572) --- app/src/main/res/layout/item_dashboard_lessons.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/item_dashboard_lessons.xml b/app/src/main/res/layout/item_dashboard_lessons.xml index 39bd317a7..9156c1a2f 100644 --- a/app/src/main/res/layout/item_dashboard_lessons.xml +++ b/app/src/main/res/layout/item_dashboard_lessons.xml @@ -50,10 +50,10 @@ android:text="@string/dashboard_timetable_title_today_and_tomorrow" android:textColor="?colorOnSurface" android:textSize="14sp" - tools:visibility="invisible" app:layout_constraintBaseline_toBaselineOf="@id/dashboard_lessons_item_title" app:layout_constraintBottom_toBottomOf="@id/dashboard_lessons_item_title" - app:layout_constraintStart_toEndOf="@id/dashboard_lessons_item_title" /> + app:layout_constraintStart_toEndOf="@id/dashboard_lessons_item_title" + tools:visibility="invisible" /> Date: Mon, 11 Oct 2021 15:43:29 +0000 Subject: [PATCH 0643/1526] Bump hianalytics from 6.2.0.301 to 6.3.0.300 (#1576) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 031385feb..fc7d50d51 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -228,7 +228,7 @@ dependencies { playImplementation 'com.google.android.play:core:1.10.2' playImplementation 'com.google.android.play:core-ktx:1.8.1' - hmsImplementation 'com.huawei.hms:hianalytics:6.2.0.301' + hmsImplementation 'com.huawei.hms:hianalytics:6.3.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.1.200' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 3d0cd11ba45042b612d3c04f146f364852cac373 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Oct 2021 15:44:03 +0000 Subject: [PATCH 0644/1526] Bump Treessence from 1.0.4 to 1.0.5 (#1575) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index fc7d50d51..ff40c7c85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -214,7 +214,7 @@ dependencies { implementation "com.jakewharton.timber:timber:5.0.1" implementation "at.favre.lib:slf4j-timber:1.0.1" - implementation 'com.github.bastienpaulfr:Treessence:1.0.4' + implementation 'com.github.bastienpaulfr:Treessence:1.0.5' implementation "com.mikepenz:aboutlibraries-core:$about_libraries" implementation "io.coil-kt:coil:1.3.2" implementation "io.github.wulkanowy:AppKillerManager:3.0.0" From 9d0366d010433994a296b69bb05ea2e3e644396d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Oct 2021 15:44:19 +0000 Subject: [PATCH 0645/1526] Bump firebase-bom from 28.4.1 to 28.4.2 (#1574) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ff40c7c85..ce6416069 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -221,7 +221,7 @@ dependencies { implementation 'me.xdrop:fuzzywuzzy:1.3.1' implementation 'com.fredporciuncula:flow-preferences:1.5.0' - playImplementation platform('com.google.firebase:firebase-bom:28.4.1') + playImplementation platform('com.google.firebase:firebase-bom:28.4.2') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From d6918077bff00d91f51d7cdd5c6a5bd201a1a5e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw=20Jelnicki?= Date: Wed, 13 Oct 2021 21:47:03 +0200 Subject: [PATCH 0646/1526] Set upcoming lesson notification visibility to public (#1581) --- .../wulkanowy/services/alarm/TimetableNotificationReceiver.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt index 5e4bad8cf..9ce96ef3f 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt @@ -124,6 +124,7 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { .setAutoCancel(false) .setWhen(countDown) .setOngoing(isPersistent) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .apply { if (Build.VERSION.SDK_INT >= N) setUsesChronometer(true) } From e3122127c0912fe0854c21a8fc140becec01982b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 13 Oct 2021 23:58:24 +0200 Subject: [PATCH 0647/1526] Add admin messages (#1553) --- app/build.gradle | 10 +- .../42.json | 2396 +++++++++++++++++ .../{RepositoryModule.kt => DataModule.kt} | 88 +- .../wulkanowy/data/api/AdminMessageService.kt | 12 + .../github/wulkanowy/data/db/AppDatabase.kt | 15 +- .../wulkanowy/data/db/dao/AdminMessageDao.kt | 25 + .../data/db/entities/AdminMessage.kt | 37 + .../data/db/migrations/Migration42.kt | 24 + .../repositories/AdminMessageRepository.kt | 53 + .../data/repositories/AppCreatorRepository.kt | 7 +- .../repositories/PreferencesRepository.kt | 2 + .../github/wulkanowy/ui/base/ErrorHandler.kt | 7 +- .../ui/modules/dashboard/DashboardAdapter.kt | 40 + .../ui/modules/dashboard/DashboardFragment.kt | 13 + .../ui/modules/dashboard/DashboardItem.kt | 13 + .../dashboard/DashboardItemMoveCallback.kt | 7 +- .../modules/dashboard/DashboardPresenter.kt | 59 +- .../ui/modules/dashboard/DashboardView.kt | 2 + .../ui/modules/login/LoginErrorHandler.kt | 7 +- .../login/recover/RecoverErrorHandler.kt | 9 +- .../completed/CompletedLessonsErrorHandler.kt | 6 +- .../java/io/github/wulkanowy/utils/AppInfo.kt | 28 +- .../res/drawable/ic_dashboard_warning.xml | 10 + .../layout/item_dashboard_admin_message.xml | 60 + app/src/main/res/values-night/styles.xml | 1 + app/src/main/res/values/api_hosts.xml | 2 +- app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/colors.xml | 3 + app/src/main/res/values/styles.xml | 1 + 29 files changed, 2868 insertions(+), 70 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/42.json rename app/src/main/java/io/github/wulkanowy/data/{RepositoryModule.kt => DataModule.kt} (72%) create mode 100644 app/src/main/java/io/github/wulkanowy/data/api/AdminMessageService.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration42.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt create mode 100644 app/src/main/res/drawable/ic_dashboard_warning.xml create mode 100644 app/src/main/res/layout/item_dashboard_admin_message.xml diff --git a/app/build.gradle b/app/build.gradle index ce6416069..227423e4d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,12 +66,14 @@ android { shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release + buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\"" } debug { resValue "string", "app_name", "Wulkanowy DEV " + defaultConfig.versionCode applicationIdSuffix ".dev" versionNameSuffix "-dev" ext.enableCrashlytics = project.hasProperty("enableFirebase") + buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\"" } } @@ -170,7 +172,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:1.3.0" + implementation "io.github.wulkanowy:sdk:4efd64264b" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' @@ -212,6 +214,10 @@ dependencies { implementation 'com.github.ncapdevi:FragNav:3.3.0' implementation "com.github.YarikSOffice:lingver:1.3.0" + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0" + implementation "com.squareup.okhttp3:logging-interceptor:4.9.2" + implementation "com.jakewharton.timber:timber:5.0.1" implementation "at.favre.lib:slf4j-timber:1.0.1" implementation 'com.github.bastienpaulfr:Treessence:1.0.5' @@ -234,7 +240,7 @@ dependencies { releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" debugImplementation "com.github.ChuckerTeam.Chucker:library:$chucker" - debugImplementation 'com.github.amitshekhariitbhu.Android-Debug-Database:debug-db:v1.0.6' + debugImplementation 'com.github.amitshekhariitbhu.Android-Debug-Database:debug-db:1.0.6' testImplementation "junit:junit:4.13.2" testImplementation "io.mockk:mockk:$mockk" diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/42.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/42.json new file mode 100644 index 000000000..a5faa57b7 --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/42.json @@ -0,0 +1,2396 @@ +{ + "formatVersion": 1, + "database": { + "version": 42, + "identityHash": "5c8b7f9409294ecdebf9f74a44f8e883", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "semester_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `recipient_name` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `removed` INTEGER NOT NULL, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `unread_by` INTEGER NOT NULL, `read_by` INTEGER NOT NULL, `content` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "recipient", + "columnName": "recipient_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "removed", + "columnName": "removed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `one_drive_id` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`real_id`))", + "fields": [ + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "oneDriveId", + "columnName": "one_drive_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "real_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ReportingUnits", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `short` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `roles` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "senderName", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roles", + "columnName": "roles", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` TEXT NOT NULL, `name` TEXT NOT NULL, `real_name` TEXT NOT NULL, `login_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `role` INTEGER NOT NULL, `hash` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "realName", + "columnName": "real_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginId", + "columnName": "login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "role", + "columnName": "role", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hash", + "columnName": "hash", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5c8b7f9409294ecdebf9f74a44f8e883')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt similarity index 72% rename from app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt rename to app/src/main/java/io/github/wulkanowy/data/DataModule.kt index 863bb5950..cac3ffc23 100644 --- a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt @@ -2,62 +2,100 @@ package io.github.wulkanowy.data import android.content.Context import android.content.SharedPreferences -import android.content.res.AssetManager -import android.content.res.Resources import androidx.preference.PreferenceManager import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.chuckerteam.chucker.api.RetentionManager import com.fredporciuncula.flow.preferences.FlowSharedPreferences +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import io.github.wulkanowy.data.api.AdminMessageService import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AppInfo import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.create import timber.log.Timber +import java.util.concurrent.TimeUnit import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -internal class RepositoryModule { +internal class DataModule { @Singleton @Provides - fun provideSdk(chuckerCollector: ChuckerCollector, @ApplicationContext context: Context): Sdk { - return Sdk().apply { + fun provideSdk(chuckerInterceptor: ChuckerInterceptor) = + Sdk().apply { androidVersion = android.os.Build.VERSION.RELEASE buildTag = android.os.Build.MODEL setSimpleHttpLogger { Timber.d(it) } // for debug only - addInterceptor( - ChuckerInterceptor.Builder(context) - .collector(chuckerCollector) - .alwaysReadResponseBody(true) - .build(), network = true - ) + addInterceptor(chuckerInterceptor, network = true) } - } @Singleton @Provides fun provideChuckerCollector( @ApplicationContext context: Context, prefRepository: PreferencesRepository - ): ChuckerCollector { - return ChuckerCollector( - context = context, - showNotification = prefRepository.isDebugNotificationEnable, - retentionPeriod = RetentionManager.Period.ONE_HOUR - ) - } + ) = ChuckerCollector( + context = context, + showNotification = prefRepository.isDebugNotificationEnable, + retentionPeriod = RetentionManager.Period.ONE_HOUR + ) + + @Singleton + @Provides + fun provideChuckerInterceptor( + @ApplicationContext context: Context, + chuckerCollector: ChuckerCollector + ) = ChuckerInterceptor.Builder(context) + .collector(chuckerCollector) + .alwaysReadResponseBody(true) + .build() + + @Singleton + @Provides + fun provideOkHttpClient(chuckerInterceptor: ChuckerInterceptor): OkHttpClient = + OkHttpClient.Builder() + .addNetworkInterceptor(chuckerInterceptor) + .addInterceptor(HttpLoggingInterceptor().apply { + level = HttpLoggingInterceptor.Level.BASIC + }) + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) + .build() + + @OptIn(ExperimentalSerializationApi::class) + @Singleton + @Provides + fun provideRetrofit( + okHttpClient: OkHttpClient, + json: Json, + appInfo: AppInfo + ): Retrofit = Retrofit.Builder() + .baseUrl(appInfo.messagesBaseUrl) + .client(okHttpClient) + .addConverterFactory(json.asConverterFactory("application/json".toMediaType())) + .build() + + @Singleton + @Provides + fun provideAdminMessageService(retrofit: Retrofit): AdminMessageService = retrofit.create() @Singleton @Provides @@ -67,14 +105,6 @@ internal class RepositoryModule { appInfo: AppInfo ) = AppDatabase.newInstance(context, sharedPrefProvider, appInfo) - @Singleton - @Provides - fun provideResources(@ApplicationContext context: Context): Resources = context.resources - - @Singleton - @Provides - fun provideAssets(@ApplicationContext context: Context): AssetManager = context.assets - @Singleton @Provides fun provideSharedPref(@ApplicationContext context: Context): SharedPreferences = @@ -208,4 +238,8 @@ internal class RepositoryModule { @Singleton @Provides fun provideNotificationDao(database: AppDatabase) = database.notificationDao + + @Singleton + @Provides + fun provideAdminMessageDao(database: AppDatabase) = database.adminMessagesDao } diff --git a/app/src/main/java/io/github/wulkanowy/data/api/AdminMessageService.kt b/app/src/main/java/io/github/wulkanowy/data/api/AdminMessageService.kt new file mode 100644 index 000000000..23f5af24a --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/api/AdminMessageService.kt @@ -0,0 +1,12 @@ +package io.github.wulkanowy.data.api + +import io.github.wulkanowy.data.db.entities.AdminMessage +import retrofit2.http.GET +import javax.inject.Singleton + +@Singleton +interface AdminMessageService { + + @GET("/v1.json") + suspend fun getAdminMessages(): List +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index b93d00881..b8831acd8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -6,6 +6,7 @@ import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.RoomDatabase.JournalMode.TRUNCATE import androidx.room.TypeConverters +import io.github.wulkanowy.data.db.dao.AdminMessageDao import io.github.wulkanowy.data.db.dao.AttendanceDao import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao import io.github.wulkanowy.data.db.dao.CompletedLessonsDao @@ -35,6 +36,7 @@ import io.github.wulkanowy.data.db.dao.TeacherDao import io.github.wulkanowy.data.db.dao.TimetableAdditionalDao import io.github.wulkanowy.data.db.dao.TimetableDao import io.github.wulkanowy.data.db.dao.TimetableHeaderDao +import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.data.db.entities.CompletedLesson @@ -97,8 +99,9 @@ import io.github.wulkanowy.data.db.migrations.Migration37 import io.github.wulkanowy.data.db.migrations.Migration38 import io.github.wulkanowy.data.db.migrations.Migration39 import io.github.wulkanowy.data.db.migrations.Migration4 -import io.github.wulkanowy.data.db.migrations.Migration41 import io.github.wulkanowy.data.db.migrations.Migration40 +import io.github.wulkanowy.data.db.migrations.Migration41 +import io.github.wulkanowy.data.db.migrations.Migration42 import io.github.wulkanowy.data.db.migrations.Migration5 import io.github.wulkanowy.data.db.migrations.Migration6 import io.github.wulkanowy.data.db.migrations.Migration7 @@ -138,7 +141,8 @@ import javax.inject.Singleton StudentInfo::class, TimetableHeader::class, SchoolAnnouncement::class, - Notification::class + Notification::class, + AdminMessage::class ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -147,7 +151,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 41 + const val VERSION_SCHEMA = 42 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), @@ -189,7 +193,8 @@ abstract class AppDatabase : RoomDatabase() { Migration38(), Migration39(), Migration40(), - Migration41() + Migration41(), + Migration42() ) fun newInstance( @@ -261,4 +266,6 @@ abstract class AppDatabase : RoomDatabase() { abstract val schoolAnnouncementDao: SchoolAnnouncementDao abstract val notificationDao: NotificationDao + + abstract val adminMessagesDao: AdminMessageDao } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt new file mode 100644 index 000000000..87f4812da --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt @@ -0,0 +1,25 @@ +package io.github.wulkanowy.data.db.dao + +import androidx.room.Dao +import androidx.room.Query +import androidx.room.Transaction +import io.github.wulkanowy.data.db.entities.AdminMessage +import kotlinx.coroutines.flow.Flow +import javax.inject.Singleton + +@Singleton +@Dao +abstract class AdminMessageDao : BaseDao { + + @Query("SELECT * FROM AdminMessages") + abstract fun loadAll(): Flow> + + @Transaction + open suspend fun removeOldAndSaveNew( + oldMessages: List, + newMessages: List + ) { + deleteAll(oldMessages) + insertAll(newMessages) + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt new file mode 100644 index 000000000..b7b0cf58a --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt @@ -0,0 +1,37 @@ +package io.github.wulkanowy.data.db.entities + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import kotlinx.serialization.Serializable + +@Serializable +@Entity(tableName = "AdminMessages") +data class AdminMessage( + + @PrimaryKey + val id: Int, + + val title: String, + + val content: String, + + @ColumnInfo(name = "version_name") + val versionMin: Int? = null, + + @ColumnInfo(name = "version_max") + val versionMax: Int? = null, + + @ColumnInfo(name = "target_register_host") + val targetRegisterHost: String? = null, + + @ColumnInfo(name = "target_flavor") + val targetFlavor: String? = null, + + @ColumnInfo(name = "destination_url") + val destinationUrl: String? = null, + + val priority: String, + + val type: String +) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration42.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration42.kt new file mode 100644 index 000000000..3d66f301b --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration42.kt @@ -0,0 +1,24 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +class Migration42 : Migration(41, 42) { + + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL( + """CREATE TABLE IF NOT EXISTS `AdminMessages` ( + `id` INTEGER NOT NULL, + `title` TEXT NOT NULL, + `content` TEXT NOT NULL, + `version_name` INTEGER, + `version_max` INTEGER, + `target_register_host` TEXT, + `target_flavor` TEXT, + `destination_url` TEXT, + `priority` TEXT NOT NULL, + `type` TEXT NOT NULL, + PRIMARY KEY(`id`))""" + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt new file mode 100644 index 000000000..a620caade --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt @@ -0,0 +1,53 @@ +package io.github.wulkanowy.data.repositories + +import io.github.wulkanowy.data.api.AdminMessageService +import io.github.wulkanowy.data.db.dao.AdminMessageDao +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.AutoRefreshHelper +import io.github.wulkanowy.utils.getRefreshKey +import io.github.wulkanowy.utils.networkBoundResource +import kotlinx.coroutines.sync.Mutex +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class AdminMessageRepository @Inject constructor( + private val adminMessageService: AdminMessageService, + private val adminMessageDao: AdminMessageDao, + private val appInfo: AppInfo, + private val refreshHelper: AutoRefreshHelper, +) { + private val saveFetchResultMutex = Mutex() + + private val cacheKey = "admin_messages" + + suspend fun getAdminMessages(student: Student, forceRefresh: Boolean) = networkBoundResource( + mutex = saveFetchResultMutex, + query = { adminMessageDao.loadAll() }, + fetch = { adminMessageService.getAdminMessages() }, + shouldFetch = { + refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, student)) || forceRefresh + }, + saveFetchResult = { oldItems, newItems -> + adminMessageDao.removeOldAndSaveNew(oldItems, newItems) + refreshHelper.updateLastRefreshTimestamp(cacheKey) + }, + showSavedOnLoading = false, + mapResult = { adminMessages -> + adminMessages.filter { adminMessage -> + val isCorrectRegister = adminMessage.targetRegisterHost?.let { + student.scrapperBaseUrl.contains(it, true) + } ?: true + val isCorrectFlavor = + adminMessage.targetFlavor?.equals(appInfo.buildFlavor, true) ?: true + val isCorrectMaxVersion = + adminMessage.versionMax?.let { it >= appInfo.versionCode } ?: true + val isCorrectMinVersion = + adminMessage.versionMin?.let { it <= appInfo.versionCode } ?: true + + isCorrectRegister && isCorrectFlavor && isCorrectMaxVersion && isCorrectMinVersion + }.maxByOrNull { it.id } + } + ) +} diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt index f1fdbfed3..3d83f7181 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.repositories -import android.content.res.AssetManager +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.pojos.Contributor import io.github.wulkanowy.utils.DispatchersProvider import kotlinx.coroutines.withContext @@ -12,7 +13,7 @@ import javax.inject.Singleton @Singleton class AppCreatorRepository @Inject constructor( - private val assets: AssetManager, + @ApplicationContext private val context: Context, private val dispatchers: DispatchersProvider, private val json: Json, ) { @@ -20,7 +21,7 @@ class AppCreatorRepository @Inject constructor( @OptIn(ExperimentalSerializationApi::class) @Suppress("BlockingMethodInNonBlockingContext") suspend fun getAppCreators() = withContext(dispatchers.backgroundThread) { - val inputStream = assets.open("contributors.json").buffered() + val inputStream = context.assets.open("contributors.json").buffered() json.decodeFromStream>(inputStream) } } 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 65edd53f0..b0991bbcb 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 @@ -209,6 +209,7 @@ class PreferencesRepository @Inject constructor( .map { set -> set.map { DashboardItem.Tile.valueOf(it) } .plus(DashboardItem.Tile.ACCOUNT) + .plus(DashboardItem.Tile.ADMIN_MESSAGE) .toSet() } @@ -216,6 +217,7 @@ class PreferencesRepository @Inject constructor( get() = selectedDashboardTilesPreference.get() .map { DashboardItem.Tile.valueOf(it) } .plus(DashboardItem.Tile.ACCOUNT) + .plus(DashboardItem.Tile.ADMIN_MESSAGE) .toSet() set(value) { val filteredValue = value.filterNot { it == DashboardItem.Tile.ACCOUNT } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index 7c32ef184..fbc994e2c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.base -import android.content.res.Resources +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.exceptions.NoCurrentStudentException import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.sdk.scrapper.login.PasswordChangeRequiredException @@ -9,7 +10,7 @@ import io.github.wulkanowy.utils.security.ScramblerException import timber.log.Timber import javax.inject.Inject -open class ErrorHandler @Inject constructor(protected val resources: Resources) { +open class ErrorHandler @Inject constructor(@ApplicationContext protected val context: Context) { var showErrorMessage: (String, Throwable) -> Unit = { _, _ -> } @@ -25,7 +26,7 @@ open class ErrorHandler @Inject constructor(protected val resources: Resources) } protected open fun proceed(error: Throwable) { - showErrorMessage(resources.getString(error), error) + showErrorMessage(context.resources.getString(error), error) when (error) { is PasswordChangeRequiredException -> onPasswordChangeRequired(error.redirectUrl) is ScramblerException, is BadCredentialsException -> onSessionExpired() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt index 7bd6ed0ca..405bfbc5a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt @@ -1,6 +1,8 @@ package io.github.wulkanowy.ui.modules.dashboard import android.annotation.SuppressLint +import android.content.res.ColorStateList +import android.graphics.Color import android.graphics.Typeface import android.os.Handler import android.os.Looper @@ -18,6 +20,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.data.db.entities.TimetableHeader import io.github.wulkanowy.databinding.ItemDashboardAccountBinding +import io.github.wulkanowy.databinding.ItemDashboardAdminMessageBinding import io.github.wulkanowy.databinding.ItemDashboardAnnouncementsBinding import io.github.wulkanowy.databinding.ItemDashboardConferencesBinding import io.github.wulkanowy.databinding.ItemDashboardExamsBinding @@ -63,6 +66,8 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter Unit = {} + var onAdminMessageClickListener: (String?) -> Unit = {} + val items = mutableListOf() fun submitList(newItems: List) { @@ -109,6 +114,9 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter ConferencesViewHolder( ItemDashboardConferencesBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.ADMIN_MESSAGE.ordinal -> AdminMessageViewHolder( + ItemDashboardAdminMessageBinding.inflate(inflater, parent, false) + ) else -> throw IllegalArgumentException() } } @@ -123,6 +131,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter bindAnnouncementsViewHolder(holder, position) is ExamsViewHolder -> bindExamsViewHolder(holder, position) is ConferencesViewHolder -> bindConferencesViewHolder(holder, position) + is AdminMessageViewHolder -> bindAdminMessage(holder, position) } } @@ -697,6 +706,34 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { + context.getThemeAttrColor(R.attr.colorPrimary) to + context.getThemeAttrColor(R.attr.colorOnPrimary) + } + "MEDIUM" -> { + context.getThemeAttrColor(R.attr.colorMessageMedium) to Color.BLACK + } + else -> null to context.getThemeAttrColor(R.attr.colorOnSurface) + } + + with(adminMessageViewHolder.binding) { + dashboardAdminMessageItemTitle.text = item.title + dashboardAdminMessageItemTitle.setTextColor(textColor) + dashboardAdminMessageItemDescription.text = item.content + dashboardAdminMessageItemDescription.setTextColor(textColor) + dashboardAdminMessageItemIcon.setColorFilter(textColor) + + root.setCardBackgroundColor(backgroundColor?.let { ColorStateList.valueOf(it) }) + item.destinationUrl?.let { url -> + root.setOnClickListener { onAdminMessageClickListener(url) } + } + } + } + class AccountViewHolder(val binding: ItemDashboardAccountBinding) : RecyclerView.ViewHolder(binding.root) @@ -736,6 +773,9 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter, private val oldList: List diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt index 096c1b77a..775b7b557 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt @@ -10,6 +10,7 @@ import androidx.core.view.isVisible import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.FragmentDashboardBinding @@ -29,6 +30,7 @@ import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragm import io.github.wulkanowy.ui.modules.timetable.TimetableFragment import io.github.wulkanowy.utils.capitalise import io.github.wulkanowy.utils.getThemeAttrColor +import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDate import javax.inject.Inject @@ -97,6 +99,13 @@ class DashboardFragment : BaseFragment(R.layout.fragme onConferencesTileClickListener = { mainActivity.pushView(ConferenceFragment.newInstance()) } + onAdminMessageClickListener = presenter::onAdminMessageSelected + + registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { + binding.dashboardRecycler.scrollToPosition(0) + } + }) } with(binding) { @@ -188,6 +197,10 @@ class DashboardFragment : BaseFragment(R.layout.fragme (requireActivity() as MainActivity).pushView(NotificationsCenterFragment.newInstance()) } + override fun openInternetBrowser(url: String) { + requireContext().openInternetBrowser(url) + } + override fun onDestroyView() { dashboardAdapter.clearTimers() presenter.onDetachView() 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 cf99f0c9a..92665857b 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 @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.dashboard +import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.db.entities.Conference import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Grade @@ -16,6 +17,15 @@ sealed class DashboardItem(val type: Type) { abstract val isDataLoaded: Boolean + data class AdminMessages( + val adminMessage: AdminMessage? = null, + override val error: Throwable? = null, + override val isLoading: Boolean = false + ) : DashboardItem(Type.ADMIN_MESSAGE) { + + override val isDataLoaded get() = adminMessage != null + } + data class Account( val student: Student? = null, override val error: Throwable? = null, @@ -96,6 +106,7 @@ sealed class DashboardItem(val type: Type) { } enum class Type { + ADMIN_MESSAGE, ACCOUNT, HORIZONTAL_GROUP, LESSONS, @@ -108,6 +119,7 @@ sealed class DashboardItem(val type: Type) { } enum class Tile { + ADMIN_MESSAGE, ACCOUNT, LUCKY_NUMBER, MESSAGES, @@ -123,6 +135,7 @@ sealed class DashboardItem(val type: Type) { } fun DashboardItem.Tile.toDashboardItemType() = when (this) { + DashboardItem.Tile.ADMIN_MESSAGE -> DashboardItem.Type.ADMIN_MESSAGE DashboardItem.Tile.ACCOUNT -> DashboardItem.Type.ACCOUNT DashboardItem.Tile.LUCKY_NUMBER -> DashboardItem.Type.HORIZONTAL_GROUP DashboardItem.Tile.MESSAGES -> DashboardItem.Type.HORIZONTAL_GROUP diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt index cf4097a4a..b9625570f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt @@ -21,7 +21,7 @@ class DashboardItemMoveCallback( recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder ): Int { - val dragFlags = if (viewHolder.bindingAdapterPosition != 0) { + val dragFlags = if (!viewHolder.isAdminMessageOrAccountItem) { ItemTouchHelper.UP or ItemTouchHelper.DOWN } else 0 @@ -32,7 +32,7 @@ class DashboardItemMoveCallback( recyclerView: RecyclerView, current: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder - ) = target.bindingAdapterPosition != 0 + ) = !target.isAdminMessageOrAccountItem override fun onMove( recyclerView: RecyclerView, @@ -52,4 +52,7 @@ class DashboardItemMoveCallback( onUserInteractionEndListener(dashboardAdapter.items.toList()) } + + private val RecyclerView.ViewHolder.isAdminMessageOrAccountItem: Boolean + get() = this is DashboardAdapter.AdminMessageViewHolder || this is DashboardAdapter.AccountViewHolder } 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 d6d533e28..5ff7f2ce8 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 @@ -5,6 +5,7 @@ import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.enums.MessageFolder +import io.github.wulkanowy.data.repositories.AdminMessageRepository import io.github.wulkanowy.data.repositories.AttendanceSummaryRepository import io.github.wulkanowy.data.repositories.ConferenceRepository import io.github.wulkanowy.data.repositories.ExamRepository @@ -50,7 +51,8 @@ class DashboardPresenter @Inject constructor( private val examRepository: ExamRepository, private val conferenceRepository: ConferenceRepository, private val preferencesRepository: PreferencesRepository, - private val schoolAnnouncementRepository: SchoolAnnouncementRepository + private val schoolAnnouncementRepository: SchoolAnnouncementRepository, + private val adminMessageRepository: AdminMessageRepository ) : BasePresenter(errorHandler, studentRepository) { private val dashboardItemLoadedList = mutableListOf() @@ -179,6 +181,7 @@ class DashboardPresenter @Inject constructor( loadConferences(student, forceRefresh) } DashboardItem.Type.ADS -> TODO() + DashboardItem.Type.ADMIN_MESSAGE -> loadAdminMessage(student, forceRefresh) } } } @@ -225,6 +228,10 @@ class DashboardPresenter @Inject constructor( }.toSet() } + fun onAdminMessageSelected(url: String?) { + url?.let { view?.openInternetBrowser(it) } + } + private fun loadHorizontalGroup(student: Student, forceRefresh: Boolean) { flow { val semester = semesterRepository.getCurrentSemester(student) @@ -567,6 +574,38 @@ class DashboardPresenter @Inject constructor( }.launch("dashboard_conferences") } + private fun loadAdminMessage(student: Student, forceRefresh: Boolean) { + flowWithResourceIn { adminMessageRepository.getAdminMessages(student, forceRefresh) } + .onEach { + when (it.status) { + Status.LOADING -> { + Timber.i("Loading dashboard admin message data started") + if (forceRefresh) return@onEach + updateData(DashboardItem.AdminMessages(), forceRefresh) + } + Status.SUCCESS -> { + Timber.i("Loading dashboard admin message result: Success") + updateData( + dashboardItem = DashboardItem.AdminMessages(adminMessage = it.data), + forceRefresh = forceRefresh + ) + } + Status.ERROR -> { + Timber.i("Loading dashboard admin message result: An exception occurred") + errorHandler.dispatch(it.error!!) + updateData( + dashboardItem = DashboardItem.AdminMessages( + adminMessage = it.data, + error = it.error + ), + forceRefresh = forceRefresh + ) + } + } + } + .launch("dashboard_admin_messages") + } + private fun updateData(dashboardItem: DashboardItem, forceRefresh: Boolean) { val isForceRefreshError = forceRefresh && dashboardItem.error != null val isFirstRunDataLoadedError = @@ -579,6 +618,11 @@ class DashboardPresenter @Inject constructor( sortDashboardItems() + if (dashboardItem is DashboardItem.AdminMessages && !dashboardItem.isDataLoaded) { + dashboardItemsToLoad = dashboardItemsToLoad - DashboardItem.Type.ADMIN_MESSAGE + dashboardItemLoadedList.removeAll { it.type == DashboardItem.Type.ADMIN_MESSAGE } + } + if (forceRefresh) { updateForceRefreshData(dashboardItem) } else { @@ -644,7 +688,9 @@ class DashboardPresenter @Inject constructor( itemsLoadedList: List, forceRefresh: Boolean ) { - val filteredItems = itemsLoadedList.filterNot { it.type == DashboardItem.Type.ACCOUNT } + val filteredItems = itemsLoadedList.filterNot { + it.type == DashboardItem.Type.ACCOUNT || it.type == DashboardItem.Type.ADMIN_MESSAGE + } val isAccountItemError = itemsLoadedList.find { it.type == DashboardItem.Type.ACCOUNT }?.error != null val isGeneralError = @@ -676,10 +722,13 @@ class DashboardPresenter @Inject constructor( val dashboardItemsPosition = preferencesRepository.dashboardItemsPosition dashboardItemLoadedList.sortBy { tile -> - dashboardItemsPosition?.getOrDefault( - tile.type, + val defaultPosition = if (tile is DashboardItem.AdminMessages) { + -1 + } else { tile.type.ordinal + 100 - ) ?: tile.type.ordinal + } + + dashboardItemsPosition?.getOrDefault(tile.type, defaultPosition) ?: tile.type.ordinal } } } \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt index 899eb3202..730e19a35 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt @@ -25,4 +25,6 @@ interface DashboardView : BaseView { fun popViewToRoot() fun openNotificationsCenterView() + + fun openInternetBrowser(url: String) } \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt index 2f76cd51e..ea7215cea 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt @@ -1,7 +1,8 @@ package io.github.wulkanowy.ui.modules.login -import android.content.res.Resources +import android.content.Context import android.database.sqlite.SQLiteConstraintException +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.sdk.mobile.exception.InvalidPinException import io.github.wulkanowy.sdk.mobile.exception.InvalidSymbolException @@ -11,7 +12,8 @@ import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.ui.base.ErrorHandler import javax.inject.Inject -class LoginErrorHandler @Inject constructor(resources: Resources) : ErrorHandler(resources) { +class LoginErrorHandler @Inject constructor(@ApplicationContext context: Context) : + ErrorHandler(context) { var onBadCredentials: (String?) -> Unit = {} @@ -24,6 +26,7 @@ class LoginErrorHandler @Inject constructor(resources: Resources) : ErrorHandler var onStudentDuplicate: (String) -> Unit = {} override fun proceed(error: Throwable) { + val resources = context.resources when (error) { is BadCredentialsException -> onBadCredentials(error.message) is SQLiteConstraintException -> onStudentDuplicate(resources.getString(R.string.login_duplicate_student)) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/RecoverErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/RecoverErrorHandler.kt index 8619369dd..ac4c03130 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/RecoverErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/RecoverErrorHandler.kt @@ -1,13 +1,15 @@ package io.github.wulkanowy.ui.modules.login.recover -import android.content.res.Resources +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.sdk.scrapper.exception.InvalidCaptchaException import io.github.wulkanowy.sdk.scrapper.exception.InvalidEmailException import io.github.wulkanowy.sdk.scrapper.exception.NoAccountFoundException import io.github.wulkanowy.ui.base.ErrorHandler import javax.inject.Inject -class RecoverErrorHandler @Inject constructor(resources: Resources) : ErrorHandler(resources) { +class RecoverErrorHandler @Inject constructor(@ApplicationContext context: Context) : + ErrorHandler(context) { var onInvalidUsername: (String) -> Unit = {} @@ -15,7 +17,8 @@ class RecoverErrorHandler @Inject constructor(resources: Resources) : ErrorHandl override fun proceed(error: Throwable) { when (error) { - is InvalidEmailException, is NoAccountFoundException -> onInvalidUsername(error.localizedMessage.orEmpty()) + is InvalidEmailException, + is NoAccountFoundException -> onInvalidUsername(error.localizedMessage.orEmpty()) is InvalidCaptchaException -> onInvalidCaptcha(error.localizedMessage.orEmpty(), error) else -> super.proceed(error) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt index 00ba0bad8..36e38fb96 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt @@ -1,11 +1,13 @@ package io.github.wulkanowy.ui.modules.timetable.completed -import android.content.res.Resources +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import io.github.wulkanowy.ui.base.ErrorHandler import javax.inject.Inject -class CompletedLessonsErrorHandler @Inject constructor(resources: Resources) : ErrorHandler(resources) { +class CompletedLessonsErrorHandler @Inject constructor(@ApplicationContext context: Context) : + ErrorHandler(context) { var onFeatureDisabled: () -> Unit = {} diff --git a/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt b/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt index a3961aed8..962e5b208 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt @@ -1,35 +1,31 @@ package io.github.wulkanowy.utils import android.content.res.Resources -import android.os.Build.MANUFACTURER -import android.os.Build.MODEL -import android.os.Build.VERSION.SDK_INT -import io.github.wulkanowy.BuildConfig.BUILD_TIMESTAMP -import io.github.wulkanowy.BuildConfig.DEBUG -import io.github.wulkanowy.BuildConfig.FLAVOR -import io.github.wulkanowy.BuildConfig.VERSION_CODE -import io.github.wulkanowy.BuildConfig.VERSION_NAME +import android.os.Build +import io.github.wulkanowy.BuildConfig import javax.inject.Inject import javax.inject.Singleton @Singleton open class AppInfo @Inject constructor() { - open val isDebug get() = DEBUG + open val isDebug get() = BuildConfig.DEBUG - open val versionCode get() = VERSION_CODE + open val versionCode get() = BuildConfig.VERSION_CODE - open val buildTimestamp get() = BUILD_TIMESTAMP + open val buildTimestamp get() = BuildConfig.BUILD_TIMESTAMP - open val buildFlavor get() = FLAVOR + open val buildFlavor get() = BuildConfig.FLAVOR - open val versionName get() = VERSION_NAME + open val versionName get() = BuildConfig.VERSION_NAME - open val systemVersion get() = SDK_INT + open val systemVersion get() = Build.VERSION.SDK_INT - open val systemManufacturer: String get() = MANUFACTURER + open val systemManufacturer: String get() = Build.MANUFACTURER - open val systemModel: String get() = MODEL + open val systemModel: String get() = Build.MODEL + + open val messagesBaseUrl = BuildConfig.MESSAGES_BASE_URL @Suppress("DEPRECATION") open val systemLanguage: String diff --git a/app/src/main/res/drawable/ic_dashboard_warning.xml b/app/src/main/res/drawable/ic_dashboard_warning.xml new file mode 100644 index 000000000..e7a5dc5a4 --- /dev/null +++ b/app/src/main/res/drawable/ic_dashboard_warning.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/item_dashboard_admin_message.xml b/app/src/main/res/layout/item_dashboard_admin_message.xml new file mode 100644 index 000000000..265cc14e0 --- /dev/null +++ b/app/src/main/res/layout/item_dashboard_admin_message.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 5eca4680e..881d5bd4f 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -8,6 +8,7 @@ @color/colorErrorLight @color/colorDividerInverse @color/colorSwipeRefreshDark + @color/dashboard_message_medium_light ?colorSurface ?android:textColorPrimary @color/colorNavigationBarLight diff --git a/app/src/main/res/values/api_hosts.xml b/app/src/main/res/values/api_hosts.xml index dac94c3ff..158490471 100644 --- a/app/src/main/res/values/api_hosts.xml +++ b/app/src/main/res/values/api_hosts.xml @@ -40,7 +40,7 @@ https://vulcan.net.pl/?login https://vulcan.net.pl/?login https://vulcan.net.pl/?login - http://fakelog.tk/?email + http://fakelog.cf/?email Default diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 49ef39ab3..d4ed6e971 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -3,4 +3,5 @@ + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a68e2710f..f3112b101 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -12,6 +12,9 @@ #1C1C1C #0D0D0D + #FFD980 + #ffd54f + #ffd54f #ff8f00 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 628aa2974..45382e6d2 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -11,6 +11,7 @@ @color/colorError @color/colorDivider @color/colorSwipeRefresh + @color/dashboard_message_medium_dark @android:color/darker_gray ?android:textColorPrimary @style/PreferenceThemeOverlay From ac86737050fbeb95d593b8747279cc593eb025ad Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Thu, 14 Oct 2021 01:44:34 +0200 Subject: [PATCH 0648/1526] Fix NPE in SyncPresenter (#1582) --- .../java/io/github/wulkanowy/services/sync/SyncManager.kt | 2 +- .../wulkanowy/ui/modules/settings/sync/SyncPresenter.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt index 02d8b964f..32ca20afc 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt @@ -74,7 +74,7 @@ class SyncManager @Inject constructor( } } - fun startOneTimeSyncWorker(): Flow { + fun startOneTimeSyncWorker(): Flow { val work = OneTimeWorkRequestBuilder() .setInputData( Data.Builder() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt index 63e86a475..0d404a138 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt @@ -46,7 +46,7 @@ class SyncPresenter @Inject constructor( fun onSyncNowClicked() { view?.run { syncManager.startOneTimeSyncWorker().onEach { workInfo -> - when (workInfo.state) { + when (workInfo?.state) { WorkInfo.State.ENQUEUED -> { setSyncInProgress(true) Timber.i("Setting sync now started") @@ -63,9 +63,9 @@ class SyncPresenter @Inject constructor( ) analytics.logEvent("sync_now", "status" to "failed") } - else -> Timber.d("Sync now state: ${workInfo.state}") + else -> Timber.d("Sync now state: ${workInfo?.state}") } - if (workInfo.state.isFinished) { + if (workInfo?.state?.isFinished == true) { setSyncInProgress(false) setSyncDateInView() } From e7550f7a43a74b02df366501481eb679be7a9979 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Oct 2021 00:10:22 +0000 Subject: [PATCH 0649/1526] Bump gradle from 7.0.2 to 7.0.3 (#1586) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 153088a6d..ad27aba07 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - classpath 'com.android.tools.build:gradle:7.0.2' + classpath 'com.android.tools.build:gradle:7.0.3' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.10' classpath 'com.huawei.agconnect:agcp:1.6.1.200' From 4c8d9c8f7fa2fb347d467ccc08a0f864ed5b07c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 14 Oct 2021 16:25:09 +0200 Subject: [PATCH 0650/1526] Fix infinite refresh when admin messages list is empty (#1587) --- .../wulkanowy/ui/modules/dashboard/DashboardPresenter.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 5ff7f2ce8..f791fa0d0 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 @@ -620,6 +620,8 @@ class DashboardPresenter @Inject constructor( if (dashboardItem is DashboardItem.AdminMessages && !dashboardItem.isDataLoaded) { dashboardItemsToLoad = dashboardItemsToLoad - DashboardItem.Type.ADMIN_MESSAGE + dashboardTileLoadedList = dashboardTileLoadedList - DashboardItem.Tile.ADMIN_MESSAGE + dashboardItemLoadedList.removeAll { it.type == DashboardItem.Type.ADMIN_MESSAGE } } @@ -654,9 +656,12 @@ class DashboardPresenter @Inject constructor( } private fun updateForceRefreshData(dashboardItem: DashboardItem) { + val isNotLoadedAdminMessage = + dashboardItem is DashboardItem.AdminMessages && !dashboardItem.isDataLoaded + with(dashboardItemRefreshLoadedList) { removeAll { it.type == dashboardItem.type } - add(dashboardItem) + if (!isNotLoadedAdminMessage) add(dashboardItem) } val isRefreshItemLoaded = From 54e9ea6478226f40363c279dddc993406aae7220 Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Sat, 16 Oct 2021 11:17:00 +0200 Subject: [PATCH 0651/1526] Use FloatingActionButton.{show,hide} instead of using setVisibility (#1591) --- .../wulkanowy/ui/modules/attendance/AttendanceFragment.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 3fbdaec5a..092c9d0d8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -218,7 +218,13 @@ class AttendanceFragment : BaseFragment(R.layout.frag } override fun showExcuseButton(show: Boolean) { - binding.attendanceExcuseButton.visibility = if (show) VISIBLE else GONE + with(binding.attendanceExcuseButton) { + if (show) { + show() + } else { + hide() + } + } } override fun showAttendanceDialog(lesson: Attendance) { From 84e4167dbdaeb7a419693f1ba0978601b247a0bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 18 Oct 2021 00:11:46 +0200 Subject: [PATCH 0652/1526] Mi Band notification improvements (#1579) --- .../notifications/AppNotificationManager.kt | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt index 69d0092c1..ddad9bf27 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.app.PendingIntent import android.content.Context import android.os.Build +import androidx.annotation.PluralsRes import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import dagger.hilt.android.qualifiers.ApplicationContext @@ -68,7 +69,8 @@ class AppNotificationManager @Inject constructor( ) { val groupType = notificationData.type.group ?: return val group = "${groupType}_${student.id}" - val groupId = student.id * 100 + notificationData.type.ordinal + + notificationData.sendSummaryNotification(group, student) notificationData.lines.forEach { item -> val title = context.resources.getQuantityString(notificationData.titleStringRes, 1) @@ -88,16 +90,26 @@ class AppNotificationManager @Inject constructor( saveNotification(title, item, notificationData, student) } + } + private fun MultipleNotificationsData.sendSummaryNotification(group: String, student: Student) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return - val summaryNotification = getDefaultNotificationBuilder(notificationData) - .setSmallIcon(notificationData.icon) + val summaryNotification = getDefaultNotificationBuilder(this) + .setSmallIcon(icon) + .setContentTitle(getQuantityString(titleStringRes, lines.size)) + .setContentText(getQuantityString(contentStringRes, lines.size)) + .setStyle( + NotificationCompat.InboxStyle() + .setSummaryText(student.nickOrName) + .also { builder -> lines.forEach { builder.addLine(it) } } + ) + .setLocalOnly(true) .setGroup(group) - .setStyle(NotificationCompat.InboxStyle().setSummaryText(student.nickOrName)) .setGroupSummary(true) .build() + val groupId = student.id * 100 + type.ordinal notificationManager.notify(groupId.toInt(), summaryNotification) } @@ -116,6 +128,7 @@ class AppNotificationManager @Inject constructor( .setDefaults(NotificationCompat.DEFAULT_ALL) .setPriority(NotificationCompat.PRIORITY_HIGH) .setColor(context.getCompatColor(R.color.colorPrimary)) + .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY) .setContentIntent( PendingIntent.getActivity( context, @@ -142,4 +155,8 @@ class AppNotificationManager @Inject constructor( notificationRepository.saveNotification(notificationEntity) } -} \ No newline at end of file + + private fun getQuantityString(@PluralsRes res: Int, arg: Int): String { + return context.resources.getQuantityString(res, arg, arg) + } +} From 58ea2c530e55991843e47ecbb9824e46678921a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Oct 2021 06:36:46 +0000 Subject: [PATCH 0653/1526] Bump hianalytics from 6.3.0.300 to 6.3.0.301 (#1593) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 227423e4d..90b4cdb94 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -234,7 +234,7 @@ dependencies { playImplementation 'com.google.android.play:core:1.10.2' playImplementation 'com.google.android.play:core-ktx:1.8.1' - hmsImplementation 'com.huawei.hms:hianalytics:6.3.0.300' + hmsImplementation 'com.huawei.hms:hianalytics:6.3.0.301' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.1.200' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 09a134d442c26d3e2a3e242ef5765b348b8a2c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 21 Oct 2021 10:47:37 +0200 Subject: [PATCH 0654/1526] Fix last sync date to save only successful sync (#1595) --- .../data/repositories/AppCreatorRepository.kt | 2 +- .../data/repositories/LoggerRepository.kt | 23 +++++++++--------- .../data/repositories/SemesterRepository.kt | 4 ++-- .../data/repositories/StudentRepository.kt | 8 +++---- .../TimetableNotificationSchedulerHelper.kt | 4 ++-- .../wulkanowy/services/sync/SyncWorker.kt | 24 +++++++++++-------- .../modules/about/license/LicensePresenter.kt | 2 +- .../wulkanowy/utils/DispatchersProvider.kt | 4 +--- .../wulkanowy/TestDispatchersProvider.kt | 4 +--- 9 files changed, 37 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt index 3d83f7181..cbaa12bd3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt @@ -20,7 +20,7 @@ class AppCreatorRepository @Inject constructor( @OptIn(ExperimentalSerializationApi::class) @Suppress("BlockingMethodInNonBlockingContext") - suspend fun getAppCreators() = withContext(dispatchers.backgroundThread) { + suspend fun getAppCreators() = withContext(dispatchers.io) { val inputStream = context.assets.open("contributors.json").buffered() json.decodeFromStream>(inputStream) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/LoggerRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/LoggerRepository.kt index 6d509b026..1a8cd6ea3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/LoggerRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/LoggerRepository.kt @@ -15,24 +15,23 @@ class LoggerRepository @Inject constructor( suspend fun getLastLogLines() = getLastModified().readText().split("\n") - suspend fun getLogFiles() = withContext(dispatchers.backgroundThread) { - File(context.filesDir.absolutePath).listFiles(File::isFile)?.filter { - it.name.endsWith(".log") - }!! + suspend fun getLogFiles() = withContext(dispatchers.io) { + File(context.filesDir.absolutePath).listFiles(File::isFile) + ?.filter { it.name.endsWith(".log") }!! } - private suspend fun getLastModified(): File { - return withContext(dispatchers.backgroundThread) { - var lastModifiedTime = Long.MIN_VALUE - var chosenFile: File? = null - File(context.filesDir.absolutePath).listFiles(File::isFile)?.forEach { file -> + private suspend fun getLastModified() = withContext(dispatchers.io) { + var lastModifiedTime = Long.MIN_VALUE + var chosenFile: File? = null + + File(context.filesDir.absolutePath).listFiles(File::isFile) + ?.forEach { file -> if (file.lastModified() > lastModifiedTime) { lastModifiedTime = file.lastModified() chosenFile = file } } - if (chosenFile == null) throw FileNotFoundException("Log file not found") - chosenFile!! - } + + chosenFile ?: throw FileNotFoundException("Log file not found") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt index 4336877a5..cc954558f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt @@ -26,7 +26,7 @@ class SemesterRepository @Inject constructor( student: Student, forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false - ) = withContext(dispatchers.backgroundThread) { + ) = withContext(dispatchers.io) { val semesters = semesterDb.loadAll(student.studentId, student.classId) if (isShouldFetch(student, semesters, forceRefresh, refreshOnNoCurrent)) { @@ -64,7 +64,7 @@ class SemesterRepository @Inject constructor( } suspend fun getCurrentSemester(student: Student, forceRefresh: Boolean = false) = - withContext(dispatchers.backgroundThread) { + withContext(dispatchers.io) { getSemesters(student, forceRefresh).getCurrentOrLast() } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index 2ac892d01..9e4a1aabc 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -66,7 +66,7 @@ class StudentRepository @Inject constructor( .map { it.apply { if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { - student.password = withContext(dispatchers.backgroundThread) { + student.password = withContext(dispatchers.io) { decrypt(student.password) } } @@ -77,7 +77,7 @@ class StudentRepository @Inject constructor( val student = studentDb.loadById(id) ?: throw NoCurrentStudentException() if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { - student.password = withContext(dispatchers.backgroundThread) { + student.password = withContext(dispatchers.io) { decrypt(student.password) } } @@ -88,7 +88,7 @@ class StudentRepository @Inject constructor( val student = studentDb.loadCurrent() ?: throw NoCurrentStudentException() if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { - student.password = withContext(dispatchers.backgroundThread) { + student.password = withContext(dispatchers.io) { decrypt(student.password) } } @@ -101,7 +101,7 @@ class StudentRepository @Inject constructor( .map { it.apply { if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.API) { - password = withContext(dispatchers.backgroundThread) { + password = withContext(dispatchers.io) { encrypt(password, context) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt index a42a0ab4b..2ec4e527b 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt @@ -54,7 +54,7 @@ class TimetableNotificationSchedulerHelper @Inject constructor( suspend fun cancelScheduled(lessons: List, student: Student) { val studentId = student.studentId - withContext(dispatchersProvider.backgroundThread) { + withContext(dispatchersProvider.io) { lessons.sortedBy { it.start }.forEachIndexed { index, lesson -> val upcomingTime = getUpcomingLessonTime(index, lessons, lesson) cancelScheduledTo( @@ -91,7 +91,7 @@ class TimetableNotificationSchedulerHelper @Inject constructor( return } - withContext(dispatchersProvider.backgroundThread) { + withContext(dispatchersProvider.io) { lessons.groupBy { it.date } .map { it.value.sortedBy { lesson -> lesson.start } } .map { it.filter { lesson -> lesson.isStudentPlan } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt index ea1f79cbf..52979e635 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt @@ -19,11 +19,11 @@ import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import io.github.wulkanowy.services.sync.channels.DebugChannel import io.github.wulkanowy.services.sync.works.Work +import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.getCompatColor -import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.withContext import timber.log.Timber import java.time.LocalDateTime -import java.time.ZoneId import kotlin.random.Random @HiltWorker @@ -34,13 +34,14 @@ class SyncWorker @AssistedInject constructor( private val semesterRepository: SemesterRepository, private val works: Set<@JvmSuppressWildcards Work>, private val preferencesRepository: PreferencesRepository, - private val notificationManager: NotificationManagerCompat + private val notificationManager: NotificationManagerCompat, + private val dispatchersProvider: DispatchersProvider ) : CoroutineWorker(appContext, workerParameters) { - override suspend fun doWork() = coroutineScope { + override suspend fun doWork() = withContext(dispatchersProvider.io) { Timber.i("SyncWorker is starting") - if (!studentRepository.isCurrentStudentSet()) return@coroutineScope Result.failure() + if (!studentRepository.isCurrentStudentSet()) return@withContext Result.failure() val student = studentRepository.getCurrentStudent() val semester = semesterRepository.getCurrentSemester(student, true) @@ -50,12 +51,12 @@ class SyncWorker @AssistedInject constructor( Timber.i("${work::class.java.simpleName} is starting") work.doWork(student, semester) Timber.i("${work::class.java.simpleName} result: Success") - preferencesRepository.lasSyncDate = LocalDateTime.now(ZoneId.systemDefault()) null } catch (e: Throwable) { Timber.w("${work::class.java.simpleName} result: An exception ${e.message} occurred") - if (e is FeatureDisabledException || e is FeatureNotAvailableException) null - else { + if (e is FeatureDisabledException || e is FeatureNotAvailableException) { + null + } else { Timber.e(e) e } @@ -70,13 +71,16 @@ class SyncWorker @AssistedInject constructor( ) } exceptions.isNotEmpty() -> Result.retry() - else -> Result.success() + else -> { + preferencesRepository.lasSyncDate = LocalDateTime.now() + Result.success() + } } if (preferencesRepository.isDebugNotificationEnable) notify(result) Timber.i("SyncWorker result: $result") - result + return@withContext result } private fun notify(result: Result) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt index cc430fc2c..5368cc19d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/license/LicensePresenter.kt @@ -31,7 +31,7 @@ class LicensePresenter @Inject constructor( private fun loadData() { flowWithResource { - withContext(dispatchers.backgroundThread) { + withContext(dispatchers.io) { view?.appLibraries.orEmpty() } }.onEach { diff --git a/app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt b/app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt index ecc8e05eb..8aaa57f4f 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt @@ -1,10 +1,8 @@ package io.github.wulkanowy.utils -import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers open class DispatchersProvider { - open val backgroundThread: CoroutineDispatcher - get() = Dispatchers.IO + open val io get() = Dispatchers.IO } diff --git a/app/src/test/java/io/github/wulkanowy/TestDispatchersProvider.kt b/app/src/test/java/io/github/wulkanowy/TestDispatchersProvider.kt index e60b1d7a2..d4cba7b5e 100644 --- a/app/src/test/java/io/github/wulkanowy/TestDispatchersProvider.kt +++ b/app/src/test/java/io/github/wulkanowy/TestDispatchersProvider.kt @@ -1,11 +1,9 @@ package io.github.wulkanowy import io.github.wulkanowy.utils.DispatchersProvider -import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers class TestDispatchersProvider : DispatchersProvider() { - override val backgroundThread: CoroutineDispatcher - get() = Dispatchers.Unconfined + override val io get() = Dispatchers.Unconfined } From 94fd303f8ea6edcdd0f8e528cf623615c8aa3619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 21 Oct 2021 10:51:00 +0200 Subject: [PATCH 0655/1526] Add single support advert (#1484) --- app/build.gradle | 20 ++-- app/src/main/AndroidManifest.xml | 13 ++- .../ui/modules/about/AboutPresenter.kt | 26 ++--- .../ui/modules/dashboard/DashboardAdapter.kt | 3 +- .../settings/advanced/AdvancedFragment.kt | 4 - .../settings/appearance/AppearanceFragment.kt | 4 - .../notifications/NotificationsFragment.kt | 4 - .../ui/modules/settings/sync/SyncFragment.kt | 4 - app/src/main/res/drawable/ic_settings_ads.xml | 22 +++++ app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 10 ++ app/src/main/res/xml/scheme_preferences.xml | 30 +++--- .../ui/modules/settings/ads/AdsFragment.kt | 94 +++++++++++++++++++ .../ui/modules/settings/ads/AdsPresenter.kt | 41 ++++++++ .../ui/modules/settings/ads/AdsView.kt | 17 ++++ .../io/github/wulkanowy/utils/AdsHelper.kt | 39 ++++++++ app/src/play/res/xml/scheme_preferences.xml | 39 ++++++++ .../play/res/xml/scheme_preferences_ads.xml | 12 +++ 18 files changed, 324 insertions(+), 59 deletions(-) create mode 100644 app/src/main/res/drawable/ic_settings_ads.xml create mode 100644 app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt create mode 100644 app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsPresenter.kt create mode 100644 app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsView.kt create mode 100644 app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt create mode 100644 app/src/play/res/xml/scheme_preferences.xml create mode 100644 app/src/play/res/xml/scheme_preferences_ads.xml diff --git a/app/build.gradle b/app/build.gradle index 90b4cdb94..421774062 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,7 +29,10 @@ android { resValue "string", "app_name", "Wulkanowy" - manifestPlaceholders = [firebase_enabled: project.hasProperty("enableFirebase")] + manifestPlaceholders = [ + firebase_enabled: project.hasProperty("enableFirebase"), + admob_project_id: "" + ] javaCompileOptions { annotationProcessorOptions { arguments += [ @@ -39,6 +42,8 @@ android { } } + buildConfigField "String", "SINGLE_SUPPORT_AD_ID", "null" + if (System.env.SET_BUILD_TIMESTAMP) { buildConfigField "long", "BUILD_TIMESTAMP", String.valueOf(System.currentTimeMillis()) } else { @@ -82,23 +87,21 @@ android { productFlavors { hms { dimension "platform" - manifestPlaceholders = [ - install_channel: "AppGallery" - ] + manifestPlaceholders = [install_channel: "AppGallery"] } play { dimension "platform" manifestPlaceholders = [ - install_channel: "Google Play" + install_channel : "Google Play", + admob_project_id: System.getenv("ADMOB_PROJECT_ID") ?: "ca-app-pub-3940256099942544~3347511713" ] + buildConfigField "String", "SINGLE_SUPPORT_AD_ID", "\"${System.getenv("SINGLE_SUPPORT_AD_ID") ?: "ca-app-pub-3940256099942544/5354046379"}\"" } fdroid { dimension "platform" - manifestPlaceholders = [ - install_channel: "F-Droid" - ] + manifestPlaceholders = [install_channel: "F-Droid"] } } @@ -233,6 +236,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.android.play:core:1.10.2' playImplementation 'com.google.android.play:core-ktx:1.8.1' + playImplementation 'com.google.android.gms:play-services-ads:20.4.0' hmsImplementation 'com.huawei.hms:hianalytics:6.3.0.301' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.1.200' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8c7eb8527..810d469f4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -165,33 +165,32 @@ - - - - - - - + + diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt index 6bcf5f77b..552749349 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt @@ -82,18 +82,20 @@ class AboutPresenter @Inject constructor( private fun loadData() { view?.run { - updateData(listOfNotNull( - versionRes, - creatorsRes, - feedbackRes, - faqRes, - discordRes, - facebookRes, - twitterRes, - homepageRes, - licensesRes, - privacyRes - )) + updateData( + listOfNotNull( + versionRes, + creatorsRes, + feedbackRes, + faqRes, + discordRes, + facebookRes, + twitterRes, + homepageRes, + licensesRes, + privacyRes + ) + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt index 405bfbc5a..440bbd5d4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardAdapter.kt @@ -299,7 +299,8 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter + + + + + + diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index c512a5f21..1aba7d856 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -34,4 +34,5 @@ message_send_recipients last_sync_date notifications_piggyback + single_ad_support diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 48c7712dc..13030366a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -658,10 +658,19 @@ Reply with message history Show arithmetic average when no weights provided + Support + Watch single ad to support project + Consent to data processing + To view an advertisement you must agree to the data processing terms of our Privacy Policy + Agree + Privacy policy + Ad is loading + Advanced Appearance & Behavior Notifications Synchronization + Advertisements Grades Dashboard @@ -681,6 +690,7 @@ Plus and minus values, average calculation Advanced App version, contributors, social portals, licenses + Displaying advertisements, project support diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index 086214923..5bf7ad8aa 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -1,33 +1,33 @@ + app:title="@string/pref_appearance_category" /> + app:title="@string/pref_notifications_category" /> + app:title="@string/pref_sync_category" /> + app:title="@string/pref_advanced_category" /> + app:title="@string/about_title" /> diff --git a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt new file mode 100644 index 000000000..960a54b8c --- /dev/null +++ b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt @@ -0,0 +1,94 @@ +package io.github.wulkanowy.ui.modules.settings.ads + +import android.os.Bundle +import android.view.View +import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat +import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R +import io.github.wulkanowy.ui.base.BaseActivity +import io.github.wulkanowy.ui.base.ErrorDialog +import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.utils.openInternetBrowser +import javax.inject.Inject + +@AndroidEntryPoint +class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView { + + @Inject + lateinit var presenter: AdsPresenter + + override val titleStringId = R.string.pref_settings_ads_title + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.scheme_preferences_ads, rootKey) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + presenter.onAttachView(this) + } + + override fun initView() { + findPreference(getString(R.string.pref_key_ads_single_support))?.setOnPreferenceClickListener { + presenter.onWatchSingleAdSelected() + true + } + } + + override fun showAd(ad: RewardedInterstitialAd) { + if (isVisible) { + ad.show(requireActivity()) {} + } + } + + override fun showPrivacyPolicyDialog() { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(getString(R.string.pref_ads_privacy_title)) + .setMessage(getString(R.string.pref_ads_privacy_description)) + .setPositiveButton(getString(R.string.pref_ads_privacy_agree)) { _, _ -> presenter.onAgreedPrivacy() } + .setNegativeButton(android.R.string.cancel) { _, _ -> } + .setNeutralButton(getString(R.string.pref_ads_privacy_link)) { _, _ -> presenter.onPrivacySelected() } + .show() + } + + override fun openPrivacyPolicy() { + requireContext().openInternetBrowser( + "https://wulkanowy.github.io/polityka-prywatnosci.html", + ::showMessage + ) + } + + override fun showLoadingSupportAd(show: Boolean) { + findPreference(getString(R.string.pref_key_ads_single_support))?.run { + isEnabled = !show + summary = if (show) getString(R.string.pref_ads_loading) else null + } + } + + override fun showError(text: String, error: Throwable) { + (activity as? BaseActivity<*, *>)?.showError(text, error) + } + + override fun showMessage(text: String) { + (activity as? BaseActivity<*, *>)?.showMessage(text) + } + + override fun showExpiredDialog() { + (activity as? BaseActivity<*, *>)?.showExpiredDialog() + } + + override fun showChangePasswordSnackbar(redirectUrl: String) { + (activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl) + } + + override fun openClearLoginView() { + (activity as? BaseActivity<*, *>)?.openClearLoginView() + } + + override fun showErrorDetailsDialog(error: Throwable) { + ErrorDialog.newInstance(error).show(childFragmentManager, error.toString()) + } +} \ No newline at end of file diff --git a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsPresenter.kt b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsPresenter.kt new file mode 100644 index 000000000..fd5cc9b6f --- /dev/null +++ b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsPresenter.kt @@ -0,0 +1,41 @@ +package io.github.wulkanowy.ui.modules.settings.ads + +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.utils.AdsHelper +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +class AdsPresenter @Inject constructor( + errorHandler: ErrorHandler, + studentRepository: StudentRepository, + private val adsHelper: AdsHelper +) : BasePresenter(errorHandler, studentRepository) { + + override fun onAttachView(view: AdsView) { + super.onAttachView(view) + view.initView() + Timber.i("Settings ads view was initialized") + } + + fun onWatchSingleAdSelected() { + view?.showPrivacyPolicyDialog() + } + + fun onPrivacySelected() { + view?.openPrivacyPolicy() + } + + fun onAgreedPrivacy() { + view?.showLoadingSupportAd(true) + presenterScope.launch { + runCatching { adsHelper.getSupportAd() } + .onFailure(errorHandler::dispatch) + .onSuccess { it?.let { view?.showAd(it) } } + + view?.showLoadingSupportAd(false) + } + } +} \ No newline at end of file diff --git a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsView.kt b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsView.kt new file mode 100644 index 000000000..25eeaaeca --- /dev/null +++ b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsView.kt @@ -0,0 +1,17 @@ +package io.github.wulkanowy.ui.modules.settings.ads + +import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd +import io.github.wulkanowy.ui.base.BaseView + +interface AdsView : BaseView { + + fun initView() + + fun showAd(ad: RewardedInterstitialAd) + + fun showPrivacyPolicyDialog() + + fun openPrivacyPolicy() + + fun showLoadingSupportAd(show: Boolean) +} \ No newline at end of file diff --git a/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt b/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt new file mode 100644 index 000000000..f363c13f9 --- /dev/null +++ b/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt @@ -0,0 +1,39 @@ +package io.github.wulkanowy.utils + +import android.content.Context +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.LoadAdError +import com.google.android.gms.ads.MobileAds +import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd +import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAdLoadCallback +import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.BuildConfig +import javax.inject.Inject +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine + +class AdsHelper @Inject constructor(@ApplicationContext private val context: Context) { + + suspend fun getSupportAd(): RewardedInterstitialAd? { + MobileAds.initialize(context) + + val adRequest = AdRequest.Builder().build() + + return suspendCoroutine { + RewardedInterstitialAd.load( + context, + BuildConfig.SINGLE_SUPPORT_AD_ID, + adRequest, + object : RewardedInterstitialAdLoadCallback() { + override fun onAdLoaded(rewardedInterstitialAd: RewardedInterstitialAd) { + it.resume(rewardedInterstitialAd) + } + + override fun onAdFailedToLoad(loadAdError: LoadAdError) { + it.resumeWithException(IllegalArgumentException(loadAdError.message)) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/play/res/xml/scheme_preferences.xml b/app/src/play/res/xml/scheme_preferences.xml new file mode 100644 index 000000000..05b0bf644 --- /dev/null +++ b/app/src/play/res/xml/scheme_preferences.xml @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/app/src/play/res/xml/scheme_preferences_ads.xml b/app/src/play/res/xml/scheme_preferences_ads.xml new file mode 100644 index 000000000..6b3625cae --- /dev/null +++ b/app/src/play/res/xml/scheme_preferences_ads.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file From 0f800b61f63f8b7ae303316354ae371eafc9799d Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Sun, 24 Oct 2021 01:23:36 +0200 Subject: [PATCH 0656/1526] Allow expanding multiple subject' grades at once (#1584) --- .../github/wulkanowy/data/db/AppDatabase.kt | 2 +- .../data/db/migrations/Migration41.kt | 12 +- .../repositories/PreferencesRepository.kt | 15 +- .../ui/modules/grade/GradeExpandMode.kt | 9 ++ .../grade/details/GradeDetailsAdapter.kt | 146 +++++++++++++----- .../grade/details/GradeDetailsFragment.kt | 5 +- .../grade/details/GradeDetailsPresenter.kt | 33 ++-- .../modules/grade/details/GradeDetailsView.kt | 3 +- .../main/res/values/preferences_defaults.xml | 2 +- app/src/main/res/values/preferences_keys.xml | 3 +- .../main/res/values/preferences_values.xml | 11 ++ .../res/xml/scheme_preferences_appearance.xml | 11 +- 12 files changed, 187 insertions(+), 65 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeExpandMode.kt diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index b8831acd8..d96856068 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -193,7 +193,7 @@ abstract class AppDatabase : RoomDatabase() { Migration38(), Migration39(), Migration40(), - Migration41(), + Migration41(sharedPrefProvider), Migration42() ) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt index 17773efdb..0080e057c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt @@ -2,10 +2,20 @@ package io.github.wulkanowy.data.db.migrations import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase +import io.github.wulkanowy.data.db.SharedPrefProvider +import io.github.wulkanowy.ui.modules.grade.GradeExpandMode -class Migration41 : Migration(40, 41) { +class Migration41(private val sharedPrefProvider: SharedPrefProvider) : Migration(40, 41) { override fun migrate(database: SupportSQLiteDatabase) { + migrateSharedPreferences() database.execSQL("ALTER TABLE Homework ADD COLUMN is_added_by_user INTEGER NOT NULL DEFAULT 0") } + + private fun migrateSharedPreferences() { + if (sharedPrefProvider.getBoolean("pref_key_expand_grade", false)) { + sharedPrefProvider.putString("pref_key_expand_grade_mode", GradeExpandMode.ALWAYS_EXPANDED.value) + } + sharedPrefProvider.delete("pref_key_expand_grade") + } } \ No newline at end of file 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 b0991bbcb..696ffd63e 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 @@ -10,6 +10,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.sdk.toLocalDate import io.github.wulkanowy.ui.modules.dashboard.DashboardItem import io.github.wulkanowy.ui.modules.grade.GradeAverageMode +import io.github.wulkanowy.ui.modules.grade.GradeExpandMode import io.github.wulkanowy.ui.modules.grade.GradeSortingMode import io.github.wulkanowy.utils.toLocalDateTime import io.github.wulkanowy.utils.toTimestamp @@ -19,6 +20,8 @@ import kotlinx.coroutines.flow.map import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import java.lang.ClassCastException +import java.lang.IllegalStateException import java.time.LocalDate import java.time.LocalDateTime import javax.inject.Inject @@ -56,8 +59,13 @@ class PreferencesRepository @Inject constructor( R.bool.pref_default_grade_average_force_calc ) - val isGradeExpandable: Boolean - get() = !getBoolean(R.string.pref_key_expand_grade, R.bool.pref_default_expand_grade) + val gradeExpandMode: GradeExpandMode + get() = GradeExpandMode.getByValue( + getString( + R.string.pref_key_expand_grade_mode, + R.string.pref_default_expand_grade_mode + ) + ) val showAllSubjectsOnStatisticsList: Boolean get() = getBoolean( @@ -265,6 +273,9 @@ class PreferencesRepository @Inject constructor( private fun getBoolean(id: String, default: Int) = sharedPref.getBoolean(id, context.resources.getBoolean(default)) + private fun getBoolean(id: Int, default: Boolean) = + sharedPref.getBoolean(context.getString(id), default) + private companion object { private const val PREF_KEY_DASHBOARD_ITEMS_POSITION = "dashboard_items_position" diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeExpandMode.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeExpandMode.kt new file mode 100644 index 000000000..722e986ee --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeExpandMode.kt @@ -0,0 +1,9 @@ +package io.github.wulkanowy.ui.modules.grade + +enum class GradeExpandMode(val value: String) { + ONE("one"), UNLIMITED("any"), ALWAYS_EXPANDED("always"); + + companion object { + fun getByValue(value: String) = values().firstOrNull { it.value == value } ?: ONE + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt index 01631140c..d96ac0928 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt @@ -5,6 +5,7 @@ import android.content.res.Resources import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.NO_POSITION @@ -13,9 +14,11 @@ import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.databinding.HeaderGradeDetailsBinding import io.github.wulkanowy.databinding.ItemGradeDetailsBinding import io.github.wulkanowy.ui.base.BaseExpandableAdapter +import io.github.wulkanowy.ui.modules.grade.GradeExpandMode import io.github.wulkanowy.utils.getBackgroundColor import io.github.wulkanowy.utils.toFormattedString import timber.log.Timber +import java.util.BitSet import javax.inject.Inject class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter() { @@ -24,19 +27,20 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter() - private var expandedPosition = NO_POSITION + private val expandedPositions = BitSet(items.size) - private var isExpandable = false + private var expandMode = GradeExpandMode.ONE var onClickListener: (Grade, position: Int) -> Unit = { _, _ -> } var colorTheme = "" - fun setDataItems(data: List, isExpanded: Boolean = isExpandable) { + fun setDataItems(data: List, expandMode: GradeExpandMode = this.expandMode) { headers = data.filter { it.viewType == ViewType.HEADER }.toMutableList() - items = if (isExpanded) headers else data.toMutableList() - isExpandable = isExpanded - expandedPosition = NO_POSITION + items = + (if (expandMode != GradeExpandMode.ALWAYS_EXPANDED) headers else data).toMutableList() + this.expandMode = expandMode + expandedPositions.clear() } fun updateDetailsItem(position: Int, grade: Grade) { @@ -48,7 +52,7 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter 1) { - Timber.e("Header with subject $subject found ${candidates.size} times! Expanded: $expandedPosition. Items: $candidates") + Timber.e("Header with subject $subject found ${candidates.size} times! Expanded: $expandedPositions. Items: $candidates") } return candidates.first() @@ -64,9 +68,9 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter HeaderViewHolder(HeaderGradeDetailsBinding.inflate(inflater, parent, false)) - ViewType.ITEM.id -> ItemViewHolder(ItemGradeDetailsBinding.inflate(inflater, parent, false)) + ViewType.HEADER.id -> HeaderViewHolder( + HeaderGradeDetailsBinding.inflate(inflater, parent, false) + ) + ViewType.ITEM.id -> ItemViewHolder( + ItemGradeDetailsBinding.inflate(inflater, parent, false) + ) else -> throw IllegalStateException() } } @@ -106,46 +114,91 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter 0) View.VISIBLE else View.GONE - if (header.newGrades > 0) gradeHeaderNote.text = header.newGrades.toString(10) + gradeHeaderPointsSum.text = + context.getString(R.string.grade_points_sum, header.pointsSum) + gradeHeaderPointsSum.isVisible = !header.pointsSum.isNullOrEmpty() + gradeHeaderNumber.text = context.resources.getQuantityString( + R.plurals.grade_number_item, + header.grades.size, + header.grades.size + ) + gradeHeaderNote.isVisible = header.newGrades > 0 - gradeHeaderContainer.isEnabled = isExpandable + if (header.newGrades > 0) { + gradeHeaderNote.text = header.newGrades.toString() + } + + gradeHeaderContainer.isEnabled = expandMode != GradeExpandMode.ALWAYS_EXPANDED gradeHeaderContainer.setOnClickListener { - expandedPosition = if (expandedPosition == adapterPosition) -1 else adapterPosition - - if (expandedPosition != NO_POSITION) { - refreshList(headers.toMutableList().apply { - addAll(headerPosition + 1, header.grades) - }) - scrollToHeaderWithSubItems(headerPosition, header.grades.size) - } else { - refreshList(headers) - } + expandGradeHeader(headerPosition, header, holder) } } } - private fun formatAverage(average: Double?, resources: Resources): String { - return if (average == null || average == .0) resources.getString(R.string.grade_no_average) - else resources.getString(R.string.grade_average, average) + private fun expandGradeHeader( + headerPosition: Int, + header: GradeDetailsHeader, + holder: HeaderViewHolder + ) { + if (expandMode == GradeExpandMode.ONE) { + val isHeaderExpanded = expandedPositions[headerPosition] + + expandedPositions.clear() + + if (!isHeaderExpanded) { + val updatedItemList = headers.toMutableList() + .apply { addAll(headerPosition + 1, header.grades) } + + expandedPositions.set(headerPosition) + refreshList(updatedItemList) + scrollToHeaderWithSubItems(headerPosition, header.grades.size) + } else { + refreshList(headers.toMutableList()) + } + } else if (expandMode == GradeExpandMode.UNLIMITED) { + val headerAdapterPosition = holder.bindingAdapterPosition + val isHeaderExpanded = expandedPositions[headerPosition] + + expandedPositions.flip(headerPosition) + + if (!isHeaderExpanded) { + val updatedList = items.toMutableList() + .apply { addAll(headerAdapterPosition + 1, header.grades) } + + refreshList(updatedList) + scrollToHeaderWithSubItems(headerAdapterPosition, header.grades.size) + } else { + val startPosition = headerAdapterPosition + 1 + val updatedList = items.toMutableList() + .apply { + subList(startPosition, startPosition + header.grades.size).clear() + } + + refreshList(updatedList) + } + } } @SuppressLint("SetTextI18n") private fun bindItemViewHolder(holder: ItemViewHolder, grade: Grade) { + val context = holder.binding.root.context + with(holder.binding) { gradeItemValue.run { text = grade.entry @@ -154,26 +207,37 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter grade.description grade.gradeSymbol.isNotBlank() -> grade.gradeSymbol - else -> root.context.getString(R.string.all_no_description) + else -> context.getString(R.string.all_no_description) } gradeItemDate.text = grade.date.toFormattedString() - gradeItemWeight.text = "${root.context.getString(R.string.grade_weight)}: ${grade.weight}" + gradeItemWeight.text = "${context.getString(R.string.grade_weight)}: ${grade.weight}" gradeItemNote.visibility = if (!grade.isRead) View.VISIBLE else View.GONE root.setOnClickListener { - holder.bindingAdapterPosition.let { if (it != NO_POSITION) onClickListener(grade, it) } + holder.bindingAdapterPosition.let { + if (it != NO_POSITION) onClickListener(grade, it) + } } } } + private fun formatAverage(average: Double?, resources: Resources) = + if (average == null || average == .0) { + resources.getString(R.string.grade_no_average) + } else { + resources.getString(R.string.grade_average, average) + } + private class HeaderViewHolder(val binding: HeaderGradeDetailsBinding) : RecyclerView.ViewHolder(binding.root) private class ItemViewHolder(val binding: ItemGradeDetailsBinding) : RecyclerView.ViewHolder(binding.root) - class GradeDetailsDiffUtil(private val old: List, private val new: List) : - DiffUtil.Callback() { + private class GradeDetailsDiffUtil( + private val old: List, + private val new: List + ) : DiffUtil.Callback() { override fun getOldListSize() = old.size diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt index 9d4da767d..c93600d49 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt @@ -12,6 +12,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.ui.modules.grade.GradeExpandMode import io.github.wulkanowy.databinding.FragmentGradeDetailsBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment @@ -79,10 +80,10 @@ class GradeDetailsFragment : else false } - override fun updateData(data: List, isGradeExpandable: Boolean, gradeColorTheme: String) { + override fun updateData(data: List, expandMode: GradeExpandMode, gradeColorTheme: String) { with(gradeDetailsAdapter) { colorTheme = gradeColorTheme - setDataItems(data, isGradeExpandable) + setDataItems(data, expandMode) notifyDataSetChanged() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index 7544d2aa1..9b9651e1c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -9,6 +9,7 @@ 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.grade.GradeAverageProvider +import io.github.wulkanowy.ui.modules.grade.GradeExpandMode import io.github.wulkanowy.ui.modules.grade.GradeSortingMode.ALPHABETIC import io.github.wulkanowy.ui.modules.grade.GradeSortingMode.DATE import io.github.wulkanowy.ui.modules.grade.GradeSubject @@ -113,7 +114,7 @@ class GradeDetailsPresenter @Inject constructor( fun onParentViewReselected() { view?.run { if (!isViewEmpty) { - if (preferencesRepository.isGradeExpandable) collapseAllItems() + if (preferencesRepository.gradeExpandMode != GradeExpandMode.ALWAYS_EXPANDED) collapseAllItems() scrollToStart() } } @@ -157,7 +158,7 @@ class GradeDetailsPresenter @Inject constructor( showContent(true) updateData( data = items, - isGradeExpandable = preferencesRepository.isGradeExpandable, + expandMode = preferencesRepository.gradeExpandMode, gradeColorTheme = preferencesRepository.gradeColorTheme ) notifyParentDataLoaded(semesterId) @@ -175,7 +176,7 @@ class GradeDetailsPresenter @Inject constructor( showContent(items.isNotEmpty()) updateData( data = items, - isGradeExpandable = preferencesRepository.isGradeExpandable, + expandMode = preferencesRepository.gradeExpandMode, gradeColorTheme = preferencesRepository.gradeColorTheme ) } @@ -235,14 +236,24 @@ class GradeDetailsPresenter @Inject constructor( .sortedByDescending { it.date } .map { GradeDetailsItem(it, ViewType.ITEM) } - listOf(GradeDetailsItem(GradeDetailsHeader( - subject = subject, - average = average, - pointsSum = points, - grades = subItems - ).apply { - newGrades = grades.filter { grade -> !grade.isRead }.size - }, ViewType.HEADER)) + if (preferencesRepository.isGradeExpandable) emptyList() else subItems + val gradeDetailsItems = listOf( + GradeDetailsItem( + GradeDetailsHeader( + subject = subject, + average = average, + pointsSum = points, + grades = subItems + ).apply { + newGrades = grades.filter { grade -> !grade.isRead }.size + }, ViewType.HEADER + ) + ) + + if (preferencesRepository.gradeExpandMode == GradeExpandMode.ALWAYS_EXPANDED) { + gradeDetailsItems + subItems + } else { + gradeDetailsItems + } }.flatten() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt index e71fcc3c8..556332290 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.modules.grade.details import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.ui.modules.grade.GradeExpandMode import io.github.wulkanowy.ui.base.BaseView interface GradeDetailsView : BaseView { @@ -9,7 +10,7 @@ interface GradeDetailsView : BaseView { fun initView() - fun updateData(data: List, isGradeExpandable: Boolean, gradeColorTheme: String) + fun updateData(data: List, expandMode: GradeExpandMode, gradeColorTheme: String) fun updateItem(item: Grade, position: Int) diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index df84d37d6..7fb3d5c05 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -4,7 +4,7 @@ true only_one_semester false - false + one false light vulcan diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 1aba7d856..fef062dd1 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -5,7 +5,8 @@ app_theme dashboard_tiles grade_color_scheme - expand_grade + expand_grade + expand_grade_mode grade_average_mode grade_average_always_calc grade_statistics_list diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index bd3e8b47d..1d777bdb6 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -99,6 +99,17 @@ grade_color + + Up to 1 at once + Always expanded + Unlimited expansions + + + one + always + any + + Average of grades only from selected semester Average of averages from both semesters diff --git a/app/src/main/res/xml/scheme_preferences_appearance.xml b/app/src/main/res/xml/scheme_preferences_appearance.xml index b34fd417d..b2da0287f 100644 --- a/app/src/main/res/xml/scheme_preferences_appearance.xml +++ b/app/src/main/res/xml/scheme_preferences_appearance.xml @@ -50,11 +50,14 @@ app:iconSpaceReserved="false" app:key="@string/pref_key_grade_color_scheme" app:title="@string/pref_view_grade_color_scheme" /> - + app:key="@string/pref_key_expand_grade_mode" + app:title="@string/pref_view_expand_grade" + app:useSimpleSummaryProvider="true" /> Date: Tue, 26 Oct 2021 09:51:36 +0000 Subject: [PATCH 0657/1526] Bump about_libraries from 8.9.3 to 8.9.4 (#1604) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ad27aba07..6a563d2e6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.5.31' - about_libraries = '8.9.3' + about_libraries = '8.9.4' hilt_version = "2.39.1" } repositories { From 621db49fbf860bad00910f906226e68fe6f02f32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Oct 2021 09:52:55 +0000 Subject: [PATCH 0658/1526] Bump agcp from 1.6.1.200 to 1.6.1.300 (#1606) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6a563d2e6..c345e4c7d 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ buildscript { classpath 'com.android.tools.build:gradle:7.0.3' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.10' - classpath 'com.huawei.agconnect:agcp:1.6.1.200' + classpath 'com.huawei.agconnect:agcp:1.6.1.300' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.3.0" From de11644e9b6b599c45d204dd30a777ab40bc47ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Oct 2021 09:53:16 +0000 Subject: [PATCH 0659/1526] Bump agconnect-crash from 1.6.1.200 to 1.6.1.300 (#1605) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 421774062..94dfc1666 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -239,7 +239,7 @@ dependencies { playImplementation 'com.google.android.gms:play-services-ads:20.4.0' hmsImplementation 'com.huawei.hms:hianalytics:6.3.0.301' - hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.1.200' + hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.1.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 1d910f8d661ba218ab674447528d764071fa7ae1 Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Wed, 27 Oct 2021 10:07:04 +0200 Subject: [PATCH 0660/1526] Fix excuse button showing up despite no lessons available to excuse (#1607) This was happening when there was an unexcused lesson that you excused until the teacher sent a response (accepted or denied it) --- .../wulkanowy/ui/modules/attendance/AttendanceAdapter.kt | 2 +- .../wulkanowy/ui/modules/attendance/AttendancePresenter.kt | 5 ++--- .../java/io/github/wulkanowy/utils/AttendanceExtension.kt | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt index 6cee23963..bb4f70224 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt @@ -46,7 +46,7 @@ class AttendanceAdapter @Inject constructor() : onExcuseCheckboxSelect(item, checked) } - when (if (item.excuseStatus != null) SentExcuseStatus.valueOf(item.excuseStatus) else null) { + when (item.excuseStatus?.let { SentExcuseStatus.valueOf(it)}) { SentExcuseStatus.WAITING -> { attendanceItemExcuseInfo.setImageResource(R.drawable.ic_excuse_waiting) attendanceItemExcuseInfo.visibility = View.VISIBLE 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 03545b25b..5ed14f67e 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 @@ -259,9 +259,8 @@ class AttendancePresenter @Inject constructor( showEmpty(filteredAttendance.isEmpty()) showErrorView(false) showContent(filteredAttendance.isNotEmpty()) - showExcuseButton(filteredAttendance.any { item -> - (!isParent && isVulcanExcusedFunctionEnabled) || (isParent && item.isExcusableOrNotExcused) - }) + val anyExcusables = filteredAttendance.any { it.isExcusableOrNotExcused } + showExcuseButton(anyExcusables && (isParent || isVulcanExcusedFunctionEnabled)) } analytics.logEvent( "load_data", 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 479cc5188..b89ad57d3 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt @@ -17,7 +17,7 @@ private inline val AttendanceSummary.allAbsences: Double get() = absence.toDouble() + absenceExcused inline val Attendance.isExcusableOrNotExcused: Boolean - get() = excusable || ((absence || lateness) && !excused) + get() = (excusable || ((absence || lateness) && !excused)) && excuseStatus == null fun AttendanceSummary.calculatePercentage() = calculatePercentage(allPresences, allAbsences) From 26c749c219b8d35e302fd12cd82641015d1dba9a Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Fri, 29 Oct 2021 20:30:27 +0200 Subject: [PATCH 0661/1526] Fix about header layout to support long app names (for DEV builds) (#1602) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- app/build.gradle | 2 +- app/src/main/res/layout/scrollable_header_about.xml | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 94dfc1666..1d5411955 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -74,7 +74,7 @@ android { buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\"" } debug { - resValue "string", "app_name", "Wulkanowy DEV " + defaultConfig.versionCode + resValue "string", "app_name", "Wulkanowy DEV" applicationIdSuffix ".dev" versionNameSuffix "-dev" ext.enableCrashlytics = project.hasProperty("enableFirebase") diff --git a/app/src/main/res/layout/scrollable_header_about.xml b/app/src/main/res/layout/scrollable_header_about.xml index e203d98d4..5a7669fdf 100644 --- a/app/src/main/res/layout/scrollable_header_about.xml +++ b/app/src/main/res/layout/scrollable_header_about.xml @@ -6,6 +6,7 @@ android:layout_height="wrap_content" android:minHeight="104dp" android:orientation="vertical" + android:paddingHorizontal="20dp" tools:context=".ui.modules.about.AboutAdapter"> + app:layout_constraintTop_toTopOf="@id/aboutScrollableHeaderIcon" + app:layout_constraintWidth_max="wrap" /> From 8ed8b5a33cdf10431ecb582f319e59c9f7d4ab66 Mon Sep 17 00:00:00 2001 From: Damian Czupryn <60961958+Daxxxis@users.noreply.github.com> Date: Sun, 31 Oct 2021 20:28:01 +0100 Subject: [PATCH 0662/1526] Error messages content wrap in error dialog (#1577) --- .../io/github/wulkanowy/ui/base/ErrorDialog.kt | 17 ++++++++--------- app/src/main/res/layout/dialog_error.xml | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt index 4ce977709..4c279d816 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt @@ -11,6 +11,7 @@ import android.widget.Toast import android.widget.Toast.LENGTH_LONG import androidx.appcompat.app.AlertDialog import androidx.core.content.getSystemService +import androidx.core.view.isGone import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.DialogErrorBinding @@ -24,8 +25,6 @@ import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser import okhttp3.internal.http2.StreamResetException import java.io.InterruptedIOException -import java.io.PrintWriter -import java.io.StringWriter import java.net.ConnectException import java.net.SocketTimeoutException import java.net.UnknownHostException @@ -64,26 +63,26 @@ class ErrorDialog : BaseDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val stringWriter = StringWriter().apply { - error.printStackTrace(PrintWriter(this)) - } + val errorStacktrace = error.stackTraceToString() with(binding) { - errorDialogContent.text = stringWriter.toString() + errorDialogContent.text = errorStacktrace.replace(": ${error.localizedMessage}", "") with(errorDialogHorizontalScroll) { post { fullScroll(HorizontalScrollView.FOCUS_LEFT) } } errorDialogCopy.setOnClickListener { - val clip = ClipData.newPlainText("wulkanowy", stringWriter.toString()) + val clip = ClipData.newPlainText("Error details", errorStacktrace) activity?.getSystemService()?.setPrimaryClip(clip) Toast.makeText(context, R.string.all_copied, LENGTH_LONG).show() } errorDialogCancel.setOnClickListener { dismiss() } errorDialogReport.setOnClickListener { - openConfirmDialog { openEmailClient(stringWriter.toString()) } + openConfirmDialog { openEmailClient(errorStacktrace) } } - errorDialogMessage.text = resources.getString(error) + errorDialogHumanizedMessage.text = resources.getString(error) + errorDialogErrorMessage.text = error.localizedMessage + errorDialogErrorMessage.isGone = error.localizedMessage.isNullOrBlank() errorDialogReport.isEnabled = when (error) { is UnknownHostException, is InterruptedIOException, diff --git a/app/src/main/res/layout/dialog_error.xml b/app/src/main/res/layout/dialog_error.xml index a78790bce..75abcf0fd 100644 --- a/app/src/main/res/layout/dialog_error.xml +++ b/app/src/main/res/layout/dialog_error.xml @@ -4,7 +4,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minWidth="300dp" - android:orientation="vertical"> + android:orientation="vertical" + tools:context=".ui.base.ErrorDialog"> + + From 36a570eeb0120a8211e62a6ab9a39a04bfbc6e49 Mon Sep 17 00:00:00 2001 From: Damian Czupryn <60961958+Daxxxis@users.noreply.github.com> Date: Mon, 1 Nov 2021 01:46:23 +0100 Subject: [PATCH 0663/1526] Allow selecting text in error dialog (#1615) --- app/src/main/res/layout/dialog_error.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/dialog_error.xml b/app/src/main/res/layout/dialog_error.xml index 75abcf0fd..b52c99aca 100644 --- a/app/src/main/res/layout/dialog_error.xml +++ b/app/src/main/res/layout/dialog_error.xml @@ -32,6 +32,7 @@ android:layout_marginBottom="5dp" android:paddingHorizontal="20dp" android:paddingTop="10dp" + android:textIsSelectable="true" android:textColor="?android:textColorSecondary" tools:text="@tools:sample/lorem" /> From a62ed54d07728c4949464e7619c3eddf83b0e398 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Nov 2021 16:54:10 +0000 Subject: [PATCH 0664/1526] Bump hianalytics from 6.3.0.301 to 6.3.0.302 (#1621) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 1d5411955..b5eb455c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -238,7 +238,7 @@ dependencies { playImplementation 'com.google.android.play:core-ktx:1.8.1' playImplementation 'com.google.android.gms:play-services-ads:20.4.0' - hmsImplementation 'com.huawei.hms:hianalytics:6.3.0.301' + hmsImplementation 'com.huawei.hms:hianalytics:6.3.0.302' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.1.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 1a3d58011650afefd16e73633457120a4a293287 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Nov 2021 16:54:43 +0000 Subject: [PATCH 0665/1526] Bump firebase-bom from 28.4.2 to 29.0.0 (#1619) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b5eb455c1..53814dae3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -230,7 +230,7 @@ dependencies { implementation 'me.xdrop:fuzzywuzzy:1.3.1' implementation 'com.fredporciuncula:flow-preferences:1.5.0' - playImplementation platform('com.google.firebase:firebase-bom:28.4.2') + playImplementation platform('com.google.firebase:firebase-bom:29.0.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From 8be605629a4ace0411b5598eb4f098f650771d72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Nov 2021 16:56:18 +0000 Subject: [PATCH 0666/1526] Bump firebase-crashlytics-gradle from 2.7.1 to 2.8.0 (#1623) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c345e4c7d..575293aa2 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.10' classpath 'com.huawei.agconnect:agcp:1.6.1.300' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.0' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.3.0" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3" From b7134221cb5d1d7b862c57512025685b93ea9b67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Nov 2021 17:05:57 +0000 Subject: [PATCH 0667/1526] Bump hilt_version from 2.39.1 to 2.40 (#1617) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 575293aa2..99c4820e8 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.5.31' about_libraries = '8.9.4' - hilt_version = "2.39.1" + hilt_version = "2.40" } repositories { mavenCentral() From eea20ced57e2d06b79cc04c4a24711866b084c4a Mon Sep 17 00:00:00 2001 From: Damian Czupryn <60961958+Daxxxis@users.noreply.github.com> Date: Thu, 4 Nov 2021 03:06:54 +0100 Subject: [PATCH 0668/1526] Notifications settings reorganize and strings update (#1616) --- app/src/main/res/values/strings.xml | 7 ++++--- .../res/xml/scheme_preferences_notifications.xml | 16 ++++++++++------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 13030366a..1e88ee1ad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -611,13 +611,13 @@ - App appearance & behavior + App Default view Calculated average options Force average calculation by app Show presence Theme - Expand grades + Grades expanding Mark current lesson Show groups next to subjects Show chart list in class grades @@ -627,6 +627,7 @@ Language Notifications + Other Show notifications Show upcoming lesson notifications Make upcoming lesson notification persistent @@ -689,7 +690,7 @@ Automatic update, synchronization interval Plus and minus values, average calculation Advanced - App version, contributors, social portals, licenses + App version, contributors, social portals Displaying advertisements, project support diff --git a/app/src/main/res/xml/scheme_preferences_notifications.xml b/app/src/main/res/xml/scheme_preferences_notifications.xml index 78e91cf06..442581bfd 100644 --- a/app/src/main/res/xml/scheme_preferences_notifications.xml +++ b/app/src/main/res/xml/scheme_preferences_notifications.xml @@ -22,18 +22,22 @@ app:singleLineTitle="false" app:summary="@string/pref_notify_upcoming_lessons_persistent_summary" app:title="@string/pref_notify_upcoming_lessons_persistent_switch" /> - + + + Date: Thu, 4 Nov 2021 03:09:47 +0100 Subject: [PATCH 0669/1526] Add support for user ca in debug flavor(#1624) --- app/src/main/AndroidManifest.xml | 1 + app/src/main/res/xml/network_security_config.xml | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 app/src/main/res/xml/network_security_config.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 810d469f4..e43a0ec08 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,7 @@ android:allowBackup="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="false" android:theme="@style/WulkanowyTheme" diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 000000000..84ff05a04 --- /dev/null +++ b/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,9 @@ + + + + + + + + + From 4401df6203bb408e1aa8cb63cf0976fe4a6f2d01 Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Sat, 6 Nov 2021 19:07:26 +0100 Subject: [PATCH 0670/1526] Migrate from ViewPager to ViewPager2 (#1601) --- .../ui/base/BaseFragmentPagerAdapter.kt | 37 ++++++++-------- .../ui/modules/grade/GradeFragment.kt | 42 ++++++++++++------ .../ui/modules/grade/GradePresenter.kt | 1 - .../ui/modules/login/LoginActivity.kt | 42 +++++++++++------- .../ui/modules/message/MessageFragment.kt | 40 ++++++++++++----- .../ui/modules/message/MessagePresenter.kt | 1 - .../SchoolAndTeachersFragment.kt | 44 ++++++++++++++----- .../SchoolAndTeachersPresenter.kt | 1 - .../ui/widgets/SwipeDisabledViewPager.kt | 19 -------- .../wulkanowy/utils/ViewPagerExtension.kt | 8 ++-- app/src/main/res/layout/activity_login.xml | 2 +- app/src/main/res/layout/fragment_grade.xml | 2 +- app/src/main/res/layout/fragment_message.xml | 2 +- .../res/layout/fragment_schoolandteachers.xml | 2 +- 14 files changed, 142 insertions(+), 101 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/widgets/SwipeDisabledViewPager.kt diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragmentPagerAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragmentPagerAdapter.kt index bd735535d..6bca87f15 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragmentPagerAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragmentPagerAdapter.kt @@ -2,32 +2,33 @@ package io.github.wulkanowy.ui.base import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentPagerAdapter +import androidx.lifecycle.Lifecycle +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayoutMediator -//TODO Use ViewPager2 -class BaseFragmentPagerAdapter(private val fragmentManager: FragmentManager) : - FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { +class BaseFragmentPagerAdapter( + private val fragmentManager: FragmentManager, + private val pagesCount: Int, + lifecycle: Lifecycle, +) : FragmentStateAdapter(fragmentManager, lifecycle), TabLayoutMediator.TabConfigurationStrategy { - private val pages = mutableMapOf() + lateinit var itemFactory: (position: Int) -> Fragment + + var titleFactory: (position: Int) -> String? = { "" } var containerId = 0 fun getFragmentInstance(position: Int): Fragment? { require(containerId != 0) { "Container id is 0" } - return fragmentManager.findFragmentByTag("android:switcher:$containerId:$position") + return fragmentManager.findFragmentByTag("f$position") } - fun addFragments(fragments: List) { - fragments.forEach { pages[it] = null } + override fun createFragment(position: Int): Fragment = itemFactory(position) + + override fun getItemCount() = pagesCount + + override fun onConfigureTab(tab: TabLayout.Tab, position: Int) { + tab.text = titleFactory(position) } - - fun addFragmentsWithTitle(pages: Map) { - this.pages.putAll(pages) - } - - override fun getItem(position: Int) = pages.keys.elementAt(position) - - override fun getCount() = pages.size - - override fun getPageTitle(position: Int) = pages.values.elementAt(position) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt index b3ef3037a..f9ecb681b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt @@ -8,6 +8,7 @@ import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE import androidx.appcompat.app.AlertDialog +import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Semester @@ -29,7 +30,13 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade @Inject lateinit var presenter: GradePresenter - private val pagerAdapter by lazy { BaseFragmentPagerAdapter(childFragmentManager) } + private val pagerAdapter by lazy { + BaseFragmentPagerAdapter( + fragmentManager = childFragmentManager, + pagesCount = 3, + lifecycle = lifecycle, + ) + } private var semesterSwitchMenu: MenuItem? = null @@ -62,25 +69,34 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade } override fun initView() { - with(pagerAdapter) { - containerId = binding.gradeViewPager.id - addFragmentsWithTitle( - mapOf( - GradeDetailsFragment.newInstance() to getString(R.string.all_details), - GradeSummaryFragment.newInstance() to getString(R.string.grade_menu_summary), - GradeStatisticsFragment.newInstance() to getString(R.string.grade_menu_statistics) - ) - ) - } - with(binding.gradeViewPager) { adapter = pagerAdapter offscreenPageLimit = 3 setOnSelectPageListener(presenter::onPageSelected) } + with(pagerAdapter) { + containerId = binding.gradeViewPager.id + titleFactory = { + when (it) { + 0 -> getString(R.string.all_details) + 1 -> getString(R.string.grade_menu_summary) + 2 -> getString(R.string.grade_menu_statistics) + else -> throw IllegalStateException() + } + } + itemFactory = { + when (it) { + 0 -> GradeDetailsFragment.newInstance() + 1 -> GradeSummaryFragment.newInstance() + 2 -> GradeStatisticsFragment.newInstance() + else -> throw IllegalStateException() + } + } + TabLayoutMediator(binding.gradeTabLayout, binding.gradeViewPager, this).attach() + } + with(binding.gradeTabLayout) { - setupWithViewPager(binding.gradeViewPager) setElevationCompat(context.dpToPx(4f)) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index 504c730de..76e88bcdb 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -101,7 +101,6 @@ class GradePresenter @Inject constructor( private fun loadData() { flowWithResource { val student = studentRepository.getCurrentStudent() - delay(200) semesterRepository.getSemesters(student, refreshOnNoCurrent = true) }.onEach { when (it.status) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt index 10f6c0737..f7bab526c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt @@ -24,7 +24,13 @@ class LoginActivity : BaseActivity(), Logi @Inject override lateinit var presenter: LoginPresenter - private val loginAdapter = BaseFragmentPagerAdapter(supportFragmentManager) + private val pagerAdapter by lazy { + BaseFragmentPagerAdapter( + fragmentManager = supportFragmentManager, + pagesCount = 5, + lifecycle = lifecycle, + ) + } @Inject lateinit var updateHelper: UpdateHelper @@ -65,24 +71,26 @@ class LoginActivity : BaseActivity(), Logi setDisplayShowTitleEnabled(false) } - with(loginAdapter) { - containerId = binding.loginViewpager.id - addFragments( - listOf( - LoginFormFragment.newInstance(), - LoginSymbolFragment.newInstance(), - LoginStudentSelectFragment.newInstance(), - LoginAdvancedFragment.newInstance(), - LoginRecoverFragment.newInstance() - ) - ) - } - with(binding.loginViewpager) { offscreenPageLimit = 2 - adapter = loginAdapter + adapter = pagerAdapter + isUserInputEnabled = false setOnSelectPageListener(presenter::onViewSelected) } + + with(pagerAdapter) { + containerId = binding.loginViewpager.id + itemFactory = { + when (it) { + 0 -> LoginFormFragment.newInstance() + 1 -> LoginSymbolFragment.newInstance() + 2 -> LoginStudentSelectFragment.newInstance() + 3 -> LoginAdvancedFragment.newInstance() + 4 -> LoginRecoverFragment.newInstance() + else -> throw IllegalStateException() + } + } + } } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -103,12 +111,12 @@ class LoginActivity : BaseActivity(), Logi } override fun notifyInitSymbolFragment(loginData: Triple) { - (loginAdapter.getFragmentInstance(1) as? LoginSymbolFragment) + (pagerAdapter.getFragmentInstance(1) as? LoginSymbolFragment) ?.onParentInitSymbolFragment(loginData) } override fun notifyInitStudentSelectFragment(studentsWithSemesters: List) { - (loginAdapter.getFragmentInstance(2) as? LoginStudentSelectFragment) + (pagerAdapter.getFragmentInstance(2) as? LoginStudentSelectFragment) ?.onParentInitStudentSelectFragment(studentsWithSemesters) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt index 72fc627f8..51076c649 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE +import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.enums.MessageFolder.RECEIVED @@ -26,7 +27,13 @@ class MessageFragment : BaseFragment(R.layout.fragment_m @Inject lateinit var presenter: MessagePresenter - private val pagerAdapter by lazy { BaseFragmentPagerAdapter(childFragmentManager) } + private val pagerAdapter by lazy { + BaseFragmentPagerAdapter( + fragmentManager = childFragmentManager, + pagesCount = 3, + lifecycle = lifecycle, + ) + } companion object { fun newInstance() = MessageFragment() @@ -43,23 +50,34 @@ class MessageFragment : BaseFragment(R.layout.fragment_m } override fun initView() { - with(pagerAdapter) { - containerId = binding.messageViewPager.id - addFragmentsWithTitle(mapOf( - MessageTabFragment.newInstance(RECEIVED) to getString(R.string.message_inbox), - MessageTabFragment.newInstance(SENT) to getString(R.string.message_sent), - MessageTabFragment.newInstance(TRASHED) to getString(R.string.message_trash) - )) - } - with(binding.messageViewPager) { adapter = pagerAdapter offscreenPageLimit = 2 setOnSelectPageListener(presenter::onPageSelected) } + with(pagerAdapter) { + containerId = binding.messageViewPager.id + titleFactory = { + when (it) { + 0 -> getString(R.string.message_inbox) + 1 -> getString(R.string.message_sent) + 2 -> getString(R.string.message_trash) + else -> throw IllegalStateException() + } + } + itemFactory = { + when (it) { + 0 -> MessageTabFragment.newInstance(RECEIVED) + 1 -> MessageTabFragment.newInstance(SENT) + 2 -> MessageTabFragment.newInstance(TRASHED) + else -> throw IllegalStateException() + } + } + TabLayoutMediator(binding.messageTabLayout, binding.messageViewPager, this).attach() + } + with(binding.messageTabLayout) { - setupWithViewPager(binding.messageViewPager) setElevationCompat(context.dpToPx(4f)) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt index be6940520..9e19517bd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt @@ -16,7 +16,6 @@ class MessagePresenter @Inject constructor( override fun onAttachView(view: MessageView) { super.onAttachView(view) presenterScope.launch { - delay(150) view.initView() Timber.i("Message view was initialized") loadData() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt index c1c569611..9892b77ad 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE +import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.databinding.FragmentSchoolandteachersBinding @@ -24,7 +25,13 @@ class SchoolAndTeachersFragment : @Inject lateinit var presenter: SchoolAndTeachersPresenter - private val pagerAdapter by lazy { BaseFragmentPagerAdapter(childFragmentManager) } + private val pagerAdapter by lazy { + BaseFragmentPagerAdapter( + fragmentManager = childFragmentManager, + pagesCount = 2, + lifecycle = lifecycle, + ) + } companion object { fun newInstance() = SchoolAndTeachersFragment() @@ -41,22 +48,36 @@ class SchoolAndTeachersFragment : } override fun initView() { - with(pagerAdapter) { - containerId = binding.schoolandteachersViewPager.id - addFragmentsWithTitle(mapOf( - SchoolFragment.newInstance() to getString(R.string.school_title), - TeacherFragment.newInstance() to getString(R.string.teachers_title) - )) - } - with(binding.schoolandteachersViewPager) { adapter = pagerAdapter offscreenPageLimit = 2 setOnSelectPageListener(presenter::onPageSelected) } + with(pagerAdapter) { + containerId = binding.schoolandteachersViewPager.id + titleFactory = { + when (it) { + 0 -> getString(R.string.school_title) + 1 -> getString(R.string.teachers_title) + else -> throw IllegalStateException() + } + } + itemFactory = { + when (it) { + 0 -> SchoolFragment.newInstance() + 1 -> TeacherFragment.newInstance() + else -> throw IllegalStateException() + } + } + TabLayoutMediator( + binding.schoolandteachersTabLayout, + binding.schoolandteachersViewPager, + this + ).attach() + } + with(binding.schoolandteachersTabLayout) { - setupWithViewPager(binding.schoolandteachersViewPager) setElevationCompat(context.dpToPx(4f)) } } @@ -77,7 +98,8 @@ class SchoolAndTeachersFragment : } override fun notifyChildLoadData(index: Int, forceRefresh: Boolean) { - (pagerAdapter.getFragmentInstance(index) as? SchoolAndTeachersChildView)?.onParentLoadData(forceRefresh) + (pagerAdapter.getFragmentInstance(index) as? SchoolAndTeachersChildView) + ?.onParentLoadData(forceRefresh) } override fun onDestroyView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt index c14272b9d..43823d6b4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersPresenter.kt @@ -16,7 +16,6 @@ class SchoolAndTeachersPresenter @Inject constructor( override fun onAttachView(view: SchoolAndTeachersView) { super.onAttachView(view) presenterScope.launch { - delay(150) view.initView() Timber.i("Message view was initialized") loadData() diff --git a/app/src/main/java/io/github/wulkanowy/ui/widgets/SwipeDisabledViewPager.kt b/app/src/main/java/io/github/wulkanowy/ui/widgets/SwipeDisabledViewPager.kt deleted file mode 100644 index eb5cae4f3..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/widgets/SwipeDisabledViewPager.kt +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.wulkanowy.ui.widgets - -import android.annotation.SuppressLint -import android.content.Context -import android.util.AttributeSet -import android.view.MotionEvent -import androidx.viewpager.widget.ViewPager - -class SwipeDisabledViewPager : ViewPager { - - constructor(context: Context) : super(context) - - constructor(context: Context, attr: AttributeSet) : super(context, attr) - - @SuppressLint("ClickableViewAccessibility") - override fun onTouchEvent(ev: MotionEvent) = false - - override fun onInterceptTouchEvent(ev: MotionEvent) = false -} diff --git a/app/src/main/java/io/github/wulkanowy/utils/ViewPagerExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ViewPagerExtension.kt index 6a5ad880a..700ac2f1d 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ViewPagerExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ViewPagerExtension.kt @@ -1,13 +1,11 @@ package io.github.wulkanowy.utils -import androidx.viewpager.widget.ViewPager +import androidx.viewpager2.widget.ViewPager2 -inline fun ViewPager.setOnSelectPageListener(crossinline selectListener: (position: Int) -> Unit) { - addOnPageChangeListener(object : ViewPager.OnPageChangeListener { +inline fun ViewPager2.setOnSelectPageListener(crossinline selectListener: (position: Int) -> Unit) { + registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { selectListener(position) } - override fun onPageScrollStateChanged(state: Int) {} - override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} }) } diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index e55ea8b95..1d5b5280d 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -10,7 +10,7 @@ android:layout_height="wrap_content" android:background="@android:color/transparent" /> - diff --git a/app/src/main/res/layout/fragment_grade.xml b/app/src/main/res/layout/fragment_grade.xml index ed0447fb5..989929d4c 100644 --- a/app/src/main/res/layout/fragment_grade.xml +++ b/app/src/main/res/layout/fragment_grade.xml @@ -17,7 +17,7 @@ tools:ignore="UnusedAttribute" tools:visibility="visible" /> - - - Date: Sat, 6 Nov 2021 22:21:34 +0100 Subject: [PATCH 0671/1526] Add timetable changes, attendance notifications and refactor notification deeplinks (#1547) --- .../43.json | 2408 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 6 +- .../wulkanowy/data/db/dao/AttendanceDao.kt | 9 +- .../wulkanowy/data/db/entities/Attendance.kt | 3 + .../wulkanowy/data/db/entities/Timetable.kt | 3 + .../data/db/migrations/Migration43.kt | 12 + .../wulkanowy/data/pojos/NotificationData.kt | 43 +- .../data/repositories/AttendanceRepository.kt | 19 +- .../data/repositories/TimetableRepository.kt | 20 +- .../wulkanowy/services/ServicesModule.kt | 10 + .../alarm/TimetableNotificationReceiver.kt | 17 +- .../TimetableNotificationSchedulerHelper.kt | 4 +- .../services/shortcuts/ShortcutsHelper.kt | 90 + .../sync/channels/NewAttendanceChannel.kt | 36 + .../sync/channels/TimetableChangeChannel.kt | 36 + .../notifications/AppNotificationManager.kt | 220 +- .../ChangeTimetableNotification.kt | 125 + .../NewAttendanceNotification.kt | 55 + .../NewConferenceNotification.kt | 48 +- .../sync/notifications/NewExamNotification.kt | 48 +- .../notifications/NewGradeNotification.kt | 98 +- .../notifications/NewHomeworkNotification.kt | 46 +- .../NewLuckyNumberNotification.kt | 34 +- .../notifications/NewMessageNotification.kt | 38 +- .../sync/notifications/NewNoteNotification.kt | 48 +- .../NewSchoolAnnouncementNotification.kt | 57 +- .../sync/notifications/NotificationType.kt | 85 +- .../services/sync/works/AttendanceWork.kt | 30 +- .../services/sync/works/TimetableWork.kt | 31 +- .../wulkanowy/ui/modules/Destination.kt | 132 + .../modules/attendance/AttendanceAdapter.kt | 4 +- .../ui/modules/attendance/AttendanceDialog.kt | 4 +- .../NotificationDebugPresenter.kt | 12 + .../debug/notification/mock/attendance.kt | 35 + .../debug/notification/mock/timetable.kt | 39 + .../LoginStudentSelectFragment.kt | 9 +- .../LuckyNumberWidgetProvider.kt | 59 +- .../wulkanowy/ui/modules/main/MainActivity.kt | 191 +- .../ui/modules/main/MainPresenter.kt | 61 +- .../wulkanowy/ui/modules/main/MainView.kt | 32 +- .../NotificationsCenterAdapter.kt | 19 +- .../NotificationsCenterFragment.kt | 6 +- .../ui/modules/settings/SettingsFragment.kt | 14 +- .../ui/modules/settings/SettingsView.kt | 5 + .../TimetableWidgetProvider.kt | 8 +- .../wulkanowy/utils/AttendanceExtension.kt | 2 +- .../wulkanowy/utils/ContextExtension.kt | 4 + .../utils/FragNavControlerExtension.kt | 13 +- .../wulkanowy/utils/FragmentExtension.kt | 44 - app/src/main/res/values/strings.xml | 34 + .../ui/modules/main/MainPresenterTest.kt | 14 +- 51 files changed, 3819 insertions(+), 601 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/43.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration43.kt create mode 100644 app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt create mode 100644 app/src/main/java/io/github/wulkanowy/services/sync/channels/NewAttendanceChannel.kt create mode 100644 app/src/main/java/io/github/wulkanowy/services/sync/channels/TimetableChangeChannel.kt create mode 100644 app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt create mode 100644 app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/attendance.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/timetable.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/utils/FragmentExtension.kt diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/43.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/43.json new file mode 100644 index 000000000..22c0d8125 --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/43.json @@ -0,0 +1,2408 @@ +{ + "formatVersion": 1, + "database": { + "version": 43, + "identityHash": "66946510bb620ae82686a5a1a31aba18", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "semester_id" + ], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `recipient_name` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `removed` INTEGER NOT NULL, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `unread_by` INTEGER NOT NULL, `read_by` INTEGER NOT NULL, `content` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "recipient", + "columnName": "recipient_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "removed", + "columnName": "removed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`real_id` INTEGER NOT NULL, `message_id` INTEGER NOT NULL, `one_drive_id` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`real_id`))", + "fields": [ + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "oneDriveId", + "columnName": "one_drive_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "real_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ReportingUnits", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `short` TEXT NOT NULL, `sender_id` INTEGER NOT NULL, `sender_name` TEXT NOT NULL, `roles` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "sender_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "senderName", + "columnName": "sender_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roles", + "columnName": "roles", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `real_id` TEXT NOT NULL, `name` TEXT NOT NULL, `real_name` TEXT NOT NULL, `login_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `role` INTEGER NOT NULL, `hash` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "realName", + "columnName": "real_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginId", + "columnName": "login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "role", + "columnName": "role", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hash", + "columnName": "hash", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '66946510bb620ae82686a5a1a31aba18')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index d96856068..7e6d609f7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -102,6 +102,7 @@ import io.github.wulkanowy.data.db.migrations.Migration4 import io.github.wulkanowy.data.db.migrations.Migration40 import io.github.wulkanowy.data.db.migrations.Migration41 import io.github.wulkanowy.data.db.migrations.Migration42 +import io.github.wulkanowy.data.db.migrations.Migration43 import io.github.wulkanowy.data.db.migrations.Migration5 import io.github.wulkanowy.data.db.migrations.Migration6 import io.github.wulkanowy.data.db.migrations.Migration7 @@ -151,7 +152,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 42 + const val VERSION_SCHEMA = 43 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), @@ -194,7 +195,8 @@ abstract class AppDatabase : RoomDatabase() { Migration39(), Migration40(), Migration41(sharedPrefProvider), - Migration42() + Migration42(), + Migration43() ) fun newInstance( 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 8ef3fd446..c6c255a1f 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 @@ -11,6 +11,11 @@ import javax.inject.Singleton @Dao interface AttendanceDao : BaseDao { - @Query("SELECT * FROM Attendance WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow> + @Query("SELECT * FROM Attendance WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :start AND date <= :end") + fun loadAll( + diaryId: Int, + studentId: Int, + start: LocalDate, + end: LocalDate + ): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt index f141d5d52..b40dd52e5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt @@ -47,4 +47,7 @@ data class Attendance( @PrimaryKey(autoGenerate = true) var id: Long = 0 + + @ColumnInfo(name = "is_notified") + var isNotified: Boolean = true } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt index 1bf159efd..29b3737bc 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt @@ -50,4 +50,7 @@ data class Timetable( @PrimaryKey(autoGenerate = true) var id: Long = 0 + + @ColumnInfo(name = "is_notified") + var isNotified: Boolean = true } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration43.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration43.kt new file mode 100644 index 000000000..68c2834d6 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration43.kt @@ -0,0 +1,12 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +class Migration43 : Migration(42, 43) { + + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE Timetable ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") + database.execSQL("ALTER TABLE Attendance ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") + } +} diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/NotificationData.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/NotificationData.kt index 0b4603ef7..0748ba647 100644 --- a/app/src/main/java/io/github/wulkanowy/data/pojos/NotificationData.kt +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/NotificationData.kt @@ -1,36 +1,19 @@ package io.github.wulkanowy.data.pojos -import androidx.annotation.DrawableRes -import androidx.annotation.PluralsRes -import androidx.annotation.StringRes +import android.content.Intent import io.github.wulkanowy.services.sync.notifications.NotificationType -import io.github.wulkanowy.ui.modules.main.MainView -sealed interface NotificationData { +data class NotificationData( + val intentToStart: Intent, + val title: String, + val content: String +) + +data class GroupNotificationData( + val notificationDataList: List, + val title: String, + val content: String, + val intentToStart: Intent, val type: NotificationType - val startMenu: MainView.Section - val icon: Int - val titleStringRes: Int - val contentStringRes: Int -} +) -data class MultipleNotificationsData( - override val type: NotificationType, - override val startMenu: MainView.Section, - @DrawableRes override val icon: Int, - @PluralsRes override val titleStringRes: Int, - @PluralsRes override val contentStringRes: Int, - - @PluralsRes val summaryStringRes: Int, - val lines: List, -) : NotificationData - -data class OneNotificationData( - override val type: NotificationType, - override val startMenu: MainView.Section, - @DrawableRes override val icon: Int, - @StringRes override val titleStringRes: Int, - @StringRes override val contentStringRes: Int, - - val contentValues: List, -) : NotificationData 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 d21ffb5fb..ec9198175 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 @@ -14,6 +14,7 @@ import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.networkBoundResource import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex import java.time.LocalDate import java.time.LocalDateTime @@ -38,6 +39,7 @@ class AttendanceRepository @Inject constructor( start: LocalDate, end: LocalDate, forceRefresh: Boolean, + notify: Boolean = false, ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { @@ -56,13 +58,28 @@ class AttendanceRepository @Inject constructor( }, saveFetchResult = { old, new -> attendanceDb.deleteAll(old uniqueSubtract new) - attendanceDb.insertAll(new uniqueSubtract old) + val attendanceToAdd = (new uniqueSubtract old).map { newAttendance -> + newAttendance.apply { if (notify) isNotified = false } + } + attendanceDb.insertAll(attendanceToAdd) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester, start, end)) }, filterResult = { it.filter { item -> item.date in start..end } } ) + fun getAttendanceFromDatabase( + semester: Semester, + start: LocalDate, + end: LocalDate + ): Flow> { + return attendanceDb.loadAll(semester.diaryId, semester.studentId, start, end) + } + + suspend fun updateTimetable(timetable: List) { + return attendanceDb.updateAll(timetable) + } + suspend fun excuseForAbsence( student: Student, semester: Semester, absenceList: List, reason: String? = null diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index 769fa0f0d..8be621122 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -47,6 +47,7 @@ class TimetableRepository @Inject constructor( end: LocalDate, forceRefresh: Boolean, refreshAdditional: Boolean = false, + notify: Boolean = false ) = networkBoundResource( mutex = saveFetchResultMutex, shouldFetch = { (timetable, additional, headers) -> @@ -67,7 +68,7 @@ class TimetableRepository @Inject constructor( timetableFull.mapToEntities(semester) }, saveFetchResult = { timetableOld, timetableNew -> - refreshTimetable(student, timetableOld.lessons, timetableNew.lessons) + refreshTimetable(student, timetableOld.lessons, timetableNew.lessons, notify) refreshAdditional(timetableOld.additional, timetableNew.additional) refreshDayHeaders(timetableOld.headers, timetableNew.headers) @@ -117,13 +118,28 @@ class TimetableRepository @Inject constructor( } } + fun getTimetableFromDatabase( + semester: Semester, + from: LocalDate, + end: LocalDate + ): Flow> { + return timetableDb.loadAll(semester.diaryId, semester.studentId, from, end) + } + + suspend fun updateTimetable(timetable: List) { + return timetableDb.updateAll(timetable) + } + private suspend fun refreshTimetable( student: Student, lessonsOld: List, lessonsNew: List, + notify: Boolean ) { val lessonsToRemove = lessonsOld uniqueSubtract lessonsNew - val lessonsToAdd = lessonsNew uniqueSubtract lessonsOld + val lessonsToAdd = (lessonsNew uniqueSubtract lessonsOld).map { new -> + new.apply { if (notify) isNotified = false } + } timetableDb.deleteAll(lessonsToRemove) timetableDb.insertAll(lessonsToAdd) diff --git a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt index cdf0c26a9..1729f1006 100644 --- a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt +++ b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt @@ -15,6 +15,7 @@ import dagger.multibindings.IntoSet import io.github.wulkanowy.services.sync.channels.Channel import io.github.wulkanowy.services.sync.channels.DebugChannel import io.github.wulkanowy.services.sync.channels.LuckyNumberChannel +import io.github.wulkanowy.services.sync.channels.NewAttendanceChannel import io.github.wulkanowy.services.sync.channels.NewConferencesChannel import io.github.wulkanowy.services.sync.channels.NewExamChannel import io.github.wulkanowy.services.sync.channels.NewGradesChannel @@ -23,6 +24,7 @@ import io.github.wulkanowy.services.sync.channels.NewMessagesChannel import io.github.wulkanowy.services.sync.channels.NewNotesChannel import io.github.wulkanowy.services.sync.channels.NewSchoolAnnouncementsChannel import io.github.wulkanowy.services.sync.channels.PushChannel +import io.github.wulkanowy.services.sync.channels.TimetableChangeChannel import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel import io.github.wulkanowy.services.sync.works.AttendanceSummaryWork import io.github.wulkanowy.services.sync.works.AttendanceWork @@ -167,4 +169,12 @@ abstract class ServicesModule { @Binds @IntoSet abstract fun provideUpcomingLessonsChannel(channel: UpcomingLessonsChannel): Channel + + @Binds + @IntoSet + abstract fun provideChangeTimetableChannel(channel: TimetableChangeChannel): Channel + + @Binds + @IntoSet + abstract fun provideNewAttendanceChannel(channel: NewAttendanceChannel): Channel } diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt index 9ce96ef3f..38ae7884c 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt @@ -15,8 +15,8 @@ import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.services.HiltBroadcastReceiver import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel.Companion.CHANNEL_ID +import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.main.MainActivity -import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.toLocalDateTime @@ -41,7 +41,7 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { const val NOTIFICATION_TYPE_UPCOMING = 2 const val NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION = 3 - const val NOTIFICATION_ID = "id" + const val NOTIFICATION_ID = 2137 const val STUDENT_NAME = "student_name" const val STUDENT_ID = "student_id" @@ -71,11 +71,10 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { private fun prepareNotification(context: Context, intent: Intent) { val type = intent.getIntExtra(LESSON_TYPE, 0) - val notificationId = intent.getIntExtra(NOTIFICATION_ID, MainView.Section.TIMETABLE.id) val isPersistent = preferencesRepository.isUpcomingLessonsNotificationsPersistent if (type == NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION) { - return NotificationManagerCompat.from(context).cancel(notificationId) + return NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID) } val studentId = intent.getIntExtra(STUDENT_ID, 0) @@ -92,7 +91,8 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { Timber.d("TimetableNotification receive: type: $type, subject: $subject, start: ${start.toLocalDateTime()}, student: $studentId") - showNotification(context, notificationId, isPersistent, studentName, + showNotification( + context, isPersistent, studentName, if (type == NOTIFICATION_TYPE_CURRENT) end else start, end - start, context.getString( if (type == NOTIFICATION_TYPE_CURRENT) R.string.timetable_now else R.string.timetable_next, @@ -109,7 +109,6 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { private fun showNotification( context: Context, - notificationId: Int, isPersistent: Boolean, studentName: String?, countDown: Long, @@ -118,7 +117,7 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { next: String? ) { NotificationManagerCompat.from(context) - .notify(notificationId, NotificationCompat.Builder(context, CHANNEL_ID) + .notify(NOTIFICATION_ID, NotificationCompat.Builder(context, CHANNEL_ID) .setContentTitle(title) .setContentText(next) .setAutoCancel(false) @@ -138,8 +137,8 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() { .setContentIntent( PendingIntent.getActivity( context, - MainView.Section.TIMETABLE.id, - MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true), + NOTIFICATION_ID, + MainActivity.getStartIntent(context, Destination.Timetable(), true), FLAG_UPDATE_CURRENT ) ) diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt index 2ec4e527b..28a9b3737 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt @@ -25,7 +25,6 @@ import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companio import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.NOTIFICATION_TYPE_UPCOMING import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_ID import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_NAME -import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.nickOrName import io.github.wulkanowy.utils.toTimestamp @@ -79,7 +78,7 @@ class TimetableNotificationSchedulerHelper @Inject constructor( } fun cancelNotification() = - NotificationManagerCompat.from(context).cancel(MainView.Section.TIMETABLE.id) + NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID) suspend fun scheduleNotifications(lessons: List, student: Student) { if (!preferencesRepository.isUpcomingLessonsNotificationsEnable) { @@ -156,7 +155,6 @@ class TimetableNotificationSchedulerHelper @Inject constructor( AlarmManagerCompat.setExactAndAllowWhileIdle( alarmManager, RTC_WAKEUP, time.toTimestamp(), PendingIntent.getBroadcast(context, getRequestCode(time, studentId), intent.also { - it.putExtra(NOTIFICATION_ID, MainView.Section.TIMETABLE.id) it.putExtra(LESSON_TYPE, notificationType) }, FLAG_UPDATE_CURRENT) ) diff --git a/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt b/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt new file mode 100644 index 000000000..d1c215f26 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt @@ -0,0 +1,90 @@ +package io.github.wulkanowy.services.shortcuts + +import android.content.Context +import android.content.Intent +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.graphics.drawable.IconCompat +import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.R +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ShortcutsHelper @Inject constructor(@ApplicationContext private val context: Context) { + + private val destinations = mapOf( + "grade" to Destination.Grade, + "attendance" to Destination.Attendance, + "exam" to Destination.Exam, + "timetable" to Destination.Timetable() + ) + + init { + initializeShortcuts() + } + + fun getDestination(intent: Intent) = + destinations[intent.getStringExtra(EXTRA_SHORTCUT_DESTINATION_ID)] + + private fun initializeShortcuts() { + val shortcutsInfo = listOf( + ShortcutInfoCompat.Builder(context, "grade_shortcut") + .setShortLabel(context.getString(R.string.grade_title)) + .setLongLabel(context.getString(R.string.grade_title)) + .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_grade)) + .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .apply { + action = Intent.ACTION_VIEW + putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "grade") + } + ) + .build(), + + ShortcutInfoCompat.Builder(context, "attendance_shortcut") + .setShortLabel(context.getString(R.string.attendance_title)) + .setLongLabel(context.getString(R.string.attendance_title)) + .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_attendance)) + .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .apply { + action = Intent.ACTION_VIEW + putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "attendance") + } + ) + .build(), + + ShortcutInfoCompat.Builder(context, "exam_shortcut") + .setShortLabel(context.getString(R.string.exam_title)) + .setLongLabel(context.getString(R.string.exam_title)) + .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_exam)) + .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .apply { + action = Intent.ACTION_VIEW + putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "exam") + } + ) + .build(), + + ShortcutInfoCompat.Builder(context, "timetable_shortcut") + .setShortLabel(context.getString(R.string.timetable_title)) + .setLongLabel(context.getString(R.string.timetable_title)) + .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_timetable)) + .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .apply { + action = Intent.ACTION_VIEW + putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "timetable") + } + ) + .build() + ) + + shortcutsInfo.forEach { ShortcutManagerCompat.pushDynamicShortcut(context, it) } + } + + private companion object { + + private const val EXTRA_SHORTCUT_DESTINATION_ID = "shortcut_destination_id" + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewAttendanceChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewAttendanceChannel.kt new file mode 100644 index 000000000..3110099e5 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewAttendanceChannel.kt @@ -0,0 +1,36 @@ +package io.github.wulkanowy.services.sync.channels + +import android.annotation.TargetApi +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.R +import javax.inject.Inject + +@TargetApi(26) +class NewAttendanceChannel @Inject constructor( + private val notificationManager: NotificationManagerCompat, + @ApplicationContext private val context: Context +) : Channel { + + companion object { + const val CHANNEL_ID = "new_attendance_channel" + } + + override fun create() { + notificationManager.createNotificationChannel( + NotificationChannel( + CHANNEL_ID, + context.getString(R.string.channel_new_attendance), + NotificationManager.IMPORTANCE_HIGH + ) + .apply { + enableLights(true) + enableVibration(true) + lockscreenVisibility = Notification.VISIBILITY_PUBLIC + }) + } +} diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/TimetableChangeChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/TimetableChangeChannel.kt new file mode 100644 index 000000000..10dd3e004 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/TimetableChangeChannel.kt @@ -0,0 +1,36 @@ +package io.github.wulkanowy.services.sync.channels + +import android.annotation.TargetApi +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import androidx.core.app.NotificationManagerCompat +import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.R +import javax.inject.Inject + +@TargetApi(26) +class TimetableChangeChannel @Inject constructor( + private val notificationManager: NotificationManagerCompat, + @ApplicationContext private val context: Context +) : Channel { + + companion object { + const val CHANNEL_ID = "change_timetable_channel" + } + + override fun create() { + notificationManager.createNotificationChannel( + NotificationChannel( + CHANNEL_ID, + context.getString(R.string.channel_change_timetable), + NotificationManager.IMPORTANCE_HIGH + ) + .apply { + enableLights(true) + enableVibration(true) + lockscreenVisibility = Notification.VISIBILITY_PUBLIC + }) + } +} diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt index ddad9bf27..542b9346b 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt @@ -4,19 +4,15 @@ import android.annotation.SuppressLint import android.app.PendingIntent import android.content.Context import android.os.Build -import androidx.annotation.PluralsRes import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Notification import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotificationsData +import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData -import io.github.wulkanowy.data.pojos.OneNotificationData import io.github.wulkanowy.data.repositories.NotificationRepository -import io.github.wulkanowy.ui.modules.main.MainActivity -import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.getCompatBitmap import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.nickOrName @@ -27,102 +23,17 @@ import kotlin.random.Random class AppNotificationManager @Inject constructor( private val notificationManager: NotificationManagerCompat, @ApplicationContext private val context: Context, - private val appInfo: AppInfo, private val notificationRepository: NotificationRepository ) { - suspend fun sendNotification(notificationData: NotificationData, student: Student) = - when (notificationData) { - is OneNotificationData -> sendOneNotification(notificationData, student) - is MultipleNotificationsData -> sendMultipleNotifications(notificationData, student) - } - - private suspend fun sendOneNotification( - notificationData: OneNotificationData, - student: Student - ) { - val content = context.getString( - notificationData.contentStringRes, - *notificationData.contentValues.toTypedArray() - ) - - val title = context.getString(notificationData.titleStringRes) - - val notification = getDefaultNotificationBuilder(notificationData) - .setContentTitle(title) - .setContentText(content) - .setStyle( - NotificationCompat.BigTextStyle() - .setSummaryText(student.nickOrName) - .bigText(content) - ) - .build() - - notificationManager.notify(Random.nextInt(Int.MAX_VALUE), notification) - - saveNotification(title, content, notificationData, student) - } - - private suspend fun sendMultipleNotifications( - notificationData: MultipleNotificationsData, - student: Student - ) { - val groupType = notificationData.type.group ?: return - val group = "${groupType}_${student.id}" - - notificationData.sendSummaryNotification(group, student) - - notificationData.lines.forEach { item -> - val title = context.resources.getQuantityString(notificationData.titleStringRes, 1) - - val notification = getDefaultNotificationBuilder(notificationData) - .setContentTitle(title) - .setContentText(item) - .setStyle( - NotificationCompat.BigTextStyle() - .setSummaryText(student.nickOrName) - .bigText(item) - ) - .setGroup(group) - .build() - - notificationManager.notify(Random.nextInt(Int.MAX_VALUE), notification) - - saveNotification(title, item, notificationData, student) - } - } - - private fun MultipleNotificationsData.sendSummaryNotification(group: String, student: Student) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return - - val summaryNotification = getDefaultNotificationBuilder(this) - .setSmallIcon(icon) - .setContentTitle(getQuantityString(titleStringRes, lines.size)) - .setContentText(getQuantityString(contentStringRes, lines.size)) - .setStyle( - NotificationCompat.InboxStyle() - .setSummaryText(student.nickOrName) - .also { builder -> lines.forEach { builder.addLine(it) } } - ) - .setLocalOnly(true) - .setGroup(group) - .setGroupSummary(true) - .build() - - val groupId = student.id * 100 + type.ordinal - notificationManager.notify(groupId.toInt(), summaryNotification) - } - @SuppressLint("InlinedApi") - private fun getDefaultNotificationBuilder(notificationData: NotificationData): NotificationCompat.Builder { - val pendingIntentsFlags = if (appInfo.systemVersion >= Build.VERSION_CODES.M) { - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - } else { - PendingIntent.FLAG_UPDATE_CURRENT - } - - return NotificationCompat.Builder(context, notificationData.type.channel) - .setLargeIcon(context.getCompatBitmap(notificationData.icon, R.color.colorPrimary)) + suspend fun sendSingleNotification( + notificationData: NotificationData, + notificationType: NotificationType, + student: Student + ) { + val notification = NotificationCompat.Builder(context, notificationType.channel) + .setLargeIcon(context.getCompatBitmap(notificationType.icon, R.color.colorPrimary)) .setSmallIcon(R.drawable.ic_stat_all) .setAutoCancel(true) .setDefaults(NotificationCompat.DEFAULT_ALL) @@ -132,31 +43,122 @@ class AppNotificationManager @Inject constructor( .setContentIntent( PendingIntent.getActivity( context, - notificationData.startMenu.id, - MainActivity.getStartIntent(context, notificationData.startMenu, true), - pendingIntentsFlags + Random.nextInt(), + notificationData.intentToStart, + PendingIntent.FLAG_UPDATE_CURRENT ) ) + .setContentTitle(notificationData.title) + .setContentText(notificationData.content) + .setStyle( + NotificationCompat.BigTextStyle() + .setSummaryText(student.nickOrName) + .bigText(notificationData.content) + ) + .build() + + notificationManager.notify(Random.nextInt(), notification) + saveNotification(notificationData, notificationType, student) + } + + @SuppressLint("InlinedApi") + suspend fun sendMultipleNotifications( + groupNotificationData: GroupNotificationData, + student: Student + ) { + val notificationType = groupNotificationData.type + val groupType = notificationType.group ?: return + val group = "${groupType}_${student.id}" + + sendSummaryNotification(groupNotificationData, group, student) + + groupNotificationData.notificationDataList.forEach { notificationData -> + val notification = NotificationCompat.Builder(context, notificationType.channel) + .setLargeIcon(context.getCompatBitmap(notificationType.icon, R.color.colorPrimary)) + .setSmallIcon(R.drawable.ic_stat_all) + .setAutoCancel(true) + .setDefaults(NotificationCompat.DEFAULT_ALL) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setColor(context.getCompatColor(R.color.colorPrimary)) + .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY) + .setContentIntent( + PendingIntent.getActivity( + context, + Random.nextInt(), + notificationData.intentToStart, + PendingIntent.FLAG_UPDATE_CURRENT + ) + ) + .setContentTitle(notificationData.title) + .setContentText(notificationData.content) + .setStyle( + NotificationCompat.BigTextStyle() + .setSummaryText(student.nickOrName) + .bigText(notificationData.content) + ) + .setGroup(group) + .build() + + notificationManager.notify(Random.nextInt(), notification) + saveNotification(notificationData, groupNotificationData.type, student) + } + } + + private fun sendSummaryNotification( + groupNotificationData: GroupNotificationData, + group: String, + student: Student + ) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return + + val summaryNotification = + NotificationCompat.Builder(context, groupNotificationData.type.channel) + .setContentTitle(groupNotificationData.title) + .setContentText(groupNotificationData.content) + .setSmallIcon(groupNotificationData.type.icon) + .setAutoCancel(true) + .setDefaults(NotificationCompat.DEFAULT_ALL) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setColor(context.getCompatColor(R.color.colorPrimary)) + .setStyle( + NotificationCompat.InboxStyle() + .setSummaryText(student.nickOrName) + .also { builder -> + groupNotificationData.notificationDataList.forEach { + builder.addLine(it.content) + } + } + ) + .setContentIntent( + PendingIntent.getActivity( + context, + Random.nextInt(), + groupNotificationData.intentToStart, + PendingIntent.FLAG_UPDATE_CURRENT + ) + ) + .setLocalOnly(true) + .setGroup(group) + .setGroupSummary(true) + .build() + + val groupId = student.id * 100 + groupNotificationData.type.ordinal + notificationManager.notify(groupId.toInt(), summaryNotification) } private suspend fun saveNotification( - title: String, - content: String, notificationData: NotificationData, + notificationType: NotificationType, student: Student ) { val notificationEntity = Notification( studentId = student.id, - title = title, - content = content, - type = notificationData.type, + title = notificationData.title, + content = notificationData.content, + type = notificationType, date = LocalDateTime.now() ) notificationRepository.saveNotification(notificationEntity) } - - private fun getQuantityString(@PluralsRes res: Int, arg: Int): String { - return context.resources.getQuantityString(res, arg, arg) - } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt new file mode 100644 index 000000000..6d2d3a59f --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt @@ -0,0 +1,125 @@ +package io.github.wulkanowy.services.sync.notifications + +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.Timetable +import io.github.wulkanowy.data.pojos.GroupNotificationData +import io.github.wulkanowy.data.pojos.NotificationData +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.getPlural +import io.github.wulkanowy.utils.toFormattedString +import java.time.LocalDate +import java.time.LocalDateTime +import javax.inject.Inject + +class ChangeTimetableNotification @Inject constructor( + private val appNotificationManager: AppNotificationManager, + @ApplicationContext private val context: Context, +) { + + suspend fun notify(items: List, student: Student) { + val currentTime = LocalDateTime.now() + val changedLessons = items.filter { (it.canceled || it.changes) && it.start > currentTime } + val notificationDataList = changedLessons.groupBy { it.date } + .map { (date, lessons) -> + getNotificationContents(date, lessons).map { + NotificationData( + title = context.getPlural( + R.plurals.timetable_notify_new_items_title, + 1 + ), + content = it, + intentToStart = MainActivity.getStartIntent( + context = context, + destination = Destination.Timetable(date), + startNewTask = true + ) + ) + } + } + .flatten() + .ifEmpty { return } + + val groupNotificationData = GroupNotificationData( + notificationDataList = notificationDataList, + title = context.getPlural( + R.plurals.timetable_notify_new_items_title, + changedLessons.size + ), + content = context.getPlural( + R.plurals.timetable_notify_new_items_group, + changedLessons.size, + changedLessons.size + ), + intentToStart = MainActivity.getStartIntent(context, Destination.Timetable(), true), + type = NotificationType.CHANGE_TIMETABLE + ) + + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) + } + + private fun getNotificationContents(date: LocalDate, lessons: List): List { + val formattedDate = date.toFormattedString("EEE dd.MM") + + return if (lessons.size > 2) { + listOf( + context.getPlural( + R.plurals.timetable_notify_new_items, + lessons.size, + formattedDate, + lessons.size, + ) + ) + } else { + lessons.map { + buildString { + append( + context.getString( + R.string.timetable_notify_lesson, + formattedDate, + it.number, + it.subject + ) + ) + if (it.roomOld.isNotBlank()) { + appendLine() + append( + context.getString( + R.string.timetable_notify_change_room, + it.roomOld, + it.room + ) + ) + } + if (it.teacherOld.isNotBlank() && it.teacher != it.teacherOld) { + appendLine() + append( + context.getString( + R.string.timetable_notify_change_teacher, + it.teacherOld, + it.teacher + ) + ) + } + if (it.subjectOld.isNotBlank()) { + appendLine() + append( + context.getString( + R.string.timetable_notify_change_subject, + it.subjectOld, + it.subject + ) + ) + } + if (it.info.isNotBlank()) { + appendLine() + append(it.info) + } + } + } + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt new file mode 100644 index 000000000..695552721 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt @@ -0,0 +1,55 @@ +package io.github.wulkanowy.services.sync.notifications + +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Attendance +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.pojos.GroupNotificationData +import io.github.wulkanowy.data.pojos.NotificationData +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.descriptionRes +import io.github.wulkanowy.utils.getPlural +import io.github.wulkanowy.utils.toFormattedString +import javax.inject.Inject + +class NewAttendanceNotification @Inject constructor( + private val appNotificationManager: AppNotificationManager, + @ApplicationContext private val context: Context +) { + + suspend fun notify(items: List, student: Student) { + val lines = items.filterNot { it.presence || it.name == "UNKNOWN" } + .map { + val description = context.getString(it.descriptionRes) + "${it.date.toFormattedString("dd.MM")} - ${it.subject}: $description" + } + .ifEmpty { return } + + val notificationDataList = lines.map { + NotificationData( + title = context.getPlural(R.plurals.attendance_notify_new_items_title, 1), + content = it, + intentToStart = MainActivity.getStartIntent(context, Destination.Attendance, true) + ) + } + + val groupNotificationData = GroupNotificationData( + notificationDataList = notificationDataList, + title = context.getPlural( + R.plurals.attendance_notify_new_items_title, + notificationDataList.size + ), + content = context.getPlural( + R.plurals.attendance_notify_new_items, + notificationDataList.size, + notificationDataList.size + ), + intentToStart = MainActivity.getStartIntent(context, Destination.Attendance, true), + type = NotificationType.NEW_ATTENDANCE + ) + + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) + } +} diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt index 994cb8d4b..97b1332d8 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt @@ -1,34 +1,52 @@ package io.github.wulkanowy.services.sync.notifications +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Conference import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotificationsData -import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.data.pojos.GroupNotificationData +import io.github.wulkanowy.data.pojos.NotificationData +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDateTime import javax.inject.Inject class NewConferenceNotification @Inject constructor( - private val appNotificationManager: AppNotificationManager + private val appNotificationManager: AppNotificationManager, + @ApplicationContext private val context: Context ) { suspend fun notify(items: List, student: Student) { val today = LocalDateTime.now() - val lines = items.filter { !it.date.isBefore(today) }.map { - "${it.date.toFormattedString("dd.MM")} - ${it.title}: ${it.subject}" - }.ifEmpty { return } + val lines = items.filter { !it.date.isBefore(today) } + .map { + "${it.date.toFormattedString("dd.MM")} - ${it.title}: ${it.subject}" + } + .ifEmpty { return } - val notification = MultipleNotificationsData( - type = NotificationType.NEW_CONFERENCE, - icon = R.drawable.ic_more_conferences, - titleStringRes = R.plurals.conference_notify_new_item_title, - contentStringRes = R.plurals.conference_notify_new_items, - summaryStringRes = R.plurals.conference_number_item, - startMenu = MainView.Section.CONFERENCE, - lines = lines + val notificationDataList = lines.map { + NotificationData( + title = context.getPlural(R.plurals.conference_notify_new_item_title, 1), + content = it, + intentToStart = MainActivity.getStartIntent(context, Destination.Conference, true) + ) + } + + val groupNotificationData = GroupNotificationData( + notificationDataList = notificationDataList, + title = context.getPlural(R.plurals.conference_notify_new_item_title, lines.size), + content = context.getPlural( + R.plurals.conference_notify_new_items, + lines.size, + lines.size + ), + intentToStart = MainActivity.getStartIntent(context, Destination.Conference, true), + type = NotificationType.NEW_CONFERENCE ) - appNotificationManager.sendNotification(notification, student) + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt index f148fa34f..6f8ed8961 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt @@ -1,34 +1,52 @@ package io.github.wulkanowy.services.sync.notifications +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotificationsData -import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.data.pojos.GroupNotificationData +import io.github.wulkanowy.data.pojos.NotificationData +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDate import javax.inject.Inject class NewExamNotification @Inject constructor( - private val appNotificationManager: AppNotificationManager + private val appNotificationManager: AppNotificationManager, + @ApplicationContext private val context: Context ) { suspend fun notify(items: List, student: Student) { val today = LocalDate.now() - val lines = items.filter { !it.date.isBefore(today) }.map { - "${it.date.toFormattedString("dd.MM")} - ${it.subject}: ${it.description}" - }.ifEmpty { return } + val lines = items.filter { !it.date.isBefore(today) } + .map { + "${it.date.toFormattedString("dd.MM")} - ${it.subject}: ${it.description}" + } + .ifEmpty { return } - val notification = MultipleNotificationsData( - type = NotificationType.NEW_EXAM, - icon = R.drawable.ic_main_exam, - titleStringRes = R.plurals.exam_notify_new_item_title, - contentStringRes = R.plurals.exam_notify_new_item_content, - summaryStringRes = R.plurals.exam_number_item, - startMenu = MainView.Section.EXAM, - lines = lines + val notificationDataList = lines.map { + NotificationData( + title = context.getPlural(R.plurals.exam_notify_new_item_title, 1), + content = it, + intentToStart = MainActivity.getStartIntent(context, Destination.Exam, true), + ) + } + + val groupNotificationData = GroupNotificationData( + notificationDataList = notificationDataList, + title = context.getPlural(R.plurals.exam_notify_new_item_title, lines.size), + content = context.getPlural( + R.plurals.exam_notify_new_item_content, + lines.size, + lines.size + ), + intentToStart = MainActivity.getStartIntent(context, Destination.Exam, true), + type = NotificationType.NEW_EXAM ) - appNotificationManager.sendNotification(notification, student) + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt index 52bdff588..09692fb7c 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt @@ -1,62 +1,88 @@ package io.github.wulkanowy.services.sync.notifications +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotificationsData -import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.data.pojos.GroupNotificationData +import io.github.wulkanowy.data.pojos.NotificationData +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.getPlural import javax.inject.Inject class NewGradeNotification @Inject constructor( - private val appNotificationManager: AppNotificationManager + private val appNotificationManager: AppNotificationManager, + @ApplicationContext private val context: Context ) { suspend fun notifyDetails(items: List, student: Student) { - val notification = MultipleNotificationsData( - type = NotificationType.NEW_GRADE_DETAILS, - icon = R.drawable.ic_stat_grade, - titleStringRes = R.plurals.grade_new_items, - contentStringRes = R.plurals.grade_notify_new_items, - summaryStringRes = R.plurals.grade_number_item, - startMenu = MainView.Section.GRADE, - lines = items.map { - "${it.subject}: ${it.entry}" - } + val notificationDataList = items.map { + NotificationData( + title = context.getPlural(R.plurals.grade_new_items, 1), + content = "${it.subject}: ${it.entry}", + intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + ) + } + + val groupNotificationData = GroupNotificationData( + notificationDataList = notificationDataList, + title = context.getPlural(R.plurals.grade_new_items, items.size), + content = context.getPlural(R.plurals.grade_notify_new_items, items.size, items.size), + intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + type = NotificationType.NEW_GRADE_DETAILS ) - appNotificationManager.sendNotification(notification, student) + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) } suspend fun notifyPredicted(items: List, student: Student) { - val notification = MultipleNotificationsData( - type = NotificationType.NEW_GRADE_PREDICTED, - icon = R.drawable.ic_stat_grade, - titleStringRes = R.plurals.grade_new_items_predicted, - contentStringRes = R.plurals.grade_notify_new_items_predicted, - summaryStringRes = R.plurals.grade_number_item, - startMenu = MainView.Section.GRADE, - lines = items.map { - "${it.subject}: ${it.predictedGrade}" - } + val notificationDataList = items.map { + NotificationData( + title = context.getPlural(R.plurals.grade_new_items_predicted, 1), + content = "${it.subject}: ${it.predictedGrade}", + intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + ) + } + + val groupNotificationData = GroupNotificationData( + notificationDataList = notificationDataList, + title = context.getPlural(R.plurals.grade_new_items_predicted, items.size), + content = context.getPlural( + R.plurals.grade_notify_new_items_predicted, + items.size, + items.size + ), + intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + type = NotificationType.NEW_GRADE_PREDICTED ) - appNotificationManager.sendNotification(notification, student) + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) } suspend fun notifyFinal(items: List, student: Student) { - val notification = MultipleNotificationsData( - type = NotificationType.NEW_GRADE_FINAL, - icon = R.drawable.ic_stat_grade, - titleStringRes = R.plurals.grade_new_items_final, - contentStringRes = R.plurals.grade_notify_new_items_final, - summaryStringRes = R.plurals.grade_number_item, - startMenu = MainView.Section.GRADE, - lines = items.map { - "${it.subject}: ${it.finalGrade}" - } + val notificationDataList = items.map { + NotificationData( + title = context.getPlural(R.plurals.grade_new_items_final, 1), + content = "${it.subject}: ${it.finalGrade}", + intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + ) + } + + val groupNotificationData = GroupNotificationData( + notificationDataList = notificationDataList, + title = context.getPlural(R.plurals.grade_new_items_final, items.size), + content = context.getPlural( + R.plurals.grade_notify_new_items_final, + items.size, + items.size + ), + intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + type = NotificationType.NEW_GRADE_FINAL ) - appNotificationManager.sendNotification(notification, student) + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt index 4c34cb8ff..cdada844e 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt @@ -1,34 +1,52 @@ package io.github.wulkanowy.services.sync.notifications +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotificationsData -import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.data.pojos.GroupNotificationData +import io.github.wulkanowy.data.pojos.NotificationData +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDate import javax.inject.Inject class NewHomeworkNotification @Inject constructor( - private val appNotificationManager: AppNotificationManager + private val appNotificationManager: AppNotificationManager, + @ApplicationContext private val context: Context ) { suspend fun notify(items: List, student: Student) { val today = LocalDate.now() - val lines = items.filter { !it.date.isBefore(today) }.map { - "${it.date.toFormattedString("dd.MM")} - ${it.subject}: ${it.content}" - }.ifEmpty { return } + val lines = items.filter { !it.date.isBefore(today) } + .map { + "${it.date.toFormattedString("dd.MM")} - ${it.subject}: ${it.content}" + } + .ifEmpty { return } - val notification = MultipleNotificationsData( + val notificationDataList = lines.map { + NotificationData( + title = context.getPlural(R.plurals.homework_notify_new_item_title, 1), + content = it, + intentToStart = MainActivity.getStartIntent(context, Destination.Homework, true), + ) + } + + val groupNotificationData = GroupNotificationData( + title = context.getPlural(R.plurals.homework_notify_new_item_title, lines.size), + content = context.getPlural( + R.plurals.homework_notify_new_item_content, + lines.size, + lines.size + ), + intentToStart = MainActivity.getStartIntent(context, Destination.Homework, true), type = NotificationType.NEW_HOMEWORK, - icon = R.drawable.ic_more_homework, - titleStringRes = R.plurals.homework_notify_new_item_title, - contentStringRes = R.plurals.homework_notify_new_item_content, - summaryStringRes = R.plurals.homework_number_item, - startMenu = MainView.Section.HOMEWORK, - lines = lines + notificationDataList = notificationDataList ) - appNotificationManager.sendNotification(notification, student) + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt index 08c985106..d9f138b5c 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt @@ -1,26 +1,34 @@ package io.github.wulkanowy.services.sync.notifications +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.OneNotificationData -import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.data.pojos.NotificationData +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity import javax.inject.Inject class NewLuckyNumberNotification @Inject constructor( - private val appNotificationManager: AppNotificationManager + private val appNotificationManager: AppNotificationManager, + @ApplicationContext private val context: Context ) { - suspend fun notify(item: LuckyNumber, student: Student) { - val notification = OneNotificationData( - type = NotificationType.NEW_LUCKY_NUMBER, - icon = R.drawable.ic_stat_luckynumber, - titleStringRes = R.string.lucky_number_notify_new_item_title, - contentStringRes = R.string.lucky_number_notify_new_item, - startMenu = MainView.Section.LUCKY_NUMBER, - contentValues = listOf(item.luckyNumber.toString()) - ) + suspend fun notify(item: LuckyNumber, student: Student) { + val notificationData = NotificationData( + title = context.getString(R.string.lucky_number_notify_new_item_title), + content = context.getString( + R.string.lucky_number_notify_new_item, + item.luckyNumber.toString() + ), + intentToStart = MainActivity.getStartIntent(context, Destination.LuckyNumber, true) + ) - appNotificationManager.sendNotification(notification, student) + appNotificationManager.sendSingleNotification( + notificationData = notificationData, + notificationType = NotificationType.NEW_LUCKY_NUMBER, + student = student + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt index a6d503aa0..cdb5ab9c8 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt @@ -1,29 +1,39 @@ package io.github.wulkanowy.services.sync.notifications +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotificationsData -import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.data.pojos.GroupNotificationData +import io.github.wulkanowy.data.pojos.NotificationData +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.getPlural import javax.inject.Inject class NewMessageNotification @Inject constructor( - private val appNotificationManager: AppNotificationManager + private val appNotificationManager: AppNotificationManager, + @ApplicationContext private val context: Context ) { suspend fun notify(items: List, student: Student) { - val notification = MultipleNotificationsData( - type = NotificationType.NEW_MESSAGE, - icon = R.drawable.ic_stat_message, - titleStringRes = R.plurals.message_new_items, - contentStringRes = R.plurals.message_notify_new_items, - summaryStringRes = R.plurals.message_number_item, - startMenu = MainView.Section.MESSAGE, - lines = items.map { - "${it.sender}: ${it.subject}" - } + val notificationDataList = items.map { + NotificationData( + title = context.getPlural(R.plurals.message_new_items, 1), + content = "${it.sender}: ${it.subject}", + intentToStart = MainActivity.getStartIntent(context, Destination.Message, true), + ) + } + + val groupNotificationData = GroupNotificationData( + notificationDataList = notificationDataList, + title = context.getPlural(R.plurals.message_new_items, items.size), + content = context.getPlural(R.plurals.message_notify_new_items, items.size, items.size), + intentToStart = MainActivity.getStartIntent(context, Destination.Message, true), + type = NotificationType.NEW_MESSAGE ) - appNotificationManager.sendNotification(notification, student) + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt index ffa3cc9cb..16be1ca50 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt @@ -1,42 +1,46 @@ package io.github.wulkanowy.services.sync.notifications +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotificationsData +import io.github.wulkanowy.data.pojos.GroupNotificationData +import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory -import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.getPlural import javax.inject.Inject class NewNoteNotification @Inject constructor( - private val appNotificationManager: AppNotificationManager + private val appNotificationManager: AppNotificationManager, + @ApplicationContext private val context: Context ) { suspend fun notify(items: List, student: Student) { - val notification = MultipleNotificationsData( - type = NotificationType.NEW_NOTE, - icon = R.drawable.ic_stat_note, - titleStringRes = when (NoteCategory.getByValue(items.first().categoryType)) { + val notificationDataList = items.map { + val titleRes = when (NoteCategory.getByValue(it.categoryType)) { NoteCategory.POSITIVE -> R.plurals.praise_new_items NoteCategory.NEUTRAL -> R.plurals.neutral_note_new_items else -> R.plurals.note_new_items - }, - contentStringRes = when (NoteCategory.getByValue(items.first().categoryType)) { - NoteCategory.POSITIVE -> R.plurals.praise_notify_new_items - NoteCategory.NEUTRAL -> R.plurals.neutral_note_notify_new_items - else -> R.plurals.note_notify_new_items - }, - summaryStringRes = when (NoteCategory.getByValue(items.first().categoryType)) { - NoteCategory.POSITIVE -> R.plurals.praise_number_item - NoteCategory.NEUTRAL -> R.plurals.neutral_note_number_item - else -> R.plurals.note_number_item - }, - startMenu = MainView.Section.NOTE, - lines = items.map { - "${it.teacher}: ${it.category}" } + + NotificationData( + title = context.getPlural(titleRes, 1), + content = "${it.teacher}: ${it.category}", + intentToStart = MainActivity.getStartIntent(context, Destination.Note, true), + ) + } + + val groupNotificationData = GroupNotificationData( + notificationDataList = notificationDataList, + intentToStart = MainActivity.getStartIntent(context, Destination.Note, true), + title = context.getPlural(R.plurals.note_new_items, items.size), + content = context.getPlural(R.plurals.note_notify_new_items, items.size, items.size), + type = NotificationType.NEW_NOTE ) - appNotificationManager.sendNotification(notification, student) + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt index 990a950b1..1f603624b 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt @@ -1,29 +1,56 @@ package io.github.wulkanowy.services.sync.notifications +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.SchoolAnnouncement import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.pojos.MultipleNotificationsData -import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.data.pojos.GroupNotificationData +import io.github.wulkanowy.data.pojos.NotificationData +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.utils.getPlural import javax.inject.Inject class NewSchoolAnnouncementNotification @Inject constructor( - private val appNotificationManager: AppNotificationManager + private val appNotificationManager: AppNotificationManager, + @ApplicationContext private val context: Context ) { - suspend fun notify(items: List, student: Student) { - val notification = MultipleNotificationsData( - type = NotificationType.NEW_ANNOUNCEMENT, - icon = R.drawable.ic_all_about, - titleStringRes = R.plurals.school_announcement_notify_new_item_title, - contentStringRes = R.plurals.school_announcement_notify_new_items, - summaryStringRes = R.plurals.school_announcement_number_item, - startMenu = MainView.Section.SCHOOL_ANNOUNCEMENT, - lines = items.map { - "${it.subject}: ${it.content}" - } + suspend fun notify(items: List, student: Student) { + val notificationDataList = items.map { + NotificationData( + intentToStart = MainActivity.getStartIntent( + context = context, + destination = Destination.SchoolAnnouncement, + startNewTask = true + ), + title = context.getPlural( + R.plurals.school_announcement_notify_new_item_title, + 1 + ), + content = "${it.subject}: ${it.content}" + ) + } + val groupNotificationData = GroupNotificationData( + type = NotificationType.NEW_ANNOUNCEMENT, + intentToStart = MainActivity.getStartIntent( + context = context, + destination = Destination.SchoolAnnouncement, + startNewTask = true + ), + title = context.getPlural( + R.plurals.school_announcement_notify_new_item_title, + items.size + ), + content = context.getPlural( + R.plurals.school_announcement_notify_new_items, + items.size, + items.size + ), + notificationDataList = notificationDataList ) - appNotificationManager.sendNotification(notification, student) + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt index 49cbcfe9e..af79fcd2a 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt @@ -1,6 +1,8 @@ package io.github.wulkanowy.services.sync.notifications +import io.github.wulkanowy.R import io.github.wulkanowy.services.sync.channels.LuckyNumberChannel +import io.github.wulkanowy.services.sync.channels.NewAttendanceChannel import io.github.wulkanowy.services.sync.channels.NewConferencesChannel import io.github.wulkanowy.services.sync.channels.NewExamChannel import io.github.wulkanowy.services.sync.channels.NewGradesChannel @@ -9,17 +11,76 @@ import io.github.wulkanowy.services.sync.channels.NewMessagesChannel import io.github.wulkanowy.services.sync.channels.NewNotesChannel import io.github.wulkanowy.services.sync.channels.NewSchoolAnnouncementsChannel import io.github.wulkanowy.services.sync.channels.PushChannel +import io.github.wulkanowy.services.sync.channels.TimetableChangeChannel -enum class NotificationType(val group: String?, val channel: String) { - NEW_CONFERENCE("new_conferences_group", NewConferencesChannel.CHANNEL_ID), - NEW_EXAM("new_exam_group", NewExamChannel.CHANNEL_ID), - NEW_GRADE_DETAILS("new_grade_details_group", NewGradesChannel.CHANNEL_ID), - NEW_GRADE_PREDICTED("new_grade_predicted_group", NewGradesChannel.CHANNEL_ID), - NEW_GRADE_FINAL("new_grade_final_group", NewGradesChannel.CHANNEL_ID), - NEW_HOMEWORK("new_homework_group", NewHomeworkChannel.CHANNEL_ID), - NEW_LUCKY_NUMBER("lucky_number_group", LuckyNumberChannel.CHANNEL_ID), - NEW_MESSAGE("new_message_group", NewMessagesChannel.CHANNEL_ID), - NEW_NOTE("new_notes_group", NewNotesChannel.CHANNEL_ID), - NEW_ANNOUNCEMENT("new_school_announcements_group", NewSchoolAnnouncementsChannel.CHANNEL_ID), - PUSH(null, PushChannel.CHANNEL_ID) +enum class NotificationType( + val group: String?, + val channel: String, + val icon: Int +) { + NEW_CONFERENCE( + group = "new_conferences_group", + channel = NewConferencesChannel.CHANNEL_ID, + icon = R.drawable.ic_more_conferences, + ), + NEW_EXAM( + group = "new_exam_group", + channel = NewExamChannel.CHANNEL_ID, + icon = R.drawable.ic_main_exam + ), + NEW_GRADE_DETAILS( + group = "new_grade_details_group", + channel = NewGradesChannel.CHANNEL_ID, + icon = R.drawable.ic_stat_grade, + ), + NEW_GRADE_PREDICTED( + group = "new_grade_predicted_group", + channel = NewGradesChannel.CHANNEL_ID, + icon = R.drawable.ic_stat_grade, + ), + NEW_GRADE_FINAL( + group = "new_grade_final_group", + channel = NewGradesChannel.CHANNEL_ID, + icon = R.drawable.ic_stat_grade, + ), + NEW_HOMEWORK( + group = "new_homework_group", + channel = NewHomeworkChannel.CHANNEL_ID, + icon = R.drawable.ic_more_homework, + ), + NEW_LUCKY_NUMBER( + group = null, + channel = LuckyNumberChannel.CHANNEL_ID, + icon = R.drawable.ic_stat_luckynumber, + ), + NEW_MESSAGE( + group = "new_message_group", + channel = NewMessagesChannel.CHANNEL_ID, + icon = R.drawable.ic_stat_message, + ), + NEW_NOTE( + group = "new_notes_group", + channel = NewNotesChannel.CHANNEL_ID, + icon = R.drawable.ic_stat_note + ), + NEW_ANNOUNCEMENT( + group = "new_school_announcements_group", + channel = NewSchoolAnnouncementsChannel.CHANNEL_ID, + icon = R.drawable.ic_all_about + ), + CHANGE_TIMETABLE( + group = "change_timetable_group", + channel = TimetableChangeChannel.CHANNEL_ID, + icon = R.drawable.ic_main_timetable + ), + NEW_ATTENDANCE( + group = "new_attendance_group", + channel = NewAttendanceChannel.CHANNEL_ID, + icon = R.drawable.ic_main_attendance + ), + PUSH( + group = null, + channel = PushChannel.CHANNEL_ID, + icon = R.drawable.ic_stat_all + ) } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt index 4823b2b5b..f7b680e31 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt @@ -3,18 +3,40 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.AttendanceRepository -import io.github.wulkanowy.utils.monday -import io.github.wulkanowy.utils.sunday +import io.github.wulkanowy.data.repositories.PreferencesRepository +import io.github.wulkanowy.services.sync.notifications.NewAttendanceNotification +import io.github.wulkanowy.utils.previousOrSameSchoolDay import io.github.wulkanowy.utils.waitForResult +import kotlinx.coroutines.flow.first import java.time.LocalDate.now import javax.inject.Inject class AttendanceWork @Inject constructor( - private val attendanceRepository: AttendanceRepository + private val attendanceRepository: AttendanceRepository, + private val newAttendanceNotification: NewAttendanceNotification, + private val preferencesRepository: PreferencesRepository ) : Work { override suspend fun doWork(student: Student, semester: Semester) { - attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true) + attendanceRepository.getAttendance( + student = student, + semester = semester, + start = now().previousOrSameSchoolDay, + end = now().previousOrSameSchoolDay, + forceRefresh = true, + notify = preferencesRepository.isNotificationsEnable + ) .waitForResult() + + attendanceRepository.getAttendanceFromDatabase(semester, now().minusDays(7), now()) + .first() + .filterNot { it.isNotified } + .let { + if (it.isNotEmpty()) newAttendanceNotification.notify(it, student) + + attendanceRepository.updateTimetable(it.onEach { attendance -> + attendance.isNotified = true + }) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt index 2df2c9dcb..fcc330638 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt @@ -2,18 +2,41 @@ package io.github.wulkanowy.services.sync.works import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.TimetableRepository -import io.github.wulkanowy.utils.monday -import io.github.wulkanowy.utils.sunday +import io.github.wulkanowy.services.sync.notifications.ChangeTimetableNotification +import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.waitForResult +import kotlinx.coroutines.flow.first import java.time.LocalDate.now import javax.inject.Inject class TimetableWork @Inject constructor( - private val timetableRepository: TimetableRepository + private val timetableRepository: TimetableRepository, + private val changeTimetableNotification: ChangeTimetableNotification, + private val preferencesRepository: PreferencesRepository ) : Work { override suspend fun doWork(student: Student, semester: Semester) { - timetableRepository.getTimetable(student, semester, now().monday, now().sunday, true).waitForResult() + timetableRepository.getTimetable( + student = student, + semester = semester, + start = now().nextOrSameSchoolDay, + end = now().nextOrSameSchoolDay, + forceRefresh = true, + notify = preferencesRepository.isNotificationsEnable + ) + .waitForResult() + + timetableRepository.getTimetableFromDatabase(semester, now(), now().plusDays(7)) + .first() + .filterNot { it.isNotified } + .let { + if (it.isNotEmpty()) changeTimetableNotification.notify(it, student) + + timetableRepository.updateTimetable(it.onEach { timetable -> + timetable.isNotified = true + }) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt new file mode 100644 index 000000000..0406afa41 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt @@ -0,0 +1,132 @@ +package io.github.wulkanowy.ui.modules + +import androidx.fragment.app.Fragment +import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment +import io.github.wulkanowy.ui.modules.conference.ConferenceFragment +import io.github.wulkanowy.ui.modules.dashboard.DashboardFragment +import io.github.wulkanowy.ui.modules.exam.ExamFragment +import io.github.wulkanowy.ui.modules.grade.GradeFragment +import io.github.wulkanowy.ui.modules.homework.HomeworkFragment +import io.github.wulkanowy.ui.modules.luckynumber.LuckyNumberFragment +import io.github.wulkanowy.ui.modules.message.MessageFragment +import io.github.wulkanowy.ui.modules.more.MoreFragment +import io.github.wulkanowy.ui.modules.note.NoteFragment +import io.github.wulkanowy.ui.modules.schoolandteachers.school.SchoolFragment +import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragment +import io.github.wulkanowy.ui.modules.timetable.TimetableFragment +import java.io.Serializable +import java.time.LocalDate + +sealed interface Destination : Serializable { + + val type: Type + + val fragment: Fragment + + enum class Type(val defaultDestination: Destination) { + DASHBOARD(Dashboard), + GRADE(Grade), + ATTENDANCE(Attendance), + EXAM(Exam), + TIMETABLE(Timetable()), + HOMEWORK(Homework), + NOTE(Note), + CONFERENCE(Conference), + SCHOOL_ANNOUNCEMENT(SchoolAnnouncement), + SCHOOL(School), + LUCKY_NUMBER(More), + MORE(More), + MESSAGE(Message); + } + + object Dashboard : Destination { + + override val type = Type.DASHBOARD + + override val fragment get() = DashboardFragment.newInstance() + } + + object Grade : Destination { + + override val type = Type.GRADE + + override val fragment get() = GradeFragment.newInstance() + } + + object Attendance : Destination { + + override val type = Type.ATTENDANCE + + override val fragment get() = AttendanceFragment.newInstance() + } + + object Exam : Destination { + + override val type = Type.EXAM + + override val fragment get() = ExamFragment.newInstance() + } + + data class Timetable(val date: LocalDate? = null) : Destination { + + override val type = Type.TIMETABLE + + override val fragment get() = TimetableFragment.newInstance(date) + } + + object Homework : Destination { + + override val type = Type.HOMEWORK + + override val fragment get() = HomeworkFragment.newInstance() + } + + object Note : Destination { + + override val type = Type.NOTE + + override val fragment get() = NoteFragment.newInstance() + } + + object Conference : Destination { + + override val type = Type.CONFERENCE + + override val fragment get() = ConferenceFragment.newInstance() + } + + object SchoolAnnouncement : Destination { + + override val type = Type.SCHOOL_ANNOUNCEMENT + + override val fragment get() = SchoolAnnouncementFragment.newInstance() + } + + object School : Destination { + + override val type = Type.SCHOOL + + override val fragment get() = SchoolFragment.newInstance() + } + + object LuckyNumber : Destination { + + override val type = Type.LUCKY_NUMBER + + override val fragment get() = LuckyNumberFragment.newInstance() + } + + object More : Destination { + + override val type = Type.MORE + + override val fragment get() = MoreFragment.newInstance() + } + + object Message : Destination { + + override val type = Type.MESSAGE + + override val fragment get() = MessageFragment.newInstance() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt index bb4f70224..5d5ed504c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt @@ -9,7 +9,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.enums.SentExcuseStatus import io.github.wulkanowy.databinding.ItemAttendanceBinding -import io.github.wulkanowy.utils.description +import io.github.wulkanowy.utils.descriptionRes import io.github.wulkanowy.utils.isExcusableOrNotExcused import javax.inject.Inject @@ -36,7 +36,7 @@ class AttendanceAdapter @Inject constructor() : with(holder.binding) { attendanceItemNumber.text = item.number.toString() attendanceItemSubject.text = item.subject - attendanceItemDescription.setText(item.description) + attendanceItemDescription.setText(item.descriptionRes) attendanceItemAlert.visibility = item.run { if (absence && !excused) View.VISIBLE else View.INVISIBLE } attendanceItemNumber.visibility = View.GONE attendanceItemExcuseInfo.visibility = View.GONE diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt index d816d8f00..9b5c63e4c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt @@ -7,7 +7,7 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.databinding.DialogAttendanceBinding -import io.github.wulkanowy.utils.description +import io.github.wulkanowy.utils.descriptionRes import io.github.wulkanowy.utils.lifecycleAwareVariable import io.github.wulkanowy.utils.toFormattedString @@ -45,7 +45,7 @@ class AttendanceDialog : DialogFragment() { with(binding) { attendanceDialogSubjectValue.text = attendance.subject - attendanceDialogDescriptionValue.setText(attendance.description) + attendanceDialogDescriptionValue.setText(attendance.descriptionRes) attendanceDialogDateValue.text = attendance.date.toFormattedString() attendanceDialogNumberValue.text = attendance.number.toString() attendanceDialogClose.setOnClickListener { dismiss() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt index 26eca18fd..d0dfcd696 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt @@ -3,6 +3,8 @@ package io.github.wulkanowy.ui.modules.debug.notification import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.StudentRepository +import io.github.wulkanowy.services.sync.notifications.ChangeTimetableNotification +import io.github.wulkanowy.services.sync.notifications.NewAttendanceNotification import io.github.wulkanowy.services.sync.notifications.NewConferenceNotification import io.github.wulkanowy.services.sync.notifications.NewExamNotification import io.github.wulkanowy.services.sync.notifications.NewGradeNotification @@ -13,6 +15,7 @@ import io.github.wulkanowy.services.sync.notifications.NewNoteNotification import io.github.wulkanowy.services.sync.notifications.NewSchoolAnnouncementNotification import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler +import io.github.wulkanowy.ui.modules.debug.notification.mock.debugAttendanceItems import io.github.wulkanowy.ui.modules.debug.notification.mock.debugConferenceItems import io.github.wulkanowy.ui.modules.debug.notification.mock.debugExamItems import io.github.wulkanowy.ui.modules.debug.notification.mock.debugGradeDetailsItems @@ -22,6 +25,7 @@ import io.github.wulkanowy.ui.modules.debug.notification.mock.debugLuckyNumber import io.github.wulkanowy.ui.modules.debug.notification.mock.debugMessageItems import io.github.wulkanowy.ui.modules.debug.notification.mock.debugNoteItems import io.github.wulkanowy.ui.modules.debug.notification.mock.debugSchoolAnnouncementItems +import io.github.wulkanowy.ui.modules.debug.notification.mock.debugTimetableItems import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject @@ -37,6 +41,8 @@ class NotificationDebugPresenter @Inject constructor( private val newNoteNotification: NewNoteNotification, private val newSchoolAnnouncementNotification: NewSchoolAnnouncementNotification, private val newLuckyNumberNotification: NewLuckyNumberNotification, + private val changeTimetableNotification: ChangeTimetableNotification, + private val newAttendanceNotification: NewAttendanceNotification, ) : BasePresenter(errorHandler, studentRepository) { private val items = listOf( @@ -64,6 +70,12 @@ class NotificationDebugPresenter @Inject constructor( NotificationDebugItem(R.string.note_title) { n -> withStudent { newNoteNotification.notify(debugNoteItems.take(n), it) } }, + NotificationDebugItem(R.string.attendance_title) { n -> + withStudent { newAttendanceNotification.notify(debugAttendanceItems.take(n), it) } + }, + NotificationDebugItem(R.string.timetable_title) { n -> + withStudent { changeTimetableNotification.notify(debugTimetableItems.take(n), it) } + }, NotificationDebugItem(R.string.school_announcement_title) { n -> withStudent { newSchoolAnnouncementNotification.notify(debugSchoolAnnouncementItems.take(n), it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/attendance.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/attendance.kt new file mode 100644 index 000000000..042cf07e7 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/attendance.kt @@ -0,0 +1,35 @@ +package io.github.wulkanowy.ui.modules.debug.notification.mock + +import io.github.wulkanowy.data.db.entities.Attendance +import java.time.LocalDate + +val debugAttendanceItems = listOf( + generateAttendance("Matematyka", "PRESENCE"), + generateAttendance("Język angielski", "UNEXCUSED_LATENESS"), + generateAttendance("Geografia", "ABSENCE_UNEXCUSED"), + generateAttendance("Sieci komputerowe", "ABSENCE_EXCUSED"), + generateAttendance("Systemy operacyjne", "EXCUSED_LATENESS"), + generateAttendance("Język niemiecki", "ABSENCE_UNEXCUSED"), + generateAttendance("Biologia", "ABSENCE_UNEXCUSED"), + generateAttendance("Chemia", "ABSENCE_EXCUSED"), + generateAttendance("Fizyka", "ABSENCE_UNEXCUSED"), + generateAttendance("Matematyka", "ABSENCE_EXCUSED"), +) + +private fun generateAttendance(subject: String, name: String) = Attendance( + subject = subject, + studentId = 0, + diaryId = 0, + date = LocalDate.now(), + timeId = 0, + number = 1, + name = name, + presence = false, + absence = false, + exemption = false, + lateness = false, + excused = false, + deleted = false, + excusable = false, + excuseStatus = "" +) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/timetable.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/timetable.kt new file mode 100644 index 000000000..428c001d6 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/timetable.kt @@ -0,0 +1,39 @@ +package io.github.wulkanowy.ui.modules.debug.notification.mock + +import io.github.wulkanowy.data.db.entities.Timetable +import java.time.LocalDate +import java.time.LocalDateTime +import kotlin.random.Random + +val debugTimetableItems = listOf( + generateTimetable("Matematyka", "12", "01"), + generateTimetable("Język angielski", "23", "12"), + generateTimetable("Geografia", "34", "23"), + generateTimetable("Sieci komputerowe", "45", "34"), + generateTimetable("Systemy operacyjne", "56", "45"), + generateTimetable("Język niemiecki", "67", "56"), + generateTimetable("Biologia", "78", "67"), + generateTimetable("Chemia", "89", "78"), + generateTimetable("Fizyka", "90", "89"), + generateTimetable("Matematyka", "01", "90"), +) + +private fun generateTimetable(subject: String, room: String, roomOld: String) = Timetable( + subject = subject, + studentId = 0, + diaryId = 0, + date = LocalDate.now().minusDays(Random.nextLong(0, 8)), + number = 1, + start = LocalDateTime.now().plusHours(1), + end = LocalDateTime.now(), + subjectOld = "", + group = "", + room = room, + roomOld = roomOld, + teacher = "Wtorkowska Renata", + teacherOld = "", + info = "", + isStudentPlan = true, + changes = true, + canceled = true +) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index e71fc0f6f..04e35d318 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -66,7 +66,14 @@ class LoginStudentSelectFragment : } override fun openMainView() { - activity?.let { startActivity(MainActivity.getStartIntent(context = it, clear = true)) } + activity?.let { + startActivity( + MainActivity.getStartIntent( + context = it, + startNewTask = true + ) + ) + } } override fun showProgress(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index 49a199431..51585ac58 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -18,8 +18,8 @@ import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.exceptions.NoCurrentStudentException import io.github.wulkanowy.data.repositories.LuckyNumberRepository import io.github.wulkanowy.data.repositories.StudentRepository +import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.main.MainActivity -import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.toFirstResult import kotlinx.coroutines.runBlocking import timber.log.Timber @@ -39,6 +39,8 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { companion object { + const val LUCKY_NUMBER_PENDING_INTENT_ID = 200 + fun getStudentWidgetKey(appWidgetId: Int) = "lucky_number_widget_student_$appWidgetId" fun getThemeWidgetKey(appWidgetId: Int) = "lucky_number_widget_theme_$appWidgetId" @@ -48,18 +50,31 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { fun getWidthWidgetKey(appWidgetId: Int) = "lucky_number_widget_width_$appWidgetId" } - override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray?) { + override fun onUpdate( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetIds: IntArray? + ) { super.onUpdate(context, appWidgetManager, appWidgetIds) appWidgetIds?.forEach { appWidgetId -> + val luckyNumber = + getLuckyNumber(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId) + val appIntent = PendingIntent.getActivity( + context, + LUCKY_NUMBER_PENDING_INTENT_ID, + MainActivity.getStartIntent(context, Destination.LuckyNumber, true), + FLAG_UPDATE_CURRENT + ) - val luckyNumber = getLuckyNumber(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId) - val appIntent = PendingIntent.getActivity(context, MainView.Section.LUCKY_NUMBER.id, - MainActivity.getStartIntent(context, MainView.Section.LUCKY_NUMBER, true), FLAG_UPDATE_CURRENT) - - val remoteView = RemoteViews(context.packageName, getCorrectLayoutId(appWidgetId, context)).apply { - setTextViewText(R.id.luckyNumberWidgetNumber, luckyNumber?.luckyNumber?.toString() ?: "#") - setOnClickPendingIntent(R.id.luckyNumberWidgetContainer, appIntent) - } + val remoteView = + RemoteViews(context.packageName, getCorrectLayoutId(appWidgetId, context)) + .apply { + setTextViewText( + R.id.luckyNumberWidgetNumber, + luckyNumber?.luckyNumber?.toString() ?: "#" + ) + setOnClickPendingIntent(R.id.luckyNumberWidgetContainer, appIntent) + } setStyles(remoteView, appWidgetId) appWidgetManager.updateAppWidget(appWidgetId, remoteView) @@ -78,7 +93,12 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { } } - override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, newOptions: Bundle?) { + override fun onAppWidgetOptionsChanged( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetId: Int, + newOptions: Bundle? + ) { super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions) val remoteView = RemoteViews(context.packageName, getCorrectLayoutId(appWidgetId, context)) @@ -88,8 +108,12 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { } private fun setStyles(views: RemoteViews, appWidgetId: Int, options: Bundle? = null) { - val width = options?.getInt(OPTION_APPWIDGET_MIN_WIDTH) ?: sharedPref.getLong(getWidthWidgetKey(appWidgetId), 74).toInt() - val height = options?.getInt(OPTION_APPWIDGET_MAX_HEIGHT) ?: sharedPref.getLong(getHeightWidgetKey(appWidgetId), 74).toInt() + val width = options?.getInt(OPTION_APPWIDGET_MIN_WIDTH) ?: sharedPref.getLong( + getWidthWidgetKey(appWidgetId), 74 + ).toInt() + val height = options?.getInt(OPTION_APPWIDGET_MAX_HEIGHT) ?: sharedPref.getLong( + getHeightWidgetKey(appWidgetId), 74 + ).toInt() with(sharedPref) { putLong(getWidthWidgetKey(appWidgetId), width.toLong()) @@ -112,7 +136,11 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { } } - private fun RemoteViews.setVisibility(imageTop: Boolean, imageLeft: Boolean, title: Boolean = false) { + private fun RemoteViews.setVisibility( + imageTop: Boolean, + imageLeft: Boolean, + title: Boolean = false + ) { setViewVisibility(R.id.luckyNumberWidgetImageTop, if (imageTop) VISIBLE else GONE) setViewVisibility(R.id.luckyNumberWidgetImageLeft, if (imageLeft) VISIBLE else GONE) setViewVisibility(R.id.luckyNumberWidgetTitle, if (title) VISIBLE else GONE) @@ -152,7 +180,8 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { private fun getCorrectLayoutId(appWidgetId: Int, context: Context): Int { val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) - val isSystemDarkMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES + val isSystemDarkMode = + context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES return if (savedTheme == 1L || (savedTheme == 2L && isSystemDarkMode)) { R.layout.widget_luckynumber_dark diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index d758ac0da..92bc36bc7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -5,16 +5,10 @@ import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK import android.content.Intent.FLAG_ACTIVITY_NEW_TASK -import android.content.pm.ShortcutInfo -import android.content.pm.ShortcutManager -import android.graphics.drawable.Icon -import android.os.Build import android.os.Build.VERSION_CODES.P import android.os.Bundle import android.view.Menu import android.view.MenuItem -import androidx.annotation.RequiresApi -import androidx.core.content.getSystemService import androidx.core.view.ViewCompat import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment @@ -29,20 +23,10 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.databinding.ActivityMainBinding +import io.github.wulkanowy.services.shortcuts.ShortcutsHelper import io.github.wulkanowy.ui.base.BaseActivity +import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog -import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment -import io.github.wulkanowy.ui.modules.conference.ConferenceFragment -import io.github.wulkanowy.ui.modules.dashboard.DashboardFragment -import io.github.wulkanowy.ui.modules.exam.ExamFragment -import io.github.wulkanowy.ui.modules.grade.GradeFragment -import io.github.wulkanowy.ui.modules.homework.HomeworkFragment -import io.github.wulkanowy.ui.modules.luckynumber.LuckyNumberFragment -import io.github.wulkanowy.ui.modules.message.MessageFragment -import io.github.wulkanowy.ui.modules.more.MoreFragment -import io.github.wulkanowy.ui.modules.note.NoteFragment -import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragment -import io.github.wulkanowy.ui.modules.timetable.TimetableFragment import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.InAppReviewHelper @@ -75,6 +59,9 @@ class MainActivity : BaseActivity(), MainVie @Inject lateinit var appInfo: AppInfo + @Inject + lateinit var shortcutsHelper: ShortcutsHelper + private var accountMenu: MenuItem? = null private val overlayProvider by lazy { ElevationOverlayProvider(this) } @@ -83,15 +70,19 @@ class MainActivity : BaseActivity(), MainVie FragNavController(supportFragmentManager, R.id.main_fragment_container) companion object { - const val EXTRA_START_MENU = "extraStartMenu" + + private const val EXTRA_START_DESTINATION = "start_destination" fun getStartIntent( context: Context, - startMenu: MainView.Section? = null, - clear: Boolean = false + destination: Destination? = null, + startNewTask: Boolean = false ) = Intent(context, MainActivity::class.java).apply { - if (clear) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK - startMenu?.let { putExtra(EXTRA_START_MENU, it.id) } + putExtra(EXTRA_START_DESTINATION, destination) + + if (startNewTask) { + flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK + } } } @@ -106,42 +97,21 @@ class MainActivity : BaseActivity(), MainVie override val currentViewSubtitle get() = (navController.currentFrag as? MainView.TitledView)?.subtitleString - override var startMenuIndex = 0 - - override var startMenuMoreIndex = -1 - - private val moreMenuFragments = mapOf( - MainView.Section.MESSAGE.id to MessageFragment.newInstance(), - MainView.Section.EXAM.id to ExamFragment.newInstance(), - MainView.Section.HOMEWORK.id to HomeworkFragment.newInstance(), - MainView.Section.NOTE.id to NoteFragment.newInstance(), - MainView.Section.CONFERENCE.id to ConferenceFragment.newInstance(), - MainView.Section.SCHOOL_ANNOUNCEMENT.id to SchoolAnnouncementFragment.newInstance(), - MainView.Section.LUCKY_NUMBER.id to LuckyNumberFragment.newInstance(), - ) + private var savedInstanceState: Bundle? = null @SuppressLint("NewApi") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(ActivityMainBinding.inflate(layoutInflater).apply { binding = this }.root) setSupportActionBar(binding.mainToolbar) + this.savedInstanceState = savedInstanceState messageContainer = binding.mainMessageContainer updateHelper.messageContainer = binding.mainFragmentContainer - val section = MainView.Section.values() - .singleOrNull { it.id == intent.getIntExtra(EXTRA_START_MENU, -1) } - - presenter.onAttachView(this, section) - - with(navController) { - initialize(startMenuIndex, savedInstanceState) - pushFragment(moreMenuFragments[startMenuMoreIndex]) - } - - if (appInfo.systemVersion >= Build.VERSION_CODES.N_MR1) { - initShortcuts() - } + val destination = intent.getSerializableExtra(EXTRA_START_DESTINATION) as Destination? + ?: shortcutsHelper.getDestination(intent) + presenter.onAttachView(this, destination) updateHelper.checkAndInstallUpdates(this) } @@ -157,54 +127,6 @@ class MainActivity : BaseActivity(), MainVie updateHelper.onActivityResult(requestCode, resultCode) } - @RequiresApi(Build.VERSION_CODES.N_MR1) - fun initShortcuts() { - val shortcutsList = mutableListOf() - - listOf( - Triple( - getString(R.string.grade_title), - R.drawable.ic_shortcut_grade, - MainView.Section.GRADE - ), - Triple( - getString(R.string.attendance_title), - R.drawable.ic_shortcut_attendance, - MainView.Section.ATTENDANCE - ), - Triple( - getString(R.string.exam_title), - R.drawable.ic_shortcut_exam, - MainView.Section.EXAM - ), - Triple( - getString(R.string.timetable_title), - R.drawable.ic_shortcut_timetable, - MainView.Section.TIMETABLE - ) - ).forEach { (title, icon, enum) -> - shortcutsList.add( - ShortcutInfo.Builder(applicationContext, title) - .setShortLabel(title) - .setLongLabel(title) - .setIcon(Icon.createWithResource(applicationContext, icon)) - .setIntents( - arrayOf( - Intent(applicationContext, MainActivity::class.java) - .setAction(Intent.ACTION_VIEW), - Intent(applicationContext, MainActivity::class.java) - .putExtra(EXTRA_START_MENU, enum.id) - .setAction(Intent.ACTION_VIEW) - .addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK) - ) - ) - .build() - ) - } - - getSystemService()?.dynamicShortcuts = shortcutsList - } - override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.action_menu_main, menu) accountMenu = menu?.findItem(R.id.mainMenuAccount) @@ -213,15 +135,38 @@ class MainActivity : BaseActivity(), MainVie return true } - @SuppressLint("NewApi") - override fun initView() { + override fun initView(startMenuIndex: Int, rootDestinations: List) { + initializeToolbar() + initializeBottomNavigation(startMenuIndex) + initializeNavController(startMenuIndex, rootDestinations) + } + + private fun initializeNavController(startMenuIndex: Int, rootDestinations: List) { + with(navController) { + setOnViewChangeListener { destinationView -> + presenter.onViewChange(destinationView) + analytics.setCurrentScreen( + this@MainActivity, + destinationView::class.java.simpleName + ) + } + fragmentHideStrategy = HIDE + rootFragments = rootDestinations.map { it.fragment } + + initialize(startMenuIndex, savedInstanceState) + } + } + + private fun initializeToolbar() { with(binding.mainToolbar) { stateListAnimator = null setBackgroundColor( overlayProvider.compositeOverlayWithThemeSurfaceColorIfNeeded(dpToPx(4f)) ) } + } + private fun initializeBottomNavigation(startMenuIndex: Int) { with(binding.mainBottomNav) { with(menu) { add(Menu.NONE, 0, Menu.NONE, R.string.dashboard_title) @@ -239,36 +184,6 @@ class MainActivity : BaseActivity(), MainVie setOnItemSelectedListener { presenter.onTabSelected(it.itemId, false) } setOnItemReselectedListener { presenter.onTabSelected(it.itemId, true) } } - - with(navController) { - setOnViewChangeListener { section, name -> - if (section == MainView.Section.ACCOUNT || section == MainView.Section.STUDENT_INFO) { - binding.mainBottomNav.isVisible = false - - if (appInfo.systemVersion >= P) { - window.navigationBarColor = getThemeAttrColor(R.attr.colorSurface) - } - } else { - binding.mainBottomNav.isVisible = true - - if (appInfo.systemVersion >= P) { - window.navigationBarColor = - getThemeAttrColor(android.R.attr.navigationBarColor) - } - } - - analytics.setCurrentScreen(this@MainActivity, name) - presenter.onViewChange(section) - } - fragmentHideStrategy = HIDE - rootFragments = listOf( - DashboardFragment.newInstance(), - GradeFragment.newInstance(), - AttendanceFragment.newInstance(), - TimetableFragment.newInstance(), - MoreFragment.newInstance() - ) - } } override fun onPreferenceStartFragment( @@ -317,6 +232,22 @@ class MainActivity : BaseActivity(), MainVie ViewCompat.setElevation(binding.mainToolbar, if (show) dpToPx(4f) else 0f) } + override fun showBottomNavigation(show: Boolean) { + binding.mainBottomNav.isVisible = show + + if (appInfo.systemVersion >= P) { + window.navigationBarColor = if (show) { + getThemeAttrColor(android.R.attr.navigationBarColor) + } else { + getThemeAttrColor(R.attr.colorSurface) + } + } + } + + override fun openMoreDestination(destination: Destination) { + pushView(destination.fragment) + } + override fun notifyMenuViewReselected() { (navController.currentStack?.getOrNull(0) as? MainView.MainChildView)?.onFragmentReselected() } @@ -373,6 +304,6 @@ class MainActivity : BaseActivity(), MainVie override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) navController.onSaveInstanceState(outState) - intent.removeExtra(EXTRA_START_MENU) + intent.removeExtra(EXTRA_START_DESTINATION) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index 4805b5a1c..0aca51afe 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -6,10 +6,15 @@ import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.BasePresenter +import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.ui.modules.main.MainView.Section.GRADE -import io.github.wulkanowy.ui.modules.main.MainView.Section.MESSAGE -import io.github.wulkanowy.ui.modules.main.MainView.Section.SCHOOL +import io.github.wulkanowy.ui.modules.Destination +import io.github.wulkanowy.ui.modules.account.AccountView +import io.github.wulkanowy.ui.modules.account.accountdetails.AccountDetailsView +import io.github.wulkanowy.ui.modules.grade.GradeView +import io.github.wulkanowy.ui.modules.message.MessageView +import io.github.wulkanowy.ui.modules.schoolandteachers.school.SchoolView +import io.github.wulkanowy.ui.modules.studentinfo.StudentInfoView import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.flowWithResource import kotlinx.coroutines.flow.onEach @@ -27,19 +32,40 @@ class MainPresenter @Inject constructor( private var studentsWitSemesters: List? = null - fun onAttachView(view: MainView, initMenu: MainView.Section?) { - super.onAttachView(view) - view.apply { - getProperViewIndexes(initMenu).let { (main, more) -> - startMenuIndex = main - startMenuMoreIndex = more + private val rootDestinationTypeList = listOf( + Destination.Type.DASHBOARD, + Destination.Type.GRADE, + Destination.Type.ATTENDANCE, + Destination.Type.TIMETABLE, + Destination.Type.MORE + ) + + private val Destination?.startMenuIndex + get() = when { + this == null -> prefRepository.startMenuIndex + type in rootDestinationTypeList -> { + rootDestinationTypeList.indexOf(type) } - initView() - Timber.i("Main view was initialized with $startMenuIndex menu index and $startMenuMoreIndex more index") + else -> 4 + } + + fun onAttachView(view: MainView, initDestination: Destination?) { + super.onAttachView(view) + + val startMenuIndex = initDestination.startMenuIndex + val destinations = rootDestinationTypeList.map { + if (it == initDestination?.type) initDestination else it.defaultDestination + } + + view.initView(startMenuIndex, destinations) + if (initDestination != null && startMenuIndex == 4) { + view.openMoreDestination(initDestination) } syncManager.startPeriodicSyncWorker() - analytics.logEvent("app_open", "destination" to initMenu?.name) + + analytics.logEvent("app_open", "destination" to initDestination.toString()) + Timber.i("Main view was initialized with $initDestination") } fun onActionMenuCreated() { @@ -64,9 +90,10 @@ class MainPresenter @Inject constructor( }.launch("avatar") } - fun onViewChange(section: MainView.Section?) { + fun onViewChange(destinationView: BaseView) { view?.apply { - showActionBarElevation(section != GRADE && section != MESSAGE && section != SCHOOL) + showBottomNavigation(destinationView !is AccountView && destinationView !is StudentInfoView && destinationView !is AccountDetailsView) + showActionBarElevation(destinationView !is GradeView && destinationView !is MessageView && destinationView !is SchoolView) currentViewTitle?.let { setViewTitle(it) } currentViewSubtitle?.let { setViewSubTitle(it.ifBlank { null }) } currentStackSize?.let { @@ -134,10 +161,4 @@ class MainPresenter @Inject constructor( view?.showStudentAvatar(currentStudent) } - - private fun getProperViewIndexes(initMenu: MainView.Section?) = when (initMenu?.id) { - in 0..3 -> initMenu!!.id to -1 - in 4..100 -> 4 to initMenu!!.id - else -> prefRepository.startMenuIndex to -1 - } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt index 8851f5878..3a57fcc6b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt @@ -3,13 +3,10 @@ package io.github.wulkanowy.ui.modules.main import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.ui.base.BaseView +import io.github.wulkanowy.ui.modules.Destination interface MainView : BaseView { - var startMenuIndex: Int - - var startMenuMoreIndex: Int - val isRootView: Boolean val currentViewTitle: String? @@ -18,7 +15,7 @@ interface MainView : BaseView { val currentStackSize: Int? - fun initView() + fun initView(startMenuIndex: Int, rootDestinations: List) fun switchMenuView(position: Int) @@ -28,6 +25,8 @@ interface MainView : BaseView { fun showActionBarElevation(show: Boolean) + fun showBottomNavigation(show: Boolean) + fun notifyMenuViewReselected() fun notifyMenuViewChanged() @@ -42,6 +41,8 @@ interface MainView : BaseView { fun showInAppReview() + fun openMoreDestination(destination: Destination) + interface MainChildView { fun onFragmentReselected() @@ -57,25 +58,4 @@ interface MainView : BaseView { get() = "" set(_) {} } - - enum class Section { - DASHBOARD, - GRADE, - ATTENDANCE, - TIMETABLE, - MORE, - MESSAGE, - EXAM, - HOMEWORK, - NOTE, - CONFERENCE, - SCHOOL_ANNOUNCEMENT, - SCHOOL, - LUCKY_NUMBER, - ACCOUNT, - STUDENT_INFO, - SETTINGS; - - val id get() = ordinal - } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterAdapter.kt index 7ee326f8f..27b3637ad 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterAdapter.kt @@ -5,7 +5,6 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Notification import io.github.wulkanowy.databinding.ItemNotificationsCenterBinding import io.github.wulkanowy.services.sync.notifications.NotificationType @@ -28,26 +27,12 @@ class NotificationsCenterAdapter @Inject constructor() : notificationsCenterItemTitle.text = item.title notificationsCenterItemContent.text = item.content notificationsCenterItemDate.text = item.date.toFormattedString("HH:mm, d MMM") - notificationsCenterItemIcon.setImageResource(item.type.toDrawableResId()) + notificationsCenterItemIcon.setImageResource(item.type.icon) root.setOnClickListener { onItemClickListener(item.type) } } } - private fun NotificationType.toDrawableResId() = when (this) { - NotificationType.NEW_CONFERENCE -> R.drawable.ic_more_conferences - NotificationType.NEW_EXAM -> R.drawable.ic_main_exam - NotificationType.NEW_GRADE_DETAILS -> R.drawable.ic_stat_grade - NotificationType.NEW_GRADE_PREDICTED -> R.drawable.ic_stat_grade - NotificationType.NEW_GRADE_FINAL -> R.drawable.ic_stat_grade - NotificationType.NEW_HOMEWORK -> R.drawable.ic_more_homework - NotificationType.NEW_LUCKY_NUMBER -> R.drawable.ic_stat_luckynumber - NotificationType.NEW_MESSAGE -> R.drawable.ic_stat_message - NotificationType.NEW_NOTE -> R.drawable.ic_stat_note - NotificationType.NEW_ANNOUNCEMENT -> R.drawable.ic_all_about - NotificationType.PUSH -> R.drawable.ic_stat_all - } - class ViewHolder(val binding: ItemNotificationsCenterBinding) : RecyclerView.ViewHolder(binding.root) @@ -59,4 +44,4 @@ class NotificationsCenterAdapter @Inject constructor() : override fun areItemsTheSame(oldItem: Notification, newItem: Notification) = oldItem.id == newItem.id } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterFragment.kt index b9bfb447e..f3bbc42de 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/notificationscenter/NotificationsCenterFragment.kt @@ -11,6 +11,7 @@ import io.github.wulkanowy.data.db.entities.Notification import io.github.wulkanowy.databinding.FragmentNotificationsCenterBinding import io.github.wulkanowy.services.sync.notifications.NotificationType import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment import io.github.wulkanowy.ui.modules.conference.ConferenceFragment import io.github.wulkanowy.ui.modules.exam.ExamFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment @@ -21,6 +22,7 @@ import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.note.NoteFragment import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragment +import io.github.wulkanowy.ui.modules.timetable.TimetableFragment import javax.inject.Inject @AndroidEntryPoint @@ -104,5 +106,7 @@ class NotificationsCenterFragment : NotificationType.NEW_NOTE -> NoteFragment.newInstance() NotificationType.NEW_ANNOUNCEMENT -> SchoolAnnouncementFragment.newInstance() NotificationType.PUSH -> null + NotificationType.CHANGE_TIMETABLE -> TimetableFragment.newInstance() + NotificationType.NEW_ATTENDANCE -> AttendanceFragment.newInstance() } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index 2612fab3a..d56cdfa7c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -6,7 +6,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.main.MainView import timber.log.Timber -class SettingsFragment : PreferenceFragmentCompat(), MainView.TitledView { +class SettingsFragment : PreferenceFragmentCompat(), MainView.TitledView, SettingsView { companion object { @@ -19,4 +19,16 @@ class SettingsFragment : PreferenceFragmentCompat(), MainView.TitledView { setPreferencesFromResource(R.xml.scheme_preferences, rootKey) Timber.i("Settings view was initialized") } + + override fun showError(text: String, error: Throwable) {} + + override fun showMessage(text: String) {} + + override fun showExpiredDialog() {} + + override fun openClearLoginView() {} + + override fun showErrorDetailsDialog(error: Throwable) {} + + override fun showChangePasswordSnackbar(redirectUrl: String) {} } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt new file mode 100644 index 000000000..79f91bc5d --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt @@ -0,0 +1,5 @@ +package io.github.wulkanowy.ui.modules.settings + +import io.github.wulkanowy.ui.base.BaseView + +interface SettingsView : BaseView \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index f9079b5f9..63fc84962 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -24,8 +24,8 @@ import io.github.wulkanowy.data.exceptions.NoCurrentStudentException import io.github.wulkanowy.data.repositories.StudentRepository 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.main.MainActivity -import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.capitalise import io.github.wulkanowy.utils.createNameInitialsDrawable @@ -60,6 +60,8 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { companion object { + private const val TIMETABLE_PENDING_INTENT_ID = 201 + private const val EXTRA_TOGGLED_WIDGET_ID = "extraToggledWidget" private const val EXTRA_BUTTON_TYPE = "extraButtonType" @@ -174,8 +176,8 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { ) val appIntent = PendingIntent.getActivity( context, - MainView.Section.TIMETABLE.id, - MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true), + TIMETABLE_PENDING_INTENT_ID, + MainActivity.getStartIntent(context, Destination.Timetable(), true), FLAG_UPDATE_CURRENT ) 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 b89ad57d3..397c95953 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt @@ -29,7 +29,7 @@ private fun calculatePercentage(presence: Double, absence: Double): Double { return if ((presence + absence) == 0.0) 0.0 else (presence / (presence + absence)) * 100 } -inline val Attendance.description +inline val Attendance.descriptionRes get() = when (AttendanceCategory.getCategoryByName(name)) { AttendanceCategory.PRESENCE -> R.string.attendance_present AttendanceCategory.ABSENCE_UNEXCUSED -> R.string.attendance_absence_unexcused diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt index 2cd4459eb..ecd982a18 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt @@ -18,6 +18,7 @@ import androidx.annotation.AttrRes import androidx.annotation.ColorInt import androidx.annotation.ColorRes import androidx.annotation.DrawableRes +import androidx.annotation.PluralsRes import androidx.core.content.ContextCompat import androidx.core.graphics.ColorUtils import androidx.core.graphics.applyCanvas @@ -57,6 +58,9 @@ fun Context.getCompatDrawable(@DrawableRes drawableRes: Int, @ColorRes colorRes: fun Context.getCompatBitmap(@DrawableRes drawableRes: Int, @ColorRes colorRes: Int) = getCompatDrawable(drawableRes, colorRes)?.toBitmap() +fun Context.getPlural(@PluralsRes pluralRes: Int, quantity: Int, vararg arguments: Any) = + resources.getQuantityString(pluralRes, quantity, *arguments) + fun Context.openInternetBrowser(uri: String, onActivityNotFound: (uri: String) -> Unit = {}) { Intent.parseUri(uri, 0).let { try { diff --git a/app/src/main/java/io/github/wulkanowy/utils/FragNavControlerExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/FragNavControlerExtension.kt index 9dc1e18a0..01c876dd2 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/FragNavControlerExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/FragNavControlerExtension.kt @@ -2,16 +2,19 @@ package io.github.wulkanowy.utils import androidx.fragment.app.Fragment import com.ncapdevi.fragnav.FragNavController -import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.base.BaseView -inline fun FragNavController.setOnViewChangeListener(crossinline listener: (section: MainView.Section?, name: String?) -> Unit) { +inline fun FragNavController.setOnViewChangeListener(crossinline listener: (view: BaseView) -> Unit) { transactionListener = object : FragNavController.TransactionListener { - override fun onFragmentTransaction(fragment: Fragment?, transactionType: FragNavController.TransactionType) { - listener(fragment?.toSection(), fragment?.let { it::class.java.simpleName }) + override fun onFragmentTransaction( + fragment: Fragment?, + transactionType: FragNavController.TransactionType + ) { + fragment?.let { listener(it as BaseView) } } override fun onTabTransaction(fragment: Fragment?, index: Int) { - listener(fragment?.toSection(), fragment?.let { it::class.java.simpleName }) + fragment?.let { listener(it as BaseView) } } } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/FragmentExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/FragmentExtension.kt deleted file mode 100644 index 210a62090..000000000 --- a/app/src/main/java/io/github/wulkanowy/utils/FragmentExtension.kt +++ /dev/null @@ -1,44 +0,0 @@ -package io.github.wulkanowy.utils - -import androidx.fragment.app.Fragment -import io.github.wulkanowy.ui.modules.account.AccountFragment -import io.github.wulkanowy.ui.modules.account.accountdetails.AccountDetailsFragment -import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment -import io.github.wulkanowy.ui.modules.conference.ConferenceFragment -import io.github.wulkanowy.ui.modules.dashboard.DashboardFragment -import io.github.wulkanowy.ui.modules.exam.ExamFragment -import io.github.wulkanowy.ui.modules.grade.GradeFragment -import io.github.wulkanowy.ui.modules.homework.HomeworkFragment -import io.github.wulkanowy.ui.modules.luckynumber.LuckyNumberFragment -import io.github.wulkanowy.ui.modules.main.MainView -import io.github.wulkanowy.ui.modules.message.MessageFragment -import io.github.wulkanowy.ui.modules.more.MoreFragment -import io.github.wulkanowy.ui.modules.note.NoteFragment -import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersFragment -import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragment -import io.github.wulkanowy.ui.modules.settings.SettingsFragment -import io.github.wulkanowy.ui.modules.studentinfo.StudentInfoFragment -import io.github.wulkanowy.ui.modules.timetable.TimetableFragment - -fun Fragment.toSection(): MainView.Section? { - return when (this) { - is GradeFragment -> MainView.Section.GRADE - is AttendanceFragment -> MainView.Section.ATTENDANCE - is ExamFragment -> MainView.Section.EXAM - is TimetableFragment -> MainView.Section.TIMETABLE - is MoreFragment -> MainView.Section.MORE - is MessageFragment -> MainView.Section.MESSAGE - is HomeworkFragment -> MainView.Section.HOMEWORK - is NoteFragment -> MainView.Section.NOTE - is LuckyNumberFragment -> MainView.Section.LUCKY_NUMBER - is SettingsFragment -> MainView.Section.SETTINGS - is SchoolAndTeachersFragment -> MainView.Section.SCHOOL - is AccountFragment -> MainView.Section.ACCOUNT - is AccountDetailsFragment -> MainView.Section.ACCOUNT - is StudentInfoFragment -> MainView.Section.STUDENT_INFO - is ConferenceFragment -> MainView.Section.CONFERENCE - is SchoolAnnouncementFragment -> MainView.Section.SCHOOL_ANNOUNCEMENT - is DashboardFragment -> MainView.Section.DASHBOARD - else -> null - } -} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1e88ee1ad..008069562 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -163,6 +163,26 @@ Now: %s Next: %s Later: %s + %1$s lesson %2$d - %3$s + Change of room from %1$s to %2$s + Change of teacher from %1$s to %2$s + Change of subject from %1$s to %2$s + + Timetable change + Timetable changes + + + %1$s - %2$d change in timetable + %1$s - %2$d changes in timetable + + + %1$d change in timetable + %1$d changes in timetable + + + %d change + %d changes + @@ -200,6 +220,18 @@ Excuse z powodu Dzień dobry,\nProszę o usprawiedliwienie mojego dziecka w dniu %s z lekcji %s%s%s.\n\nPozdrawiam. + + New attendance + New attendance + + + %1$d new attendance + %1$d attendance + + + %d attendance + %d attendance + @@ -706,6 +738,8 @@ Push notifications Upcoming lessons Debug + Timetable change + New attendance diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt index 2c44e9fad..7557d745a 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt @@ -42,20 +42,12 @@ class MainPresenterTest { MockKAnnotations.init(this) clearMocks(mainView) - every { mainView.startMenuIndex = any() } just Runs - every { mainView.startMenuMoreIndex = any() } just Runs - every { mainView.startMenuIndex } returns 1 - every { mainView.startMenuMoreIndex } returns 1 - every { mainView.initView() } just Runs - presenter = MainPresenter(errorHandler, studentRepository, prefRepository, syncManager, analytics) + every { mainView.initView(any(), any()) } just Runs + presenter = + MainPresenter(errorHandler, studentRepository, prefRepository, syncManager, analytics) presenter.onAttachView(mainView, null) } - @Test - fun initMenuTest() { - verify { mainView.initView() } - } - @Test fun onTabSelectedTest() { every { mainView.notifyMenuViewChanged() } just Runs From 007d62e61d79c89ab5d6f22563280f354086e32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 11 Nov 2021 15:23:20 +0100 Subject: [PATCH 0672/1526] Update project to Android SDK 31 (#1570) --- app/build.gradle | 11 ++--- app/src/main/AndroidManifest.xml | 1 - .../wulkanowy/data/db/SharedPrefProvider.kt | 9 ++-- .../alarm/TimetableNotificationReceiver.kt | 8 ++-- .../TimetableNotificationSchedulerHelper.kt | 12 +++-- .../services/shortcuts/ShortcutsHelper.kt | 10 ++-- .../notifications/AppNotificationManager.kt | 7 +-- .../ChangeTimetableNotification.kt | 6 +-- .../NewAttendanceNotification.kt | 6 +-- .../NewConferenceNotification.kt | 6 +-- .../sync/notifications/NewExamNotification.kt | 6 +-- .../notifications/NewGradeNotification.kt | 14 +++--- .../notifications/NewHomeworkNotification.kt | 6 +-- .../NewLuckyNumberNotification.kt | 4 +- .../notifications/NewMessageNotification.kt | 6 +-- .../sync/notifications/NewNoteNotification.kt | 6 +-- .../NewSchoolAnnouncementNotification.kt | 6 +-- .../github/wulkanowy/ui/base/BaseActivity.kt | 8 +--- .../github/wulkanowy/ui/base/BasePresenter.kt | 2 +- .../github/wulkanowy/ui/base/ThemeManager.kt | 11 +++-- .../wulkanowy/ui/modules/Destination.kt | 30 ++++++------ .../accountedit/AccountEditColorAdapter.kt | 32 +++---------- .../modules/attendance/AttendanceFragment.kt | 6 +-- .../summary/AttendanceSummaryFragment.kt | 2 +- .../wulkanowy/ui/modules/exam/ExamFragment.kt | 2 +- .../ui/modules/grade/GradeFragment.kt | 4 +- .../statistics/GradeStatisticsFragment.kt | 2 +- .../ui/modules/homework/HomeworkFragment.kt | 2 +- .../ui/modules/login/LoginActivity.kt | 4 +- .../LoginStudentSelectFragment.kt | 13 ++---- .../history/LuckyNumberHistoryFragment.kt | 2 +- .../LuckyNumberWidgetProvider.kt | 8 ++-- .../wulkanowy/ui/modules/main/MainActivity.kt | 12 ----- .../ui/modules/message/MessageFragment.kt | 5 +- .../message/preview/MessagePreviewFragment.kt | 10 +--- .../preview/MessagePreviewPresenter.kt | 24 +++++----- .../message/preview/MessagePreviewView.kt | 7 +-- .../message/tab/MessageTabPresenter.kt | 9 ++-- .../SchoolAndTeachersFragment.kt | 4 +- .../notifications/NotificationsFragment.kt | 2 - .../ui/modules/splash/SplashActivity.kt | 43 +++++++++++++++--- .../ui/modules/splash/SplashPresenter.kt | 27 ++++++----- .../wulkanowy/ui/modules/splash/SplashView.kt | 3 +- .../ui/modules/timetable/TimetableFragment.kt | 2 +- .../additional/AdditionalLessonsFragment.kt | 2 +- .../completed/CompletedLessonsFragment.kt | 2 +- .../TimetableWidgetProvider.kt | 34 +++++++------- .../ui/widgets/FittedScrollableTabLayout.kt | 12 ++--- .../ui/widgets/MaterialLinearLayout.kt | 25 +++------- .../wulkanowy/ui/widgets/MaterialTabLayout.kt | 25 ---------- .../wulkanowy/utils/PendingIntentCompat.kt | 11 +++++ .../github/wulkanowy/utils/StringExtension.kt | 4 +- .../wulkanowy/utils/security/Scrambler.kt | 3 -- ...ompat_splash_screen_no_icon_background.xml | 24 ++++++++++ .../main/res/drawable-v23/img_splash_logo.png | Bin 19474 -> 0 bytes .../drawable-v23/layer_splash_background.xml | 12 ----- app/src/main/res/drawable/ic_splash_logo.xml | 12 +++++ app/src/main/res/drawable/img_splash_logo.png | Bin 20340 -> 0 bytes .../res/drawable/layer_splash_background.xml | 12 ----- .../main/res/layout/fragment_attendance.xml | 8 ++-- app/src/main/res/layout/fragment_exam.xml | 8 ++-- .../layout/fragment_lucky_number_history.xml | 8 ++-- app/src/main/res/layout/fragment_message.xml | 2 +- app/src/main/res/layout/fragment_school.xml | 8 ++-- .../res/layout/fragment_schoolandteachers.xml | 2 +- .../main/res/layout/fragment_timetable.xml | 8 ++-- .../layout/fragment_timetable_additional.xml | 8 ++-- .../layout/fragment_timetable_completed.xml | 8 ++-- .../layout/subitem_dashboard_conferences.xml | 7 +-- app/src/main/res/values-v23/styles.xml | 8 +--- app/src/main/res/values-v26/styles.xml | 7 --- app/src/main/res/values-v28/styles.xml | 8 ---- app/src/main/res/values-v29/styles.xml | 8 ---- app/src/main/res/values/styles.xml | 12 ++--- .../wulkanowy/utils/CrashlyticsUtils.kt | 6 --- .../ui/modules/splash/SplashPresenterTest.kt | 6 +-- 76 files changed, 316 insertions(+), 384 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialTabLayout.kt create mode 100644 app/src/main/java/io/github/wulkanowy/utils/PendingIntentCompat.kt create mode 100644 app/src/main/res/drawable-v23/compat_splash_screen_no_icon_background.xml delete mode 100644 app/src/main/res/drawable-v23/img_splash_logo.png delete mode 100644 app/src/main/res/drawable-v23/layer_splash_background.xml create mode 100644 app/src/main/res/drawable/ic_splash_logo.xml delete mode 100644 app/src/main/res/drawable/img_splash_logo.png delete mode 100644 app/src/main/res/drawable/layer_splash_background.xml diff --git a/app/build.gradle b/app/build.gradle index 53814dae3..bef984aa2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,17 +15,16 @@ apply from: 'sonarqube.gradle' apply from: 'hooks.gradle' android { - compileSdkVersion 30 + compileSdkVersion 31 defaultConfig { applicationId "io.github.wulkanowy" testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 - targetSdkVersion 30 + targetSdkVersion 31 versionCode 97 versionName "1.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables.useSupportLibrary = true resValue "string", "app_name", "Wulkanowy" @@ -166,7 +165,7 @@ huaweiPublish { } ext { - work_manager = "2.6.0" + work_manager = "2.7.0" android_hilt = "1.0.0" room = "2.3.0" chucker = "3.5.2" @@ -183,9 +182,9 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" implementation "androidx.core:core-ktx:1.6.0" + implementation 'androidx.core:core-splashscreen:1.0.0-alpha02' implementation "androidx.activity:activity-ktx:1.3.1" - implementation "androidx.appcompat:appcompat:1.3.1" - implementation "androidx.appcompat:appcompat-resources:1.3.1" + implementation "androidx.appcompat:appcompat:1.4.0-beta01" implementation "androidx.fragment:fragment-ktx:1.3.6" implementation "androidx.annotation:annotation:1.2.0" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e43a0ec08..5928c23a0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,7 +42,6 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="false" android:theme="@style/WulkanowyTheme" - android:usesCleartextTraffic="true" tools:ignore="GoogleAppIndexingWarning,UnusedAttribute"> , requestCode: Int) { if (now() in range) cancelNotification() + alarmManager.cancel( - PendingIntent.getBroadcast(context, requestCode, Intent(), FLAG_UPDATE_CURRENT) + PendingIntent.getBroadcast( + context, + requestCode, + Intent(), + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE + ) ) } @@ -156,7 +162,7 @@ class TimetableNotificationSchedulerHelper @Inject constructor( alarmManager, RTC_WAKEUP, time.toTimestamp(), PendingIntent.getBroadcast(context, getRequestCode(time, studentId), intent.also { it.putExtra(LESSON_TYPE, notificationType) - }, FLAG_UPDATE_CURRENT) + }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE) ) Timber.d( "TimetableNotification scheduled: type: $notificationType, subject: ${ diff --git a/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt b/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt index d1c215f26..bb09434b5 100644 --- a/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt @@ -8,7 +8,7 @@ import androidx.core.graphics.drawable.IconCompat import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import javax.inject.Inject import javax.inject.Singleton @@ -35,7 +35,7 @@ class ShortcutsHelper @Inject constructor(@ApplicationContext private val contex .setShortLabel(context.getString(R.string.grade_title)) .setLongLabel(context.getString(R.string.grade_title)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_grade)) - .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .setIntent(SplashActivity.getStartIntent(context, startNewTask = true) .apply { action = Intent.ACTION_VIEW putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "grade") @@ -47,7 +47,7 @@ class ShortcutsHelper @Inject constructor(@ApplicationContext private val contex .setShortLabel(context.getString(R.string.attendance_title)) .setLongLabel(context.getString(R.string.attendance_title)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_attendance)) - .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .setIntent(SplashActivity.getStartIntent(context, startNewTask = true) .apply { action = Intent.ACTION_VIEW putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "attendance") @@ -59,7 +59,7 @@ class ShortcutsHelper @Inject constructor(@ApplicationContext private val contex .setShortLabel(context.getString(R.string.exam_title)) .setLongLabel(context.getString(R.string.exam_title)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_exam)) - .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .setIntent(SplashActivity.getStartIntent(context, startNewTask = true) .apply { action = Intent.ACTION_VIEW putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "exam") @@ -71,7 +71,7 @@ class ShortcutsHelper @Inject constructor(@ApplicationContext private val contex .setShortLabel(context.getString(R.string.timetable_title)) .setLongLabel(context.getString(R.string.timetable_title)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_timetable)) - .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .setIntent(SplashActivity.getStartIntent(context, startNewTask = true) .apply { action = Intent.ACTION_VIEW putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "timetable") diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt index 542b9346b..2848fe303 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt @@ -13,6 +13,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.repositories.NotificationRepository +import io.github.wulkanowy.utils.PendingIntentCompat import io.github.wulkanowy.utils.getCompatBitmap import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.nickOrName @@ -45,7 +46,7 @@ class AppNotificationManager @Inject constructor( context, Random.nextInt(), notificationData.intentToStart, - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) ) .setContentTitle(notificationData.title) @@ -86,7 +87,7 @@ class AppNotificationManager @Inject constructor( context, Random.nextInt(), notificationData.intentToStart, - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) ) .setContentTitle(notificationData.title) @@ -134,7 +135,7 @@ class AppNotificationManager @Inject constructor( context, Random.nextInt(), groupNotificationData.intentToStart, - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) ) .setLocalOnly(true) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt index 6d2d3a59f..f8860b7f1 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDate @@ -32,7 +32,7 @@ class ChangeTimetableNotification @Inject constructor( 1 ), content = it, - intentToStart = MainActivity.getStartIntent( + intentToStart = SplashActivity.getStartIntent( context = context, destination = Destination.Timetable(date), startNewTask = true @@ -54,7 +54,7 @@ class ChangeTimetableNotification @Inject constructor( changedLessons.size, changedLessons.size ), - intentToStart = MainActivity.getStartIntent(context, Destination.Timetable(), true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Timetable(), true), type = NotificationType.CHANGE_TIMETABLE ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt index 695552721..3792725ca 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import io.github.wulkanowy.utils.descriptionRes import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.toFormattedString @@ -31,7 +31,7 @@ class NewAttendanceNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.attendance_notify_new_items_title, 1), content = it, - intentToStart = MainActivity.getStartIntent(context, Destination.Attendance, true) + intentToStart = SplashActivity.getStartIntent(context, Destination.Attendance, true) ) } @@ -46,7 +46,7 @@ class NewAttendanceNotification @Inject constructor( notificationDataList.size, notificationDataList.size ), - intentToStart = MainActivity.getStartIntent(context, Destination.Attendance, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Attendance, true), type = NotificationType.NEW_ATTENDANCE ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt index 97b1332d8..4ec359b08 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDateTime @@ -31,7 +31,7 @@ class NewConferenceNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.conference_notify_new_item_title, 1), content = it, - intentToStart = MainActivity.getStartIntent(context, Destination.Conference, true) + intentToStart = SplashActivity.getStartIntent(context, Destination.Conference, true) ) } @@ -43,7 +43,7 @@ class NewConferenceNotification @Inject constructor( lines.size, lines.size ), - intentToStart = MainActivity.getStartIntent(context, Destination.Conference, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Conference, true), type = NotificationType.NEW_CONFERENCE ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt index 6f8ed8961..feb7c320a 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDate @@ -31,7 +31,7 @@ class NewExamNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.exam_notify_new_item_title, 1), content = it, - intentToStart = MainActivity.getStartIntent(context, Destination.Exam, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Exam, true), ) } @@ -43,7 +43,7 @@ class NewExamNotification @Inject constructor( lines.size, lines.size ), - intentToStart = MainActivity.getStartIntent(context, Destination.Exam, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Exam, true), type = NotificationType.NEW_EXAM ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt index 09692fb7c..425a57fc6 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt @@ -9,7 +9,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import io.github.wulkanowy.utils.getPlural import javax.inject.Inject @@ -23,7 +23,7 @@ class NewGradeNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.grade_new_items, 1), content = "${it.subject}: ${it.entry}", - intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true), ) } @@ -31,7 +31,7 @@ class NewGradeNotification @Inject constructor( notificationDataList = notificationDataList, title = context.getPlural(R.plurals.grade_new_items, items.size), content = context.getPlural(R.plurals.grade_notify_new_items, items.size, items.size), - intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true), type = NotificationType.NEW_GRADE_DETAILS ) @@ -43,7 +43,7 @@ class NewGradeNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.grade_new_items_predicted, 1), content = "${it.subject}: ${it.predictedGrade}", - intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true), ) } @@ -55,7 +55,7 @@ class NewGradeNotification @Inject constructor( items.size, items.size ), - intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true), type = NotificationType.NEW_GRADE_PREDICTED ) @@ -67,7 +67,7 @@ class NewGradeNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.grade_new_items_final, 1), content = "${it.subject}: ${it.finalGrade}", - intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true), ) } @@ -79,7 +79,7 @@ class NewGradeNotification @Inject constructor( items.size, items.size ), - intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true), type = NotificationType.NEW_GRADE_FINAL ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt index cdada844e..fcaed10f0 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDate @@ -31,7 +31,7 @@ class NewHomeworkNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.homework_notify_new_item_title, 1), content = it, - intentToStart = MainActivity.getStartIntent(context, Destination.Homework, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Homework, true), ) } @@ -42,7 +42,7 @@ class NewHomeworkNotification @Inject constructor( lines.size, lines.size ), - intentToStart = MainActivity.getStartIntent(context, Destination.Homework, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Homework, true), type = NotificationType.NEW_HOMEWORK, notificationDataList = notificationDataList ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt index d9f138b5c..ab2c1ca76 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt @@ -7,7 +7,7 @@ import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import javax.inject.Inject class NewLuckyNumberNotification @Inject constructor( @@ -22,7 +22,7 @@ class NewLuckyNumberNotification @Inject constructor( R.string.lucky_number_notify_new_item, item.luckyNumber.toString() ), - intentToStart = MainActivity.getStartIntent(context, Destination.LuckyNumber, true) + intentToStart = SplashActivity.getStartIntent(context, Destination.LuckyNumber, true) ) appNotificationManager.sendSingleNotification( diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt index cdb5ab9c8..1a06cf6fa 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import io.github.wulkanowy.utils.getPlural import javax.inject.Inject @@ -22,7 +22,7 @@ class NewMessageNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.message_new_items, 1), content = "${it.sender}: ${it.subject}", - intentToStart = MainActivity.getStartIntent(context, Destination.Message, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Message, true), ) } @@ -30,7 +30,7 @@ class NewMessageNotification @Inject constructor( notificationDataList = notificationDataList, title = context.getPlural(R.plurals.message_new_items, items.size), content = context.getPlural(R.plurals.message_notify_new_items, items.size, items.size), - intentToStart = MainActivity.getStartIntent(context, Destination.Message, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Message, true), type = NotificationType.NEW_MESSAGE ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt index 16be1ca50..533d7f387 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt @@ -9,7 +9,7 @@ import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import io.github.wulkanowy.utils.getPlural import javax.inject.Inject @@ -29,13 +29,13 @@ class NewNoteNotification @Inject constructor( NotificationData( title = context.getPlural(titleRes, 1), content = "${it.teacher}: ${it.category}", - intentToStart = MainActivity.getStartIntent(context, Destination.Note, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Note, true), ) } val groupNotificationData = GroupNotificationData( notificationDataList = notificationDataList, - intentToStart = MainActivity.getStartIntent(context, Destination.Note, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Note, true), title = context.getPlural(R.plurals.note_new_items, items.size), content = context.getPlural(R.plurals.note_notify_new_items, items.size, items.size), type = NotificationType.NEW_NOTE diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt index 1f603624b..1efe13ae9 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity import io.github.wulkanowy.utils.getPlural import javax.inject.Inject @@ -20,7 +20,7 @@ class NewSchoolAnnouncementNotification @Inject constructor( suspend fun notify(items: List, student: Student) { val notificationDataList = items.map { NotificationData( - intentToStart = MainActivity.getStartIntent( + intentToStart = SplashActivity.getStartIntent( context = context, destination = Destination.SchoolAnnouncement, startNewTask = true @@ -34,7 +34,7 @@ class NewSchoolAnnouncementNotification @Inject constructor( } val groupNotificationData = GroupNotificationData( type = NotificationType.NEW_ANNOUNCEMENT, - intentToStart = MainActivity.getStartIntent( + intentToStart = SplashActivity.getStartIntent( context = context, destination = Destination.SchoolAnnouncement, startNewTask = true diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index 0521b4a08..075557a5c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -1,14 +1,11 @@ package io.github.wulkanowy.ui.base import android.app.ActivityManager -import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK -import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.os.Bundle import android.view.View import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.app.AppCompatDelegate import androidx.viewbinding.ViewBinding import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG @@ -40,7 +37,6 @@ abstract class BaseActivity, VB : ViewBinding> : themeManager.applyActivityTheme(this) super.onCreate(savedInstanceState) supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true) - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) @Suppress("DEPRECATION") setTaskDescription( @@ -83,8 +79,8 @@ abstract class BaseActivity, VB : ViewBinding> : } override fun openClearLoginView() { - startActivity(LoginActivity.getStartIntent(this) - .apply { addFlags(FLAG_ACTIVITY_CLEAR_TASK or FLAG_ACTIVITY_NEW_TASK) }) + startActivity(LoginActivity.getStartIntent(this)) + finishAffinity() } override fun onDestroy() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index 5cd5d0109..40d548607 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -20,7 +20,7 @@ open class BasePresenter( ) { private val job = SupervisorJob() - protected val presenterScope = CoroutineScope(job + Dispatchers.Main) + protected val presenterScope = CoroutineScope(job + Dispatchers.Main.immediate) private val childrenJobs = mutableMapOf() diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt index b560ed2e7..e934a1822 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt @@ -41,14 +41,15 @@ class ThemeManager @Inject constructor(private val preferencesRepository: Prefer ) } - private fun isThemeApplicable(activity: AppCompatActivity): Boolean { - return activity.packageManager + private fun isThemeApplicable(activity: AppCompatActivity) = + activity.packageManager .getPackageInfo(activity.packageName, GET_ACTIVITIES) - .activities.singleOrNull { it.name == activity::class.java.canonicalName } - ?.theme.let { + .activities + .singleOrNull { it.name == activity::class.java.canonicalName } + ?.theme + .let { it == R.style.WulkanowyTheme_Black || it == R.style.WulkanowyTheme_NoActionBar || it == R.style.WulkanowyTheme_Login || it == R.style.WulkanowyTheme_Login_Black || it == R.style.WulkanowyTheme_MessageSend || it == R.style.WulkanowyTheme_MessageSend_Black } - } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt index 0406afa41..43d4b5f9f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt @@ -19,6 +19,10 @@ import java.time.LocalDate sealed interface Destination : Serializable { + /* + Type in children classes have to be as getter to avoid null in enums + https://stackoverflow.com/questions/68866453/kotlin-enum-val-is-returning-null-despite-being-set-at-compile-time + */ val type: Type val fragment: Fragment @@ -41,91 +45,91 @@ sealed interface Destination : Serializable { object Dashboard : Destination { - override val type = Type.DASHBOARD + override val type get() = Type.DASHBOARD override val fragment get() = DashboardFragment.newInstance() } object Grade : Destination { - override val type = Type.GRADE + override val type get() = Type.GRADE override val fragment get() = GradeFragment.newInstance() } object Attendance : Destination { - override val type = Type.ATTENDANCE + override val type get() = Type.ATTENDANCE override val fragment get() = AttendanceFragment.newInstance() } object Exam : Destination { - override val type = Type.EXAM + override val type get() = Type.EXAM override val fragment get() = ExamFragment.newInstance() } data class Timetable(val date: LocalDate? = null) : Destination { - override val type = Type.TIMETABLE + override val type get() = Type.TIMETABLE override val fragment get() = TimetableFragment.newInstance(date) } object Homework : Destination { - override val type = Type.HOMEWORK + override val type get() = Type.HOMEWORK override val fragment get() = HomeworkFragment.newInstance() } object Note : Destination { - override val type = Type.NOTE + override val type get() = Type.NOTE override val fragment get() = NoteFragment.newInstance() } object Conference : Destination { - override val type = Type.CONFERENCE + override val type get() = Type.CONFERENCE override val fragment get() = ConferenceFragment.newInstance() } object SchoolAnnouncement : Destination { - override val type = Type.SCHOOL_ANNOUNCEMENT + override val type get() = Type.SCHOOL_ANNOUNCEMENT override val fragment get() = SchoolAnnouncementFragment.newInstance() } object School : Destination { - override val type = Type.SCHOOL + override val type get() = Type.SCHOOL override val fragment get() = SchoolFragment.newInstance() } object LuckyNumber : Destination { - override val type = Type.LUCKY_NUMBER + override val type get() = Type.LUCKY_NUMBER override val fragment get() = LuckyNumberFragment.newInstance() } object More : Destination { - override val type = Type.MORE + override val type get() = Type.MORE override val fragment get() = MoreFragment.newInstance() } object Message : Destination { - override val type = Type.MESSAGE + override val type get() = Type.MESSAGE override val fragment get() = MessageFragment.newInstance() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditColorAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditColorAdapter.kt index ab6eec417..66e39fc72 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditColorAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditColorAdapter.kt @@ -3,12 +3,9 @@ package io.github.wulkanowy.ui.modules.account.accountedit import android.annotation.SuppressLint import android.content.res.ColorStateList import android.graphics.Color -import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import android.graphics.drawable.RippleDrawable -import android.graphics.drawable.StateListDrawable -import android.os.Build import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.view.isVisible @@ -52,30 +49,13 @@ class AccountEditColorAdapter @Inject constructor() : } } - private fun Int.createForegroundDrawable(): Drawable = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - val mask = GradientDrawable().apply { - shape = GradientDrawable.OVAL - setColor(Color.BLACK) - } - RippleDrawable(ColorStateList.valueOf(this.rippleColor), null, mask) - } else { - val foreground = StateListDrawable().apply { - alpha = 80 - setEnterFadeDuration(250) - setExitFadeDuration(250) - } - - val mask = GradientDrawable().apply { - shape = GradientDrawable.OVAL - setColor(this@createForegroundDrawable.rippleColor) - } - - foreground.apply { - addState(intArrayOf(android.R.attr.state_pressed), mask) - addState(intArrayOf(), ColorDrawable(Color.TRANSPARENT)) - } + private fun Int.createForegroundDrawable(): Drawable { + val mask = GradientDrawable().apply { + shape = GradientDrawable.OVAL + setColor(Color.BLACK) } + return RippleDrawable(ColorStateList.valueOf(this.rippleColor), null, mask) + } private inline val Int.rippleColor: Int get() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 092c9d0d8..c6ee60ee4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -121,9 +121,7 @@ class AttendanceFragment : BaseFragment(R.layout.frag attendanceSwipe.setOnRefreshListener(presenter::onSwipeRefresh) attendanceSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) attendanceSwipe.setProgressBackgroundColorSchemeColor( - requireContext().getThemeAttrColor( - R.attr.colorSwipeRefresh - ) + requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh) ) attendanceErrorRetry.setOnClickListener { presenter.onRetry() } attendanceErrorDetails.setOnClickListener { presenter.onDetailsClick() } @@ -134,7 +132,7 @@ class AttendanceFragment : BaseFragment(R.layout.frag attendanceExcuseButton.setOnClickListener { presenter.onExcuseButtonClick() } - attendanceNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + attendanceNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt index 118971e62..dd1644a98 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt @@ -71,7 +71,7 @@ class AttendanceSummaryFragment : setOnItemSelectedListener { presenter.onSubjectSelected(it?.text?.toString()) } } - binding.attendanceSummarySubjectsContainer.setElevationCompat(requireContext().dpToPx(1f)) + binding.attendanceSummarySubjectsContainer.elevation = requireContext().dpToPx(1f) } override fun updateSubjects(data: ArrayList) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt index fb7939bc5..ddd0e4a19 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt @@ -64,7 +64,7 @@ class ExamFragment : BaseFragment(R.layout.fragment_exam), examPreviousButton.setOnClickListener { presenter.onPreviousWeek() } examNextButton.setOnClickListener { presenter.onNextWeek() } - examNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + examNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt index f9ecb681b..0a8561eec 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt @@ -96,9 +96,7 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade TabLayoutMediator(binding.gradeTabLayout, binding.gradeViewPager, this).attach() } - with(binding.gradeTabLayout) { - setElevationCompat(context.dpToPx(4f)) - } + binding.gradeTabLayout.elevation = requireContext().dpToPx(4f) with(binding) { gradeErrorRetry.setOnClickListener { presenter.onRetry() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt index 0adac300a..dbc4c10c6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt @@ -68,7 +68,7 @@ class GradeStatisticsFragment : } with(binding) { - gradeStatisticsSubjectsContainer.setElevationCompat(requireContext().dpToPx(1f)) + gradeStatisticsSubjectsContainer.elevation = requireContext().dpToPx(1f) gradeStatisticsSwipe.setOnRefreshListener(presenter::onSwipeRefresh) gradeStatisticsSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt index a723b0483..d4eaade2c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt @@ -67,7 +67,7 @@ class HomeworkFragment : BaseFragment(R.layout.fragment openAddHomeworkButton.setOnClickListener { presenter.onHomeworkAddButtonClicked() } - homeworkNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + homeworkNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt index f7bab526c..70b54c493 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt @@ -35,13 +35,13 @@ class LoginActivity : BaseActivity(), Logi @Inject lateinit var updateHelper: UpdateHelper + override val currentViewIndex get() = binding.loginViewpager.currentItem + companion object { fun getStartIntent(context: Context) = Intent(context, LoginActivity::class.java) } - override val currentViewIndex get() = binding.loginViewpager.currentItem - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(ActivityLoginBinding.inflate(layoutInflater).apply { binding = this }.root) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index 04e35d318..87cb505c4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -66,14 +66,8 @@ class LoginStudentSelectFragment : } override fun openMainView() { - activity?.let { - startActivity( - MainActivity.getStartIntent( - context = it, - startNewTask = true - ) - ) - } + startActivity(MainActivity.getStartIntent(requireContext())) + requireActivity().finish() } override fun showProgress(show: Boolean) { @@ -115,7 +109,8 @@ class LoginStudentSelectFragment : chooserTitle = requireContext().getString(R.string.login_email_intent_title), email = "wulkanowyinc@gmail.com", subject = requireContext().getString(R.string.login_email_subject), - body = requireContext().getString(R.string.login_email_text, appInfo.systemModel, + body = requireContext().getString( + R.string.login_email_text, appInfo.systemModel, appInfo.systemVersion.toString(), appInfo.versionName, "Select users to log in", diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt index 3a84b2dd5..49d094b78 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt @@ -65,7 +65,7 @@ class LuckyNumberHistoryFragment : luckyNumberHistoryPreviousButton.setOnClickListener { presenter.onPreviousWeek() } luckyNumberHistoryNextButton.setOnClickListener { presenter.onNextWeek() } - luckyNumberHistoryNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + luckyNumberHistoryNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index 51585ac58..9ef410683 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.ui.modules.luckynumberwidget import android.app.PendingIntent -import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH @@ -19,7 +18,8 @@ import io.github.wulkanowy.data.exceptions.NoCurrentStudentException import io.github.wulkanowy.data.repositories.LuckyNumberRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.main.MainActivity +import io.github.wulkanowy.ui.modules.splash.SplashActivity +import io.github.wulkanowy.utils.PendingIntentCompat import io.github.wulkanowy.utils.toFirstResult import kotlinx.coroutines.runBlocking import timber.log.Timber @@ -62,8 +62,8 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { val appIntent = PendingIntent.getActivity( context, LUCKY_NUMBER_PENDING_INTENT_ID, - MainActivity.getStartIntent(context, Destination.LuckyNumber, true), - FLAG_UPDATE_CURRENT + SplashActivity.getStartIntent(context, Destination.LuckyNumber, true), + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) val remoteView = diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 92bc36bc7..3969e1d3e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -3,8 +3,6 @@ package io.github.wulkanowy.ui.modules.main import android.annotation.SuppressLint import android.content.Context import android.content.Intent -import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK -import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.os.Build.VERSION_CODES.P import android.os.Bundle import android.view.Menu @@ -23,7 +21,6 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.databinding.ActivityMainBinding -import io.github.wulkanowy.services.shortcuts.ShortcutsHelper import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog @@ -59,9 +56,6 @@ class MainActivity : BaseActivity(), MainVie @Inject lateinit var appInfo: AppInfo - @Inject - lateinit var shortcutsHelper: ShortcutsHelper - private var accountMenu: MenuItem? = null private val overlayProvider by lazy { ElevationOverlayProvider(this) } @@ -76,13 +70,8 @@ class MainActivity : BaseActivity(), MainVie fun getStartIntent( context: Context, destination: Destination? = null, - startNewTask: Boolean = false ) = Intent(context, MainActivity::class.java).apply { putExtra(EXTRA_START_DESTINATION, destination) - - if (startNewTask) { - flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK - } } } @@ -109,7 +98,6 @@ class MainActivity : BaseActivity(), MainVie updateHelper.messageContainer = binding.mainFragmentContainer val destination = intent.getSerializableExtra(EXTRA_START_DESTINATION) as Destination? - ?: shortcutsHelper.getDestination(intent) presenter.onAttachView(this, destination) updateHelper.checkAndInstallUpdates(this) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt index 51076c649..a45ab6234 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt @@ -77,9 +77,8 @@ class MessageFragment : BaseFragment(R.layout.fragment_m TabLayoutMediator(binding.messageTabLayout, binding.messageViewPager, this).attach() } - with(binding.messageTabLayout) { - setElevationCompat(context.dpToPx(4f)) - } + binding.messageTabLayout.elevation = requireContext().dpToPx(4f) + binding.openSendMessageButton.setOnClickListener { presenter.onSendMessageButtonClicked() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index 74f8f57ec..e1cc2e374 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.message.preview -import android.os.Build import android.os.Bundle import android.print.PrintAttributes import android.print.PrintManager @@ -13,7 +12,6 @@ import android.view.View.VISIBLE import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient -import androidx.annotation.RequiresApi import androidx.core.content.getSystemService import androidx.recyclerview.widget.LinearLayoutManager import dagger.hilt.android.AndroidEntryPoint @@ -25,7 +23,6 @@ import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity -import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.shareText import javax.inject.Inject @@ -40,9 +37,6 @@ class MessagePreviewFragment : @Inject lateinit var previewAdapter: MessagePreviewAdapter - @Inject - lateinit var appInfo: AppInfo - private var menuReplyButton: MenuItem? = null private var menuForwardButton: MenuItem? = null @@ -140,7 +134,7 @@ class MessagePreviewFragment : menuForwardButton?.isVisible = show menuDeleteButton?.isVisible = show menuShareButton?.isVisible = show - menuPrintButton?.isVisible = show && appInfo.systemVersion >= Build.VERSION_CODES.LOLLIPOP + menuPrintButton?.isVisible = show } override fun setDeletedOptionsLabels() { @@ -175,7 +169,6 @@ class MessagePreviewFragment : context?.shareText(text, subject) } - @RequiresApi(Build.VERSION_CODES.LOLLIPOP) override fun printDocument(html: String, jobName: String) { val webView = WebView(requireContext()) webView.webViewClient = object : WebViewClient() { @@ -190,7 +183,6 @@ class MessagePreviewFragment : webView.loadDataWithBaseURL("file:///android_asset/", html, "text/HTML", "UTF-8", null) } - @RequiresApi(Build.VERSION_CODES.LOLLIPOP) private fun createWebPrintJob(webView: WebView, jobName: String) { activity?.getSystemService()?.let { printManager -> val printAdapter = webView.createPrintDocumentAdapter(jobName) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index 702e54676..eb33ee6ea 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.ui.modules.message.preview import android.annotation.SuppressLint -import android.os.Build import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageAttachment @@ -11,7 +10,6 @@ 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.utils.AnalyticsHelper -import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn @@ -24,8 +22,7 @@ class MessagePreviewPresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, private val messageRepository: MessageRepository, - private val analytics: AnalyticsHelper, - private var appInfo: AppInfo + private val analytics: AnalyticsHelper ) : BasePresenter(errorHandler, studentRepository) { var message: Message? = null @@ -112,10 +109,11 @@ class MessagePreviewPresenter @Inject constructor( fun onShare(): Boolean { message?.let { - var text = "Temat: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}\n" + when (it.sender.isNotEmpty()) { - true -> "Od: ${it.sender}\n" - false -> "Do: ${it.recipient}\n" - } + "Data: ${it.date.toFormattedString("yyyy-MM-dd HH:mm:ss")}\n\n${it.content}" + var text = + "Temat: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}\n" + when (it.sender.isNotEmpty()) { + true -> "Od: ${it.sender}\n" + false -> "Do: ${it.recipient}\n" + } + "Data: ${it.date.toFormattedString("yyyy-MM-dd HH:mm:ss")}\n\n${it.content}" attachments?.let { attachments -> if (attachments.isNotEmpty()) { @@ -127,7 +125,10 @@ class MessagePreviewPresenter @Inject constructor( } } - view?.shareText(text, "FW: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}") + view?.shareText( + text, + "FW: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}" + ) return true } return false @@ -135,7 +136,6 @@ class MessagePreviewPresenter @Inject constructor( @SuppressLint("NewApi") fun onPrint(): Boolean { - if (appInfo.systemVersion < Build.VERSION_CODES.LOLLIPOP) return false message?.let { val dateString = it.date.toFormattedString("yyyy-MM-dd HH:mm:ss") val infoContent = "

Data wysłania

$dateString
" + when { @@ -154,7 +154,9 @@ class MessagePreviewPresenter @Inject constructor( view?.apply { val html = printHTML - .replace("%SUBJECT%", it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }) + .replace( + "%SUBJECT%", + it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }) .replace("%CONTENT%", messageContent) .replace("%INFO%", infoContent) printDocument(html, jobName) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt index 583ba6878..88fe77d94 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt @@ -1,7 +1,5 @@ package io.github.wulkanowy.ui.modules.message.preview -import android.os.Build -import androidx.annotation.RequiresApi import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.ui.base.BaseView @@ -42,8 +40,7 @@ interface MessagePreviewView : BaseView { fun shareText(text: String, subject: String) - @RequiresApi(Build.VERSION_CODES.LOLLIPOP) - fun printDocument(html: String, jobName: String) - fun popView() + + fun printDocument(html: String, jobName: String) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 4571390b5..9b76a7f08 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -127,10 +127,13 @@ class MessageTabPresenter @Inject constructor( onlyUnread, onlyWithAttachments ) - val newItems = listOf(MessageTabDataItem.Header) + filteredData.map { - MessageTabDataItem.MessageItem(it) + val messageItems = filteredData.map { message -> + MessageTabDataItem.MessageItem(message) } - updateData(newItems, folder.id == MessageFolder.SENT.id) + val messageItemsWithHeader = + listOf(MessageTabDataItem.Header) + messageItems + + updateData(messageItemsWithHeader, folder.id == MessageFolder.SENT.id) notifyParentDataLoaded() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt index 9892b77ad..f4fa8e01d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt @@ -77,9 +77,7 @@ class SchoolAndTeachersFragment : ).attach() } - with(binding.schoolandteachersTabLayout) { - setElevationCompat(context.dpToPx(4f)) - } + binding.schoolandteachersTabLayout.elevation = requireContext().dpToPx(4f) } override fun showContent(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt index 43920588c..dd6cf0ecd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.settings.notifications -import android.annotation.SuppressLint import android.content.Intent import android.content.SharedPreferences import android.net.Uri @@ -152,7 +151,6 @@ class NotificationsFragment : PreferenceFragmentCompat(), .show() } - @SuppressLint("InlinedApi") override fun openSystemSettings() { val intent = if (appInfo.systemVersion >= Build.VERSION_CODES.O) { Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt index 376ef3743..b27f06ef4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt @@ -1,29 +1,60 @@ package io.github.wulkanowy.ui.modules.splash +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent import android.os.Bundle import android.widget.Toast import android.widget.Toast.LENGTH_LONG +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.viewbinding.ViewBinding import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.services.shortcuts.ShortcutsHelper import io.github.wulkanowy.ui.base.BaseActivity +import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.main.MainActivity -import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject +@SuppressLint("CustomSplashScreen") @AndroidEntryPoint class SplashActivity : BaseActivity(), SplashView { @Inject - lateinit var appInfo: AppInfo + override lateinit var presenter: SplashPresenter @Inject - override lateinit var presenter: SplashPresenter + lateinit var shortcutsHelper: ShortcutsHelper + + companion object { + + private const val EXTRA_START_DESTINATION = "start_destination" + + private const val EXTRA_EXTERNAL_URL = "external_url" + + fun getStartIntent( + context: Context, + destination: Destination? = null, + startNewTask: Boolean = false + ) = Intent(context, SplashActivity::class.java).apply { + putExtra(EXTRA_START_DESTINATION, destination) + + if (startNewTask) { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - presenter.onAttachView(this, intent?.getStringExtra("external_url")) + installSplashScreen().setKeepVisibleCondition { true } + + val externalLink = intent?.getStringExtra(EXTRA_EXTERNAL_URL) + val startDestination = intent?.getSerializableExtra(EXTRA_START_DESTINATION) as Destination? + ?: shortcutsHelper.getDestination(intent) + + presenter.onAttachView(this, externalLink, startDestination) } override fun openLoginView() { @@ -31,8 +62,8 @@ class SplashActivity : BaseActivity(), SplashView finish() } - override fun openMainView() { - startActivity(MainActivity.getStartIntent(this)) + override fun openMainView(destination: Destination?) { + startActivity(MainActivity.getStartIntent(this, destination)) finish() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt index 03e43efa8..0b7409020 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt @@ -1,12 +1,10 @@ package io.github.wulkanowy.ui.modules.splash -import io.github.wulkanowy.data.Status 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.utils.flowWithResource -import kotlinx.coroutines.flow.onEach -import timber.log.Timber +import io.github.wulkanowy.ui.modules.Destination +import kotlinx.coroutines.launch import javax.inject.Inject class SplashPresenter @Inject constructor( @@ -14,7 +12,7 @@ class SplashPresenter @Inject constructor( studentRepository: StudentRepository, ) : BasePresenter(errorHandler, studentRepository) { - fun onAttachView(view: SplashView, externalUrl: String?) { + fun onAttachView(view: SplashView, externalUrl: String?, startDestination: Destination?) { super.onAttachView(view) if (!externalUrl.isNullOrBlank()) { @@ -22,15 +20,16 @@ class SplashPresenter @Inject constructor( return } - flowWithResource { studentRepository.isCurrentStudentSet() }.onEach { - when (it.status) { - Status.LOADING -> Timber.d("Is current user set check started") - Status.SUCCESS -> { - if (it.data!!) view.openMainView() - else view.openLoginView() + presenterScope.launch { + runCatching { studentRepository.isCurrentStudentSet() } + .onFailure(errorHandler::dispatch) + .onSuccess { + if (it) { + view.openMainView(startDestination) + } else { + view.openLoginView() + } } - Status.ERROR -> errorHandler.dispatch(it.error!!) - } - }.launch() + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt index a5aa14091..1c5d8bfd4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt @@ -1,12 +1,13 @@ package io.github.wulkanowy.ui.modules.splash import io.github.wulkanowy.ui.base.BaseView +import io.github.wulkanowy.ui.modules.Destination interface SplashView : BaseView { fun openLoginView() - fun openMainView() + fun openMainView(destination: Destination?) fun openExternalUrlAndFinish(url: String) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index 4478a2a66..07a9f6c76 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -97,7 +97,7 @@ class TimetableFragment : BaseFragment(R.layout.fragme timetableNavDate.setOnClickListener { presenter.onPickDate() } timetableNextButton.setOnClickListener { presenter.onNextDay() } - timetableNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + timetableNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt index 47bee1e39..e8fb9e440 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt @@ -72,7 +72,7 @@ class AdditionalLessonsFragment : additionalLessonsNavDate.setOnClickListener { presenter.onPickDate() } additionalLessonsNextButton.setOnClickListener { presenter.onNextDay() } - additionalLessonsNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + additionalLessonsNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt index b8da1c0fd..a6b126447 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt @@ -79,7 +79,7 @@ class CompletedLessonsFragment : completedLessonsNavDate.setOnClickListener { presenter.onPickDate() } completedLessonsNextButton.setOnClickListener { presenter.onNextDay() } - completedLessonsNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + completedLessonsNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 63fc84962..2c8c5a677 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -2,7 +2,6 @@ package io.github.wulkanowy.ui.modules.timetablewidget import android.annotation.SuppressLint import android.app.PendingIntent -import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_DELETED import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE @@ -25,8 +24,9 @@ import io.github.wulkanowy.data.repositories.StudentRepository 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.main.MainActivity +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 @@ -167,18 +167,20 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { action = appWidgetId.toString() } val accountIntent = PendingIntent.getActivity( - context, -Int.MAX_VALUE + appWidgetId, + context, + -Int.MAX_VALUE + appWidgetId, Intent(context, TimetableWidgetConfigureActivity::class.java).apply { addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK) putExtra(EXTRA_APPWIDGET_ID, appWidgetId) putExtra(EXTRA_FROM_PROVIDER, true) - }, FLAG_UPDATE_CURRENT + }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE + ) val appIntent = PendingIntent.getActivity( context, TIMETABLE_PENDING_INTENT_ID, - MainActivity.getStartIntent(context, Destination.Timetable(), true), - FLAG_UPDATE_CURRENT + SplashActivity.getStartIntent(context, Destination.Timetable(), true), + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) val remoteView = RemoteViews(context.packageName, layoutId).apply { @@ -222,16 +224,16 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { code: Int, appWidgetId: Int, buttonType: String - ): PendingIntent { - return PendingIntent.getBroadcast( - context, code, - Intent(context, TimetableWidgetProvider::class.java).apply { - action = ACTION_APPWIDGET_UPDATE - putExtra(EXTRA_BUTTON_TYPE, buttonType) - putExtra(EXTRA_TOGGLED_WIDGET_ID, appWidgetId) - }, FLAG_UPDATE_CURRENT - ) - } + ) = PendingIntent.getBroadcast( + context, + code, + Intent(context, TimetableWidgetProvider::class.java).apply { + action = ACTION_APPWIDGET_UPDATE + putExtra(EXTRA_BUTTON_TYPE, buttonType) + putExtra(EXTRA_TOGGLED_WIDGET_ID, appWidgetId) + }, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE + ) private suspend fun getStudent(studentId: Long, appWidgetId: Int) = try { val students = studentRepository.getSavedStudents(false) diff --git a/app/src/main/java/io/github/wulkanowy/ui/widgets/FittedScrollableTabLayout.kt b/app/src/main/java/io/github/wulkanowy/ui/widgets/FittedScrollableTabLayout.kt index 0f121dc5b..6b7fb4aa9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/widgets/FittedScrollableTabLayout.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/widgets/FittedScrollableTabLayout.kt @@ -3,17 +3,15 @@ package io.github.wulkanowy.ui.widgets import android.content.Context import android.util.AttributeSet import android.view.ViewGroup +import com.google.android.material.tabs.TabLayout /** * @see
Tabs don't fit to screen with tabmode=scrollable, Even with a Custom Tab Layout */ -class FittedScrollableTabLayout : MaterialTabLayout { - - constructor(context: Context) : super(context) - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) - - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) +class FittedScrollableTabLayout @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : TabLayout(context, attrs) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { setMeasuredDimension(widthMeasureSpec, heightMeasureSpec) diff --git a/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialLinearLayout.kt b/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialLinearLayout.kt index a04922e5d..4e1ca1a97 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialLinearLayout.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialLinearLayout.kt @@ -1,24 +1,19 @@ package io.github.wulkanowy.ui.widgets import android.content.Context -import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP import android.util.AttributeSet import android.widget.LinearLayout import androidx.core.view.ViewCompat -import com.google.android.material.elevation.ElevationOverlayProvider import com.google.android.material.shape.MaterialShapeDrawable -class MaterialLinearLayout : LinearLayout { - - constructor(context: Context) : super(context) - - constructor(context: Context, attr: AttributeSet) : super(context, attr) - - constructor(context: Context, attr: AttributeSet, defStyleAttr: Int) : super(context, attr, defStyleAttr) +class MaterialLinearLayout @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : LinearLayout(context, attrs) { init { - val drawable = MaterialShapeDrawable.createWithElevationOverlay(context, ViewCompat.getElevation(this)) + val drawable = + MaterialShapeDrawable.createWithElevationOverlay(context, ViewCompat.getElevation(this)) ViewCompat.setBackground(this, drawable) } @@ -28,12 +23,4 @@ class MaterialLinearLayout : LinearLayout { (background as MaterialShapeDrawable).elevation = elevation } } - - fun setElevationCompat(elevation: Float) { - if (SDK_INT >= LOLLIPOP) { - setElevation(elevation) - } else { - setBackgroundColor(ElevationOverlayProvider(context).compositeOverlayWithThemeSurfaceColorIfNeeded(elevation)) - } - } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialTabLayout.kt b/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialTabLayout.kt deleted file mode 100644 index e19d01116..000000000 --- a/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialTabLayout.kt +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.wulkanowy.ui.widgets - -import android.content.Context -import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP -import android.util.AttributeSet -import com.google.android.material.elevation.ElevationOverlayProvider -import com.google.android.material.tabs.TabLayout - -open class MaterialTabLayout : TabLayout { - - constructor(context: Context) : super(context) - - constructor(context: Context, attr: AttributeSet) : super(context, attr) - - constructor(context: Context, attr: AttributeSet, defStyleAttr: Int) : super(context, attr, defStyleAttr) - - fun setElevationCompat(elevation: Float) { - if (SDK_INT >= LOLLIPOP) { - setElevation(elevation) - } else { - setBackgroundColor(ElevationOverlayProvider(context).compositeOverlayWithThemeSurfaceColorIfNeeded(elevation)) - } - } -} diff --git a/app/src/main/java/io/github/wulkanowy/utils/PendingIntentCompat.kt b/app/src/main/java/io/github/wulkanowy/utils/PendingIntentCompat.kt new file mode 100644 index 000000000..45ee431a2 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/PendingIntentCompat.kt @@ -0,0 +1,11 @@ +package io.github.wulkanowy.utils + +import android.app.PendingIntent +import android.os.Build + +object PendingIntentCompat { + + val FLAG_IMMUTABLE = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + PendingIntent.FLAG_IMMUTABLE + } else 0 +} diff --git a/app/src/main/java/io/github/wulkanowy/utils/StringExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/StringExtension.kt index 5c888f30a..bddd7df4c 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/StringExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/StringExtension.kt @@ -4,6 +4,4 @@ inline fun String?.ifNullOrBlank(defaultValue: () -> String) = if (isNullOrBlank()) defaultValue() else this fun String.capitalise() = - replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } - -fun String.decapitalise() = replaceFirstChar { it.lowercase() } + replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt b/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt index 74ae19326..c994ebab6 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt @@ -2,10 +2,8 @@ package io.github.wulkanowy.utils.security -import android.annotation.TargetApi import android.content.Context import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.JELLY_BEAN_MR2 import android.os.Build.VERSION_CODES.M import android.security.KeyPairGeneratorSpec import android.security.keystore.KeyGenParameterSpec @@ -116,7 +114,6 @@ fun decrypt(cipherText: String): String { } } -@TargetApi(JELLY_BEAN_MR2) private fun generateKeyPair(context: Context) { (if (SDK_INT >= M) { KeyGenParameterSpec.Builder(KEY_ALIAS, PURPOSE_DECRYPT or PURPOSE_ENCRYPT) diff --git a/app/src/main/res/drawable-v23/compat_splash_screen_no_icon_background.xml b/app/src/main/res/drawable-v23/compat_splash_screen_no_icon_background.xml new file mode 100644 index 000000000..dad56a171 --- /dev/null +++ b/app/src/main/res/drawable-v23/compat_splash_screen_no_icon_background.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v23/img_splash_logo.png b/app/src/main/res/drawable-v23/img_splash_logo.png deleted file mode 100644 index 61489d81b973aae9ed13341ea9bc0f0902168b82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19474 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 o% - - - - - - - diff --git a/app/src/main/res/drawable/ic_splash_logo.xml b/app/src/main/res/drawable/ic_splash_logo.xml new file mode 100644 index 000000000..e2e747316 --- /dev/null +++ b/app/src/main/res/drawable/ic_splash_logo.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/img_splash_logo.png b/app/src/main/res/drawable/img_splash_logo.png deleted file mode 100644 index fb521bf65ee01a4c75b85550fd214c7c606f4444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20340 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 - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_attendance.xml b/app/src/main/res/layout/fragment_attendance.xml index 8016081b8..6f6f648a8 100644 --- a/app/src/main/res/layout/fragment_attendance.xml +++ b/app/src/main/res/layout/fragment_attendance.xml @@ -142,8 +142,8 @@ android:paddingRight="12dp" android:paddingBottom="8dp" android:scaleType="fitStart" - android:tint="?colorPrimary" - app:srcCompat="@drawable/ic_chevron_left" /> + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/fragment_exam.xml b/app/src/main/res/layout/fragment_exam.xml index ca88849c5..0c62aab5f 100644 --- a/app/src/main/res/layout/fragment_exam.xml +++ b/app/src/main/res/layout/fragment_exam.xml @@ -128,8 +128,8 @@ android:paddingRight="12dp" android:paddingBottom="8dp" android:scaleType="fitStart" - android:tint="?colorPrimary" - app:srcCompat="@drawable/ic_chevron_left" /> + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/fragment_lucky_number_history.xml b/app/src/main/res/layout/fragment_lucky_number_history.xml index 5f50d1261..a5698e2e4 100644 --- a/app/src/main/res/layout/fragment_lucky_number_history.xml +++ b/app/src/main/res/layout/fragment_lucky_number_history.xml @@ -118,8 +118,8 @@ android:paddingRight="12dp" android:paddingBottom="8dp" android:scaleType="fitStart" - android:tint="?colorPrimary" - app:srcCompat="@drawable/ic_chevron_left" /> + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml index f6fe39ddb..5269d95e8 100644 --- a/app/src/main/res/layout/fragment_message.xml +++ b/app/src/main/res/layout/fragment_message.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + android:layout_gravity="center_vertical" + app:tint="?colorPrimary" /> + android:layout_gravity="center_vertical" + app:tint="?colorPrimary" /> - + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/fragment_timetable_additional.xml b/app/src/main/res/layout/fragment_timetable_additional.xml index 61eb44454..a71f7545b 100644 --- a/app/src/main/res/layout/fragment_timetable_additional.xml +++ b/app/src/main/res/layout/fragment_timetable_additional.xml @@ -131,8 +131,8 @@ android:paddingRight="12dp" android:paddingBottom="8dp" android:scaleType="fitStart" - android:tint="?colorPrimary" - app:srcCompat="@drawable/ic_chevron_left" /> + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/fragment_timetable_completed.xml b/app/src/main/res/layout/fragment_timetable_completed.xml index 1a890fe12..e089275d9 100644 --- a/app/src/main/res/layout/fragment_timetable_completed.xml +++ b/app/src/main/res/layout/fragment_timetable_completed.xml @@ -130,8 +130,8 @@ android:paddingRight="12dp" android:paddingBottom="8dp" android:scaleType="fitStart" - android:tint="?colorPrimary" - app:srcCompat="@drawable/ic_chevron_left" /> + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/subitem_dashboard_conferences.xml b/app/src/main/res/layout/subitem_dashboard_conferences.xml index e80809365..8da2e19b4 100644 --- a/app/src/main/res/layout/subitem_dashboard_conferences.xml +++ b/app/src/main/res/layout/subitem_dashboard_conferences.xml @@ -2,7 +2,8 @@ + android:layout_height="wrap_content" + xmlns:tools="http://schemas.android.com/tools"> + - - \ No newline at end of file diff --git a/app/src/main/res/values-v26/styles.xml b/app/src/main/res/values-v26/styles.xml index 55413c053..3fb0a5dd8 100644 --- a/app/src/main/res/values-v26/styles.xml +++ b/app/src/main/res/values-v26/styles.xml @@ -5,11 +5,4 @@ false @android:color/darker_gray - - diff --git a/app/src/main/res/values-v28/styles.xml b/app/src/main/res/values-v28/styles.xml index ee77091d3..a936566f0 100644 --- a/app/src/main/res/values-v28/styles.xml +++ b/app/src/main/res/values-v28/styles.xml @@ -6,12 +6,4 @@ true @android:color/white - - \ No newline at end of file diff --git a/app/src/main/res/values-v29/styles.xml b/app/src/main/res/values-v29/styles.xml index ee77091d3..a936566f0 100644 --- a/app/src/main/res/values-v29/styles.xml +++ b/app/src/main/res/values-v29/styles.xml @@ -6,12 +6,4 @@ true @android:color/white - - \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 45382e6d2..7cd0f7258 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -23,10 +23,11 @@ true - @@ -50,8 +50,6 @@ 11sp - + + + + + diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 881d5bd4f..7d2f0cfed 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -1,20 +1,41 @@ - - - - - - + + diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml index 840f53573..95450ae1a 100644 --- a/app/src/main/res/values-v23/styles.xml +++ b/app/src/main/res/values-v23/styles.xml @@ -3,6 +3,11 @@ - \ No newline at end of file + + + diff --git a/app/src/main/res/values-v26/styles.xml b/app/src/main/res/values-v26/styles.xml deleted file mode 100644 index 3fb0a5dd8..000000000 --- a/app/src/main/res/values-v26/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml new file mode 100644 index 000000000..1cbe97911 --- /dev/null +++ b/app/src/main/res/values-v27/styles.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/values-v28/styles.xml b/app/src/main/res/values-v28/styles.xml deleted file mode 100644 index a936566f0..000000000 --- a/app/src/main/res/values-v28/styles.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values-v29/styles.xml b/app/src/main/res/values-v29/styles.xml deleted file mode 100644 index a936566f0..000000000 --- a/app/src/main/res/values-v29/styles.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values-v31/styles.xml b/app/src/main/res/values-v31/styles.xml new file mode 100644 index 000000000..cffb284ec --- /dev/null +++ b/app/src/main/res/values-v31/styles.xml @@ -0,0 +1,60 @@ + + + + + + + - - - - + + diff --git a/app/src/main/res/xml/provider_widget_lucky_number.xml b/app/src/main/res/xml/provider_widget_lucky_number.xml index 064f20570..330bd53fe 100644 --- a/app/src/main/res/xml/provider_widget_lucky_number.xml +++ b/app/src/main/res/xml/provider_widget_lucky_number.xml @@ -4,11 +4,13 @@ android:configure="io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetConfigureActivity" android:initialLayout="@layout/widget_luckynumber" android:minWidth="110dp" - android:minHeight="40dp" - android:minResizeWidth="40dp" + android:minHeight="110dp" android:minResizeHeight="40dp" android:previewImage="@drawable/img_luckynumber_widget_preview" + android:previewLayout="@layout/widget_luckynumber" android:resizeMode="horizontal|vertical" + android:targetCellWidth="2" + android:targetCellHeight="2" android:updatePeriodMillis="3600000" android:widgetCategory="home_screen" - tools:targetApi="jelly_bean_mr1" /> + tools:targetApi="s" /> diff --git a/app/src/main/res/xml/provider_widget_timetable.xml b/app/src/main/res/xml/provider_widget_timetable.xml index 5392dd50b..3cdad0c81 100644 --- a/app/src/main/res/xml/provider_widget_timetable.xml +++ b/app/src/main/res/xml/provider_widget_timetable.xml @@ -8,7 +8,10 @@ android:minResizeWidth="250dp" android:minResizeHeight="110dp" android:previewImage="@drawable/img_timetable_widget_preview" + android:previewLayout="@layout/widget_timetable_preview" android:resizeMode="horizontal|vertical" + android:targetCellWidth="3" + android:targetCellHeight="2" android:updatePeriodMillis="3600000" android:widgetCategory="home_screen" - tools:targetApi="jelly_bean_mr1" /> + tools:targetApi="s" /> From 8d2d7922f94bf7a15607aaad1bdb49234cb3f610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 29 Mar 2023 22:23:42 +0200 Subject: [PATCH 1122/1526] Fix collapse garde subject when grade is unread (#2158) --- .../github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index 38bae3761..2d63aae4d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -15,6 +15,7 @@ import io.github.wulkanowy.utils.changeModifier import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest import javax.inject.Inject @@ -77,7 +78,7 @@ class GradeAverageProvider @Inject constructor( ) } } - } + }.distinctUntilChanged() private fun calculateCombinedAverage( student: Student, From 7aa65e98ce3393a6e5a1e615d5ddc4ef0743a17c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 20:30:27 +0000 Subject: [PATCH 1123/1526] Bump com.android.tools:desugar_jdk_libs from 2.0.2 to 2.0.3 (#2162) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3fd11ccc7..e96d9b801 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -188,7 +188,7 @@ ext { dependencies { implementation "io.github.wulkanowy:sdk:1.9.2" - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.2' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" From cb914fe32b862fe5ab2f6aba597410e0bc2af916 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 20:30:56 +0000 Subject: [PATCH 1124/1526] Bump com.google.android.gms:play-services-ads from 21.5.0 to 22.0.0 (#2161) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e96d9b801..a0bc17aa7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -249,7 +249,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-config-ktx' playImplementation 'com.google.android.play:core:1.10.3' playImplementation 'com.google.android.play:core-ktx:1.8.1' - playImplementation 'com.google.android.gms:play-services-ads:21.5.0' + playImplementation 'com.google.android.gms:play-services-ads:22.0.0' hmsImplementation 'com.huawei.hms:hianalytics:6.9.1.200' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.8.1.300' From a7cf54897ac6d05c042a2b7e39a138d01adccac7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 20:32:06 +0000 Subject: [PATCH 1125/1526] Bump kotlin_version from 1.8.10 to 1.8.20 (#2160) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c14e0dbd3..2aa3f758e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.8.10' + kotlin_version = '1.8.20' about_libraries = '10.6.1' hilt_version = "2.45" } From 253e55f70e63e7fe24e75669c01a84a4a3448fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 5 Apr 2023 22:33:01 +0200 Subject: [PATCH 1126/1526] New Crowdin updates (#2159) --- app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-da-rDK/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + 8 files changed, 8 insertions(+) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 1897a48b4..bedb491bc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -682,6 +682,7 @@ Zrušit Žádné lekce + Synchronizováno %1$s v %2$s Vybrat motiv Světlý Tmavý diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 3875b3d98..ebec11b25 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -594,6 +594,7 @@ Cancel No lessons + Synchronized on %1$s at %2$s Choose theme Light Dark diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c03181e48..1e1785bff 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -594,6 +594,7 @@ Cancel Keine Lektionen + Synchronized on %1$s at %2$s Thema wählen Licht Dunkel diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 3875b3d98..ebec11b25 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -594,6 +594,7 @@ Cancel No lessons + Synchronized on %1$s at %2$s Choose theme Light Dark diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 7f0c32915..f797a4dcb 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -682,6 +682,7 @@ Anuluj Brak lekcji + Zsynchronizowano %1$s o %2$s Wybierz motyw Jasny Ciemny diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 42e1e0bb9..7a42e3880 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -682,6 +682,7 @@ Отменить Нет уроков + Synchronized on %1$s at %2$s Выбрать тему Светлая Тёмная diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 8979a95fc..cde3178bb 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -682,6 +682,7 @@ Zrušiť Žiadne lekcie + Synchronizované %1$s v %2$s Vybrať motív Svetlý Tmavý diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0c7369040..9602aabba 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -682,6 +682,7 @@ Скасувати Немаэ уроків + Synchronized on %1$s at %2$s Увібрати тему Яскрава Темна From c67d2d767d1b037c571efea34787838b92c2fec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 6 Apr 2023 01:28:47 +0200 Subject: [PATCH 1127/1526] Set error tint to password toggle icon when error occured (#2163) --- .../ui/modules/login/form/LoginFormFragment.kt | 11 +++++------ .../io/github/wulkanowy/utils/ContextExtension.kt | 6 ++---- app/src/main/res/layout/fragment_login_form.xml | 4 ++-- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index a0e7608d6..bbc382190 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -15,12 +15,7 @@ import io.github.wulkanowy.databinding.FragmentLoginFormBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginData -import io.github.wulkanowy.utils.AppInfo -import io.github.wulkanowy.utils.hideSoftInput -import io.github.wulkanowy.utils.openEmailClient -import io.github.wulkanowy.utils.openInternetBrowser -import io.github.wulkanowy.utils.setOnEditorDoneSignIn -import io.github.wulkanowy.utils.showSoftInput +import io.github.wulkanowy.utils.* import javax.inject.Inject @AndroidEntryPoint @@ -149,12 +144,14 @@ class LoginFormFragment : BaseFragment(R.layout.fragme override fun setErrorPassRequired(focus: Boolean) { with(binding.loginFormPassLayout) { error = getString(R.string.error_field_required) + setEndIconTintList(requireContext().getAttrColorStateList(R.attr.colorError)) } } override fun setErrorPassInvalid(focus: Boolean) { with(binding.loginFormPassLayout) { error = getString(R.string.login_invalid_password) + setEndIconTintList(requireContext().getAttrColorStateList(R.attr.colorError)) } } @@ -162,6 +159,7 @@ class LoginFormFragment : BaseFragment(R.layout.fragme with(binding) { loginFormUsernameLayout.error = " " loginFormPassLayout.error = " " + loginFormPassLayout.setEndIconTintList(requireContext().getAttrColorStateList(R.attr.colorError)) loginFormHostLayout.error = " " loginFormErrorBox.text = message ?: getString(R.string.login_incorrect_password_default) loginFormErrorBox.isVisible = true @@ -181,6 +179,7 @@ class LoginFormFragment : BaseFragment(R.layout.fragme override fun clearPassError() { binding.loginFormPassLayout.error = null + binding.loginFormPassLayout.setEndIconTintList(null) binding.loginFormErrorBox.isVisible = false } diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt index cc4c5aaa4..77f3eb64a 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt @@ -6,7 +6,6 @@ import android.content.res.ColorStateList import android.graphics.* import android.text.TextPaint import android.util.DisplayMetrics.DENSITY_DEFAULT -import android.widget.ImageView import androidx.annotation.* import androidx.core.content.ContextCompat import androidx.core.graphics.ColorUtils @@ -14,7 +13,6 @@ import androidx.core.graphics.applyCanvas import androidx.core.graphics.drawable.RoundedBitmapDrawable import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory import androidx.core.graphics.drawable.toBitmap -import androidx.core.widget.ImageViewCompat @ColorInt @@ -89,6 +87,6 @@ fun Context.createNameInitialsDrawable( .apply { isCircular = true } } -fun ImageView.setTint(@ColorInt color: Int) { - ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(color)) +fun Context.getAttrColorStateList(@AttrRes color: Int): ColorStateList { + return ColorStateList.valueOf(getThemeAttrColor(color)) } diff --git a/app/src/main/res/layout/fragment_login_form.xml b/app/src/main/res/layout/fragment_login_form.xml index 1aea70660..fac3960e9 100644 --- a/app/src/main/res/layout/fragment_login_form.xml +++ b/app/src/main/res/layout/fragment_login_form.xml @@ -180,12 +180,12 @@ android:layout_marginEnd="24dp" android:layout_marginRight="24dp" android:hint="@string/login_password_hint" + app:endIconMode="password_toggle" app:errorEnabled="true" app:errorIconDrawable="@null" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/loginFormUsernameLayout" - app:passwordToggleEnabled="true"> + app:layout_constraintTop_toBottomOf="@+id/loginFormUsernameLayout"> Date: Thu, 6 Apr 2023 01:29:46 +0200 Subject: [PATCH 1128/1526] Use segmented toggle buttons instead of option group in grades statistics (#2164) --- .../statistics/GradeStatisticsAdapter.kt | 4 ++- .../layout/item_grade_statistics_header.xml | 26 +++++++++++-------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt index fd0ac5471..3fce8d57e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt @@ -116,7 +116,9 @@ class GradeStatisticsAdapter @Inject constructor() : } ) - binding.gradeStatisticsTypeSwitch.setOnCheckedChangeListener { _, checkedId -> + binding.gradeStatisticsTypeSwitch.addOnButtonCheckedListener { _, checkedId, isChecked -> + if (!isChecked) return@addOnButtonCheckedListener + currentDataType = when (checkedId) { R.id.gradeStatisticsTypePartial -> GradeStatisticsItem.DataType.PARTIAL R.id.gradeStatisticsTypeSemester -> GradeStatisticsItem.DataType.SEMESTER diff --git a/app/src/main/res/layout/item_grade_statistics_header.xml b/app/src/main/res/layout/item_grade_statistics_header.xml index 92f522ba4..cc35f6066 100644 --- a/app/src/main/res/layout/item_grade_statistics_header.xml +++ b/app/src/main/res/layout/item_grade_statistics_header.xml @@ -1,8 +1,10 @@ + android:layout_height="wrap_content" + tools:context=".ui.modules.grade.statistics.GradeStatisticsAdapter"> - + android:paddingEnd="16dp" + app:selectionRequired="true" + app:singleSelection="true"> - - - - + - \ No newline at end of file + From bce2c39ccc0801e7831ed9936aa76b287fb435eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 6 Apr 2023 10:13:34 +0200 Subject: [PATCH 1129/1526] Disable error dialog for admin messages (#2165) --- .../wulkanowy/ui/modules/dashboard/DashboardPresenter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 22b0d267e..ac2c896dc 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 @@ -606,7 +606,7 @@ class DashboardPresenter @Inject constructor( } is Resource.Error -> { Timber.i("Loading dashboard admin message result: An exception occurred") - errorHandler.dispatch(it.error) + Timber.e(it.error) updateData( dashboardItem = DashboardItem.AdminMessages( adminMessage = null, @@ -748,7 +748,7 @@ class DashboardPresenter @Inject constructor( itemsLoadedList.find { it.type == DashboardItem.Type.ACCOUNT }?.error != null val isGeneralError = filteredItems.none { it.error == null } && filteredItems.isNotEmpty() || isAccountItemError - val firstError = itemsLoadedList.mapNotNull { it.error }.firstOrNull() + val firstError = itemsLoadedList.firstNotNullOfOrNull { it.error } val filteredOriginalLoadedList = dashboardItemLoadedList.filterNot { it.type == DashboardItem.Type.ACCOUNT } From 2c9434766861adbc5f7d5d497a4caac12a8c852b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Apr 2023 16:29:14 +0000 Subject: [PATCH 1130/1526] Bump androidx.core:core-ktx from 1.9.0 to 1.10.0 (#2167) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a0bc17aa7..edb0ca36d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -193,7 +193,7 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" - implementation "androidx.core:core-ktx:1.9.0" + implementation "androidx.core:core-ktx:1.10.0" implementation 'androidx.core:core-splashscreen:1.0.0' implementation "androidx.activity:activity-ktx:1.7.0" implementation "androidx.appcompat:appcompat:1.6.1" From 327e61bbdd0c3dbc37da1029c2aad4aae804b444 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Apr 2023 16:29:50 +0000 Subject: [PATCH 1131/1526] Bump about_libraries from 10.6.1 to 10.6.2 (#2166) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2aa3f758e..d53632feb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.8.20' - about_libraries = '10.6.1' + about_libraries = '10.6.2' hilt_version = "2.45" } repositories { From 6978ad11ebab55ffb221b060ba82443e9612929d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 05:11:17 +0000 Subject: [PATCH 1132/1526] Bump com.google.firebase:firebase-crashlytics-gradle from 2.9.4 to 2.9.5 (#2174) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d53632feb..ad23becdb 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.15' classpath 'com.huawei.agconnect:agcp:1.8.1.300' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.4' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.3.5" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.0.0.2929" From e7054bb5b94c716f76e997fc4542d56ca981ffef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 05:11:45 +0000 Subject: [PATCH 1133/1526] Bump com.google.firebase:firebase-bom from 31.4.0 to 31.5.0 (#2173) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index edb0ca36d..0cc3592f7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -242,7 +242,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.0' implementation 'org.apache.commons:commons-text:1.10.0' - playImplementation platform('com.google.firebase:firebase-bom:31.4.0') + playImplementation platform('com.google.firebase:firebase-bom:31.5.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From de8b38dd9ca1a5ab5b2b4618b8d406031c2e8b19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 05:12:06 +0000 Subject: [PATCH 1134/1526] Bump org.robolectric:robolectric from 4.9.2 to 4.10 (#2169) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0cc3592f7..c5c8992c8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -265,7 +265,7 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines" testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" - testImplementation 'org.robolectric:robolectric:4.9.2' + testImplementation 'org.robolectric:robolectric:4.10' testImplementation "androidx.test:runner:1.5.2" testImplementation "androidx.test.ext:junit:1.1.5" testImplementation "androidx.test:core:1.5.0" From 1f30cc1f902b25cf2b56cc17a8b896d73ec946ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 05:12:24 +0000 Subject: [PATCH 1135/1526] Bump mockk from 1.13.4 to 1.13.5 (#2170) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c5c8992c8..d0199a0e7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -181,7 +181,7 @@ ext { android_hilt = "1.0.0" room = "2.5.1" chucker = "3.5.2" - mockk = "1.13.4" + mockk = "1.13.5" coroutines = "1.6.4" } From 623f0339e692a362a03e202d3767cba8f7b6c9ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 05:21:17 +0000 Subject: [PATCH 1136/1526] Bump com.fredporciuncula:flow-preferences from 1.9.0 to 1.9.1 (#2172) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d0199a0e7..b8d4e1ca5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -239,7 +239,7 @@ dependencies { implementation "io.coil-kt:coil:2.3.0" implementation "io.github.wulkanowy:AppKillerManager:3.0.1" implementation 'me.xdrop:fuzzywuzzy:1.4.0' - implementation 'com.fredporciuncula:flow-preferences:1.9.0' + implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.10.0' playImplementation platform('com.google.firebase:firebase-bom:31.5.0') From b1d22843b59cbcabca741bdb8cdb9d92c2cc3d9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 21:29:42 +0000 Subject: [PATCH 1137/1526] Bump androidx.core:core-splashscreen from 1.0.0 to 1.0.1 (#2180) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b8d4e1ca5..77b3d8c40 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -194,7 +194,7 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" implementation "androidx.core:core-ktx:1.10.0" - implementation 'androidx.core:core-splashscreen:1.0.0' + implementation 'androidx.core:core-splashscreen:1.0.1' implementation "androidx.activity:activity-ktx:1.7.0" implementation "androidx.appcompat:appcompat:1.6.1" implementation "androidx.fragment:fragment-ktx:1.5.6" From b2af5ed57de63a39cd392c3db3c93b91fd7690a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 21:30:39 +0000 Subject: [PATCH 1138/1526] Bump com.squareup.okhttp3:logging-interceptor from 4.10.0 to 4.11.0 (#2177) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 77b3d8c40..2a1d58885 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -230,7 +230,7 @@ dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0" - implementation "com.squareup.okhttp3:logging-interceptor:4.10.0" + implementation "com.squareup.okhttp3:logging-interceptor:4.11.0" implementation "com.jakewharton.timber:timber:5.0.1" implementation "at.favre.lib:slf4j-timber:1.0.1" From 56d7e94946dca8536764050fdcf0080df10e9cd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 21:31:46 +0000 Subject: [PATCH 1139/1526] Bump com.huawei.agconnect:agcp from 1.8.1.300 to 1.9.0.300 (#2179) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ad23becdb..b8813f89f 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ buildscript { classpath 'com.android.tools.build:gradle:7.4.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.15' - classpath 'com.huawei.agconnect:agcp:1.8.1.300' + classpath 'com.huawei.agconnect:agcp:1.9.0.300' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.3.5" From 4fedb74005e3a3cb02d6792f7e156ec62149c189 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 21:32:02 +0000 Subject: [PATCH 1140/1526] Bump kotlin_version from 1.8.20 to 1.8.21 (#2182) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b8813f89f..3c8552d20 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.8.20' + kotlin_version = '1.8.21' about_libraries = '10.6.2' hilt_version = "2.45" } From f7fa89638a4e0e55ce56b2f7e254816c1b9b82b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 21:32:49 +0000 Subject: [PATCH 1141/1526] Bump com.huawei.agconnect:agconnect-crash from 1.8.1.300 to 1.9.0.300 (#2178) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 2a1d58885..77a17a293 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -252,7 +252,7 @@ dependencies { playImplementation 'com.google.android.gms:play-services-ads:22.0.0' hmsImplementation 'com.huawei.hms:hianalytics:6.9.1.200' - hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.8.1.300' + hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.0.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 4be66637526c7ef1a77194c87532a52c4dbf4b1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 21:50:34 +0000 Subject: [PATCH 1142/1526] Bump com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter (#2175) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 77a17a293..732de13c0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -229,7 +229,7 @@ dependencies { implementation "com.github.YarikSOffice:lingver:1.3.0" implementation 'com.squareup.retrofit2:retrofit:2.9.0' - implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0" + implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0" implementation "com.squareup.okhttp3:logging-interceptor:4.11.0" implementation "com.jakewharton.timber:timber:5.0.1" From b1a5a77559df78866d7d194771485ec8746557e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 21:50:48 +0000 Subject: [PATCH 1143/1526] Bump androidx.fragment:fragment-ktx from 1.5.6 to 1.5.7 (#2176) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 732de13c0..f54d80cb9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -197,7 +197,7 @@ dependencies { implementation 'androidx.core:core-splashscreen:1.0.1' implementation "androidx.activity:activity-ktx:1.7.0" implementation "androidx.appcompat:appcompat:1.6.1" - implementation "androidx.fragment:fragment-ktx:1.5.6" + implementation "androidx.fragment:fragment-ktx:1.5.7" implementation "androidx.annotation:annotation:1.6.0" implementation "androidx.preference:preference-ktx:1.2.0" From b195fda026d7d262a3a1c408bcc2fdd11e01527c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 22:02:43 +0000 Subject: [PATCH 1144/1526] Bump androidx.activity:activity-ktx from 1.7.0 to 1.7.1 (#2181) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f54d80cb9..79cb37ff8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ dependencies { implementation "androidx.core:core-ktx:1.10.0" implementation 'androidx.core:core-splashscreen:1.0.1' - implementation "androidx.activity:activity-ktx:1.7.0" + implementation "androidx.activity:activity-ktx:1.7.1" implementation "androidx.appcompat:appcompat:1.6.1" implementation "androidx.fragment:fragment-ktx:1.5.7" implementation "androidx.annotation:annotation:1.6.0" From f8431d7ad6d10b67594599015bd5f6c9d5a45ae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 7 May 2023 23:21:59 +0200 Subject: [PATCH 1145/1526] SDK update (#2168) --- .gitignore | 1 + app/build.gradle | 2 +- .../io/github/wulkanowy/data/DataModule.kt | 2 - .../github/wulkanowy/data/db/entities/Exam.kt | 1 + .../data/mappers/ConferenceMapper.kt | 6 +- .../wulkanowy/data/mappers/ExamMapper.kt | 2 +- .../wulkanowy/data/mappers/MessageMapper.kt | 2 +- .../data/mappers/MobileDeviceMapper.kt | 2 +- .../data/mappers/RegisterUserMapper.kt | 31 +++---- .../wulkanowy/data/mappers/StudentMapper.kt | 37 -------- .../wulkanowy/data/mappers/TimetableMapper.kt | 16 ++-- .../wulkanowy/data/pojos/RegisterUser.kt | 11 ++- .../data/repositories/AppCreatorRepository.kt | 1 - .../data/repositories/AttendanceRepository.kt | 2 +- .../data/repositories/ExamRepository.kt | 2 +- .../data/repositories/NoteRepository.kt | 2 +- .../data/repositories/SemesterRepository.kt | 2 +- .../data/repositories/StudentRepository.kt | 36 ++++---- .../data/repositories/TeacherRepository.kt | 2 +- .../data/repositories/TimetableRepository.kt | 2 +- .../ui/modules/login/LoginErrorHandler.kt | 14 ++-- .../login/advanced/LoginAdvancedFragment.kt | 8 +- .../login/advanced/LoginAdvancedPresenter.kt | 84 ++++--------------- .../login/advanced/LoginAdvancedView.kt | 1 - .../modules/login/form/LoginFormFragment.kt | 4 + .../modules/login/form/LoginFormPresenter.kt | 3 + .../ui/modules/login/form/LoginFormView.kt | 2 + .../LoginStudentSelectFragment.kt | 1 - .../io/github/wulkanowy/utils/SdkExtension.kt | 11 ++- .../main/res/layout/fragment_login_form.xml | 1 - .../io/github/wulkanowy/TestEnityCreator.kt | 2 +- .../data/mappers/AttendanceMapperKtTest.kt | 4 +- .../repositories/AttendanceRepositoryTest.kt | 12 +-- .../data/repositories/ExamRemoteTest.kt | 13 ++- .../data/repositories/GradeRepositoryTest.kt | 33 ++++++-- .../repositories/MessageRepositoryTest.kt | 2 +- .../MobileDeviceRepositoryTest.kt | 17 ++-- .../repositories/SemesterRepositoryTest.kt | 3 +- .../data/repositories/StudentTest.kt | 81 ------------------ .../repositories/TimetableRepositoryTest.kt | 80 ++++++++++++++---- .../domain/GetMailboxByStudentUseCaseTest.kt | 2 +- .../modules/grade/GradeAverageProviderTest.kt | 2 +- .../login/form/LoginFormPresenterTest.kt | 23 ++++- .../LoginStudentSelectPresenterTest.kt | 16 +++- 44 files changed, 260 insertions(+), 321 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/data/mappers/StudentMapper.kt delete mode 100644 app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt diff --git a/.gitignore b/.gitignore index cd5ff7146..921bd0a9a 100644 --- a/.gitignore +++ b/.gitignore @@ -119,3 +119,4 @@ Thumbs.db app/src/release/agconnect-services.json app/src/release/agconnect-credentials.json .idea/deploymentTargetDropDown.xml +.idea/kotlinc.xml diff --git a/app/build.gradle b/app/build.gradle index 79cb37ff8..22de4b8b6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -186,7 +186,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:1.9.2" + implementation "io.github.wulkanowy:sdk:14267a9a" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt index e538b2b2f..c9e4990f9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt @@ -20,7 +20,6 @@ import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.RemoteConfigHelper -import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient @@ -81,7 +80,6 @@ internal class DataModule { .readTimeout(30, TimeUnit.SECONDS) .build() - @OptIn(ExperimentalSerializationApi::class) @Singleton @Provides fun provideRetrofit( diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt index 50299e607..2292c3e62 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt @@ -22,6 +22,7 @@ data class Exam( val subject: String, + @Deprecated("not available anymore") val group: String, val type: String, diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/ConferenceMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/ConferenceMapper.kt index 17a9e5cdb..add6439d4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/ConferenceMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/ConferenceMapper.kt @@ -10,9 +10,9 @@ fun List.mapToEntities(semester: Semester) = map { diaryId = semester.diaryId, agenda = it.agenda, conferenceId = it.id, - date = it.dateZoned.toInstant(), + date = it.date.toInstant(), presentOnConference = it.presentOnConference, - subject = it.subject, - title = it.title + subject = it.topic, + title = it.place, ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/ExamMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/ExamMapper.kt index bdb5efbba..173dfebf9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/ExamMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/ExamMapper.kt @@ -11,7 +11,7 @@ fun List.mapToEntities(semester: Semester) = map { date = it.date, entryDate = it.entryDate, subject = it.subject, - group = it.group, + group = "", type = it.type, description = it.description, teacher = it.teacher, diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/MessageMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/MessageMapper.kt index 6fc5dc950..a26d76651 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/MessageMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/MessageMapper.kt @@ -26,7 +26,7 @@ fun List.mapToEntities( messageId = it.id, correspondents = it.correspondents, subject = it.subject.trim(), - date = it.dateZoned.toInstant(), + date = it.date.toInstant(), folderId = it.folderId, unread = it.unread, unreadBy = it.unreadBy, diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt index 1a1c501f6..1f4178fae 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt @@ -9,7 +9,7 @@ import io.github.wulkanowy.sdk.pojo.Token as SdkToken fun List.mapToEntities(student: Student) = map { MobileDevice( userLoginId = student.userLoginId, - date = it.createDateZoned.toInstant(), + date = it.createDate.toInstant(), deviceId = it.id, name = it.name ) diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt index 2dfd7e062..bcf26a5e1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt @@ -3,22 +3,24 @@ package io.github.wulkanowy.data.mappers import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.pojos.* -import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.sdk.mapper.mapSemesters import java.time.Instant -import io.github.wulkanowy.sdk.scrapper.register.RegisterStudent as SdkRegisterStudent -import io.github.wulkanowy.sdk.scrapper.register.RegisterUser as SdkRegisterUser +import io.github.wulkanowy.sdk.pojo.RegisterStudent as SdkRegisterStudent +import io.github.wulkanowy.sdk.pojo.RegisterUser as SdkRegisterUser -fun SdkRegisterUser.mapToPojo(password: String) = RegisterUser( +fun SdkRegisterUser.mapToPojo(password: String?) = RegisterUser( email = email, login = login, password = password, - baseUrl = baseUrl, + scrapperBaseUrl = scrapperBaseUrl, + loginMode = loginMode, loginType = loginType, symbols = symbols.map { registerSymbol -> RegisterSymbol( symbol = registerSymbol.symbol, error = registerSymbol.error, + hebeBaseUrl = registerSymbol.hebeBaseUrl, + keyId = registerSymbol.keyId, + privatePem = registerSymbol.privatePem, userName = registerSymbol.userName, schools = registerSymbol.schools.map { RegisterUnit( @@ -42,14 +44,13 @@ fun SdkRegisterUser.mapToPojo(password: String) = RegisterUser( classId = registerSubject.classId, isParent = registerSubject.isParent, semesters = registerSubject.semesters - .mapSemesters() .mapToEntities(registerSubject.studentId), ) }, ) } ) - } + }, ) fun RegisterStudent.mapToStudentWithSemesters( @@ -68,17 +69,17 @@ fun RegisterStudent.mapToStudentWithSemesters( classId = classId, studentId = studentId, symbol = symbol.symbol, - loginType = user.loginType.name, + loginType = user.loginType?.name.orEmpty(), schoolName = unit.schoolName, schoolShortName = unit.schoolShortName, schoolSymbol = unit.schoolId, studentName = "$studentName $studentSurname", - loginMode = Sdk.Mode.SCRAPPER.name, - scrapperBaseUrl = user.baseUrl, - mobileBaseUrl = "", - certificateKey = "", - privateKey = "", - password = user.password, + loginMode = user.loginMode.name, + scrapperBaseUrl = user.scrapperBaseUrl.orEmpty(), + mobileBaseUrl = symbol.hebeBaseUrl.orEmpty(), + certificateKey = symbol.keyId.orEmpty(), + privateKey = symbol.privatePem.orEmpty(), + password = user.password.orEmpty(), isCurrent = false, registrationDate = Instant.now(), ).apply { diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/StudentMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/StudentMapper.kt deleted file mode 100644 index a2110d7f5..000000000 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/StudentMapper.kt +++ /dev/null @@ -1,37 +0,0 @@ -package io.github.wulkanowy.data.mappers - -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.db.entities.StudentWithSemesters -import java.time.Instant -import io.github.wulkanowy.sdk.pojo.Student as SdkStudent - -fun List.mapToEntities(password: String = "", colors: List) = map { - StudentWithSemesters( - student = Student( - email = it.email, - password = password, - isParent = it.isParent, - symbol = it.symbol, - studentId = it.studentId, - userLoginId = it.userLoginId, - userName = it.userName, - studentName = it.studentName + " " + it.studentSurname, - schoolSymbol = it.schoolSymbol, - schoolShortName = it.schoolShortName, - schoolName = it.schoolName, - className = it.className, - classId = it.classId, - scrapperBaseUrl = it.scrapperBaseUrl, - loginType = it.loginType.name, - isCurrent = false, - registrationDate = Instant.now(), - mobileBaseUrl = it.mobileBaseUrl, - privateKey = it.privateKey, - certificateKey = it.certificateKey, - loginMode = it.loginMode.name, - ).apply { - avatarColor = colors.random() - }, - semesters = it.semesters.mapToEntities(it.studentId) - ) -} diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/TimetableMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/TimetableMapper.kt index e55aa3cf7..ee525e108 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/TimetableMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/TimetableMapper.kt @@ -5,10 +5,10 @@ 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.pojos.TimetableFull -import io.github.wulkanowy.sdk.pojo.TimetableFull as SdkTimetableFull +import io.github.wulkanowy.sdk.pojo.Timetable as SdkTimetableFull import io.github.wulkanowy.sdk.pojo.TimetableDayHeader as SdkTimetableHeader -import io.github.wulkanowy.sdk.pojo.Timetable as SdkTimetable -import io.github.wulkanowy.sdk.pojo.TimetableAdditional as SdkTimetableAdditional +import io.github.wulkanowy.sdk.pojo.Lesson as SdkLesson +import io.github.wulkanowy.sdk.pojo.LessonAdditional as SdkTimetableAdditional fun SdkTimetableFull.mapToEntities(semester: Semester) = TimetableFull( lessons = lessons.mapToEntities(semester), @@ -16,13 +16,13 @@ fun SdkTimetableFull.mapToEntities(semester: Semester) = TimetableFull( headers = headers.mapToEntities(semester) ) -fun List.mapToEntities(semester: Semester) = map { +fun List.mapToEntities(semester: Semester) = map { Timetable( studentId = semester.studentId, diaryId = semester.diaryId, number = it.number, - start = it.startZoned.toInstant(), - end = it.endZoned.toInstant(), + start = it.start.toInstant(), + end = it.end.toInstant(), date = it.date, subject = it.subject, subjectOld = it.subjectOld, @@ -45,8 +45,8 @@ fun List.mapToEntities(semester: Semester) = map { diaryId = semester.diaryId, subject = it.subject, date = it.date, - start = it.startZoned.toInstant(), - end = it.endZoned.toInstant(), + start = it.start.toInstant(), + end = it.end.toInstant(), ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/RegisterUser.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/RegisterUser.kt index 4aea33771..98bf1402b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/pojos/RegisterUser.kt +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/RegisterUser.kt @@ -1,20 +1,25 @@ package io.github.wulkanowy.data.pojos import io.github.wulkanowy.data.db.entities.Semester +import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.scrapper.Scrapper data class RegisterUser( val email: String, - val password: String, + val password: String?, val login: String, // may be the same as email - val baseUrl: String, - val loginType: Scrapper.LoginType, + val scrapperBaseUrl: String?, + val loginType: Scrapper.LoginType?, + val loginMode: Sdk.Mode, val symbols: List, ) : java.io.Serializable data class RegisterSymbol( val symbol: String, val error: Throwable?, + val hebeBaseUrl: String?, + val keyId: String?, + val privatePem: String?, val userName: String, val schools: List, ) : java.io.Serializable diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt index cbaa12bd3..bec2797db 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AppCreatorRepository.kt @@ -19,7 +19,6 @@ class AppCreatorRepository @Inject constructor( ) { @OptIn(ExperimentalSerializationApi::class) - @Suppress("BlockingMethodInNonBlockingContext") suspend fun getAppCreators() = withContext(dispatchers.io) { val inputStream = context.assets.open("contributors.json").buffered() json.decodeFromStream>(inputStream) 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 fd5d8bd16..3afb99077 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 @@ -59,7 +59,7 @@ class AttendanceRepository @Inject constructor( } sdk.init(student) .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) - .getAttendance(start.monday, end.sunday, semester.semesterId) + .getAttendance(start.monday, end.sunday) .mapToEntities(semester, lessons) }, saveFetchResult = { old, new -> diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt index faa80b93e..013c0951d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt @@ -52,7 +52,7 @@ class ExamRepository @Inject constructor( fetch = { sdk.init(student) .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) - .getExams(start.startExamsDay, start.endExamsDay, semester.semesterId) + .getExams(start.startExamsDay, start.endExamsDay) .mapToEntities(semester) }, saveFetchResult = { old, new -> 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 e5d7bc5cb..4101803f3 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 @@ -42,7 +42,7 @@ class NoteRepository @Inject constructor( fetch = { sdk.init(student) .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) - .getNotes(semester.semesterId) + .getNotes() .mapToEntities(semester) }, saveFetchResult = { old, new -> diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt index 96f019223..92bb37081 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt @@ -40,7 +40,7 @@ class SemesterRepository @Inject constructor( val isNoSemesters = semesters.isEmpty() val isRefreshOnModeChangeRequired = when { - Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API -> { + Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE -> { semesters.firstOrNull { it.isCurrent }?.let { 0 == it.diaryId && 0 == it.kindergartenDiaryId } == true diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index b1d1ba832..4c7069ef6 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -10,11 +10,9 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.exceptions.NoCurrentStudentException -import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.mappers.mapToPojo import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.security.decrypt import io.github.wulkanowy.utils.security.encrypt @@ -29,37 +27,35 @@ class StudentRepository @Inject constructor( private val studentDb: StudentDao, private val semesterDb: SemesterDao, private val sdk: Sdk, - private val appInfo: AppInfo, private val appDatabase: AppDatabase ) { - suspend fun isStudentSaved() = getSavedStudents(false).isNotEmpty() - suspend fun isCurrentStudentSet() = studentDb.loadCurrent()?.isCurrent ?: false suspend fun getStudentsApi( pin: String, symbol: String, token: String - ): List = - sdk.getStudentsFromMobileApi(token, pin, symbol, "") - .mapToEntities(colors = appInfo.defaultColorsForAvatar) + ): RegisterUser = sdk + .getStudentsFromHebe(token, pin, symbol, "") + .mapToPojo(null) suspend fun getStudentsScrapper( email: String, password: String, scrapperBaseUrl: String, symbol: String - ): List = - sdk.getStudentsFromScrapper(email, password, scrapperBaseUrl, symbol) - .mapToEntities(password, appInfo.defaultColorsForAvatar) + ): RegisterUser = sdk + .getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, symbol) + .mapToPojo(password) suspend fun getUserSubjectsFromScrapper( email: String, password: String, scrapperBaseUrl: String, symbol: String - ): RegisterUser = sdk.getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, symbol) + ): RegisterUser = sdk + .getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, symbol) .mapToPojo(password) suspend fun getStudentsHybrid( @@ -67,15 +63,15 @@ class StudentRepository @Inject constructor( password: String, scrapperBaseUrl: String, symbol: String - ): List = - sdk.getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol) - .mapToEntities(password, appInfo.defaultColorsForAvatar) + ): RegisterUser = sdk + .getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol) + .mapToPojo(password) suspend fun getSavedStudents(decryptPass: Boolean = true) = studentDb.loadStudentsWithSemesters() .map { it.apply { - if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { + if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) { student.password = withContext(dispatchers.io) { decrypt(student.password) } @@ -85,7 +81,7 @@ class StudentRepository @Inject constructor( suspend fun getSavedStudentById(id: Long, decryptPass: Boolean = true) = studentDb.loadStudentWithSemestersById(id)?.apply { - if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { + if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) { student.password = withContext(dispatchers.io) { decrypt(student.password) } @@ -95,7 +91,7 @@ class StudentRepository @Inject constructor( suspend fun getStudentById(id: Long, decryptPass: Boolean = true): Student { val student = studentDb.loadById(id) ?: throw NoCurrentStudentException() - if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { + if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) { student.password = withContext(dispatchers.io) { decrypt(student.password) } @@ -106,7 +102,7 @@ class StudentRepository @Inject constructor( suspend fun getCurrentStudent(decryptPass: Boolean = true): Student { val student = studentDb.loadCurrent() ?: throw NoCurrentStudentException() - if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { + if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) { student.password = withContext(dispatchers.io) { decrypt(student.password) } @@ -119,7 +115,7 @@ class StudentRepository @Inject constructor( val students = studentsWithSemesters.map { it.student } .map { it.apply { - if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.API) { + if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.HEBE) { password = withContext(dispatchers.io) { encrypt(password, context) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt index acd71e1f4..4e3b40f96 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt @@ -40,7 +40,7 @@ class TeacherRepository @Inject constructor( fetch = { sdk.init(student) .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) - .getTeachers(semester.semesterId) + .getTeachers() .mapToEntities(semester) }, saveFetchResult = { old, new -> diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index 26e1f3fff..136fb8d5b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -66,7 +66,7 @@ class TimetableRepository @Inject constructor( fetch = { val timetableFull = sdk.init(student) .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) - .getTimetableFull(start.monday, end.sunday) + .getTimetable(start.monday, end.sunday) timetableFull.mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt index 37ab71dce..4f709438a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt @@ -4,13 +4,15 @@ import android.content.Context import android.database.sqlite.SQLiteConstraintException import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R -import io.github.wulkanowy.sdk.mobile.exception.InvalidPinException -import io.github.wulkanowy.sdk.mobile.exception.InvalidSymbolException -import io.github.wulkanowy.sdk.mobile.exception.InvalidTokenException -import io.github.wulkanowy.sdk.mobile.exception.TokenDeadException +import io.github.wulkanowy.sdk.hebe.exception.InvalidPinException +import io.github.wulkanowy.sdk.hebe.exception.InvalidTokenException +import io.github.wulkanowy.sdk.hebe.exception.TokenDeadException +import io.github.wulkanowy.sdk.hebe.exception.UnknownTokenException import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.ui.base.ErrorHandler import javax.inject.Inject +import io.github.wulkanowy.sdk.hebe.exception.InvalidSymbolException as InvalidHebeSymbolException +import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException as InvalidScrapperSymbolException class LoginErrorHandler @Inject constructor( @ApplicationContext context: Context, @@ -32,9 +34,11 @@ class LoginErrorHandler @Inject constructor( is BadCredentialsException -> onBadCredentials(error.message) is SQLiteConstraintException -> onStudentDuplicate(resources.getString(R.string.login_duplicate_student)) is TokenDeadException -> onInvalidToken(resources.getString(R.string.login_expired_token)) + is UnknownTokenException, is InvalidTokenException -> onInvalidToken(resources.getString(R.string.login_invalid_token)) is InvalidPinException -> onInvalidPin(resources.getString(R.string.login_invalid_pin)) - is InvalidSymbolException -> onInvalidSymbol(resources.getString(R.string.login_invalid_symbol)) + is InvalidScrapperSymbolException, + is InvalidHebeSymbolException -> onInvalidSymbol(resources.getString(R.string.login_invalid_symbol)) else -> super.proceed(error) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt index 8c90623e1..ead2d71af 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt @@ -34,9 +34,9 @@ class LoginAdvancedFragment : override val formLoginType: String get() = when (binding.loginTypeSwitch.checkedRadioButtonId) { - R.id.loginTypeApi -> "API" - R.id.loginTypeScrapper -> "SCRAPPER" - else -> "HYBRID" + R.id.loginTypeApi -> Sdk.Mode.HEBE.name + R.id.loginTypeScrapper -> Sdk.Mode.SCRAPPER.name + else -> Sdk.Mode.HYBRID.name } override val formUsernameValue: String @@ -99,7 +99,7 @@ class LoginAdvancedFragment : loginTypeSwitch.setOnCheckedChangeListener { _, checkedId -> presenter.onLoginModeSelected( when (checkedId) { - R.id.loginTypeApi -> Sdk.Mode.API + R.id.loginTypeApi -> Sdk.Mode.HEBE R.id.loginTypeScrapper -> Sdk.Mode.SCRAPPER else -> Sdk.Mode.HYBRID } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt index 33a76e5f9..ab56bd786 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt @@ -1,17 +1,12 @@ package io.github.wulkanowy.ui.modules.login.advanced import io.github.wulkanowy.data.Resource -import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.logResourceStatus import io.github.wulkanowy.data.onResourceNotLoading -import io.github.wulkanowy.data.pojos.RegisterStudent -import io.github.wulkanowy.data.pojos.RegisterSymbol -import io.github.wulkanowy.data.pojos.RegisterUnit import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.resourceFlow import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.sdk.scrapper.Scrapper import io.github.wulkanowy.sdk.scrapper.getNormalizedSymbol import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginData @@ -97,14 +92,16 @@ class LoginAdvancedPresenter @Inject constructor( fun onLoginModeSelected(type: Sdk.Mode) { view?.run { when (type) { - Sdk.Mode.API -> { + Sdk.Mode.HEBE -> { showOnlyMobileApiModeInputs() showMobileApiWarningMessage() } + Sdk.Mode.SCRAPPER -> { showOnlyScrapperModeInputs() showScraperWarningMessage() } + Sdk.Mode.HYBRID -> { showOnlyHybridModeInputs() showHybridWarningMessage() @@ -145,11 +142,12 @@ class LoginAdvancedPresenter @Inject constructor( showProgress(true) showContent(false) } + is Resource.Success -> { analytics.logEvent( "registration_form", "success" to true, - "students" to it.data.size, + "scrapperBaseUrl" to view?.formHostValue.orEmpty(), "error" to "No error" ) val loginData = LoginData( @@ -158,14 +156,15 @@ class LoginAdvancedPresenter @Inject constructor( baseUrl = view?.formHostValue.orEmpty().trim(), symbol = view?.formSymbolValue.orEmpty().trim().getNormalizedSymbol(), ) - when (it.data.size) { + when (it.data.symbols.size) { 0 -> view?.navigateToSymbol(loginData) else -> view?.navigateToStudentSelect( loginData = loginData, - registerUser = it.data.toRegisterUser(loginData), + registerUser = it.data, ) } } + is Resource.Error -> { analytics.logEvent( "registration_form", @@ -183,59 +182,7 @@ class LoginAdvancedPresenter @Inject constructor( }.launch("login") } - private fun List.toRegisterUser(loginData: LoginData) = RegisterUser( - email = loginData.login, - password = loginData.password, - login = loginData.login, - baseUrl = loginData.baseUrl, - loginType = firstOrNull()?.student?.loginType?.let( - Scrapper.LoginType::valueOf - ) ?: Scrapper.LoginType.AUTO, - symbols = this - .groupBy { students -> students.student.symbol } - .map { (symbol, students) -> - RegisterSymbol( - symbol = symbol, - error = null, - userName = "", - schools = students - .groupBy { student -> - Triple( - first = student.student.schoolSymbol, - second = student.student.userLoginId, - third = student.student.schoolShortName - ) - } - .map { (groupKey, students) -> - val (schoolId, loginId, schoolName) = groupKey - RegisterUnit( - students = students.map { - RegisterStudent( - studentId = it.student.studentId, - studentName = it.student.studentName, - studentSecondName = it.student.studentName, - studentSurname = it.student.studentName, - className = it.student.className, - classId = it.student.classId, - isParent = it.student.isParent, - semesters = it.semesters, - ) - }, - userLoginId = loginId, - schoolId = schoolId, - schoolName = schoolName, - schoolShortName = schoolName, - parentIds = listOf(), - studentIds = listOf(), - employeeIds = listOf(), - error = null - ) - } - ) - }, - ) - - private suspend fun getStudentsAppropriatesToLoginType(): List { + private suspend fun getStudentsAppropriatesToLoginType(): RegisterUser { val email = view?.formUsernameValue.orEmpty() val password = view?.formPassValue.orEmpty() val endpoint = view?.formHostValue.orEmpty() @@ -245,10 +192,11 @@ class LoginAdvancedPresenter @Inject constructor( val token = view?.formTokenValue.orEmpty() return when (Sdk.Mode.valueOf(view?.formLoginType.orEmpty())) { - Sdk.Mode.API -> studentRepository.getStudentsApi(pin, symbol, token) + Sdk.Mode.HEBE -> studentRepository.getStudentsApi(pin, symbol, token) Sdk.Mode.SCRAPPER -> studentRepository.getStudentsScrapper( email, password, endpoint, symbol ) + Sdk.Mode.HYBRID -> studentRepository.getStudentsHybrid( email, password, endpoint, symbol ) @@ -267,8 +215,8 @@ class LoginAdvancedPresenter @Inject constructor( var isCorrect = true - when (Sdk.Mode.valueOf(view?.formLoginType ?: "")) { - Sdk.Mode.API -> { + when (Sdk.Mode.valueOf(view?.formLoginType.orEmpty())) { + Sdk.Mode.HEBE -> { if (pin.isEmpty()) { view?.setErrorPinRequired() isCorrect = false @@ -284,17 +232,17 @@ class LoginAdvancedPresenter @Inject constructor( isCorrect = false } } + Sdk.Mode.HYBRID, Sdk.Mode.SCRAPPER -> { if (login.isEmpty()) { view?.setErrorUsernameRequired() isCorrect = false } else { - if ("@" in login && "standard" !in host) { + if ("@" in login && "login" in host) { view?.setErrorLoginRequired() isCorrect = false } - - if ("@" !in login && "standard" in host) { + if ("@" !in login && "email" in host) { view?.setErrorEmailRequired() isCorrect = false } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt index 824fa0288..34062d938 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.login.advanced -import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.modules.login.LoginData diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index bbc382190..43ba3fe1d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -204,6 +204,10 @@ class LoginFormFragment : BaseFragment(R.layout.fragme binding.loginFormContainer.visibility = if (show) VISIBLE else GONE } + override fun showOtherOptionsButton(show: Boolean) { + binding.loginFormAdvancedButton.isVisible = show + } + @SuppressLint("SetTextI18n") override fun showVersion() { binding.loginFormVersion.text = "v${appInfo.versionName}" diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index 8035ea0ad..ed70eb128 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.AnalyticsHelper +import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.ifNullOrBlank import timber.log.Timber import java.net.URL @@ -15,6 +16,7 @@ import javax.inject.Inject class LoginFormPresenter @Inject constructor( studentRepository: StudentRepository, private val loginErrorHandler: LoginErrorHandler, + private val appInfo: AppInfo, private val analytics: AnalyticsHelper ) : BasePresenter(loginErrorHandler, studentRepository) { @@ -25,6 +27,7 @@ class LoginFormPresenter @Inject constructor( view.run { initView() showContact(false) + showOtherOptionsButton(appInfo.isDebug) showVersion() loginErrorHandler.onBadCredentials = { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt index 5a816fb32..e5c680d6f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt @@ -56,6 +56,8 @@ interface LoginFormView : BaseView { fun showContent(show: Boolean) + fun showOtherOptionsButton(show: Boolean) + fun showVersion() fun navigateToSymbol(loginData: LoginData) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index 169702151..c33d12faa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -55,7 +55,6 @@ class LoginStudentSelectFragment : } } - @Suppress("UNCHECKED_CAST") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding = FragmentLoginStudentSelectBinding.bind(view) diff --git a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt index 63a30db8c..481cad113 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt @@ -12,18 +12,17 @@ fun Sdk.init(student: Student): Sdk { studentId = student.studentId classId = student.classId - if (Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) { + if (Sdk.Mode.valueOf(student.loginMode) == Sdk.Mode.HEBE) { + mobileBaseUrl = student.mobileBaseUrl + } else { scrapperBaseUrl = student.scrapperBaseUrl loginType = Sdk.ScrapperLoginType.valueOf(student.loginType) } - loginId = student.userLoginId mode = Sdk.Mode.valueOf(student.loginMode) mobileBaseUrl = student.mobileBaseUrl - certKey = student.certificateKey - privateKey = student.privateKey - - emptyCookieJarInterceptor = true + keyId = student.certificateKey + privatePem = student.privateKey Timber.d("Sdk in ${student.loginMode} mode reinitialized") diff --git a/app/src/main/res/layout/fragment_login_form.xml b/app/src/main/res/layout/fragment_login_form.xml index fac3960e9..3bfe0c34f 100644 --- a/app/src/main/res/layout/fragment_login_form.xml +++ b/app/src/main/res/layout/fragment_login_form.xml @@ -247,7 +247,6 @@ android:layout_marginEnd="16dp" android:text="@string/login_advanced" android:textAppearance="?android:textAppearance" - android:visibility="gone" app:backgroundTint="?android:windowBackground" app:fontFamily="sans-serif-medium" app:layout_constraintBottom_toBottomOf="@id/loginFormSignIn" diff --git a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt index 84a0cb405..c8d95829e 100644 --- a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt +++ b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt @@ -48,7 +48,7 @@ fun getSemesterPojo(diaryId: Int, semesterId: Int, start: LocalDate, end: LocalD end = end, ) -fun getStudentEntity(mode: Sdk.Mode = Sdk.Mode.API) = Student( +fun getStudentEntity(mode: Sdk.Mode = Sdk.Mode.HEBE) = Student( scrapperBaseUrl = "http://fakelog.cf", email = "jan@fakelog.cf", certificateKey = "", diff --git a/app/src/test/java/io/github/wulkanowy/data/mappers/AttendanceMapperKtTest.kt b/app/src/test/java/io/github/wulkanowy/data/mappers/AttendanceMapperKtTest.kt index a35e5d303..ac73becdc 100644 --- a/app/src/test/java/io/github/wulkanowy/data/mappers/AttendanceMapperKtTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/mappers/AttendanceMapperKtTest.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.data.mappers import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.sdk.pojo.Attendance -import io.github.wulkanowy.sdk.scrapper.attendance.SentExcuse +import io.github.wulkanowy.sdk.scrapper.attendance.SentExcuseStatus import org.junit.Test import java.time.Instant import java.time.LocalDate @@ -98,7 +98,7 @@ class AttendanceMapperTest { timeId = 1, categoryId = 1, deleted = false, - excuseStatus = SentExcuse.Status.WAITING, + excuseStatus = SentExcuseStatus.WAITING, excusable = false, absence = false, excused = false, diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt index 896491ef0..d0e500f19 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt @@ -63,7 +63,7 @@ class AttendanceRepositoryTest { @Test fun `force refresh without difference`() { // prepare - coEvery { sdk.getAttendance(startDate, endDate, 1) } returns remoteList + coEvery { sdk.getAttendance(startDate, endDate) } returns remoteList coEvery { attendanceDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester, emptyList())), flowOf(remoteList.mapToEntities(semester, emptyList())) @@ -77,7 +77,7 @@ class AttendanceRepositoryTest { // verify assertEquals(null, res.errorOrNull) assertEquals(2, res.dataOrNull?.size) - coVerify { sdk.getAttendance(startDate, endDate, 1) } + coVerify { sdk.getAttendance(startDate, endDate) } coVerify { attendanceDb.loadAll(1, 1, startDate, endDate) } coVerify { attendanceDb.insertAll(match { it.isEmpty() }) } coVerify { attendanceDb.deleteAll(match { it.isEmpty() }) } @@ -86,7 +86,7 @@ class AttendanceRepositoryTest { @Test fun `force refresh with more items in remote`() { // prepare - coEvery { sdk.getAttendance(startDate, endDate, 1) } returns remoteList + coEvery { sdk.getAttendance(startDate, endDate) } returns remoteList coEvery { attendanceDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.dropLast(1).mapToEntities(semester, emptyList())), flowOf(remoteList.dropLast(1).mapToEntities(semester, emptyList())), // after fetch end before save result @@ -101,7 +101,7 @@ class AttendanceRepositoryTest { // verify assertEquals(null, res.errorOrNull) assertEquals(2, res.dataOrNull?.size) - coVerify { sdk.getAttendance(startDate, endDate, 1) } + coVerify { sdk.getAttendance(startDate, endDate) } coVerify { attendanceDb.loadAll(1, 1, startDate, endDate) } coVerify { attendanceDb.insertAll(match { @@ -114,7 +114,7 @@ class AttendanceRepositoryTest { @Test fun `force refresh with more items in local`() { // prepare - coEvery { sdk.getAttendance(startDate, endDate, 1) } returns remoteList.dropLast(1) + coEvery { sdk.getAttendance(startDate, endDate) } returns remoteList.dropLast(1) coEvery { attendanceDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester, emptyList())), flowOf(remoteList.mapToEntities(semester, emptyList())), // after fetch end before save result @@ -129,7 +129,7 @@ class AttendanceRepositoryTest { // verify assertEquals(null, res.errorOrNull) assertEquals(1, res.dataOrNull?.size) - coVerify { sdk.getAttendance(startDate, endDate, 1) } + coVerify { sdk.getAttendance(startDate, endDate) } coVerify { attendanceDb.loadAll(1, 1, startDate, endDate) } coVerify { attendanceDb.insertAll(match { it.isEmpty() }) } coVerify { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt index e3790662e..fb037a87e 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt @@ -59,7 +59,7 @@ class ExamRemoteTest { @Test fun `force refresh without difference`() { // prepare - coEvery { sdk.getExams(startDate, realEndDate, 1) } returns remoteList + coEvery { sdk.getExams(startDate, realEndDate) } returns remoteList coEvery { examDb.loadAll(1, 1, startDate, realEndDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester)), flowOf(remoteList.mapToEntities(semester)) @@ -73,7 +73,7 @@ class ExamRemoteTest { // verify assertEquals(null, res.errorOrNull) assertEquals(2, res.dataOrNull?.size) - coVerify { sdk.getExams(startDate, realEndDate, 1) } + coVerify { sdk.getExams(startDate, realEndDate) } coVerify { examDb.loadAll(1, 1, startDate, realEndDate) } coVerify { examDb.insertAll(match { it.isEmpty() }) } coVerify { examDb.deleteAll(match { it.isEmpty() }) } @@ -82,7 +82,7 @@ class ExamRemoteTest { @Test fun `force refresh with more items in remote`() { // prepare - coEvery { sdk.getExams(startDate, realEndDate, 1) } returns remoteList + coEvery { sdk.getExams(startDate, realEndDate) } returns remoteList coEvery { examDb.loadAll(1, 1, startDate, realEndDate) } returnsMany listOf( flowOf(remoteList.dropLast(1).mapToEntities(semester)), flowOf(remoteList.dropLast(1).mapToEntities(semester)), // after fetch end before save result @@ -97,7 +97,7 @@ class ExamRemoteTest { // verify assertEquals(null, res.errorOrNull) assertEquals(2, res.dataOrNull?.size) - coVerify { sdk.getExams(startDate, realEndDate, 1) } + coVerify { sdk.getExams(startDate, realEndDate) } coVerify { examDb.loadAll(1, 1, startDate, realEndDate) } coVerify { examDb.insertAll(match { @@ -110,7 +110,7 @@ class ExamRemoteTest { @Test fun `force refresh with more items in local`() { // prepare - coEvery { sdk.getExams(startDate, realEndDate, 1) } returns remoteList.dropLast(1) + coEvery { sdk.getExams(startDate, realEndDate) } returns remoteList.dropLast(1) coEvery { examDb.loadAll(1, 1, startDate, realEndDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester)), flowOf(remoteList.mapToEntities(semester)), // after fetch end before save result @@ -125,7 +125,7 @@ class ExamRemoteTest { // verify assertEquals(null, res.errorOrNull) assertEquals(1, res.dataOrNull?.size) - coVerify { sdk.getExams(startDate, realEndDate, 1) } + coVerify { sdk.getExams(startDate, realEndDate) } coVerify { examDb.loadAll(1, 1, startDate, realEndDate) } coVerify { examDb.insertAll(match { it.isEmpty() }) } coVerify { @@ -137,7 +137,6 @@ class ExamRemoteTest { private fun getExam(date: LocalDate) = SdkExam( subject = "", - group = "", type = "", description = "", teacher = "", diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt index e8d0b6c8f..1d6dfaff0 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt @@ -9,13 +9,21 @@ import io.github.wulkanowy.data.toFirstResult import io.github.wulkanowy.getSemesterEntity import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.sdk.pojo.Grades import io.github.wulkanowy.utils.AutoRefreshHelper -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK +import io.mockk.just import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking -import org.junit.Assert.* +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import java.time.LocalDate @@ -72,7 +80,7 @@ class GradeRepositoryTest { createGradeApi(5, 4.0, of(2019, 2, 27), "Ocena z dnia logowania"), createGradeApi(5, 4.0, of(2019, 2, 28), "Ocena jeszcze nowsza") ) - coEvery { sdk.getGrades(1) } returns (remoteList to emptyList()) + coEvery { sdk.getGrades(1) } returns createGrades(remoteList) coEvery { gradeDb.loadAll(1, 1) } returnsMany listOf( flowOf(listOf()), // empty because it is new user @@ -122,7 +130,7 @@ class GradeRepositoryTest { ), createGradeApi(2, 5.0, of(2019, 2, 28), "Ta jest już w ogóle nowa") ) - coEvery { sdk.getGrades(1) } returns (remoteList to emptyList()) + coEvery { sdk.getGrades(1) } returns createGrades(remoteList) val localList = listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Jedna ocena"), @@ -169,7 +177,7 @@ class GradeRepositoryTest { createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) - coEvery { sdk.getGrades(1) } returns (remoteList to emptyList()) + coEvery { sdk.getGrades(1) } returns createGrades(remoteList) val localList = listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), @@ -200,7 +208,7 @@ class GradeRepositoryTest { createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), // will be added... createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) - coEvery { sdk.getGrades(1) } returns (remoteList to emptyList()) + coEvery { sdk.getGrades(1) } returns createGrades(remoteList) val localList = listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), @@ -230,7 +238,7 @@ class GradeRepositoryTest { createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) - coEvery { sdk.getGrades(1) } returns (remoteList to emptyList()) + coEvery { sdk.getGrades(1) } returns createGrades(remoteList) coEvery { gradeDb.loadAll(1, 1) } returnsMany listOf( flowOf(listOf()), @@ -250,7 +258,7 @@ class GradeRepositoryTest { fun `force refresh when remote is empty`() { // prepare val remoteList = emptyList() - coEvery { sdk.getGrades(semester.semesterId) } returns (remoteList to emptyList()) + coEvery { sdk.getGrades(semester.semesterId) } returns createGrades(remoteList) val localList = listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), @@ -284,4 +292,13 @@ class GradeRepositoryTest { weight = weight.toString(), weightValue = weight ) + + private fun createGrades(grades: List): Grades = Grades( + details = grades, + summary = listOf(), + isAverage = false, + isPoints = false, + isForAdults = false, + type = 0, + ) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt index 9a2c22fd6..3a18ee979 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt @@ -224,7 +224,7 @@ class MessageRepositoryTest { recipients = listOf(), subject = "", content = "Test", - dateZoned = Instant.EPOCH.atZone(ZoneOffset.UTC), + date = Instant.EPOCH.atZone(ZoneOffset.UTC), folderId = 1, unread = true, readBy = 1, diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt index 6865aa7da..1a3f96795 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt @@ -10,16 +10,21 @@ import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Device import io.github.wulkanowy.utils.AutoRefreshHelper -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK +import io.mockk.just import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import org.junit.Assert import org.junit.Before import org.junit.Test -import java.time.LocalDateTime.of -import java.time.ZoneId +import java.time.ZoneOffset +import java.time.ZonedDateTime.of class MobileDeviceRepositoryTest { @@ -134,9 +139,7 @@ class MobileDeviceRepositoryTest { id = 0, name = "", deviceId = "", - createDate = of(2019, 5, day, 0, 0, 0), - modificationDate = of(2019, 5, day, 0, 0, 0), - createDateZoned = of(2019, 5, day, 0, 0, 0).atZone(ZoneId.systemDefault()), - modificationDateZoned = of(2019, 5, day, 0, 0, 0).atZone(ZoneId.systemDefault()) + createDate = of(2019, 5, day, 0, 0, 0, 0, ZoneOffset.UTC), + modificationDate = of(2019, 5, day, 0, 0, 0, 0, ZoneOffset.UTC), ) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt index 0ed008851..d8256869f 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt @@ -75,7 +75,7 @@ class SemesterRepositoryTest { coEvery { semesterDb.deleteAll(any()) } just Runs coEvery { semesterDb.insertSemesters(any()) } returns listOf() - val items = runBlocking { semesterRepository.getSemesters(student.copy(loginMode = Sdk.Mode.API.name)) } + val items = runBlocking { semesterRepository.getSemesters(student.copy(loginMode = Sdk.Mode.HEBE.name)) } assertEquals(2, items.size) assertEquals(0, items[0].diaryId) } @@ -215,6 +215,7 @@ class SemesterRepositoryTest { @Test(expected = RuntimeException::class) fun getCurrentSemester_emptyList() { coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns emptyList() + coEvery { sdk.getSemesters() } returns emptyList() runBlocking { semesterRepository.getCurrentSemester(student) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt deleted file mode 100644 index 9d3d7a2ec..000000000 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/StudentTest.kt +++ /dev/null @@ -1,81 +0,0 @@ -package io.github.wulkanowy.data.repositories - -import io.github.wulkanowy.TestDispatchersProvider -import io.github.wulkanowy.data.db.dao.SemesterDao -import io.github.wulkanowy.data.db.dao.StudentDao -import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.sdk.pojo.Student -import io.github.wulkanowy.utils.AppInfo -import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.impl.annotations.MockK -import io.mockk.mockk -import kotlinx.coroutines.runBlocking -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Test - -class StudentTest { - - @MockK - private lateinit var mockSdk: Sdk - - @MockK - private lateinit var studentDb: StudentDao - - @MockK - private lateinit var semesterDb: SemesterDao - - private lateinit var studentRepository: StudentRepository - - @Before - fun initApi() { - MockKAnnotations.init(this) - studentRepository = StudentRepository( - context = mockk(), - dispatchers = TestDispatchersProvider(), - studentDb = studentDb, - semesterDb = semesterDb, - sdk = mockSdk, - appInfo = AppInfo(), - appDatabase = mockk() - ) - } - - @Test - fun testRemoteAll() { - coEvery { mockSdk.getStudentsFromScrapper(any(), any(), any(), any()) } returns listOf( - getStudent("test") - ) - - val students = runBlocking { studentRepository.getStudentsScrapper("", "", "http://fakelog.cf", "") } - assertEquals(1, students.size) - assertEquals("test Kowalski", students.first().student.studentName) - } - - private fun getStudent(name: String): Student { - return Student( - email = "", - symbol = "", - studentId = 0, - userLoginId = 0, - userLogin = "", - userName = "", - studentName = name, - studentSurname = "Kowalski", - schoolSymbol = "", - schoolShortName = "", - schoolName = "", - className = "", - classId = 0, - certificateKey = "", - privateKey = "", - loginMode = Sdk.Mode.SCRAPPER, - mobileBaseUrl = "", - loginType = Sdk.ScrapperLoginType.STANDARD, - scrapperBaseUrl = "", - isParent = false, - semesters = emptyList() - ) - } -} diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt index e56aaa5d0..92ad01b18 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt @@ -10,12 +10,17 @@ import io.github.wulkanowy.data.toFirstResult import io.github.wulkanowy.getSemesterEntity import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.sdk.pojo.TimetableFull import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper import io.github.wulkanowy.utils.AutoRefreshHelper -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK +import io.mockk.just +import io.mockk.mockk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals @@ -25,7 +30,7 @@ import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalDateTime.of import java.time.ZoneId -import io.github.wulkanowy.sdk.pojo.Timetable as SdkTimetable +import io.github.wulkanowy.sdk.pojo.Lesson as SdkLesson class TimetableRepositoryTest { @@ -62,18 +67,43 @@ class TimetableRepositoryTest { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - timetableRepository = TimetableRepository(timetableDb, timetableAdditionalDao, timetableHeaderDao, sdk, timetableNotificationSchedulerHelper, refreshHelper) + timetableRepository = TimetableRepository( + timetableDb, + timetableAdditionalDao, + timetableHeaderDao, + sdk, + timetableNotificationSchedulerHelper, + refreshHelper + ) } @Test fun `force refresh without difference`() { val remoteList = listOf( - createTimetableRemote(of(2021, 1, 4, 8, 0), 1, "123", "Język polski", "Jan Kowalski", false), - createTimetableRemote(of(2021, 1, 4, 8, 50), 2, "124", "Język niemiecki", "Joanna Czarniecka", true) + createTimetableRemote( + start = of(2021, 1, 4, 8, 0), + number = 1, + room = "123", + subject = "Język polski", + teacher = "Jan Kowalski", + changes = false + ), + createTimetableRemote( + start = of(2021, 1, 4, 8, 50), + number = 2, + room = "124", + subject = "Język niemiecki", + teacher = "Joanna Czarniecka", + changes = true + ) ) // prepare - coEvery { sdk.getTimetableFull(startDate, endDate) } returns TimetableFull(emptyList(), remoteList, emptyList()) + coEvery { sdk.getTimetable(startDate, endDate) } returns mockk { + every { headers } returns emptyList() + every { lessons } returns remoteList + every { additional } returns emptyList() + } coEvery { timetableDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester)), flowOf(remoteList.mapToEntities(semester)) @@ -81,7 +111,14 @@ class TimetableRepositoryTest { coEvery { timetableDb.insertAll(any()) } returns listOf(1, 2, 3) coEvery { timetableDb.deleteAll(any()) } just Runs - coEvery { timetableAdditionalDao.loadAll(1, 1, startDate, endDate) } returns flowOf(listOf()) + coEvery { + timetableAdditionalDao.loadAll( + diaryId = 1, + studentId = 1, + from = startDate, + end = endDate + ) + } returns flowOf(listOf()) coEvery { timetableAdditionalDao.deleteAll(emptyList()) } just Runs coEvery { timetableAdditionalDao.insertAll(emptyList()) } returns listOf(1, 2, 3) @@ -90,23 +127,36 @@ class TimetableRepositoryTest { coEvery { timetableHeaderDao.deleteAll(emptyList()) } just Runs // execute - val res = runBlocking { timetableRepository.getTimetable(student, semester, startDate, endDate, true).toFirstResult() } + val res = runBlocking { + timetableRepository.getTimetable( + student = student, + semester = semester, + start = startDate, + end = endDate, + forceRefresh = true + ).toFirstResult() + } // verify assertEquals(null, res.errorOrNull) assertEquals(2, res.dataOrNull!!.lessons.size) - coVerify { sdk.getTimetableFull(startDate, endDate) } + coVerify { sdk.getTimetable(startDate, endDate) } coVerify { timetableDb.loadAll(1, 1, startDate, endDate) } coVerify { timetableDb.insertAll(match { it.isEmpty() }) } coVerify { timetableDb.deleteAll(match { it.isEmpty() }) } } - private fun createTimetableRemote(start: LocalDateTime, number: Int = 1, room: String = "", subject: String = "", teacher: String = "", changes: Boolean = false) = SdkTimetable( + private fun createTimetableRemote( + start: LocalDateTime, + number: Int = 1, + room: String = "", + subject: String = "", + teacher: String = "", + changes: Boolean = false + ) = SdkLesson( number = number, - start = start, - end = start.plusMinutes(45), - startZoned = start.atZone(ZoneId.systemDefault()), - endZoned = start.plusMinutes(45).atZone(ZoneId.systemDefault()), + start = start.atZone(ZoneId.systemDefault()), + end = start.plusMinutes(45).atZone(ZoneId.systemDefault()), date = start.toLocalDate(), subject = subject, group = "", diff --git a/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt b/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt index 6db16d2f5..f58a5381d 100644 --- a/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt +++ b/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt @@ -207,7 +207,7 @@ class GetMailboxByStudentUseCaseTest { className = "", isCurrent = false, isParent = false, - loginMode = Sdk.Mode.API.name, + loginMode = Sdk.Mode.HEBE.name, loginType = Sdk.ScrapperLoginType.STANDARD.name, mobileBaseUrl = "", password = "", diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index 10c84efcf..b94002c0d 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -456,7 +456,7 @@ class GradeAverageProviderTest { @Test fun `force calc current semester average with custom modifiers in api mode`() { - val student = student.copy(loginMode = Sdk.Mode.API.name) + val student = student.copy(loginMode = Sdk.Mode.HEBE.name) every { preferencesRepository.gradeAverageForceCalcFlow } returns flowOf(true) every { preferencesRepository.isOptionalArithmeticAverageFlow } returns flowOf(false) diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt index bf2d9f2cc..eb1f53006 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt @@ -3,11 +3,18 @@ package io.github.wulkanowy.ui.modules.login.form import io.github.wulkanowy.MainCoroutineRule import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.StudentRepository +import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.scrapper.Scrapper import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.AnalyticsHelper -import io.mockk.* +import io.github.wulkanowy.utils.AppInfo +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.verify import org.junit.Before import org.junit.Rule import org.junit.Test @@ -30,13 +37,17 @@ class LoginFormPresenterTest { @MockK(relaxed = true) lateinit var analytics: AnalyticsHelper + @MockK + lateinit var appInfo: AppInfo + private lateinit var presenter: LoginFormPresenter private val registerUser = RegisterUser( email = "", password = "", login = "", - baseUrl = "", + scrapperBaseUrl = "", + loginMode = Sdk.Mode.HEBE, loginType = Scrapper.LoginType.AUTO, symbols = listOf(), ) @@ -54,8 +65,14 @@ class LoginFormPresenterTest { every { loginFormView.setErrorPassInvalid(any()) } just Runs every { loginFormView.setErrorPassRequired(any()) } just Runs every { loginFormView.setErrorUsernameRequired() } just Runs + every { appInfo.isDebug } returns false - presenter = LoginFormPresenter(repository, errorHandler, analytics) + presenter = LoginFormPresenter( + studentRepository = repository, + loginErrorHandler = errorHandler, + appInfo = appInfo, + analytics = analytics, + ) presenter.onAttachView(loginFormView) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index cf426a50b..da292c51c 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -6,14 +6,22 @@ import io.github.wulkanowy.data.pojos.RegisterSymbol import io.github.wulkanowy.data.pojos.RegisterUnit import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.StudentRepository +import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.scrapper.Scrapper import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AppInfo -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.clearMocks +import io.mockk.coEvery +import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.slot +import io.mockk.verify import org.junit.Before import org.junit.Rule import org.junit.Test @@ -76,6 +84,9 @@ class LoginStudentSelectPresenterTest { symbol = "", error = null, userName = "", + keyId = null, + privatePem = null, + hebeBaseUrl = null, schools = listOf(school), ) @@ -83,7 +94,8 @@ class LoginStudentSelectPresenterTest { email = "", password = "", login = "", - baseUrl = "", + scrapperBaseUrl = "", + loginMode = Sdk.Mode.SCRAPPER, loginType = Scrapper.LoginType.AUTO, symbols = listOf(symbol), ) From d99c93ec052f48c3ceb95207397212e086b2e2a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 7 May 2023 23:40:18 +0200 Subject: [PATCH 1146/1526] Version 2.0.0 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 22de4b8b6..bcca55873 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 121 - versionName "1.9.2" + versionCode 122 + versionName "2.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -186,7 +186,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:14267a9a" + implementation "io.github.wulkanowy:sdk:2.0.0" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index b3fec438f..c5ec9de3d 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,7 +1,8 @@ -Wersja 1.9.2 +Wersja 2.0.0 -- naprawiliśmy oznaczanie wiadomości jako odczytanych (problem dotyczył głównie kont rodziców z wieloma dziećmi w tej samej szkole) -- naprawiliśmy zapisywanie załączników do wiadomości w sytuacji, gdy ten sam załącznik był dodany do więcej niż jednej wiadomości -- usprawniliśmy ekran z wyborem uczniów i wpisywaniem symbolu przy pierwszym logowaniu +— zaktualizowaliśmy wygląd aplikacji na (częściowo) zgodny z wytycznymi Material 3 +— dodaliśmy możliwość zmiany kolejności pozycji w menu dolnym +— poprawiliśmy sposób wyświetlania błędu o nieprawidłowym haśle na ekranie logowania +— od teraz zmiana ustawień liczenia średniej automatycznie odświeży listę ocen Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 3fdd47c22196b1f6957c67f957e6dcadaf3826b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 11 May 2023 16:44:10 +0200 Subject: [PATCH 1147/1526] Fix ime overlaping message content (#2199) --- .../ui/modules/message/send/SendMessageActivity.kt | 9 +++++++-- app/src/main/res/layout/activity_send_message.xml | 6 ++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt index 28147faed..0ba82f1a0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessageActivity.kt @@ -142,10 +142,15 @@ class SendMessageActivity : BaseActivity - val bottomInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars()) + val navigationBarInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars()) + val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()) view.updateLayoutParams { - bottomMargin = bottomInsets.bottom + bottomMargin = if (imeInsets.bottom > navigationBarInsets.bottom) { + imeInsets.bottom + } else { + navigationBarInsets.bottom + } } WindowInsetsCompat.CONSUMED } diff --git a/app/src/main/res/layout/activity_send_message.xml b/app/src/main/res/layout/activity_send_message.xml index fac27d99f..e50cf6b39 100644 --- a/app/src/main/res/layout/activity_send_message.xml +++ b/app/src/main/res/layout/activity_send_message.xml @@ -22,17 +22,15 @@ + android:layout_height="wrap_content"> Date: Thu, 11 May 2023 23:45:20 +0200 Subject: [PATCH 1148/1526] Add auth dialog (#2198) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- app/build.gradle | 2 +- .../wulkanowy/data/db/dao/StudentDao.kt | 4 + .../wulkanowy/data/db/entities/StudentName.kt | 18 +++ .../data/repositories/StudentRepository.kt | 20 +++ .../github/wulkanowy/ui/base/BaseActivity.kt | 5 + .../wulkanowy/ui/base/BaseDialogFragment.kt | 8 +- .../github/wulkanowy/ui/base/BaseFragment.kt | 5 + .../github/wulkanowy/ui/base/BasePresenter.kt | 8 +- .../io/github/wulkanowy/ui/base/BaseView.kt | 2 + .../github/wulkanowy/ui/base/ErrorHandler.kt | 5 + .../wulkanowy/ui/modules/auth/AuthDialog.kt | 81 +++++++++++ .../ui/modules/auth/AuthPresenter.kt | 100 ++++++++++++++ .../wulkanowy/ui/modules/auth/AuthView.kt | 20 +++ .../ui/modules/settings/SettingsFragment.kt | 2 + .../settings/advanced/AdvancedFragment.kt | 5 + .../settings/appearance/AppearanceFragment.kt | 5 + .../notifications/NotificationsFragment.kt | 5 + .../ui/modules/settings/sync/SyncFragment.kt | 5 + .../wulkanowy/utils/StudentExtension.kt | 2 +- app/src/main/res/drawable/ic_auth_success.xml | 10 ++ app/src/main/res/layout/dialog_auth.xml | 128 ++++++++++++++++++ app/src/main/res/values/strings.xml | 11 ++ app/src/main/res/values/styles.xml | 5 + .../ui/modules/settings/ads/AdsFragment.kt | 5 + 24 files changed, 455 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/entities/StudentName.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthView.kt create mode 100644 app/src/main/res/drawable/ic_auth_success.xml create mode 100644 app/src/main/res/layout/dialog_auth.xml diff --git a/app/build.gradle b/app/build.gradle index bcca55873..16127d9a3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -186,7 +186,7 @@ ext { } dependencies { - implementation "io.github.wulkanowy:sdk:2.0.0" + implementation 'com.github.wulkanowy:sdk:c1573f04c5' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt index cfa7a72a2..a2f0abac6 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt @@ -2,6 +2,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.* import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentName import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar import io.github.wulkanowy.data.db.entities.StudentWithSemesters import javax.inject.Singleton @@ -19,6 +20,9 @@ abstract class StudentDao { @Update(entity = Student::class) abstract suspend fun update(studentNickAndAvatar: StudentNickAndAvatar) + @Update(entity = Student::class) + abstract suspend fun update(studentName: StudentName) + @Query("SELECT * FROM Students WHERE is_current = 1") abstract suspend fun loadCurrent(): Student? diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentName.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentName.kt new file mode 100644 index 000000000..46f754b5e --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentName.kt @@ -0,0 +1,18 @@ +package io.github.wulkanowy.data.db.entities + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import java.io.Serializable + +@Entity +data class StudentName( + + @ColumnInfo(name = "student_name") + val studentName: String + +) : Serializable { + + @PrimaryKey + var id: Long = 0 +} diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index 4c7069ef6..a6bb72433 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -6,7 +6,9 @@ import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.dao.StudentDao +import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentName import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.exceptions.NoCurrentStudentException @@ -14,6 +16,7 @@ import io.github.wulkanowy.data.mappers.mapToPojo import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.DispatchersProvider +import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.security.decrypt import io.github.wulkanowy.utils.security.encrypt import kotlinx.coroutines.withContext @@ -146,4 +149,21 @@ class StudentRepository @Inject constructor( suspend fun isOneUniqueStudent() = getSavedStudents(false) .distinctBy { it.student.studentName }.size == 1 + + suspend fun authorizePermission(student: Student, semester: Semester, pesel: String) = + sdk.init(student) + .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .authorizePermission(pesel) + + suspend fun refreshStudentName(student: Student, semester: Semester) { + val newCurrentApiStudent = sdk.init(student) + .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .getCurrentStudent() ?: return + + val studentName = StudentName( + studentName = "${newCurrentApiStudent.studentName} ${newCurrentApiStudent.studentSurname}" + ).apply { id = student.id } + + studentDb.update(studentName) + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index 7914df81c..f622209a7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -10,6 +10,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG import io.github.wulkanowy.R +import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.utils.FragmentLifecycleLogger import io.github.wulkanowy.utils.getThemeAttrColor @@ -76,6 +77,10 @@ abstract class BaseActivity, VB : ViewBinding> : .show() } + override fun showAuthDialog() { + AuthDialog.newInstance().show(supportFragmentManager, "auth_dialog") + } + override fun showChangePasswordSnackbar(redirectUrl: String) { messageContainer?.let { Snackbar.make(it, R.string.error_password_change_required, LENGTH_LONG) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt index 561d181a9..84540b1ca 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt @@ -5,10 +5,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast -import androidx.annotation.CallSuper import androidx.fragment.app.DialogFragment import androidx.viewbinding.ViewBinding import com.google.android.material.elevation.SurfaceColors +import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.lifecycleAwareVariable import javax.inject.Inject @@ -40,17 +40,19 @@ abstract class BaseDialogFragment : DialogFragment(), BaseView (activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl) } + override fun showAuthDialog() { + AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + } + override fun showErrorDetailsDialog(error: Throwable) { ErrorDialog.newInstance(error).show(childFragmentManager, error.toString()) } - @CallSuper override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) view.setBackgroundColor(SurfaceColors.SURFACE_3.getColor(requireContext())) } - @CallSuper override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt index dbc5af3a9..b25346a7e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt @@ -7,6 +7,7 @@ import androidx.viewbinding.ViewBinding import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG import io.github.wulkanowy.R +import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.utils.lifecycleAwareVariable abstract class BaseFragment(@LayoutRes layoutId: Int) : Fragment(layoutId), @@ -42,6 +43,10 @@ abstract class BaseFragment(@LayoutRes layoutId: Int) : Fragme (activity as? BaseActivity<*, *>)?.showExpiredDialog() } + override fun showAuthDialog() { + AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + } + override fun openClearLoginView() { (activity as? BaseActivity<*, *>)?.openClearLoginView() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index 15c069f54..2d913103b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -1,10 +1,15 @@ package io.github.wulkanowy.ui.base import io.github.wulkanowy.data.repositories.StudentRepository -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.launch import timber.log.Timber open class BasePresenter( @@ -26,6 +31,7 @@ open class BasePresenter( onSessionExpired = view::showExpiredDialog onNoCurrentStudent = view::openClearLoginView onPasswordChangeRequired = view::showChangePasswordSnackbar + onAuthorizationRequired = view::showAuthDialog } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt index d3165ea44..b31737e2b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt @@ -8,6 +8,8 @@ interface BaseView { fun showExpiredDialog() + fun showAuthDialog() + fun openClearLoginView() fun showErrorDetailsDialog(error: Throwable) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index afe200e9a..0a41a47b3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.base import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.exceptions.NoCurrentStudentException +import io.github.wulkanowy.sdk.scrapper.exception.AuthorizationRequiredException import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.sdk.scrapper.login.PasswordChangeRequiredException import io.github.wulkanowy.utils.getErrorString @@ -20,6 +21,8 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co var onPasswordChangeRequired: (String) -> Unit = {} + var onAuthorizationRequired: () -> Unit = {} + fun dispatch(error: Throwable) { Timber.e(error, "An exception occurred while the Wulkanowy was running") proceed(error) @@ -31,6 +34,7 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co is PasswordChangeRequiredException -> onPasswordChangeRequired(error.redirectUrl) is ScramblerException, is BadCredentialsException -> onSessionExpired() is NoCurrentStudentException -> onNoCurrentStudent() + is AuthorizationRequiredException -> onAuthorizationRequired() } } @@ -39,5 +43,6 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co onSessionExpired = {} onNoCurrentStudent = {} onPasswordChangeRequired = {} + onAuthorizationRequired = {} } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt new file mode 100644 index 000000000..fa29df473 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt @@ -0,0 +1,81 @@ +package io.github.wulkanowy.ui.modules.auth + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.text.parseAsHtml +import androidx.core.view.isVisible +import androidx.core.widget.doOnTextChanged +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R +import io.github.wulkanowy.databinding.DialogAuthBinding +import io.github.wulkanowy.ui.base.BaseDialogFragment +import javax.inject.Inject + +@AndroidEntryPoint +class AuthDialog : BaseDialogFragment(), AuthView { + + @Inject + lateinit var presenter: AuthPresenter + + companion object { + fun newInstance() = AuthDialog() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, R.style.FullScreenDialogStyle) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + return DialogAuthBinding.inflate(inflater).apply { binding = this }.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + presenter.onAttachView(this) + + binding.authInput.doOnTextChanged { text, _, _, _ -> + presenter.onPeselChange(text?.toString()) + } + + binding.authButton.setOnClickListener { presenter.authorize() } + binding.authSuccessButton.setOnClickListener { + activity?.recreate() + dismiss() + } + binding.authButtonSkip.setOnClickListener { dismiss() } + } + + override fun enableAuthButton(isEnabled: Boolean) { + binding.authButton.isEnabled = isEnabled + } + + override fun showProgress(show: Boolean) { + binding.authProgress.isVisible = show + } + + override fun showPeselError(show: Boolean) { + binding.authInputLayout.error = getString(R.string.auth_api_error).takeIf { show } + } + + override fun showInvalidPeselError(show: Boolean) { + binding.authInputLayout.error = getString(R.string.auth_invalid_error).takeIf { show } + } + + override fun showSuccess(show: Boolean) { + binding.authSuccess.isVisible = show + } + + override fun showContent(show: Boolean) { + binding.authForm.isVisible = show + } + + override fun showDescriptionWithName(name: String) { + binding.authDescription.text = getString(R.string.auth_description, name).parseAsHtml() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt new file mode 100644 index 000000000..8f579712b --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt @@ -0,0 +1,100 @@ +package io.github.wulkanowy.ui.modules.auth + +import io.github.wulkanowy.data.repositories.SemesterRepository +import io.github.wulkanowy.data.repositories.StudentRepository +import io.github.wulkanowy.ui.base.BasePresenter +import io.github.wulkanowy.ui.base.ErrorHandler +import kotlinx.coroutines.launch +import javax.inject.Inject + +class AuthPresenter @Inject constructor( + private val semesterRepository: SemesterRepository, + errorHandler: ErrorHandler, + studentRepository: StudentRepository +) : BasePresenter(errorHandler, studentRepository) { + + private var pesel: String = "" + + override fun onAttachView(view: AuthView) { + super.onAttachView(view) + view.enableAuthButton(pesel.length == 11) + view.showSuccess(false) + view.showProgress(false) + + loadName() + } + + private fun loadName() { + presenterScope.launch { + runCatching { studentRepository.getCurrentStudent(false) } + .onSuccess { view?.showDescriptionWithName(it.studentName) } + .onFailure { errorHandler.dispatch(it) } + } + } + + fun onPeselChange(newPesel: String?) { + pesel = newPesel.orEmpty() + + view?.enableAuthButton(pesel.length == 11) + view?.showPeselError(false) + view?.showInvalidPeselError(false) + } + + fun authorize() { + presenterScope.launch { + view?.showProgress(true) + view?.showContent(false) + + if (!isValidPESEL(pesel)) { + view?.showInvalidPeselError(true) + view?.showProgress(false) + view?.showContent(true) + return@launch + } + + runCatching { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + + val isSuccess = studentRepository.authorizePermission(student, semester, pesel) + if (isSuccess) { + studentRepository.refreshStudentName(student, semester) + } + isSuccess + } + .onFailure { errorHandler.dispatch(it) } + .onSuccess { + if (it) { + view?.showSuccess(true) + view?.showContent(false) + view?.showPeselError(false) + } else { + view?.showSuccess(false) + view?.showContent(true) + view?.showPeselError(true) + } + } + + view?.showProgress(false) + } + } + + private fun isValidPESEL(peselString: String): Boolean { + if (peselString.length != 11) { + return false + } + + val weights = intArrayOf(1, 3, 7, 9, 1, 3, 7, 9, 1, 3) + var sum = 0 + + for (i in 0 until 10) { + sum += weights[i] * Character.getNumericValue(peselString[i]) + } + + sum %= 10 + sum = 10 - sum + sum %= 10 + + return sum == Character.getNumericValue(peselString[10]) + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthView.kt new file mode 100644 index 000000000..d7e1917c2 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthView.kt @@ -0,0 +1,20 @@ +package io.github.wulkanowy.ui.modules.auth + +import io.github.wulkanowy.ui.base.BaseView + +interface AuthView : BaseView { + + fun enableAuthButton(isEnabled: Boolean) + + fun showProgress(show: Boolean) + + fun showPeselError(show: Boolean) + + fun showInvalidPeselError(show: Boolean) + + fun showSuccess(show: Boolean) + + fun showContent(show: Boolean) + + fun showDescriptionWithName(name: String) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index d56cdfa7c..21f564988 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -31,4 +31,6 @@ class SettingsFragment : PreferenceFragmentCompat(), MainView.TitledView, Settin override fun showErrorDetailsDialog(error: Throwable) {} override fun showChangePasswordSnackbar(redirectUrl: String) {} + + override fun showAuthDialog() {} } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt index b4ba5bc4b..41e9e8b1a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt @@ -8,6 +8,7 @@ import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog +import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AppInfo import javax.inject.Inject @@ -62,6 +63,10 @@ class AdvancedFragment : PreferenceFragmentCompat(), ErrorDialog.newInstance(error).show(childFragmentManager, error.toString()) } + override fun showAuthDialog() { + AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + } + override fun onResume() { super.onResume() preferenceScreen.sharedPreferences?.registerOnSharedPreferenceChangeListener(this) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt index 1f6d5143b..493ab5d7f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt @@ -9,6 +9,7 @@ import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog +import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AppInfo import javax.inject.Inject @@ -78,6 +79,10 @@ class AppearanceFragment : PreferenceFragmentCompat(), ErrorDialog.newInstance(error).show(childFragmentManager, error.toString()) } + override fun showAuthDialog() { + AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + } + override fun onResume() { super.onResume() preferenceScreen.sharedPreferences?.registerOnSharedPreferenceChangeListener(this) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt index 98ac15739..35c1faa45 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt @@ -21,6 +21,7 @@ import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog +import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.openInternetBrowser @@ -148,6 +149,10 @@ class NotificationsFragment : PreferenceFragmentCompat(), ErrorDialog.newInstance(error).show(childFragmentManager, error.toString()) } + override fun showAuthDialog() { + AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + } + override fun showFixSyncDialog() { MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.pref_notify_fix_sync_issues) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt index 2a804d9f6..df2e1348a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt @@ -10,6 +10,7 @@ import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog +import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.main.MainView import javax.inject.Inject @@ -99,6 +100,10 @@ class SyncFragment : PreferenceFragmentCompat(), ErrorDialog.newInstance(error).show(childFragmentManager, "error_details") } + override fun showAuthDialog() { + AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + } + override fun onResume() { super.onResume() preferenceScreen.sharedPreferences?.registerOnSharedPreferenceChangeListener(this) diff --git a/app/src/main/java/io/github/wulkanowy/utils/StudentExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/StudentExtension.kt index fdd0610a0..132a3085e 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/StudentExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/StudentExtension.kt @@ -2,4 +2,4 @@ package io.github.wulkanowy.utils import io.github.wulkanowy.data.db.entities.Student -inline val Student.nickOrName get() = if (nick.isBlank()) studentName else nick +inline val Student.nickOrName get() = nick.ifBlank { studentName } diff --git a/app/src/main/res/drawable/ic_auth_success.xml b/app/src/main/res/drawable/ic_auth_success.xml new file mode 100644 index 000000000..015553c02 --- /dev/null +++ b/app/src/main/res/drawable/ic_auth_success.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/dialog_auth.xml b/app/src/main/res/layout/dialog_auth.xml new file mode 100644 index 000000000..e2e2aa304 --- /dev/null +++ b/app/src/main/res/layout/dialog_auth.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e53fd2f1..1eff95698 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -808,6 +808,17 @@ Restart + + Authorization has been rejected. The data provided does not match the records in the secretary\'s office. + Invalid PESEL + PESEL + Authorize + Authorization completed successfully + Authorization + To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Skip for now + + No internet connection An error occurred. Check your device clock diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b0bf28194..9d1f07458 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -78,4 +78,9 @@ @drawable/background_material_alert_dialog @layout/m3_alert_dialog + + diff --git a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt index de4c591e1..af6a83404 100644 --- a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt +++ b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt @@ -13,6 +13,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.databinding.DialogAdsConsentBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog +import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject @@ -146,6 +147,10 @@ class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView { (activity as? BaseActivity<*, *>)?.openClearLoginView() } + override fun showAuthDialog() { + AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + } + override fun showErrorDetailsDialog(error: Throwable) { ErrorDialog.newInstance(error).show(childFragmentManager, error.toString()) } From 5a2622871f9e5a61b419e100dd546457a36c63bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 12 May 2023 00:21:24 +0200 Subject: [PATCH 1149/1526] Version 2.0.1 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 16127d9a3..48ca28a0e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 122 - versionName "2.0.0" + versionCode 123 + versionName "2.0.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -161,7 +161,7 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS - userFraction = 0.50d + userFraction = 0.10d updatePriority = 2 enabled.set(false) } @@ -186,7 +186,7 @@ ext { } dependencies { - implementation 'com.github.wulkanowy:sdk:c1573f04c5' + implementation 'io.github.wulkanowy:sdk:2.0.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index c5ec9de3d..d079f986c 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -4,5 +4,6 @@ Wersja 2.0.0 — dodaliśmy możliwość zmiany kolejności pozycji w menu dolnym — poprawiliśmy sposób wyświetlania błędu o nieprawidłowym haśle na ekranie logowania — od teraz zmiana ustawień liczenia średniej automatycznie odświeży listę ocen +— dodaliśmy okienko na wpisanie numeru PESEL, gdy dziennik wymaga dodatkowej autoryzacji dostępu Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From cbef160adaead03b862035c8cfc3b6dab9355716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 12 May 2023 00:41:53 +0200 Subject: [PATCH 1150/1526] New Crowdin updates (#2193) --- app/src/main/res/values-cs/strings.xml | 9 +++++++++ app/src/main/res/values-da-rDK/strings.xml | 9 +++++++++ app/src/main/res/values-de/strings.xml | 9 +++++++++ app/src/main/res/values-es-rES/strings.xml | 9 +++++++++ app/src/main/res/values-pl/strings.xml | 9 +++++++++ app/src/main/res/values-ru/strings.xml | 11 ++++++++++- app/src/main/res/values-sk/strings.xml | 9 +++++++++ app/src/main/res/values-uk/strings.xml | 9 +++++++++ 8 files changed, 73 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index bedb491bc..beb2996be 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -809,6 +809,15 @@ Restartování aplikace Pro uložení změn je nutné aplikaci restartovat Restartovat + + Authorization has been rejected. The data provided does not match the records in the secretary\'s office. + Invalid PESEL + PESEL + Authorize + Authorization completed successfully + Authorization + To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Skip for now Žádné internetové připojení Vyskytla se chyba. Zkontrolujte hodiny svého zařízení diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index ebec11b25..b9de57f77 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -721,6 +721,15 @@ Application restart The application must restart for the changes to be saved Restart + + Authorization has been rejected. The data provided does not match the records in the secretary\'s office. + Invalid PESEL + PESEL + Authorize + Authorization completed successfully + Authorization + To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Skip for now No internet connection An error occurred. Check your device clock diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1e1785bff..4fdd71b50 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -721,6 +721,15 @@ Application restart The application must restart for the changes to be saved Restart + + Authorization has been rejected. The data provided does not match the records in the secretary\'s office. + Invalid PESEL + PESEL + Authorize + Authorization completed successfully + Authorization + To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Skip for now Keine Internetverbindung Es ist ein Fehler aufgetreten. Überprüfen Sie Ihre Geräteuhr diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index ebec11b25..b9de57f77 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -721,6 +721,15 @@ Application restart The application must restart for the changes to be saved Restart + + Authorization has been rejected. The data provided does not match the records in the secretary\'s office. + Invalid PESEL + PESEL + Authorize + Authorization completed successfully + Authorization + To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Skip for now No internet connection An error occurred. Check your device clock diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f797a4dcb..207b12e98 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -809,6 +809,15 @@ Ponowne uruchomienie aplikacji W celu zapisania zmian aplikacja musi zostać ponownie uruchomiona Uruchom ponownie + + Autoryzacja została odrzucona. Podano dane niezgodne z danymi w sekretariacie. + Nieprawidłowy PESEL + PESEL + Potwierdź + Autoryzacja zakończona pomyślnie + Autoryzacja + Rodzicu, musimy mieć pewność, że Twój adres e-mail został powiązany z prawidłowym kontem ucznia. W celu autoryzacji konta podaj numer PESEL ucznia <b>%1$s</b> w polu poniżej + Na razie pomiń Brak połączenia z internetem Wystąpił błąd. Sprawdź poprawność daty w urządzeniu diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7a42e3880..726e95465 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -778,7 +778,7 @@ Значения плюса и минуса, расчёт средней оценки Расширенные Версия приложения, разработчики, соц. сети - Посмотреть рекламу, чтобы поддержать преокт + Displaying advertisements, project support Новые оценки Новое домашнее задание @@ -809,6 +809,15 @@ Перезапуск приложение Для сохранения изменений необходимо перезапустить приложение Перезапустить + + Authorization has been rejected. The data provided does not match the records in the secretary\'s office. + Invalid PESEL + PESEL + Authorize + Authorization completed successfully + Authorization + To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Skip for now Интернет-соединение отсутствует Произошла ошибка. Проверьте время на вашем устройстве diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index cde3178bb..7e42c6cd4 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -809,6 +809,15 @@ Reštartovanie aplikácie Pre uloženie zmien je nutné aplikáciu reštartovať Reštartovať + + Authorization has been rejected. The data provided does not match the records in the secretary\'s office. + Invalid PESEL + PESEL + Authorize + Authorization completed successfully + Authorization + To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Skip for now Žiadne internetové pripojenie Vyskytla sa chyba. Skontrolujte hodiny svojho zariadenia diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 9602aabba..66cd23870 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -809,6 +809,15 @@ Перезавантаження додатку Додаток потрібно перезавантажити для збереження змін Перезавантажити + + Authorization has been rejected. The data provided does not match the records in the secretary\'s office. + Invalid PESEL + PESEL + Authorize + Authorization completed successfully + Authorization + To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Skip for now Немає з\'єднання з інтернетом Сталася помилка. Перевірте годинник пристрою From b8ac72c247a70ae4a68349a3239d3ff280bd0335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 12 May 2023 00:45:48 +0200 Subject: [PATCH 1151/1526] Version 2.0.2 --- app/build.gradle | 4 ++-- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 48ca28a0e..de0c2a3ce 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 123 - versionName "2.0.1" + versionCode 124 + versionName "2.0.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index d079f986c..378dedceb 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 2.0.0 +Wersja 2.0.2 — zaktualizowaliśmy wygląd aplikacji na (częściowo) zgodny z wytycznymi Material 3 — dodaliśmy możliwość zmiany kolejności pozycji w menu dolnym From 54fbd56b7382f956dc745addd4e91d3cf23dc17a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 May 2023 04:33:56 +0000 Subject: [PATCH 1152/1526] Bump com.google.firebase:firebase-bom from 31.5.0 to 32.0.0 (#2190) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index de0c2a3ce..0f6789e8e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -242,7 +242,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.10.0' - playImplementation platform('com.google.firebase:firebase-bom:31.5.0') + playImplementation platform('com.google.firebase:firebase-bom:32.0.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From cb8303f33dc1953db0dcf31516ca36f396aede29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 May 2023 04:34:14 +0000 Subject: [PATCH 1153/1526] Bump com.google.android.material:material from 1.8.0 to 1.9.0 (#2191) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0f6789e8e..85ac4833f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -206,7 +206,7 @@ dependencies { implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.constraintlayout:constraintlayout:2.1.4" implementation "androidx.coordinatorlayout:coordinatorlayout:1.2.0" - implementation "com.google.android.material:material:1.8.0" + implementation "com.google.android.material:material:1.9.0" implementation "com.github.wulkanowy:material-chips-input:2.3.1" implementation "com.github.PhilJay:MPAndroidChart:v3.1.0" implementation 'com.github.lopspower:CircularImageView:4.3.0' From a0af55825d3c8e0a39ca559b6de804f76ee3d309 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 May 2023 04:34:32 +0000 Subject: [PATCH 1154/1526] Bump about_libraries from 10.6.2 to 10.6.3 (#2189) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3c8552d20..c63a8fd0c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.8.21' - about_libraries = '10.6.2' + about_libraries = '10.6.3' hilt_version = "2.45" } repositories { From c33b309cf068efd51566fb52048da140f9046208 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 May 2023 04:34:48 +0000 Subject: [PATCH 1155/1526] Bump org.robolectric:robolectric from 4.10 to 4.10.2 (#2188) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 85ac4833f..4ea086a19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -265,7 +265,7 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines" testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" - testImplementation 'org.robolectric:robolectric:4.10' + testImplementation 'org.robolectric:robolectric:4.10.2' testImplementation "androidx.test:runner:1.5.2" testImplementation "androidx.test.ext:junit:1.1.5" testImplementation "androidx.test:core:1.5.0" From 030fe8c218a2508789c5750d9d3412334aa1fb03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 May 2023 04:45:15 +0000 Subject: [PATCH 1156/1526] Bump coroutines from 1.6.4 to 1.7.0 (#2186) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4ea086a19..3a6744c14 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -182,7 +182,7 @@ ext { room = "2.5.1" chucker = "3.5.2" mockk = "1.13.5" - coroutines = "1.6.4" + coroutines = "1.7.0" } dependencies { From f2faa7e8b7f27c7f7f182117fc8b83d02e0e8122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 12 May 2023 22:45:24 +0200 Subject: [PATCH 1157/1526] Fix button color in high priority admin message (#2202) --- .../ui/modules/dashboard/adapters/DashboardAdapter.kt | 5 +++-- app/src/main/res/values-night-v31/styles.xml | 4 +++- app/src/main/res/values-night/styles.xml | 4 +++- app/src/main/res/values-v31/styles.xml | 4 +++- app/src/main/res/values/attrs.xml | 2 ++ app/src/main/res/values/colors.xml | 6 ++++-- app/src/main/res/values/styles.xml | 4 +++- 7 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt index 2c06e45fd..4ad4e9d67 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt @@ -738,8 +738,8 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { - context.getThemeAttrColor(R.attr.colorPrimary) to - context.getThemeAttrColor(R.attr.colorOnPrimary) + context.getThemeAttrColor(R.attr.colorMessageHigh) to + context.getThemeAttrColor(R.attr.colorOnMessageHigh) } "MEDIUM" -> { context.getThemeAttrColor(R.attr.colorMessageMedium) to Color.BLACK @@ -754,6 +754,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter@color/colorErrorLight @color/colorDividerInverse @color/material_dynamic_secondary20 - @color/dashboard_message_medium_light + @color/dashboard_message_medium_dark + @color/dashboard_message_high_dark + @android:color/black ?colorSurface @color/material_dynamic_neutral90 @android:color/transparent diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 7d2f0cfed..5d9aa22a6 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -24,7 +24,9 @@ @color/colorErrorLight @color/colorDividerInverse @color/colorSwipeRefreshDark - @color/dashboard_message_medium_light + @color/dashboard_message_medium_dark + @color/dashboard_message_high_dark + @android:color/black ?colorSurface ?android:textColorPrimary @color/colorNavigationBarDark diff --git a/app/src/main/res/values-v31/styles.xml b/app/src/main/res/values-v31/styles.xml index cffb284ec..bb47b22ed 100644 --- a/app/src/main/res/values-v31/styles.xml +++ b/app/src/main/res/values-v31/styles.xml @@ -37,7 +37,9 @@ @color/colorError @color/colorDivider @color/material_dynamic_secondary90 - @color/dashboard_message_medium_dark + @color/dashboard_message_medium_light + @color/dashboard_message_high_light + @android:color/white @color/material_dynamic_neutral10 @android:color/transparent @android:color/transparent diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 8986f3576..aa58fa09e 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -5,4 +5,6 @@ + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ac1b1c196..87057c61d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -39,8 +39,10 @@ #342826 #181010 - #FFD980 - #ffd54f + #ffd54f + #FFD980 + #B91B21 + #e57373 #d32f2f #e57373 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 9d1f07458..603e22abc 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -22,7 +22,9 @@ @color/colorError @color/colorDivider @color/colorSwipeRefresh - @color/dashboard_message_medium_dark + @color/dashboard_message_medium_light + @color/dashboard_message_high_light + @android:color/white ?android:textColorPrimary @android:color/black @style/PreferenceThemeOverlay From cc752ab0ad36510bff1df10bfee1eda641768ead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 12 May 2023 22:45:50 +0200 Subject: [PATCH 1158/1526] New Crowdin updates (#2201) --- app/src/main/res/values-cs/strings.xml | 14 +++++----- app/src/main/res/values-de/strings.xml | 36 +++++++++++++------------- app/src/main/res/values-sk/strings.xml | 14 +++++----- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index beb2996be..f8c19dff0 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -810,14 +810,14 @@ Pro uložení změn je nutné aplikaci restartovat Restartovat - Authorization has been rejected. The data provided does not match the records in the secretary\'s office. - Invalid PESEL + Autorizace byla zamítnuta. Uvedené údaje se neshodují se záznamy v kanceláři tajemníka. + Neplatný PESEL PESEL - Authorize - Authorization completed successfully - Authorization - To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below - Skip for now + Autorizovat + Autorizace byla úspěšně dokončena + Autorizace + Pro provoz aplikace potřebujeme potvrdit vaši identitu. Zadejte PESEL žáka <b>%1$s</b> v níže uvedeném poli + Zatím přeskočit Žádné internetové připojení Vyskytla se chyba. Zkontrolujte hodiny svého zařízení diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4fdd71b50..500553e27 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -26,7 +26,7 @@ Schülerinfo Übersicht Benachrichtigungszentrum - Menu configuartion + Menü Konfiguration Semester %1$d, %2$d/%3$d @@ -56,7 +56,7 @@ Ungültige symbol Schüler nicht gefunden. Überprüfen Sie das Symbol und die gewählte Variation des UONET+ Registers Ausgewählter Student ist bereits angemeldet. - The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the first login screen + Das Symbol kann auf der Registerseite in Student → Tost Möbeln → Registrieren Sie Ihr Mobilgerätgefunden werden.\n\nStellen Sie sicher, dass Sie die entsprechende Registervariante im Feld UONET+ Registervariante auf dem vorherigen Bildschirm festgelegt haben Wählen Sie die Studenten aus, die sich bei der Anwendung anmelden sollen Andere Optionen In diesem Modus funktioniert eine Glücknummer, eine Klassenstatistik, eine Zusammenfassung der Anwesenheit, eine Entschuldigung für die Abwesenheit, abgeschlossene Lektionen, Schulinformationen und eine Vorschau der Liste der registrierten Geräte nicht @@ -73,14 +73,14 @@ Wiederherstellen Student ist bereits angemeldet Standard - Other search locations - No active students found - Enter a different symbol + Andere Suchorte + Keine aktiven Schüler gefunden + Geben Sie ein anderes Symbol ein - Enable notifications - Enable notifications so you don\'t miss message from teacher or new grade - Skip - Enable + Benachrichtigungen aktivieren + Aktivieren Sie Benachrichtigungen, damit Sie keine Nachricht vom Lehrer oder eine neue Klasse verpassen + Überspringen + Ermöglichen Kundenbetreuer Anmelden @@ -288,7 +288,7 @@ Nur ungelesen Nur mit Anhängen Lesen: %s - Read by: %1$d of %2$d people + Lesen von: %1$d von %2$d Personen %1$d Nachricht %1$d Nachrichten @@ -422,8 +422,8 @@ Teilnahme an einem Meeting Agenda - Place - Topic + Ort + Thema Schulankündigungen Keine schulankündigungen @@ -591,10 +591,10 @@ lösen Ändern Zum Kalender hinzufügen - Cancel + Stornieren Keine Lektionen - Synchronized on %1$s at %2$s + Synchronisiert am %1$s am %2$s Thema wählen Licht Dunkel @@ -614,8 +614,8 @@ Farbschema der Noten Schulfachen sortieren Sprache - Menu configuration - Set the order of functions in the menu + Menü Konfiguration + Legen Sie die Reihenfolge der Funktionen im Menü fest Benachrichtigungen Sonstiges Benachrichtigungen anzeigen @@ -718,8 +718,8 @@ Neustart Update fehlgeschlagen! Wulkanowy funktioniert möglicherweise nicht richtig. Überlegen Sie die Aktualisierung - Application restart - The application must restart for the changes to be saved + Neustart der Anwendung + Die Anwendung muss neu gestartet werden, damit die Änderungen gespeichert werden Restart Authorization has been rejected. The data provided does not match the records in the secretary\'s office. diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 7e42c6cd4..950eb01e0 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -810,14 +810,14 @@ Pre uloženie zmien je nutné aplikáciu reštartovať Reštartovať - Authorization has been rejected. The data provided does not match the records in the secretary\'s office. - Invalid PESEL + Autorizácia bola zamietnutá. Uvedené údaje sa nezhodujú so záznamami v kancelárii tajomníka. + Neplatný PESEL PESEL - Authorize - Authorization completed successfully - Authorization - To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below - Skip for now + Autorizovať + Autorizácia bola úspešne dokončená + Autorizácia + Na prevádzku aplikácie potrebujeme potvrdiť vašu identitu. Zadajte PESEL žiaka <b>%1$s</b> v nižšie uvedenom poli + Zatiaľ preskočiť Žiadne internetové pripojenie Vyskytla sa chyba. Skontrolujte hodiny svojho zariadenia From 1e9a6a5c42bc11d80bb9f73fcb788f5a0b051cc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 12 May 2023 22:59:40 +0200 Subject: [PATCH 1159/1526] Version 2.0.3 --- app/build.gradle | 10 +++++----- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3a6744c14..a4f230b88 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 124 - versionName "2.0.2" + versionCode 125 + versionName "2.0.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -161,8 +161,8 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS - userFraction = 0.10d - updatePriority = 2 + userFraction = 0.50d + updatePriority = 3 enabled.set(false) } @@ -186,7 +186,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.0.1' + implementation 'io.github.wulkanowy:sdk:2.0.3' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 378dedceb..aee30290a 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 2.0.2 +Wersja 2.0.3 — zaktualizowaliśmy wygląd aplikacji na (częściowo) zgodny z wytycznymi Material 3 — dodaliśmy możliwość zmiany kolejności pozycji w menu dolnym From adf418cc689c479ac898a14bac0d7a4219d4620f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 13 May 2023 10:44:09 +0200 Subject: [PATCH 1160/1526] Fix delete user homework button visibility (#2204) --- app/src/main/res/layout/item_homework_dialog_details.xml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/layout/item_homework_dialog_details.xml b/app/src/main/res/layout/item_homework_dialog_details.xml index 1b1c1d39b..a40b5dcee 100644 --- a/app/src/main/res/layout/item_homework_dialog_details.xml +++ b/app/src/main/res/layout/item_homework_dialog_details.xml @@ -14,16 +14,13 @@ + android:textColor="?attr/colorOnSurface" /> Date: Sun, 14 May 2023 17:28:29 +0000 Subject: [PATCH 1161/1526] Bump hilt_version from 2.45 to 2.46.1 (#2205) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c63a8fd0c..7161e4c31 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.8.21' about_libraries = '10.6.3' - hilt_version = "2.45" + hilt_version = "2.46.1" } repositories { mavenCentral() From a06add070ecc9543a9a5235bf822b89d4d6775fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 May 2023 18:20:56 +0000 Subject: [PATCH 1162/1526] Bump com.android.tools.build:gradle from 7.4.2 to 8.0.1 (#2187) --- .github/workflows/deploy-store.yml | 4 ++-- .github/workflows/deploy-test.yml | 4 ++-- .github/workflows/test.yml | 6 +++--- app/build.gradle | 6 +++++- build.gradle | 2 +- gradle.properties | 9 +++++++-- gradle/wrapper/gradle-wrapper.jar | Bin 61574 -> 61608 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 4 ++-- 9 files changed, 23 insertions(+), 14 deletions(-) diff --git a/.github/workflows/deploy-store.yml b/.github/workflows/deploy-store.yml index 3ce618ca7..e8a220ddf 100644 --- a/.github/workflows/deploy-store.yml +++ b/.github/workflows/deploy-store.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/setup-java@v2 with: distribution: 'zulu' - java-version: 11 + java-version: 17 - uses: actions/cache@v3 with: path: | @@ -52,7 +52,7 @@ jobs: - uses: actions/setup-java@v2 with: distribution: 'zulu' - java-version: 11 + java-version: 17 - uses: actions/cache@v3 with: path: | diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index 20082590d..f2e9f016f 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/setup-java@v2 with: distribution: 'zulu' - java-version: 11 + java-version: 17 - uses: actions/cache@v3 with: path: | @@ -92,7 +92,7 @@ jobs: - uses: actions/setup-java@v2 with: distribution: 'zulu' - java-version: 11 + java-version: 17 - uses: actions/cache@v3 with: path: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7f8591bb1..bc4b36470 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/setup-java@v2 with: distribution: 'zulu' - java-version: 11 + java-version: 17 - uses: actions/cache@v3 with: path: | @@ -48,7 +48,7 @@ jobs: - uses: actions/setup-java@v2 with: distribution: 'zulu' - java-version: 11 + java-version: 17 - uses: actions/cache@v3 with: path: | @@ -74,7 +74,7 @@ jobs: - uses: actions/setup-java@v2 with: distribution: 'zulu' - java-version: 11 + java-version: 17 - uses: actions/cache@v3 with: path: | diff --git a/app/build.gradle b/app/build.gradle index a4f230b88..ad83461a3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -156,7 +156,11 @@ android { kapt { correctErrorTypes true } - +kotlin { + jvmToolchain { + languageVersion.set(JavaLanguageVersion.of(11)) + } +} play { defaultToAppBundles = false track = 'production' diff --git a/build.gradle b/build.gradle index 7161e4c31..88079e54d 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - classpath 'com.android.tools.build:gradle:7.4.2' + classpath 'com.android.tools.build:gradle:8.0.1' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.15' classpath 'com.huawei.agconnect:agcp:1.9.0.300' diff --git a/gradle.properties b/gradle.properties index 38603830b..5a8099a12 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,13 +11,18 @@ org.gradle.jvmargs=-Xmx1536m # android.enableJetifier=true android.useAndroidX=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false # kotlin.code.style=official -# kapt.use.worker.api=true kapt.include.compile.classpath=false # +# https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-common-faq-0000001063210244#section17273113244910 +apmsInstrumentationEnabled=false +# # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true \ No newline at end of file +# org.gradle.parallel=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 943f0cbfa754578e88a3dae77fce6e3dea56edbf..ccebba7710deaf9f98673a68957ea02138b60d0a 100644 GIT binary patch delta 5094 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 delta 5107 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e8be595e3..6ec1567a0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68d6..79a61d421 100755 --- a/gradlew +++ b/gradlew @@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac From 5b0fe2c006a2509aeb912d8c834db8aa6355c635 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 May 2023 19:28:49 +0000 Subject: [PATCH 1163/1526] Bump ru.cian:huawei-publish-gradle-plugin from 1.3.5 to 1.4.0 (#2185) --- app/build.gradle | 8 +++++++- build.gradle | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ad83461a3..f500e7795 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -175,7 +175,13 @@ huaweiPublish { hmsRelease { credentialsPath = "$rootDir/app/src/release/agconnect-credentials.json" buildFormat = "aab" - deployType = "draft" + deployType = "publish" + releaseNotes = [ + new ru.cian.huawei.publish.ReleaseNote( + "pl-PL", + "$projectDir/src/main/play/release-notes/pl-PL/default.txt" + ) + ] } } } diff --git a/build.gradle b/build.gradle index 88079e54d..eac46b05c 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ buildscript { classpath 'com.huawei.agconnect:agcp:1.9.0.300' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' classpath "com.github.triplet.gradle:play-publisher:3.6.0" - classpath "ru.cian:huawei-publish-gradle-plugin:1.3.5" + classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.0.0.2929" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" From ea312c3e12c9bbc3dc4a379d092678ea099dad89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 17:13:02 +0000 Subject: [PATCH 1164/1526] Bump androidx.core:core-ktx from 1.10.0 to 1.10.1 (#2208) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f500e7795..aaa27b9c7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -203,7 +203,7 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" - implementation "androidx.core:core-ktx:1.10.0" + implementation "androidx.core:core-ktx:1.10.1" implementation 'androidx.core:core-splashscreen:1.0.1' implementation "androidx.activity:activity-ktx:1.7.1" implementation "androidx.appcompat:appcompat:1.6.1" From 8a7b7103eb375b22231a748a6360f85640033489 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 18:36:26 +0000 Subject: [PATCH 1165/1526] Bump coroutines from 1.7.0 to 1.7.1 (#2207) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index aaa27b9c7..2cde7cdaa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -192,7 +192,7 @@ ext { room = "2.5.1" chucker = "3.5.2" mockk = "1.13.5" - coroutines = "1.7.0" + coroutines = "1.7.1" } dependencies { From 48bcf581cfde80e282eb18866870c42be5e91c74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 18:36:50 +0000 Subject: [PATCH 1166/1526] Bump org.jetbrains.kotlinx:kotlinx-serialization-json (#2209) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 2cde7cdaa..3b5fadb13 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -200,7 +200,7 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' - implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" implementation "androidx.core:core-ktx:1.10.1" From 94664828938ee2b25cdd6a367323fe4c2923477a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 18 May 2023 16:14:14 +0200 Subject: [PATCH 1167/1526] Add foojay-resolver and update dependencies (#2212) --- app/build.gradle | 10 +++++----- gradle/wrapper/gradle-wrapper.jar | Bin 61608 -> 62076 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 7 ++++--- settings.gradle | 3 +++ 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3b5fadb13..83be53fc5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -156,11 +156,11 @@ android { kapt { correctErrorTypes true } + kotlin { - jvmToolchain { - languageVersion.set(JavaLanguageVersion.of(11)) - } + jvmToolchain(11) } + play { defaultToAppBundles = false track = 'production' @@ -261,7 +261,7 @@ dependencies { playImplementation 'com.google.android.play:core-ktx:1.8.1' playImplementation 'com.google.android.gms:play-services-ads:22.0.0' - hmsImplementation 'com.huawei.hms:hianalytics:6.9.1.200' + hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.0.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" @@ -275,7 +275,7 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines" testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" - testImplementation 'org.robolectric:robolectric:4.10.2' + testImplementation 'org.robolectric:robolectric:4.10.3' testImplementation "androidx.test:runner:1.5.2" testImplementation "androidx.test.ext:junit:1.1.5" testImplementation "androidx.test:core:1.5.0" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index ccebba7710deaf9f98673a68957ea02138b60d0a..c1962a79e29d3e0ab67b14947c167a862655af9b 100644 GIT binary patch delta 8979 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 Date: Mon, 22 May 2023 17:09:57 +0200 Subject: [PATCH 1168/1526] Version 2.0.4 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 83be53fc5..729488737 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 125 - versionName "2.0.3" + versionCode 126 + versionName "2.0.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -166,7 +166,7 @@ play { track = 'production' releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS userFraction = 0.50d - updatePriority = 3 + updatePriority = 1 enabled.set(false) } @@ -196,7 +196,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.0.3' + implementation 'io.github.wulkanowy:sdk:2.0.4' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index aee30290a..858b44d42 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 2.0.3 +Wersja 2.0.4 — zaktualizowaliśmy wygląd aplikacji na (częściowo) zgodny z wytycznymi Material 3 — dodaliśmy możliwość zmiany kolejności pozycji w menu dolnym From aca88b57e0b005df6bf0f05efbe66dc066479451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 23 May 2023 02:16:42 +0200 Subject: [PATCH 1169/1526] Add r8 rules for HMS SDK (#2217) --- app/proguard-rules.pro | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index fd9482613..ac7d1b029 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,5 +1,6 @@ # General -dontobfuscate +-ignorewarnings #Config for wulkanowy @@ -24,3 +25,13 @@ #Config for Material Components -keep class com.google.android.material.tabs.** { *; } + +#Config for HMS SDK +-keepattributes *Annotation* +-keepattributes Exceptions +-keepattributes InnerClasses +-keepattributes Signature +-keep class com.huawei.agconnect.**{*;} +-keep class com.huawei.hianalytics.**{*;} +-keep class com.huawei.updatesdk.**{*;} +-keep class com.huawei.hms.**{*;} From 4c1fe233c7d4fa2ef4d4cd088fbfecc0189ae4e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 23 May 2023 02:37:38 +0200 Subject: [PATCH 1170/1526] Version 2.0.5 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 729488737..b1116c588 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 126 - versionName "2.0.4" + versionCode 127 + versionName "2.0.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -196,7 +196,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.0.4' + implementation 'io.github.wulkanowy:sdk:2.0.5' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 858b44d42..720952730 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 2.0.4 +Wersja 2.0.5 — zaktualizowaliśmy wygląd aplikacji na (częściowo) zgodny z wytycznymi Material 3 — dodaliśmy możliwość zmiany kolejności pozycji w menu dolnym From c1706144615b9e024f3e8d1a7efe47d60dd1aa35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 23 May 2023 14:09:48 +0200 Subject: [PATCH 1171/1526] Add R8 rule for Wulkanowy SDK (#2220) --- app/proguard-rules.pro | 5 +++++ gradle.properties | 29 +++++++---------------------- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index ac7d1b029..0fd49f6ac 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -26,6 +26,7 @@ #Config for Material Components -keep class com.google.android.material.tabs.** { *; } + #Config for HMS SDK -keepattributes *Annotation* -keepattributes Exceptions @@ -35,3 +36,7 @@ -keep class com.huawei.hianalytics.**{*;} -keep class com.huawei.updatesdk.**{*;} -keep class com.huawei.hms.**{*;} + + +#Config for Wulkanowy SDK +-keep,allowobfuscation,allowshrinking class retrofit2.Response diff --git a/gradle.properties b/gradle.properties index 5a8099a12..4c54d414a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,28 +1,13 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m # -android.enableJetifier=true -android.useAndroidX=true -android.defaults.buildfeatures.buildconfig=true -android.nonTransitiveRClass=false -android.nonFinalResIds=false -# -kotlin.code.style=official -kapt.use.worker.api=true kapt.include.compile.classpath=false +kotlin.code.style=official +# +android.useAndroidX=true +android.enableJetifier=true +android.nonTransitiveRClass=false +android.defaults.buildfeatures.buildconfig=true # # https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-common-faq-0000001063210244#section17273113244910 apmsInstrumentationEnabled=false -# -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true + From 092e86b621459ec4cb0229a6aa65f43e623ea85f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 23 May 2023 16:26:31 +0200 Subject: [PATCH 1172/1526] Version 2.0.6 --- app/build.gradle | 10 +++++----- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b1116c588..5cebcb31b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 127 - versionName "2.0.5" + versionCode 128 + versionName "2.0.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -165,8 +165,8 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS - userFraction = 0.50d - updatePriority = 1 + userFraction = 0.25d + updatePriority = 4 enabled.set(false) } @@ -196,7 +196,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.0.5' + implementation 'io.github.wulkanowy:sdk:2.0.6' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 720952730..df69a331d 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 2.0.5 +Wersja 2.0.6 — zaktualizowaliśmy wygląd aplikacji na (częściowo) zgodny z wytycznymi Material 3 — dodaliśmy możliwość zmiany kolejności pozycji w menu dolnym From e7733bfa2a72362e8736dc102383cce9d241cf6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 21:31:38 +0000 Subject: [PATCH 1173/1526] Bump com.google.android.gms:play-services-ads from 22.0.0 to 22.1.0 (#2216) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5cebcb31b..40ea252c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -259,7 +259,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-config-ktx' playImplementation 'com.google.android.play:core:1.10.3' playImplementation 'com.google.android.play:core-ktx:1.8.1' - playImplementation 'com.google.android.gms:play-services-ads:22.0.0' + playImplementation 'com.google.android.gms:play-services-ads:22.1.0' hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.0.300' From 19ed12146686d95d15101c58429403f8245425ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 21:32:28 +0000 Subject: [PATCH 1174/1526] Bump io.coil-kt:coil from 2.3.0 to 2.4.0 (#2215) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 40ea252c1..3b7ee510d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -246,7 +246,7 @@ dependencies { implementation "at.favre.lib:slf4j-timber:1.0.1" implementation 'com.github.bastienpaulfr:Treessence:1.0.5' implementation "com.mikepenz:aboutlibraries-core:$about_libraries" - implementation "io.coil-kt:coil:2.3.0" + implementation "io.coil-kt:coil:2.4.0" implementation "io.github.wulkanowy:AppKillerManager:3.0.1" implementation 'me.xdrop:fuzzywuzzy:1.4.0' implementation 'com.fredporciuncula:flow-preferences:1.9.1' From 3096fa15384ce6d8083d1aad5143be1ee1fed1ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 21:50:17 +0000 Subject: [PATCH 1175/1526] Bump about_libraries from 10.6.3 to 10.7.0 (#2214) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index eac46b05c..1a70f82af 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.8.21' - about_libraries = '10.6.3' + about_libraries = '10.7.0' hilt_version = "2.46.1" } repositories { From 70333737cf218734850ea5d4df16b439f75e789b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 15:16:42 +0000 Subject: [PATCH 1176/1526] Bump androidx.activity:activity-ktx from 1.7.1 to 1.7.2 (#2226) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3b7ee510d..e72beed28 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -205,7 +205,7 @@ dependencies { implementation "androidx.core:core-ktx:1.10.1" implementation 'androidx.core:core-splashscreen:1.0.1' - implementation "androidx.activity:activity-ktx:1.7.1" + implementation "androidx.activity:activity-ktx:1.7.2" implementation "androidx.appcompat:appcompat:1.6.1" implementation "androidx.fragment:fragment-ktx:1.5.7" implementation "androidx.annotation:annotation:1.6.0" From 48e4a9fec58cc6beb07f7e086fe6fd964f318f66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 15:17:48 +0000 Subject: [PATCH 1177/1526] Bump org.sonarsource.scanner.gradle:sonarqube-gradle-plugin (#2223) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1a70f82af..b7ac37edc 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ buildscript { classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" - classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.0.0.2929" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.1.0.3113" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" } From db4e4d8cef31f399bfc5a4d48c0a1a98d1d53ffa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 15:18:07 +0000 Subject: [PATCH 1178/1526] Bump com.huawei.hms:hianalytics from 6.10.0.300 to 6.10.0.301 (#2224) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e72beed28..251aa4b6e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -261,7 +261,7 @@ dependencies { playImplementation 'com.google.android.play:core-ktx:1.8.1' playImplementation 'com.google.android.gms:play-services-ads:22.1.0' - hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.300' + hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.301' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.0.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 06fd7b0c368959d101a3baf0df021becfa73222a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 15:18:30 +0000 Subject: [PATCH 1179/1526] Bump com.google.firebase:firebase-bom from 32.0.0 to 32.1.0 (#2225) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 251aa4b6e..05070d102 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -252,7 +252,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.10.0' - playImplementation platform('com.google.firebase:firebase-bom:32.0.0') + playImplementation platform('com.google.firebase:firebase-bom:32.1.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From 556f42195b1bc5d7c5ac9ba26ee4cf7c75f3e931 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 15:18:55 +0000 Subject: [PATCH 1180/1526] Bump com.android.tools.build:gradle from 8.0.1 to 8.0.2 (#2228) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b7ac37edc..69c0905af 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - classpath 'com.android.tools.build:gradle:8.0.1' + classpath 'com.android.tools.build:gradle:8.0.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.15' classpath 'com.huawei.agconnect:agcp:1.9.0.300' From 41bde45731dce8c4cf39200ff98e7ca47c6c7bfd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 15:19:25 +0000 Subject: [PATCH 1181/1526] Bump androidx.viewpager2:viewpager2 from 1.1.0-beta01 to 1.1.0-beta02 (#2227) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 05070d102..929a9db99 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -212,7 +212,7 @@ dependencies { implementation "androidx.preference:preference-ktx:1.2.0" implementation "androidx.recyclerview:recyclerview:1.3.0" - implementation "androidx.viewpager2:viewpager2:1.1.0-beta01" + implementation "androidx.viewpager2:viewpager2:1.1.0-beta02" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.constraintlayout:constraintlayout:2.1.4" implementation "androidx.coordinatorlayout:coordinatorlayout:1.2.0" From 1bc0f2d21457281d1c528b7c6cb9697b3211f9a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 1 Jun 2023 10:30:50 +0200 Subject: [PATCH 1182/1526] Add character limit to attendance excuse content (#2222) --- app/src/main/res/layout/dialog_excuse.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/dialog_excuse.xml b/app/src/main/res/layout/dialog_excuse.xml index 401aef313..8297bc142 100644 --- a/app/src/main/res/layout/dialog_excuse.xml +++ b/app/src/main/res/layout/dialog_excuse.xml @@ -1,5 +1,6 @@ + android:layout_height="wrap_content" + app:counterEnabled="true" + app:counterMaxLength="256"> + android:layout_weight="1" + android:hint="@string/attendance_excuse_dialog_reason" + android:maxLength="256" /> From 63487249b8ce8995e6b433ee31701ac9015d405b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 1 Jun 2023 10:31:42 +0200 Subject: [PATCH 1183/1526] New Crowdin updates (#2211) --- app/src/main/res/values-ru/strings.xml | 18 +++++++++--------- app/src/main/res/values-uk/strings.xml | 14 +++++++------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 726e95465..9029f4b91 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -682,7 +682,7 @@ Отменить Нет уроков - Synchronized on %1$s at %2$s + Синхронизировано %1$s в %2$s Выбрать тему Светлая Тёмная @@ -778,7 +778,7 @@ Значения плюса и минуса, расчёт средней оценки Расширенные Версия приложения, разработчики, соц. сети - Displaying advertisements, project support + Посмотреть рекламу, чтобы поддержать проект Новые оценки Новое домашнее задание @@ -810,14 +810,14 @@ Для сохранения изменений необходимо перезапустить приложение Перезапустить - Authorization has been rejected. The data provided does not match the records in the secretary\'s office. - Invalid PESEL - PESEL + Авторизация отклонена. Предоставленные данные не соответствуют записям в кабинете секретаря. + Неправильный номер PESEL + Номер PESEL Authorize - Authorization completed successfully - Authorization - To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below - Skip for now + Авторизация прошла успешно + Авторизация + Для работы приложения нам необходимо подтвердить вашу личность. Введите PESEL учащегося <b>%1$s</b> в поле ниже + Пропустить сейчас Интернет-соединение отсутствует Произошла ошибка. Проверьте время на вашем устройстве diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 66cd23870..be136ea29 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -682,7 +682,7 @@ Скасувати Немаэ уроків - Synchronized on %1$s at %2$s + Синхронізовано %1$s в %2$s Увібрати тему Яскрава Темна @@ -810,14 +810,14 @@ Додаток потрібно перезавантажити для збереження змін Перезавантажити - Authorization has been rejected. The data provided does not match the records in the secretary\'s office. - Invalid PESEL - PESEL + Авторизацію відхилено. Надані дані не збігаються із записами в кабінеті секретаря. + Неправильний PESEL + Число PESEL Authorize Authorization completed successfully - Authorization - To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below - Skip for now + Авторизувати + Для роботи програми нам потрібно підтвердити вашу особу. Будь ласка, введіть число PESEL <b>%1$s</b> студента в поле нижче + Поки що пропустити Немає з\'єднання з інтернетом Сталася помилка. Перевірте годинник пристрою From d4ae0d56d62215ea26ad829579ac909d9e313575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 1 Jun 2023 10:59:50 +0200 Subject: [PATCH 1184/1526] Version 2.0.7 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 10 ++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 929a9db99..ec62e19f1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 128 - versionName "2.0.6" + versionCode 129 + versionName "2.0.7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -166,7 +166,7 @@ play { track = 'production' releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS userFraction = 0.25d - updatePriority = 4 + updatePriority = 1 enabled.set(false) } @@ -196,7 +196,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.0.6' + implementation 'io.github.wulkanowy:sdk:2.0.7' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index df69a331d..066485d3d 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,9 +1,7 @@ -Wersja 2.0.6 +Wersja 2.0.7 -— zaktualizowaliśmy wygląd aplikacji na (częściowo) zgodny z wytycznymi Material 3 -— dodaliśmy możliwość zmiany kolejności pozycji w menu dolnym -— poprawiliśmy sposób wyświetlania błędu o nieprawidłowym haśle na ekranie logowania -— od teraz zmiana ustawień liczenia średniej automatycznie odświeży listę ocen -— dodaliśmy okienko na wpisanie numeru PESEL, gdy dziennik wymaga dodatkowej autoryzacji dostępu +— poprawiliśmy wyświetlanie kilku rodzajów zmian w planie lekcji +— dodaliśmy limit znaków w okienku usprawiedliwiania +— naprawiliśmy wyświetlanie frekwencji w szkołach, gdzie działa już system eduOne (ciągle jednak brak opcji usprawiedliwiania) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 5306044173d5a67b4d1d09f037148f08b4ea8574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 1 Jun 2023 23:22:10 +0200 Subject: [PATCH 1185/1526] Add custom register host field on login screen (#2221) --- app/build.gradle | 2 +- .../56.json | 2442 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 3 +- .../wulkanowy/data/db/entities/Student.kt | 3 + .../data/mappers/RegisterUserMapper.kt | 2 + .../data/repositories/StudentRepository.kt | 12 +- .../wulkanowy/ui/modules/login/LoginData.kt | 1 + .../login/advanced/LoginAdvancedFragment.kt | 7 + .../login/advanced/LoginAdvancedPresenter.kt | 6 +- .../login/advanced/LoginAdvancedView.kt | 2 + .../modules/login/form/LoginFormFragment.kt | 8 + .../modules/login/form/LoginFormPresenter.kt | 18 +- .../ui/modules/login/form/LoginFormView.kt | 4 + .../LoginStudentSelectPresenter.kt | 1 + .../login/symbol/LoginSymbolPresenter.kt | 1 + .../io/github/wulkanowy/utils/SdkExtension.kt | 1 + .../res/layout/fragment_login_advanced.xml | 29 +- .../main/res/layout/fragment_login_form.xml | 28 +- app/src/main/res/values/api_hosts.xml | 3 + app/src/main/res/values/strings.xml | 1 + .../io/github/wulkanowy/TestEnityCreator.kt | 1 + .../data/repositories/GradeRepositoryTest.kt | 1 + .../domain/GetMailboxByStudentUseCaseTest.kt | 1 + .../modules/grade/GradeAverageProviderTest.kt | 1 + .../login/form/LoginFormPresenterTest.kt | 13 +- .../LoginStudentSelectPresenterTest.kt | 1 + 26 files changed, 2564 insertions(+), 28 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/56.json diff --git a/app/build.gradle b/app/build.gradle index ec62e19f1..19fbf6dec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -196,7 +196,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.0.7' + implementation 'io.github.wulkanowy:sdk:2.0.8-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/56.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/56.json new file mode 100644 index 000000000..1a26e717b --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/56.json @@ -0,0 +1,2442 @@ +{ + "formatVersion": 1, + "database": { + "version": 56, + "identityHash": "48f0538bd21601eb5322a7d850e04134", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `scrapper_domain_suffix` TEXT NOT NULL DEFAULT '', `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperDomainSuffix", + "columnName": "scrapper_domain_suffix", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `kindergarten_diary_id` INTEGER NOT NULL DEFAULT 0, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "kindergartenDiaryId", + "columnName": "kindergarten_diary_id", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "kindergarten_diary_id", + "semester_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `kindergarten_diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`email` TEXT NOT NULL, `message_global_key` TEXT NOT NULL, `mailbox_key` TEXT NOT NULL, `message_id` INTEGER NOT NULL, `correspondents` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `read_by` INTEGER, `unread_by` INTEGER, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `content` TEXT NOT NULL, `sender` TEXT, `recipients` TEXT)", + "fields": [ + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mailboxKey", + "columnName": "mailbox_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "correspondents", + "columnName": "correspondents", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "recipients", + "columnName": "recipients", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`message_global_key` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`message_global_key`, `url`, `filename`))", + "fields": [ + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "message_global_key", + "url", + "filename" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Mailboxes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`globalKey` TEXT NOT NULL, `email` TEXT NOT NULL, `symbol` TEXT NOT NULL, `schoolId` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `studentName` TEXT NOT NULL, `schoolNameShort` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`globalKey`))", + "fields": [ + { + "fieldPath": "globalKey", + "columnName": "globalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolId", + "columnName": "schoolId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "studentName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolNameShort", + "columnName": "schoolNameShort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "globalKey" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`mailboxGlobalKey` TEXT NOT NULL, `studentMailboxGlobalKey` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `schoolShortName` TEXT NOT NULL, `type` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "mailboxGlobalKey", + "columnName": "mailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentMailboxGlobalKey", + "columnName": "studentMailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "schoolShortName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `repeat_id` BLOB DEFAULT NULL, `is_added_by_user` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatId", + "columnName": "repeat_id", + "affinity": "BLOB", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `destination` TEXT NOT NULL DEFAULT '{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}', `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "destination", + "columnName": "destination", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}'" + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `type` TEXT NOT NULL, `is_dismissible` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isDismissible", + "columnName": "is_dismissible", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '48f0538bd21601eb5322a7d850e04134')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 0aea86dab..882a70167 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -49,6 +49,7 @@ import javax.inject.Singleton AutoMigration(from = 47, to = 48), AutoMigration(from = 51, to = 52), AutoMigration(from = 54, to = 55, spec = Migration55::class), + AutoMigration(from = 55, to = 56), ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -57,7 +58,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 55 + const val VERSION_SCHEMA = 56 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt index 76da9643d..e1116733c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt @@ -19,6 +19,9 @@ data class Student( @ColumnInfo(name = "scrapper_base_url") val scrapperBaseUrl: String, + @ColumnInfo(name = "scrapper_domain_suffix", defaultValue = "") + val scrapperDomainSuffix: String, + @ColumnInfo(name = "mobile_base_url") val mobileBaseUrl: String, diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt index bcf26a5e1..72c4861c9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt @@ -55,6 +55,7 @@ fun SdkRegisterUser.mapToPojo(password: String?) = RegisterUser( fun RegisterStudent.mapToStudentWithSemesters( user: RegisterUser, + scrapperDomainSuffix: String, symbol: RegisterSymbol, unit: RegisterUnit, colors: List, @@ -76,6 +77,7 @@ fun RegisterStudent.mapToStudentWithSemesters( studentName = "$studentName $studentSurname", loginMode = user.loginMode.name, scrapperBaseUrl = user.scrapperBaseUrl.orEmpty(), + scrapperDomainSuffix = scrapperDomainSuffix, mobileBaseUrl = symbol.hebeBaseUrl.orEmpty(), certificateKey = symbol.keyId.orEmpty(), privateKey = symbol.privatePem.orEmpty(), diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index a6bb72433..42d1eb84e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -43,22 +43,14 @@ class StudentRepository @Inject constructor( .getStudentsFromHebe(token, pin, symbol, "") .mapToPojo(null) - suspend fun getStudentsScrapper( - email: String, - password: String, - scrapperBaseUrl: String, - symbol: String - ): RegisterUser = sdk - .getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, symbol) - .mapToPojo(password) - suspend fun getUserSubjectsFromScrapper( email: String, password: String, scrapperBaseUrl: String, + domainSuffix: String, symbol: String ): RegisterUser = sdk - .getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, symbol) + .getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, domainSuffix, symbol) .mapToPojo(password) suspend fun getStudentsHybrid( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginData.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginData.kt index ae6c22492..2c11bb6d5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginData.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginData.kt @@ -6,5 +6,6 @@ data class LoginData( val login: String, val password: String, val baseUrl: String, + val domainSuffix: String, val symbol: String?, ) : Serializable diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt index ead2d71af..13d2c14a7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.widget.ArrayAdapter +import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R @@ -55,6 +56,9 @@ class LoginAdvancedFragment : get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) .orEmpty() + override val formDomainSuffix: String + get() = binding.loginFormDomainSuffix.text.toString().trim() + override val formHostSymbol: String get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) .orEmpty() @@ -279,6 +283,7 @@ class LoginAdvancedFragment : loginFormUsernameLayout.visibility = VISIBLE loginFormPassLayout.visibility = VISIBLE loginFormHostLayout.visibility = VISIBLE + loginFormDomainSuffixLayout.isVisible = true loginFormPinLayout.visibility = GONE loginFormSymbolLayout.visibility = VISIBLE loginFormTokenLayout.visibility = GONE @@ -290,6 +295,7 @@ class LoginAdvancedFragment : loginFormUsernameLayout.visibility = VISIBLE loginFormPassLayout.visibility = VISIBLE loginFormHostLayout.visibility = VISIBLE + loginFormDomainSuffixLayout.isVisible = true loginFormPinLayout.visibility = GONE loginFormSymbolLayout.visibility = VISIBLE loginFormTokenLayout.visibility = GONE @@ -301,6 +307,7 @@ class LoginAdvancedFragment : loginFormUsernameLayout.visibility = GONE loginFormPassLayout.visibility = GONE loginFormHostLayout.visibility = GONE + loginFormDomainSuffixLayout.isVisible = false loginFormPinLayout.visibility = VISIBLE loginFormSymbolLayout.visibility = VISIBLE loginFormTokenLayout.visibility = VISIBLE diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt index ab56bd786..a17ad0035 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt @@ -154,6 +154,7 @@ class LoginAdvancedPresenter @Inject constructor( login = view?.formUsernameValue.orEmpty().trim(), password = view?.formPassValue.orEmpty().trim(), baseUrl = view?.formHostValue.orEmpty().trim(), + domainSuffix = view?.formDomainSuffix.orEmpty().trim(), symbol = view?.formSymbolValue.orEmpty().trim().getNormalizedSymbol(), ) when (it.data.symbols.size) { @@ -186,6 +187,7 @@ class LoginAdvancedPresenter @Inject constructor( val email = view?.formUsernameValue.orEmpty() val password = view?.formPassValue.orEmpty() val endpoint = view?.formHostValue.orEmpty() + val domainSuffix = view?.formDomainSuffix.orEmpty() val pin = view?.formPinValue.orEmpty() val symbol = view?.formSymbolValue.orEmpty() @@ -193,8 +195,8 @@ class LoginAdvancedPresenter @Inject constructor( return when (Sdk.Mode.valueOf(view?.formLoginType.orEmpty())) { Sdk.Mode.HEBE -> studentRepository.getStudentsApi(pin, symbol, token) - Sdk.Mode.SCRAPPER -> studentRepository.getStudentsScrapper( - email, password, endpoint, symbol + Sdk.Mode.SCRAPPER -> studentRepository.getUserSubjectsFromScrapper( + email, password, endpoint, domainSuffix, symbol ) Sdk.Mode.HYBRID -> studentRepository.getStudentsHybrid( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt index 34062d938..afd33e3b6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt @@ -12,6 +12,8 @@ interface LoginAdvancedView : BaseView { val formHostValue: String + val formDomainSuffix: String + val formHostSymbol: String val formLoginType: String diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index 43ba3fe1d..1085ff509 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -45,6 +45,9 @@ class LoginFormFragment : BaseFragment(R.layout.fragme get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) .orEmpty() + override val formDomainSuffix: String + get() = binding.loginFormDomainSuffix.text.toString() + override val formHostSymbol: String get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) .orEmpty() @@ -204,6 +207,10 @@ class LoginFormFragment : BaseFragment(R.layout.fragme binding.loginFormContainer.visibility = if (show) VISIBLE else GONE } + override fun showDomainSuffixInput(show: Boolean) { + binding.loginFormDomainSuffixLayout.isVisible = show + } + override fun showOtherOptionsButton(show: Boolean) { binding.loginFormAdvancedButton.isVisible = show } @@ -256,6 +263,7 @@ class LoginFormFragment : BaseFragment(R.layout.fragme override fun onResume() { super.onResume() presenter.updateUsernameLabel() + presenter.updateCustomDomainSuffixVisibility() } override fun openEmail(lastError: String) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index ed70eb128..85f428415 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -1,8 +1,13 @@ package io.github.wulkanowy.ui.modules.login.form import androidx.core.net.toUri -import io.github.wulkanowy.data.* +import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceLoading +import io.github.wulkanowy.data.onResourceNotLoading +import io.github.wulkanowy.data.onResourceSuccess import io.github.wulkanowy.data.repositories.StudentRepository +import io.github.wulkanowy.data.resourceFlow import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.LoginErrorHandler @@ -56,10 +61,17 @@ class LoginFormPresenter @Inject constructor( } else if (formUsernameValue == "jan@fakelog.cf" && formPassValue == "jan123") { setCredentials("", "") } + updateCustomDomainSuffixVisibility() updateUsernameLabel() } } + fun updateCustomDomainSuffixVisibility() { + view?.run { + showDomainSuffixInput("customSuffix" in formHostValue) + } + } + fun updateUsernameLabel() { view?.run { setUsernameLabel(if ("email" !in formHostValue) nicknameLabel else emailLabel) @@ -91,6 +103,7 @@ class LoginFormPresenter @Inject constructor( val email = view?.formUsernameValue.orEmpty().trim() val password = view?.formPassValue.orEmpty().trim() val host = view?.formHostValue.orEmpty().trim() + val domainSuffix = view?.formDomainSuffix.orEmpty().trim() val symbol = view?.formHostSymbol.orEmpty().trim() if (!validateCredentials(email, password, host)) return @@ -100,6 +113,7 @@ class LoginFormPresenter @Inject constructor( email = email, password = password, scrapperBaseUrl = host, + domainSuffix = domainSuffix, symbol = symbol ) } @@ -112,7 +126,7 @@ class LoginFormPresenter @Inject constructor( } } .onResourceSuccess { - val loginData = LoginData(email, password, host, symbol) + val loginData = LoginData(email, password, host, domainSuffix, symbol) when (it.symbols.size) { 0 -> view?.navigateToSymbol(loginData) else -> view?.navigateToStudentSelect(loginData, it) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt index e5c680d6f..5fb260620 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt @@ -14,6 +14,8 @@ interface LoginFormView : BaseView { val formHostValue: String + val formDomainSuffix: String + val formHostSymbol: String val nicknameLabel: String @@ -56,6 +58,8 @@ interface LoginFormView : BaseView { fun showContent(show: Boolean) + fun showDomainSuffixInput(show: Boolean) + fun showOtherOptionsButton(show: Boolean) fun showVersion() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 7e1fe3b21..70862e828 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -241,6 +241,7 @@ class LoginStudentSelectPresenter @Inject constructor( item.student.mapToStudentWithSemesters( user = registerUser, symbol = item.symbol, + scrapperDomainSuffix = loginData.domainSuffix, unit = item.unit, colors = appInfo.defaultColorsForAvatar, ) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index 03ea95fa6..91fe1ac3c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -62,6 +62,7 @@ class LoginSymbolPresenter @Inject constructor( email = loginData.login, password = loginData.password, scrapperBaseUrl = loginData.baseUrl, + domainSuffix = loginData.domainSuffix, symbol = loginData.symbol.orEmpty(), ) }.onEach { user -> diff --git a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt index 481cad113..889d64ea1 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt @@ -16,6 +16,7 @@ fun Sdk.init(student: Student): Sdk { mobileBaseUrl = student.mobileBaseUrl } else { scrapperBaseUrl = student.scrapperBaseUrl + domainSuffix = student.scrapperDomainSuffix loginType = Sdk.ScrapperLoginType.valueOf(student.loginType) } diff --git a/app/src/main/res/layout/fragment_login_advanced.xml b/app/src/main/res/layout/fragment_login_advanced.xml index 43016db4c..37551decb 100644 --- a/app/src/main/res/layout/fragment_login_advanced.xml +++ b/app/src/main/res/layout/fragment_login_advanced.xml @@ -172,7 +172,7 @@ android:layout_marginBottom="16dp" android:hint="@string/login_host_hint" android:orientation="vertical" - app:layout_constraintBottom_toTopOf="@+id/loginFormTokenLayout" + app:layout_constraintBottom_toTopOf="@+id/loginFormDomainSuffixLayout" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/loginFormPassLayout"> @@ -185,6 +185,31 @@ tools:ignore="Deprecated,LabelFor" /> + + + + + + app:layout_constraintTop_toBottomOf="@+id/loginFormDomainSuffixLayout"> + + + + + + app:layout_constraintTop_toBottomOf="@+id/loginFormDomainSuffixLayout" /> Gmina Ulan-Majorat - Platforma oświatowa Gmina Ozorków - Platforma edukacyjna Gmina Łopiennik Górny - Platforma oświatowa + Custom domain suffix Fakelog @@ -42,6 +43,7 @@ https://vulcan.net.pl/?login https://vulcan.net.pl/?login https://vulcan.net.pl/?login + https://vulcan.net.pl/?email&customSuffix https://fakelog.cf/?email @@ -64,6 +66,7 @@ gminaulanmajorat gminaozorkow gminalopiennikgorny + Default powiatwulkanowy diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1eff95698..98c316cb0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,6 +42,7 @@ Login, PESEL or e-mail Password UONET+ register variant + Custom domain suffix Mobile API Scraper Hybrid diff --git a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt index c8d95829e..eac1389f4 100644 --- a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt +++ b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt @@ -50,6 +50,7 @@ fun getSemesterPojo(diaryId: Int, semesterId: Int, start: LocalDate, end: LocalD fun getStudentEntity(mode: Sdk.Mode = Sdk.Mode.HEBE) = Student( scrapperBaseUrl = "http://fakelog.cf", + scrapperDomainSuffix = "", email = "jan@fakelog.cf", certificateKey = "", classId = 0, diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt index 1d6dfaff0..5a1877cc0 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt @@ -296,6 +296,7 @@ class GradeRepositoryTest { private fun createGrades(grades: List): Grades = Grades( details = grades, summary = listOf(), + descriptive = emptyList(), isAverage = false, isPoints = false, isForAdults = false, diff --git a/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt b/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt index f58a5381d..34a8fe991 100644 --- a/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt +++ b/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt @@ -201,6 +201,7 @@ class GetMailboxByStudentUseCaseTest { schoolShortName: String = "test", ) = Student( scrapperBaseUrl = "http://fakelog.cf", + scrapperDomainSuffix = "", email = "jan@fakelog.cf", certificateKey = "", classId = 0, diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index b94002c0d..31ea3322b 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -47,6 +47,7 @@ class GradeAverageProviderTest { private val student = Student( scrapperBaseUrl = "", + scrapperDomainSuffix = "", mobileBaseUrl = "", loginType = "", loginMode = "SCRAPPER", diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt index eb1f53006..a6440f72a 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt @@ -130,7 +130,7 @@ class LoginFormPresenterTest { @Test fun loginTest() { coEvery { - repository.getUserSubjectsFromScrapper(any(), any(), any(), any()) + repository.getUserSubjectsFromScrapper(any(), any(), any(), any(), any()) } returns registerUser every { loginFormView.formUsernameValue } returns "@" @@ -149,7 +149,7 @@ class LoginFormPresenterTest { @Test fun loginEmptyTest() { coEvery { - repository.getUserSubjectsFromScrapper(any(), any(), any(), any()) + repository.getUserSubjectsFromScrapper(any(), any(), any(), any(), any()) } returns registerUser every { loginFormView.formUsernameValue } returns "@" every { loginFormView.formPassValue } returns "123456" @@ -167,7 +167,7 @@ class LoginFormPresenterTest { @Test fun loginEmptyTwiceTest() { coEvery { - repository.getUserSubjectsFromScrapper(any(), any(), any(), any()) + repository.getUserSubjectsFromScrapper(any(), any(), any(), any(), any()) } returns registerUser every { loginFormView.formUsernameValue } returns "@" every { loginFormView.formPassValue } returns "123456" @@ -187,12 +187,7 @@ class LoginFormPresenterTest { fun loginErrorTest() { val testException = IOException("test") coEvery { - repository.getUserSubjectsFromScrapper( - any(), - any(), - any(), - any() - ) + repository.getUserSubjectsFromScrapper(any(), any(), any(), any(), any()) } throws testException every { loginFormView.formUsernameValue } returns "@" every { loginFormView.formPassValue } returns "123456" diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index da292c51c..06aabec72 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -55,6 +55,7 @@ class LoginStudentSelectPresenterTest { password = "", baseUrl = "", symbol = null, + domainSuffix = "", ) private val subject = RegisterStudent( From fa44295d59ffa0b480f43b46b3139f10df88ebc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 1 Jun 2023 23:37:01 +0200 Subject: [PATCH 1186/1526] New Crowdin updates (#2231) --- app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-da-rDK/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + 8 files changed, 8 insertions(+) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index f8c19dff0..964329dae 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -37,6 +37,7 @@ Přihlášení, číslo PESEL nebo e-mail Heslo Variace deníku UONET+ + Custom domain suffix Mobile API Scraper Hybridní diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index b9de57f77..5c7d02a0f 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -37,6 +37,7 @@ Login, PESEL or e-mail Password UONET+ register variant + Custom domain suffix Mobile API Scraper Hybrid diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 500553e27..96423e35e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -37,6 +37,7 @@ Anmeldung, PESEL oder e-mail Passwort UONET+ Registervariante + Custom domain suffix Mobile API Scraper Hybride diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index b9de57f77..5c7d02a0f 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -37,6 +37,7 @@ Login, PESEL or e-mail Password UONET+ register variant + Custom domain suffix Mobile API Scraper Hybrid diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 207b12e98..2c7077977 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -37,6 +37,7 @@ Login, PESEL lub adres e-mail Hasło Odmiana dziennika UONET+ + Niestandardowy sufiks domeny Mobilne API Scraper Hybrydowe diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9029f4b91..eb8be0028 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -37,6 +37,7 @@ Логин, PESEL или электронная почта Пароль Тип дневника UONET+ + Custom domain suffix Мобильный API Scraper Hybrid diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 950eb01e0..bcbd832ae 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -37,6 +37,7 @@ Prihlásenie, číslo PESEL alebo e-mail Heslo Variácia denníka UONET+ + Custom domain suffix Mobile API Scraper Hybridné diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index be136ea29..30a587cc4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -37,6 +37,7 @@ Логін, PESEL або e-mail Пароль Тип щоденника UONET+ + Custom domain suffix Мobile API Scraper Hybrid From fecd5c707d6005e37117d231d612ee59a92126c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 1 Jun 2023 23:43:01 +0200 Subject: [PATCH 1187/1526] Version 2.0.8 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- app/src/main/res/values/api_hosts.xml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 19fbf6dec..000cc09ca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 129 - versionName "2.0.7" + versionCode 130 + versionName "2.0.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -196,7 +196,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.0.8-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.0.8' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 066485d3d..e881cfdaf 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 2.0.7 +Wersja 2.0.8 — poprawiliśmy wyświetlanie kilku rodzajów zmian w planie lekcji — dodaliśmy limit znaków w okienku usprawiedliwiania diff --git a/app/src/main/res/values/api_hosts.xml b/app/src/main/res/values/api_hosts.xml index 932093676..522b6e116 100644 --- a/app/src/main/res/values/api_hosts.xml +++ b/app/src/main/res/values/api_hosts.xml @@ -20,7 +20,7 @@ Gmina Ulan-Majorat - Platforma oświatowa Gmina Ozorków - Platforma edukacyjna Gmina Łopiennik Górny - Platforma oświatowa - Custom domain suffix + @string/login_domain_suffix_hint Fakelog From 2f749a690b4293a802c6fc00063c41a42c5008c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:18:23 +0000 Subject: [PATCH 1188/1526] Bump androidx.fragment:fragment-ktx from 1.5.7 to 1.6.0 (#2239) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 000cc09ca..2231da52b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -207,7 +207,7 @@ dependencies { implementation 'androidx.core:core-splashscreen:1.0.1' implementation "androidx.activity:activity-ktx:1.7.2" implementation "androidx.appcompat:appcompat:1.6.1" - implementation "androidx.fragment:fragment-ktx:1.5.7" + implementation "androidx.fragment:fragment-ktx:1.6.0" implementation "androidx.annotation:annotation:1.6.0" implementation "androidx.preference:preference-ktx:1.2.0" From f20ffe44d5b16c9954d9738b8f44214968f27853 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:24:27 +0000 Subject: [PATCH 1189/1526] Bump kotlin_version from 1.8.21 to 1.8.22 (#2238) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 69c0905af..c5a48ec9d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.8.21' + kotlin_version = '1.8.22' about_libraries = '10.7.0' hilt_version = "2.46.1" } From 8913b22a200685915c4da82a10802ab5ad0a7990 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:25:46 +0000 Subject: [PATCH 1190/1526] Bump org.sonarsource.scanner.gradle:sonarqube-gradle-plugin (#2237) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c5a48ec9d..757910b1c 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ buildscript { classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" - classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.1.0.3113" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.2.0.3129" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" } From df8849639b3baa8826eafc3a2c1c7a8eccdc510d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 10:56:32 +0000 Subject: [PATCH 1191/1526] Bump org.sonarsource.scanner.gradle:sonarqube-gradle-plugin (#2242) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 757910b1c..150bd4cfb 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ buildscript { classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" - classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.2.0.3129" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.2.1.3168" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" } From 03cd3aeab78cf3c3991cb28099cca6d67d5d2f1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 17:53:21 +0000 Subject: [PATCH 1192/1526] Bump com.google.firebase:firebase-bom from 32.1.0 to 32.2.0 (#2259) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 2231da52b..46f709c85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -252,7 +252,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.10.0' - playImplementation platform('com.google.firebase:firebase-bom:32.1.0') + playImplementation platform('com.google.firebase:firebase-bom:32.2.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From 6e7c12a118775f9590a57e99ac6a4064116505d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 17:53:38 +0000 Subject: [PATCH 1193/1526] Bump com.google.firebase:firebase-crashlytics-gradle from 2.9.5 to 2.9.7 (#2258) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 150bd4cfb..62f6389f0 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.15' classpath 'com.huawei.agconnect:agcp:1.9.0.300' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.7' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.2.1.3168" From bb79b33b6d40d0d208b7fe546c32a04a09d02446 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 17:53:58 +0000 Subject: [PATCH 1194/1526] Bump com.google.android.gms:play-services-ads from 22.1.0 to 22.2.0 (#2256) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 46f709c85..4589331fc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -259,7 +259,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-config-ktx' playImplementation 'com.google.android.play:core:1.10.3' playImplementation 'com.google.android.play:core-ktx:1.8.1' - playImplementation 'com.google.android.gms:play-services-ads:22.1.0' + playImplementation 'com.google.android.gms:play-services-ads:22.2.0' hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.301' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.0.300' From dbe608f2dd6aa9ab616c40a5d0b377a88d77fe37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 17:54:26 +0000 Subject: [PATCH 1195/1526] Bump about_libraries from 10.7.0 to 10.8.0 (#2249) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 62f6389f0..d12932db3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.8.22' - about_libraries = '10.7.0' + about_libraries = '10.8.0' hilt_version = "2.46.1" } repositories { From 29a36aaf6ed30318e2a8feb4666a0739daed822d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 18:11:57 +0000 Subject: [PATCH 1196/1526] Bump com.huawei.hms:hianalytics from 6.10.0.301 to 6.10.0.302 (#2253) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4589331fc..54cc97ffd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -261,7 +261,7 @@ dependencies { playImplementation 'com.google.android.play:core-ktx:1.8.1' playImplementation 'com.google.android.gms:play-services-ads:22.2.0' - hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.301' + hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.302' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.0.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 8564e12b015b151f3ead4b13f7ae4fb5d4c8358d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 19:15:06 +0000 Subject: [PATCH 1197/1526] Bump com.huawei.agconnect:agcp from 1.9.0.300 to 1.9.1.300 (#2254) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d12932db3..75191aade 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ buildscript { classpath 'com.android.tools.build:gradle:8.0.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.15' - classpath 'com.huawei.agconnect:agcp:1.9.0.300' + classpath 'com.huawei.agconnect:agcp:1.9.1.300' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.7' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" From d0819928f3b61e4d020d2dd9b78d10fd9b32d4d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 19:15:21 +0000 Subject: [PATCH 1198/1526] Bump com.huawei.agconnect:agconnect-crash from 1.9.0.300 to 1.9.1.300 (#2252) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 54cc97ffd..fdb8d20f7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -262,7 +262,7 @@ dependencies { playImplementation 'com.google.android.gms:play-services-ads:22.2.0' hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.302' - hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.0.300' + hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 88ea753fc69bba48fb367a9535e28c05e14c6b6b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 19:15:34 +0000 Subject: [PATCH 1199/1526] Bump coroutines from 1.7.1 to 1.7.2 (#2251) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index fdb8d20f7..9e0743715 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -192,7 +192,7 @@ ext { room = "2.5.1" chucker = "3.5.2" mockk = "1.13.5" - coroutines = "1.7.1" + coroutines = "1.7.2" } dependencies { From 86c7de6595fc6f71dbe616bffaa5474d1bdb215e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 19:15:48 +0000 Subject: [PATCH 1200/1526] Bump room from 2.5.1 to 2.5.2 (#2250) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 9e0743715..f3ea03c1e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -189,7 +189,7 @@ huaweiPublish { ext { work_manager = "2.8.1" android_hilt = "1.0.0" - room = "2.5.1" + room = "2.5.2" chucker = "3.5.2" mockk = "1.13.5" coroutines = "1.7.2" From 05741761a2117667d848d171b43096287d1aa811 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:08:56 +0000 Subject: [PATCH 1201/1526] Bump kotlin_version from 1.8.22 to 1.9.0 (#2255) --- app/build.gradle | 15 +++++---------- .../wulkanowy/data/db/dao/AdminMessageDao.kt | 2 +- build.gradle | 3 ++- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f3ea03c1e..596393f54 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlinx-serialization' apply plugin: 'kotlin-parcelize' apply plugin: 'kotlin-kapt' +apply plugin: 'com.google.devtools.ksp' apply plugin: 'dagger.hilt.android.plugin' apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' @@ -33,14 +34,6 @@ android { firebase_enabled: project.hasProperty("enableFirebase"), admob_project_id: "" ] - javaCompileOptions { - annotationProcessorOptions { - arguments += [ - "room.schemaLocation": "$projectDir/schemas".toString(), - "room.incremental" : "true" - ] - } - } buildConfigField "String", "SINGLE_SUPPORT_AD_ID", "null" buildConfigField "String", "DASHBOARD_TILE_AD_ID", "null" @@ -156,7 +149,9 @@ android { kapt { correctErrorTypes true } - +ksp { + arg("room.schemaLocation", "$projectDir/schemas".toString()) +} kotlin { jvmToolchain(11) } @@ -228,7 +223,7 @@ dependencies { implementation "androidx.room:room-runtime:$room" implementation "androidx.room:room-ktx:$room" - kapt "androidx.room:room-compiler:$room" + ksp "androidx.room:room-compiler:$room" implementation "com.google.dagger:hilt-android:$hilt_version" kapt "com.google.dagger:hilt-android-compiler:$hilt_version" diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt index 87f4812da..2b4cb5975 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt @@ -22,4 +22,4 @@ abstract class AdminMessageDao : BaseDao { deleteAll(oldMessages) insertAll(newMessages) } -} \ No newline at end of file +} diff --git a/build.gradle b/build.gradle index 75191aade..6a378d481 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.8.22' + kotlin_version = '1.9.0' about_libraries = '10.8.0' hilt_version = "2.46.1" } @@ -13,6 +13,7 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" + classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.11" classpath 'com.android.tools.build:gradle:8.0.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.15' From ef72218906b6a87d7a909fb3a561d99307276c17 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:30:37 +0000 Subject: [PATCH 1202/1526] Bump org.gradle.toolchains.foojay-resolver-convention (#2264) --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index a69aaa955..af9bb737a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.6.0' } include ':app' From c0161f38c61dc93a338b5907b374a48280e65031 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:33:17 +0000 Subject: [PATCH 1203/1526] Bump org.sonarsource.scanner.gradle:sonarqube-gradle-plugin (#2262) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6a378d481..8bdcdedfa 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ buildscript { classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.7' classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" - classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.2.1.3168" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.3.0.3225" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" } From e79c5d4d2bc9b7cb9359377fb7709bdc2633f8c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:36:06 +0000 Subject: [PATCH 1204/1526] Bump hilt_version from 2.46.1 to 2.47 (#2261) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8bdcdedfa..dba021521 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.9.0' about_libraries = '10.8.0' - hilt_version = "2.46.1" + hilt_version = "2.47" } repositories { mavenCentral() From 5b2e2ffb34820e475a4553eb1795b070a4f0a789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 25 Jul 2023 11:37:43 +0200 Subject: [PATCH 1205/1526] Remove tests deprecations (#2260) --- app/build.gradle | 2 +- .../io/github/wulkanowy/MainCoroutineRule.kt | 12 +++---- .../db/migrations/AbstractMigrationTest.kt | 3 +- .../data/db/migrations/Migration12Test.kt | 18 +++++----- .../data/db/migrations/Migration13Test.kt | 34 +++++++++++-------- 5 files changed, 37 insertions(+), 32 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 596393f54..f8603cc88 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,6 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlinx-serialization' apply plugin: 'kotlin-parcelize' -apply plugin: 'kotlin-kapt' apply plugin: 'com.google.devtools.ksp' apply plugin: 'dagger.hilt.android.plugin' apply plugin: 'com.google.gms.google-services' @@ -11,6 +10,7 @@ apply plugin: 'com.github.triplet.play' apply plugin: 'ru.cian.huawei-publish' apply plugin: 'com.mikepenz.aboutlibraries.plugin' apply plugin: 'com.huawei.agconnect' +apply plugin: 'kotlin-kapt' apply from: 'jacoco.gradle' apply from: 'sonarqube.gradle' apply from: 'hooks.gradle' diff --git a/app/src/test/java/io/github/wulkanowy/MainCoroutineRule.kt b/app/src/test/java/io/github/wulkanowy/MainCoroutineRule.kt index 10724868a..543c9540f 100644 --- a/app/src/test/java/io/github/wulkanowy/MainCoroutineRule.kt +++ b/app/src/test/java/io/github/wulkanowy/MainCoroutineRule.kt @@ -2,7 +2,8 @@ package io.github.wulkanowy import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.TestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain import org.junit.rules.TestWatcher @@ -10,17 +11,14 @@ import org.junit.runner.Description @OptIn(ExperimentalCoroutinesApi::class) class MainCoroutineRule( - private val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher() + private val testDispatcher: TestDispatcher = UnconfinedTestDispatcher() ) : TestWatcher() { - override fun starting(description: Description?) { - super.starting(description) + override fun starting(description: Description) { Dispatchers.setMain(testDispatcher) } - override fun finished(description: Description?) { - super.finished(description) + override fun finished(description: Description) { Dispatchers.resetMain() - testDispatcher.cleanupTestCoroutines() } } diff --git a/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt b/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt index 18249ba8b..18ff93392 100644 --- a/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt @@ -22,7 +22,8 @@ abstract class AbstractMigrationTest { @get:Rule val helper: MigrationTestHelper = MigrationTestHelper( InstrumentationRegistry.getInstrumentation(), - AppDatabase::class.java.canonicalName, + AppDatabase::class.java, + listOf(Migration55()), FrameworkSQLiteOpenHelperFactory() ) diff --git a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt index f614c8ca9..54c73e209 100644 --- a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt +++ b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt @@ -22,12 +22,12 @@ class Migration12Test : AbstractMigrationTest() { fun twoNotRelatedStudents() { helper.createDatabase(dbName, 11).apply { // user 1 - createStudent(this, 1, true) + createStudent(this, 1) createSemester(this, 1, false, 5, 1) createSemester(this, 1, true, 5, 2) // user 2 - createStudent(this, 2, true) + createStudent(this, 2) createSemester(this, 2, false, 6, 1) createSemester(this, 2, true, 6, 2) close() @@ -56,9 +56,9 @@ class Migration12Test : AbstractMigrationTest() { fun removeStudentsWithoutClassId() { helper.createDatabase(dbName, 11).apply { // user 1 - createStudent(this, 1, true) + createStudent(this, 1) createSemester(this, 1, false, 0, 2) - createStudent(this, 2, true) + createStudent(this, 2) createSemester(this, 2, true, 1, 2) close() } @@ -81,11 +81,11 @@ class Migration12Test : AbstractMigrationTest() { fun ensureThereIsOnlyOneCurrentStudent() { helper.createDatabase(dbName, 11).apply { // user 1 - createStudent(this, 1, true) + createStudent(this, 1) createSemester(this, 1, true, 5, 2) - createStudent(this, 2, true) + createStudent(this, 2) createSemester(this, 2, true, 6, 2) - createStudent(this, 3, true) + createStudent(this, 3) createSemester(this, 3, false, 7, 2) close() } @@ -112,7 +112,7 @@ class Migration12Test : AbstractMigrationTest() { db.close() } - private fun createStudent(db: SupportSQLiteDatabase, studentId: Int, isCurrent: Boolean) { + private fun createStudent(db: SupportSQLiteDatabase, studentId: Int) { db.insert("Students", CONFLICT_FAIL, ContentValues().apply { put("endpoint", "https://fakelog.cf") put("loginType", "STANDARD") @@ -123,7 +123,7 @@ class Migration12Test : AbstractMigrationTest() { put("student_name", "Jan Kowalski") put("school_id", "000123") put("school_name", "") - put("is_current", isCurrent) + put("is_current", true) put("registration_date", "0") }) } diff --git a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt index b0c03fb11..9ba36876e 100644 --- a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt +++ b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt @@ -95,22 +95,22 @@ class Migration13Test : AbstractMigrationTest() { fun markAtLeastAndOnlyOneSemesterAtCurrent() { helper.createDatabase(dbName, 12).apply { createStudent(this, 1, "", 5) - createSemester(this, 1, 5, 1, 1, false) - createSemester(this, 1, 5, 2, 1, false) - createSemester(this, 1, 5, 3, 2, false) - createSemester(this, 1, 5, 4, 2, false) + createSemester(this, 1, 1, 1, false) + createSemester(this, 1, 2, 1, false) + createSemester(this, 1, 3, 2, false) + createSemester(this, 1, 4, 2, false) createStudent(this, 2, "", 5) - createSemester(this, 2, 5, 5, 5, true) - createSemester(this, 2, 5, 6, 5, true) - createSemester(this, 2, 5, 7, 55, true) - createSemester(this, 2, 5, 8, 55, true) + createSemester(this, 2, 5, 5, true) + createSemester(this, 2, 6, 5, true) + createSemester(this, 2, 7, 55, true) + createSemester(this, 2, 8, 55, true) createStudent(this, 3, "", 5) - createSemester(this, 3, 5, 11, 99, false) - createSemester(this, 3, 5, 12, 99, false) - createSemester(this, 3, 5, 13, 100, false) - createSemester(this, 3, 5, 14, 100, true) + createSemester(this, 3, 11, 99, false) + createSemester(this, 3, 12, 99, false) + createSemester(this, 3, 13, 100, false) + createSemester(this, 3, 14, 100, true) close() } @@ -198,7 +198,13 @@ class Migration13Test : AbstractMigrationTest() { }) } - private fun createSemester(db: SupportSQLiteDatabase, studentId: Int, classId: Int, semesterId: Int, diaryId: Int, isCurrent: Boolean = false) { + private fun createSemester( + db: SupportSQLiteDatabase, + studentId: Int, + semesterId: Int, + diaryId: Int, + isCurrent: Boolean = false + ) { db.insert("Semesters", SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("student_id", studentId) put("diary_id", diaryId) @@ -206,7 +212,7 @@ class Migration13Test : AbstractMigrationTest() { put("semester_id", semesterId) put("semester_name", "1") put("is_current", isCurrent) - put("class_id", classId) + put("class_id", 5) put("unit_id", "99") }) } From 398bc513fb6e6e7284a1e1126f01af755ade050f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jul 2023 10:00:31 +0000 Subject: [PATCH 1206/1526] Bump about_libraries from 10.8.0 to 10.8.3 (#2263) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index dba021521..9584caaca 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.9.0' - about_libraries = '10.8.0' + about_libraries = '10.8.3' hilt_version = "2.47" } repositories { From b2969264231a65109ed70b24c7636c0c3425802a Mon Sep 17 00:00:00 2001 From: Bartosz Bieniek Date: Tue, 25 Jul 2023 23:05:14 +0200 Subject: [PATCH 1207/1526] Timetable widget improvements (#2219) --- .../timetablewidget/TimetableWidgetFactory.kt | 8 +- .../TimetableWidgetProvider.kt | 270 +++++++++------ .../background_timetable_widget_avatar.xml | 2 +- .../background_widget_item_timetable.xml | 2 +- .../res/drawable/ic_timetable_widget_swap.xml | 4 +- .../main/res/drawable/ic_widget_chevron.xml | 4 +- .../drawable/img_timetable_widget_preview.png | Bin 21111 -> 76378 bytes .../layout-v31/widget_timetable_preview.xml | 321 ++++++++++++++++-- .../main/res/layout/item_widget_timetable.xml | 20 +- app/src/main/res/layout/widget_timetable.xml | 89 ++--- .../res/xml/provider_widget_timetable.xml | 10 +- 11 files changed, 524 insertions(+), 206 deletions(-) mode change 100755 => 100644 app/src/main/res/drawable/img_timetable_widget_preview.png diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index 9c5abe1c2..d545413da 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -124,14 +124,12 @@ class TimetableWidgetFactory( val lessonStartTime = lesson.start.toFormattedString(TIME_FORMAT_STYLE) val lessonEndTime = lesson.end.toFormattedString(TIME_FORMAT_STYLE) - val roomText = "${context.getString(R.string.timetable_room)} ${lesson.room}" val remoteViews = RemoteViews(context.packageName, R.layout.item_widget_timetable).apply { setTextViewText(R.id.timetableWidgetItemNumber, lesson.number.toString()) setTextViewText(R.id.timetableWidgetItemTimeStart, lessonStartTime) setTextViewText(R.id.timetableWidgetItemTimeFinish, lessonEndTime) setTextViewText(R.id.timetableWidgetItemSubject, lesson.subject) - setTextViewText(R.id.timetableWidgetItemRoom, roomText) setTextViewText(R.id.timetableWidgetItemTeacher, lesson.teacher) setTextViewText(R.id.timetableWidgetItemDescription, lesson.info) setOnClickFillInIntent(R.id.timetableWidgetItemContainer, Intent()) @@ -140,6 +138,12 @@ class TimetableWidgetFactory( updateTheme() clearLessonStyles(remoteViews) + if (lesson.room.isBlank()) { + remoteViews.setViewVisibility(R.id.timetableWidgetItemRoom, GONE) + } else { + remoteViews.setTextViewText(R.id.timetableWidgetItemRoom, lesson.room) + } + when { lesson.canceled -> applyCancelledLessonStyles(remoteViews) lesson.changes or lesson.info.isNotBlank() -> applyChangedLessonStyles( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 624ca30f4..cc48539a5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -8,6 +8,7 @@ import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK import android.content.Intent.FLAG_ACTIVITY_NEW_TASK +import android.graphics.Bitmap import android.widget.RemoteViews import androidx.appcompat.content.res.AppCompatResources import androidx.core.graphics.drawable.DrawableCompat @@ -76,110 +77,151 @@ class TimetableWidgetProvider : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { GlobalScope.launch { when (intent.action) { - ACTION_APPWIDGET_UPDATE -> onUpdate(context, intent) - ACTION_APPWIDGET_DELETED -> onDelete(intent) + ACTION_APPWIDGET_UPDATE -> onWidgetUpdate(context, intent) + ACTION_APPWIDGET_DELETED -> onWidgetDeleted(intent) } } } - private suspend fun onUpdate(context: Context, intent: Intent) { - if (intent.getStringExtra(EXTRA_BUTTON_TYPE) == null) { - val isFromConfigure = intent.getBooleanExtra(EXTRA_FROM_CONFIGURE, false) - val appWidgetIds = intent.getIntArrayExtra(EXTRA_APPWIDGET_IDS) ?: return + private suspend fun onWidgetUpdate(context: Context, intent: Intent) { + val pressedButton = intent.getPressedButton() - appWidgetIds.forEach { appWidgetId -> - val student = - getStudent(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId) - val savedDataEpochDay = sharedPref.getLong(getDateWidgetKey(appWidgetId), 0) - - val dateToLoad = if (isFromConfigure && savedDataEpochDay != 0L) { - LocalDate.ofEpochDay(savedDataEpochDay) - } else { - getWidgetDefaultDateToLoad(appWidgetId) - } - - updateWidget(context, appWidgetId, dateToLoad, student) - } + if (pressedButton == null) { + val updatedWidgetIds = intent.getWidgetIds() ?: return + updatedWidgetIds.forEach { updateWidgetLayout(context, it) } } else { - val buttonType = intent.getStringExtra(EXTRA_BUTTON_TYPE) - val toggledWidgetId = intent.getIntExtra(EXTRA_TOGGLED_WIDGET_ID, 0) - val student = getStudent( - sharedPref.getLong(getStudentWidgetKey(toggledWidgetId), 0), toggledWidgetId - ) - val savedDate = - LocalDate.ofEpochDay(sharedPref.getLong(getDateWidgetKey(toggledWidgetId), 0)) - val date = when (buttonType) { - BUTTON_RESET -> getWidgetDefaultDateToLoad(toggledWidgetId) - BUTTON_NEXT -> savedDate.nextSchoolDay - BUTTON_PREV -> savedDate.previousSchoolDay - else -> getWidgetDefaultDateToLoad(toggledWidgetId) - } - if (!buttonType.isNullOrBlank()) { - analytics.logEvent( - "changed_timetable_widget_day", "button" to buttonType - ) - } - updateWidget(context, toggledWidgetId, date, student) + val widgetId = intent.getToggledWidgetId() ?: return + reportChangedDay(pressedButton) + updateSavedWidgetDate(widgetId, pressedButton) + updateWidgetLayout(context, widgetId) } } - private fun onDelete(intent: Intent) { - val appWidgetId = intent.getIntExtra(EXTRA_APPWIDGET_ID, 0) + private fun Intent.getPressedButton(): String? { + return getStringExtra(EXTRA_BUTTON_TYPE) + } - if (appWidgetId != 0) { - with(sharedPref) { - delete(getStudentWidgetKey(appWidgetId)) - delete(getDateWidgetKey(appWidgetId)) - } + private fun Intent.getWidgetIds(): IntArray? { + return getIntArrayExtra(EXTRA_APPWIDGET_IDS) + } + + private fun Intent.getToggledWidgetId(): Int? { + val toggledWidgetId = getIntExtra(EXTRA_TOGGLED_WIDGET_ID, INVALID_APPWIDGET_ID) + return toggledWidgetId.takeIf { it != INVALID_APPWIDGET_ID } + } + + private fun reportChangedDay(buttonType: String) { + if (buttonType.isNotBlank()) { + analytics.logEvent("changed_timetable_widget_day", "button" to buttonType) } } - private fun updateWidget( - context: Context, appWidgetId: Int, date: LocalDate, student: Student? + private fun updateSavedWidgetDate(widgetId: Int, buttonType: String) { + val savedDate = getSavedWidgetDate(widgetId) + val newDate = savedDate?.let { getNewDate(it, widgetId, buttonType) } + ?: getWidgetDefaultDateToLoad(widgetId) + setWidgetDate(widgetId, newDate) + } + + private fun getSavedWidgetDate(widgetId: Int): LocalDate? { + val epochDay = sharedPref.getLong(getDateWidgetKey(widgetId), 0) + return if (epochDay == 0L) null else LocalDate.ofEpochDay(epochDay) + } + + private fun getNewDate( + currentDate: LocalDate, + widgetId: Int, + selectedButton: String + ): LocalDate { + return when (selectedButton) { + BUTTON_NEXT -> currentDate.nextSchoolDay + BUTTON_PREV -> currentDate.previousSchoolDay + else -> getWidgetDefaultDateToLoad(widgetId) + } + } + + private fun setWidgetDate(widgetId: Int, dateToSet: LocalDate) { + val widgetDateKey = getDateWidgetKey(widgetId) + sharedPref.putLong(widgetDateKey, dateToSet.toEpochDay(), true) + } + + private fun getWidgetDefaultDateToLoad(widgetId: Int): LocalDate { + val lastLessonEndDateTime = getLastLessonDateTime(widgetId) + + val todayDate = LocalDate.now() + val isLastLessonToday = lastLessonEndDateTime.toLocalDate() == todayDate + val isEndOfLessons = LocalDateTime.now() > lastLessonEndDateTime + + return if (isLastLessonToday && isEndOfLessons) { + todayDate.nextSchoolDay + } else { + todayDate.nextOrSameSchoolDay + } + } + + private fun getLastLessonDateTime(widgetId: Int): LocalDateTime { + val lastLessonTimestamp = sharedPref + .getLong(getTodayLastLessonEndDateTimeWidgetKey(widgetId), 0) + return LocalDateTime.ofEpochSecond(lastLessonTimestamp, 0, ZoneOffset.UTC) + } + + private suspend fun updateWidgetLayout( + context: Context, widgetId: Int ) { - val nextNavIntent = createNavIntent(context, appWidgetId, appWidgetId, BUTTON_NEXT) - val prevNavIntent = createNavIntent(context, -appWidgetId, appWidgetId, BUTTON_PREV) - val resetNavIntent = - createNavIntent(context, Int.MAX_VALUE - appWidgetId, appWidgetId, BUTTON_RESET) - val adapterIntent = Intent(context, TimetableWidgetService::class.java).apply { - putExtra(EXTRA_APPWIDGET_ID, appWidgetId) - action = appWidgetId.toString() //make Intent unique - } - val appIntent = PendingIntent.getActivity( - context, - TIMETABLE_PENDING_INTENT_ID, - SplashActivity.getStartIntent(context, Destination.Timetable()), - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE - ) + val widgetRemoteViews = RemoteViews(context.packageName, R.layout.widget_timetable) + // Apply the click action intent + val appIntent = createPendingAppIntent(context) + widgetRemoteViews.setPendingIntentTemplate(R.id.timetableWidgetList, appIntent) + + // Display saved date + val date = getSavedWidgetDate(widgetId) ?: getWidgetDefaultDateToLoad(widgetId) val formattedDate = date.toFormattedString("EEE, dd.MM").capitalise() - val remoteView = RemoteViews(context.packageName, R.layout.widget_timetable).apply { - setEmptyView(R.id.timetableWidgetList, R.id.timetableWidgetEmpty) - setTextViewText(R.id.timetableWidgetDate, formattedDate) - setRemoteAdapter(R.id.timetableWidgetList, adapterIntent) + widgetRemoteViews.setTextViewText(R.id.timetableWidgetDate, formattedDate) + + // Apply intents to the date switcher buttons + val nextNavIntent = createNavButtonIntent(context, widgetId, widgetId, BUTTON_NEXT) + val prevNavIntent = createNavButtonIntent(context, -widgetId, widgetId, BUTTON_PREV) + val resetNavIntent = + createNavButtonIntent(context, Int.MAX_VALUE - widgetId, widgetId, BUTTON_RESET) + widgetRemoteViews.run { setOnClickPendingIntent(R.id.timetableWidgetNext, nextNavIntent) setOnClickPendingIntent(R.id.timetableWidgetPrev, prevNavIntent) setOnClickPendingIntent(R.id.timetableWidgetDate, resetNavIntent) - setPendingIntentTemplate(R.id.timetableWidgetList, appIntent) } - student?.let { - setupAccountView(context, student, remoteView, appWidgetId) + // Setup the lesson list adapter + val lessonListAdapterIntent = createLessonListAdapterIntent(context, widgetId) + // --- Ensure the selected date is stored in the shared preferences, + // --- on which the TimetableWidgetFactory relies + setWidgetDate(widgetId, date) + // --- + widgetRemoteViews.apply { + setEmptyView(R.id.timetableWidgetList, R.id.timetableWidgetEmpty) + setRemoteAdapter(R.id.timetableWidgetList, lessonListAdapterIntent) } - with(sharedPref) { - putLong(getDateWidgetKey(appWidgetId), date.toEpochDay(), true) + // Setup profile picture + getWidgetStudent(widgetId)?.let { student -> + setupAccountView(context, student, widgetRemoteViews, widgetId) } + // Apply updates with(appWidgetManager) { - partiallyUpdateAppWidget(appWidgetId, remoteView) - notifyAppWidgetViewDataChanged(appWidgetId, R.id.timetableWidgetList) + partiallyUpdateAppWidget(widgetId, widgetRemoteViews) + notifyAppWidgetViewDataChanged(widgetId, R.id.timetableWidgetList) } Timber.d("TimetableWidgetProvider updated") } - private fun createNavIntent( + private fun createPendingAppIntent(context: Context) = PendingIntent.getActivity( + context, TIMETABLE_PENDING_INTENT_ID, + SplashActivity.getStartIntent(context, Destination.Timetable()), + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE + ) + + private fun createNavButtonIntent( context: Context, code: Int, appWidgetId: Int, buttonType: String ) = PendingIntent.getBroadcast( context, code, Intent(context, TimetableWidgetProvider::class.java).apply { @@ -189,6 +231,17 @@ class TimetableWidgetProvider : BroadcastReceiver() { }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) + private fun createLessonListAdapterIntent(context: Context, widgetId: Int) = + Intent(context, TimetableWidgetService::class.java).apply { + putExtra(EXTRA_APPWIDGET_ID, widgetId) + action = widgetId.toString() //make Intent unique + } + + private suspend fun getWidgetStudent(widgetId: Int): Student? { + val studentId = sharedPref.getLong(getStudentWidgetKey(widgetId), 0) + return getStudent(studentId, widgetId) + } + private suspend fun getStudent(studentId: Long, appWidgetId: Int) = try { val students = studentRepository.getSavedStudents(false) val student = students.singleOrNull { it.student.id == studentId }?.student @@ -199,6 +252,7 @@ class TimetableWidgetProvider : BroadcastReceiver() { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } } + else -> null } } catch (e: Exception) { @@ -208,60 +262,64 @@ class TimetableWidgetProvider : BroadcastReceiver() { null } - private fun getWidgetDefaultDateToLoad(appWidgetId: Int): LocalDate { - val lastLessonEndTimestamp = - sharedPref.getLong(getTodayLastLessonEndDateTimeWidgetKey(appWidgetId), 0) - val lastLessonEndDateTime = - LocalDateTime.ofEpochSecond(lastLessonEndTimestamp, 0, ZoneOffset.UTC) + private fun setupAccountView( + context: Context, student: Student, remoteViews: RemoteViews, widgetId: Int + ) { + val accountInitials = getAccountInitials(student.nickOrName) + val accountPickerPendingIntent = createAccountPickerPendingIntent(context, widgetId) - val todayDate = LocalDate.now() - val isLastLessonEndDateNow = lastLessonEndDateTime.toLocalDate() == todayDate - val isLastLessonEndDateAfterNowTime = LocalDateTime.now() > lastLessonEndDateTime + getAvatarBackgroundBitmap(context, student.avatarColor)?.let { + remoteViews.setImageViewBitmap(R.id.timetableWidgetAccountBackground, it) + } - return if (isLastLessonEndDateNow && isLastLessonEndDateAfterNowTime) { - todayDate.nextSchoolDay - } else { - todayDate.nextOrSameSchoolDay + remoteViews.apply { + setTextViewText(R.id.timetableWidgetAccountInitials, accountInitials) + setOnClickPendingIntent(R.id.timetableWidgetAccount, accountPickerPendingIntent) } } - private fun setupAccountView( - context: Context, - student: Student, - remoteViews: RemoteViews, - appWidgetId: Int - ) { - val accountInitials = student.nickOrName - .split(" ") - .mapNotNull { it.firstOrNull() }.take(2) - .joinToString(separator = "").uppercase() + private fun getAccountInitials(name: String): String { + val firstLetters = name.split(" ").mapNotNull { it.firstOrNull() } + return firstLetters.joinToString(separator = "").uppercase() + } - val accountPickerIntent = PendingIntent.getActivity( + private fun createAccountPickerPendingIntent(context: Context, widgetId: Int) = + PendingIntent.getActivity( context, - -Int.MAX_VALUE + appWidgetId, + -Int.MAX_VALUE + widgetId, Intent(context, TimetableWidgetConfigureActivity::class.java).apply { addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK) - putExtra(EXTRA_APPWIDGET_ID, appWidgetId) + putExtra(EXTRA_APPWIDGET_ID, widgetId) putExtra(EXTRA_FROM_PROVIDER, true) }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) - // Create background bitmap + private fun getAvatarBackgroundBitmap(context: Context, avatarColor: Long): Bitmap? { val avatarDrawableResource = R.drawable.background_timetable_widget_avatar - AppCompatResources.getDrawable(context, avatarDrawableResource)?.let { drawable -> + return AppCompatResources.getDrawable(context, avatarDrawableResource)?.let { drawable -> val screenDensity = context.resources.displayMetrics.density val avatarSize = (48 * screenDensity).toInt() - val backgroundBitmap = DrawableCompat.wrap(drawable).run { - DrawableCompat.setTint(this, student.avatarColor.toInt()) + DrawableCompat.wrap(drawable).run { + DrawableCompat.setTint(this, avatarColor.toInt()) toBitmap(avatarSize, avatarSize) } - remoteViews.setImageViewBitmap(R.id.timetableWidgetAccountBackground, backgroundBitmap) } + } - remoteViews.apply { - setTextViewText(R.id.timetableWidgetAccountInitials, accountInitials) - setOnClickPendingIntent(R.id.timetableWidgetAccount, accountPickerIntent) + private fun onWidgetDeleted(intent: Intent) { + val deletedWidgetId = intent.getWidgetId() + deleteWidgetPreferences(deletedWidgetId) + } + + private fun Intent.getWidgetId(): Int { + return getIntExtra(EXTRA_APPWIDGET_ID, INVALID_APPWIDGET_ID) + } + + private fun deleteWidgetPreferences(widgetId: Int) { + with(sharedPref) { + delete(getStudentWidgetKey(widgetId)) + delete(getDateWidgetKey(widgetId)) } } } diff --git a/app/src/main/res/drawable/background_timetable_widget_avatar.xml b/app/src/main/res/drawable/background_timetable_widget_avatar.xml index 7f64c4ebe..48298d675 100644 --- a/app/src/main/res/drawable/background_timetable_widget_avatar.xml +++ b/app/src/main/res/drawable/background_timetable_widget_avatar.xml @@ -2,5 +2,5 @@ - + diff --git a/app/src/main/res/drawable/background_widget_item_timetable.xml b/app/src/main/res/drawable/background_widget_item_timetable.xml index 096357584..510c70c0c 100644 --- a/app/src/main/res/drawable/background_widget_item_timetable.xml +++ b/app/src/main/res/drawable/background_widget_item_timetable.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/drawable/ic_timetable_widget_swap.xml b/app/src/main/res/drawable/ic_timetable_widget_swap.xml index 2f91489a9..09c50b4f1 100644 --- a/app/src/main/res/drawable/ic_timetable_widget_swap.xml +++ b/app/src/main/res/drawable/ic_timetable_widget_swap.xml @@ -1,6 +1,6 @@ 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 literal 21111 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 bi-Ccg@uSalw&_c=6hVAXS3j3^P6 @@ -16,23 +16,47 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" - android:orientation="horizontal" - android:paddingVertical="16dp"> + android:paddingTop="12dp" + android:paddingBottom="8dp"> + + + + + + + + - + android:paddingBottom="12dp"> - + android:background="@drawable/background_widget_item_timetable" + android:backgroundTint="?attr/colorSurface" + android:gravity="center_vertical" + android:minHeight="48dp" + android:orientation="horizontal" + android:paddingHorizontal="12dp" + android:paddingVertical="8dp"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + android:background="@drawable/background_widget_item_timetable" + android:backgroundTint="?attr/colorSurface" + android:gravity="center_vertical" + android:minHeight="48dp" + android:orientation="horizontal" + android:paddingHorizontal="12dp" + android:paddingVertical="8dp"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:layout_height="wrap_content" + android:background="@drawable/background_widget_item_timetable" + android:backgroundTint="?attr/colorSurface" + android:gravity="center_vertical" + android:minHeight="48dp" + android:orientation="horizontal" + android:paddingHorizontal="12dp" + android:paddingVertical="8dp"> + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_widget_timetable.xml b/app/src/main/res/layout/item_widget_timetable.xml index 27c9db66c..01f4525ec 100644 --- a/app/src/main/res/layout/item_widget_timetable.xml +++ b/app/src/main/res/layout/item_widget_timetable.xml @@ -6,11 +6,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/background_widget_item_timetable" - android:backgroundTint="?attr/backgroundColor" + android:backgroundTint="?attr/colorSurface" android:gravity="center_vertical" + android:minHeight="48dp" android:orientation="horizontal" - android:paddingHorizontal="16dp" - android:paddingVertical="12dp" + android:paddingHorizontal="12dp" + android:paddingVertical="8dp" android:theme="@style/Wulkanowy.Widget.Theme" tools:context=".ui.modules.timetablewidget.TimetableWidgetFactory"> @@ -18,15 +19,14 @@ android:id="@+id/timetableWidgetItemNumber" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="?attr/textAppearanceHeadline6" - android:textSize="24sp" + android:textSize="22sp" tools:text="1" tools:textColor="?attr/colorTimetableChange" /> @@ -41,7 +41,7 @@ android:id="@+id/timetableWidgetItemTimeFinish" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="4dp" + android:layout_marginTop="2dp" android:textAppearance="?attr/textAppearanceBodySmall" tools:text="09:45" /> @@ -60,7 +60,7 @@ android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" - android:textAppearance="?attr/textAppearanceTitleMedium" + android:textSize="14sp" tools:text="Programowanie aplikacji mobilnych i desktopowych" /> + tools:context=".ui.modules.timetablewidget.TimetableWidgetProvider" + tools:targetApi="s"> + android:paddingTop="12dp" + android:paddingBottom="8dp"> + + + + + + + + + android:textSize="18sp" + tools:text="Friday, 19.05" /> - - - - - - @@ -111,5 +114,7 @@ android:text="@string/widget_timetable_no_items" android:textAppearance="?attr/textAppearanceBody1" android:visibility="gone" /> + + diff --git a/app/src/main/res/xml/provider_widget_timetable.xml b/app/src/main/res/xml/provider_widget_timetable.xml index 3cdad0c81..555d8cb10 100644 --- a/app/src/main/res/xml/provider_widget_timetable.xml +++ b/app/src/main/res/xml/provider_widget_timetable.xml @@ -3,15 +3,15 @@ xmlns:tools="http://schemas.android.com/tools" android:configure="io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetConfigureActivity" android:initialLayout="@layout/widget_timetable" - android:minWidth="250dp" - android:minHeight="110dp" - android:minResizeWidth="250dp" - android:minResizeHeight="110dp" + android:minWidth="245dp" + android:minHeight="102dp" + android:minResizeWidth="245dp" + android:minResizeHeight="102dp" android:previewImage="@drawable/img_timetable_widget_preview" android:previewLayout="@layout/widget_timetable_preview" android:resizeMode="horizontal|vertical" android:targetCellWidth="3" - android:targetCellHeight="2" + android:targetCellHeight="3" android:updatePeriodMillis="3600000" android:widgetCategory="home_screen" tools:targetApi="s" /> From 91d7ee442edc87b045ae2693874d612bf0bcfe87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 26 Jul 2023 19:37:06 +0200 Subject: [PATCH 1208/1526] New Crowdin updates (#2257) --- .../res/values-it-rIT/preferences_values.xml | 65 ++ app/src/main/res/values-it-rIT/strings.xml | 747 ++++++++++++++++++ app/src/main/res/values-uk/strings.xml | 6 +- 3 files changed, 815 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/values-it-rIT/preferences_values.xml create mode 100644 app/src/main/res/values-it-rIT/strings.xml diff --git a/app/src/main/res/values-it-rIT/preferences_values.xml b/app/src/main/res/values-it-rIT/preferences_values.xml new file mode 100644 index 000000000..ac2b6e9e5 --- /dev/null +++ b/app/src/main/res/values-it-rIT/preferences_values.xml @@ -0,0 +1,65 @@ + + + + Light + Dark + Black (AMOLED) + + + System language + Polski + English + Pусский + Українська + Deutsch + Čeština + Slovenčina + + + 15 minutes + 30 minutes + 1 hour + 2 hours + 6 hours + 12 hours + 24 hours + + + 0,00 + 0,25 + 0,33 + 0,5 + 0,75 + + + Alphabetically + By date + By average + + + Dzienniczek+ + Wulkanowy + Grade colors in register + + + Up to 1 at once + Always expanded + Unlimited expansions + + + Average of grades only from selected semester + Average of averages from both semesters + Average of grades from the whole year + + + Lucky number + Unread messages + Attendance + Lessons + Grades + Homework + School announcements + Exams + Conferences + + diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml new file mode 100644 index 000000000..5c7d02a0f --- /dev/null +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -0,0 +1,747 @@ + + + + Login + Wulkanowy + Grades + Attendance + Exams + Timetable + Settings + More + About + Log viewer + Debug + Notification debug + Contributors + Licenses + Messages + New message + New homework + Notes and achievements + Homework + Accounts manager + Select account + Account details + Student info + Dashboard + Notifications center + Menu configuartion + + Semester %1$d, %2$d/%3$d + + Sign in with the student or parent account + Enter the symbol from the register page for account: <b>%1$s</b> + Username + Email + Login, PESEL or e-mail + Password + UONET+ register variant + Custom domain suffix + Mobile API + Scraper + Hybrid + Token + PIN + Symbol + Sign in + Password too short + Login details are incorrect + %1$s. Make sure the correct UONET+ register variation is selected below + Invalid PIN + Invalid token + Token expired + Invalid email + Use the assigned login instead of email + Use the assigned login or email in @%1$s + Invalid symbol + Student not found. Validate the symbol and the chosen variation of the UONET+ register + Selected student is already logged in + The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the first login screen + Select students to log in to the application + Other options + In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices + This mode displays the same data as it appears on the register website + The combination of the best features of the other two modes. It works faster than scraper and provides features not available in the Mobile API mode. It is in the experimental phase + Privacy policy + Trouble signing in? Contact us! + Email + Discord + Send email + Make sure you select the correct UONET+ register variation! + I forgot my password + Recover your account + Recover + Student is already signed in + Standard + Other search locations + No active students found + Enter a different symbol + + Enable notifications + Enable notifications so you don\'t miss message from teacher or new grade + Skip + Enable + + Account manager + Log in + Session expired + Session expired, log in again + Application support + Do you like this app? Support its development by enabling non-invasive ads that you can disable at any time + Enable ads + + Grade + Semester %d + Change semester + No grades + Weight + Weight: %s + Comment + Number of new ratings: %1$d + Average: %1$.2f + Points: %s + No average + Total points + Final grade + Predicted grade + Calculated average + How does Calculated Average work? + The Calculated Average is the arithmetic average calculated from the subjects averages. It allows you to know the approximate final average. It is calculated in a way selected by the user in the application settings. It is recommended that you choose the appropriate option. This is because the calculation of school averages differs. Additionally, if your school reports the average of the subjects on the Vulcan page, the application downloads them and does not calculate these averages. This can be changed by forcing the calculation of the average in the application settings.\n\nAverage of grades only from selected semester:\n1. Calculating the weighted average for each subject in a given semester\n2.Adding calculated averages\n3. Calculation of the arithmetic average of the summed averages\n\nAverage of averages from both semesters:\n1.Calculating the weighted average for each subject in semester 1 and 2\n2. Calculating the arithmetic average of the calculated averages for semesters 1 and 2 for each subject.\n3. Adding calculated averages\n4. Calculation of the arithmetic average of the summed averages\n\nAverage of grades from the whole year:\n1. Calculating weighted average over the year for each subject. The final average in the 1st semester is irrelevant.\n2. Adding calculated averages\n3. Calculating the arithmetic average of summed averages + How does the Final Average work? + The Final Average is the arithmetic average calculated from all currently available final grades in the given semester.\n\nThe calculation scheme consists of the following steps:\n1. Summing up the final grades given by teachers\n2. Divide by the number of subjects that have already been graded + Final average + from %1$d of %2$d subjects + Summary + Class + Mark as read + Partial + Semester + Points + Legend + Class average: %1$s + Your average: %1$s + Your grade: %1$s + Class + Student + + %d grade + %d grades + + + New grade + New grades + + + New predicted grade + New predicted grades + + + New final grade + New final grades + + + You received %1$d grade + You received %1$d grades + + + You received %1$d predicted grade + You received %1$d predicted grades + + + You received %1$d final grade + You received %1$d final grades + + + Lesson + Room + Group + Hours + Changes + No lessons this day + %s min + %s sec + %1$s left + in %1$s + Finished + Now: %s + Next: %s + Later: %s + %1$s lesson %2$d - %3$s + Change of room from %1$s to %2$s + Change of teacher from %1$s to %2$s + Change of subject from %1$s to %2$s + + Timetable change + Timetable changes + + + %1$s - %2$d change in timetable + %1$s - %2$d changes in timetable + + + %1$d change in timetable + %1$d changes in timetable + + + %d change + %d changes + + + Completed lessons + Show completed lessons + No info about completed lessons + Topic + Absence + Resources + + Additional lessons + Show additional lessons + No info about additional lessons + New lesson + New additional lesson + Additional lesson added successfully + Additional lesson deleted successfully + Repeat weekly + Delete additional lesson + Just this lesson + All in the series + Start time + End time + End time must be greater than start time + + Attendance summary + Absent for school reasons + Excused absence + Unexcused absence + Exemption + Excused lateness + Unexcused lateness + Present + Deleted + Unknown + Number of lesson + No entries + Absence reason (optional) + Send + Absence excuse request sent successfully! + You must select at least one absence! + Excuse + + New attendance + New attendance + + + %1$d new attendance + %1$d attendance + + + %d attendance + %d attendance + + + Total + + No exams this week + Type + Entry date + + New exam + New exams + + + %d new exam + %d new exams + + + %d exam + %d exams + + + Inbox + Sent + Trash + (no subject) + No messages + From: + To: + Date: %1$s + Reply + Forward + Select all + Unselect all + Move to trash + Delete permanently + Message deleted successfully + student + parent + guardian + employee + Share + Print + Subject + Content + Message sent successfully + Message does not exist + You need to choose at least 1 recipient + The message content must be at least 3 characters + All mailboxes + Only unread + Only with attachments + Read: %s + Read by: %1$d of %2$d people + + %1$d message + %1$d messages + + + New message + New messages + + Do you want to restore draft message? + Do you want to restore draft message with recipients: %s? + + You received %1$d message + You received %1$d messages + + + %1$d selected + %1$d selected + + Messages deleted + Choose mailbox + + No info about notes + Points + + %d note + %d notes + + + New note + New notes + + + You received %1$d note + You received %1$d notes + + + + %d praise + %d praises + + + New praise + New praises + + + You received %1$d praise + You received %1$d praises + + + + %d neutral note + %d neutral notes + + + New neutral note + New neutral notes + + + You received %1$d neutral note + You received %1$d neutral notes + + + No info about homework + Mark as done + Mark as undone + Add homework + Homework added successfully + Homework deleted successfully + Attachments + + New homework + New homework + + + You received %d new homework + You received %d new homework + + + %d homework + %d homework + + + Lucky number + Today\'s lucky number is + No info about the lucky number + Lucky number for today + Today\'s lucky number is: %s + Show history + + Lucky number history + No info about lucky numbers + + Mobile devices + No devices + Deregister + Device removed + QR code + Token + Symbol + PIN + + School and teachers + + School + No info about school + School name + School address + Telephone + Name of headmaster + Name of pedagogue + Show on map + Call + + Teachers + No info about teachers + No subject + + Conferences + No info about conferences + + %d conference + %d conferences + + + New conference + New conferences + + + You have %1$d new conference + You have %1$d new conferences + + Present at conference + Agenda + Place + Topic + + School announcements + No school announcements + + %d school announcement + %d school announcements + + + New school announcement + New school announcements + + + You have %1$d new school announcement + You have %1$d new school announcements + + + Add account + Logout + Do you want to log out this student? + Student logout + Student account + Parent account + Edit data + Accounts manager + Select student + Family + Contact + Residence details + Personal information + + App version + Contributors + List of Wulkanowy developers + Report a bug + Send a bug report via e-mail + FAQ + Read Frequently Asked Questions + Discord server + Join the Wulkanowy community + Facebook fanpage + Twitter page + Follow us on twitter + Like our facebook fanpage + Privacy policy + Rules for collecting personal data + System settings + Open system settings + Homepage + Visit the website and help develop the application + Licenses + Licenses of libraries used in the application + + License + + Avatar + See more on GitHub + + No info about student or student family + Name + Second name + Gender + Polish citizenship + Family name + Mother\'s and father\'s names + Phone + Cellphone + E-mail + Address of residence + Address of registration + Correspondence address + Surname and first name + Degree of kinship + Address + Phones + Male + Female + Last name + Guardian + + Nick + Add nick + Choose avatar color + + Share logs + Refresh + + Lessons + (Tomorrow) + (Today and tomorrow) + In a moment: + Soon: + First: + Now: + End of lessons + Next: + Later: + + %1$d more lesson + %1$d more lessons + + until %1$s + No upcoming lessons + An error occurred while loading the lessons + Homework + No homework to do + An error occurred while loading the homework + + %1$d more homework + %1$d more homework + + due %1$s + Last grades + No new grades + An error occurred while loading the grades + School announcements + No current announcements + An error occurred while loading the announcements + + %1$d more announcement + %1$d more announcements + + Exams + No upcoming exams + An error occurred while loading the exams + + %1$d more exam + %1$d more exams + + Conferences + No upcoming conferences + An error occurred while loading the conferences + + %1$d more conference + %1$d more conferences + + An error occurred while loading data + None + + Check for updates + Before reporting a bug, check first if an update with the bug fix is available + + Content + Retry + Description + No description + Teacher + Date + Entry date + Color + Details + Category + Close + No data + Subject + Prev + Next + Search + Search… + Yes + No + Save + Title + Add + Copied + Undo + Change + Add to calendar + Cancel + + No lessons + Synchronized on %1$s at %2$s + Choose theme + Light + Dark + System Theme + + App + Default view + Calculated average options + Force average calculation by app + Show presence + Theme + Grades expanding + Mark current lesson + Show groups next to subjects + Show chart list in class grades + Show subjects without grades + Grades color scheme + Subjects sorting + Language + Menu configuration + Set the order of functions in the menu + Notifications + Other + Show notifications + Show upcoming lesson notifications + Make upcoming lesson notification persistent + Turn off when notification is not showing in your watch/band + Open system notification settings + Fix synchronization & notifications issues + Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. + Show debug notifications + Synchronization is disabled + Official app notifications + Capture official app notifications + Remove official app notifications after capture + Capture notifications + With this feature you can gain a substitute of push notifications like in the official app. All you need to do is allow Wulkanowy to receive all notifications in your system settings.\n\nHow it works?\nWhen you get a notification in Dziennik VULCAN, Wulkanowy will be notified (that\'s what these extra permissions are for) and will trigger a sync so that can send its own notification.\n\nFOR ADVANCED USERS ONLY + Upcoming lesson notifications + You must allow the Wulkanowy app to set alarms and reminders in your system settings to use this feature. + Go to settings + Synchronization + Automatic update + Suspended on holidays + Updates interval + Wi-Fi only + Sync now + Synced! + Sync failed + Sync in progress + Last full sync: %s + Value of the plus + Value of the minus + Reply with message history + Show arithmetic average when no weights provided + Support + Privacy Policy + Agreements + Consent to processing of data related to ads + Show ads in app + Watch single ad to support project + Consent to data processing + To view an advertisement you must agree to the data processing terms of our Privacy Policy + Agree + Privacy policy + Ad is loading + Thank you for your support, come back later for more ads + Can we use your data to display ads? + You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details + Personalized ads + Non-personalized ads + I am over 18 years old + Yes, personalized ads + Yes, non-personalized ads + Advanced + Appearance & Behavior + Notifications + Synchronization + Advertisements + Grades + Dashboard + Tiles visibility + Attendance + Timetable + Grades + Calculated average + Messages + Appearance & Behavior + Languages, themes, subjects sorting + App notifications, fix problems + Notifications + Synchronization + Automatic update, synchronization interval + Plus and minus values, average calculation + Advanced + App version, contributors, social portals + Displaying advertisements, project support + + New grades + New homework + New conferences + New exams + Lucky number + New messages + New notes + New school announcements + Push notifications + Upcoming lessons + Debug + Timetable change + New attendance + + Black + Red + Blue + Green + Purple + No color + + Download of updates has started… + An update has just been downloaded. + Restart + Update failed! Wulkanowy may not function properly. Consider updating + + Application restart + The application must restart for the changes to be saved + Restart + + Authorization has been rejected. The data provided does not match the records in the secretary\'s office. + Invalid PESEL + PESEL + Authorize + Authorization completed successfully + Authorization + To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Skip for now + + No internet connection + An error occurred. Check your device clock + Connection to register failed. Servers can be overloaded. Please try again later + Loading data failed. Please try again later + Register password change required + Maintenance underway UONET + register. Try again later + Unknown UONET + register error. Try again later + Unknown application error. Please try again later + An unexpected error occurred + Feature disabled by your school + Feature not available. Login in a mode other than Mobile API + This field is required + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 30a587cc4..f89e38fcd 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -37,7 +37,7 @@ Логін, PESEL або e-mail Пароль Тип щоденника UONET+ - Custom domain suffix + Користувацький суфікс домену Мobile API Scraper Hybrid @@ -814,8 +814,8 @@ Авторизацію відхилено. Надані дані не збігаються із записами в кабінеті секретаря. Неправильний PESEL Число PESEL - Authorize - Authorization completed successfully + Авторизовать + Авторизація пройшла успішно Авторизувати Для роботи програми нам потрібно підтвердити вашу особу. Будь ласка, введіть число PESEL <b>%1$s</b> студента в поле нижче Поки що пропустити From 64cc24ae6012470b59c9e7038c2145147f09c29a Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Wed, 26 Jul 2023 22:17:58 +0200 Subject: [PATCH 1209/1526] Add incognito mode in messages (#1970) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- .../data/repositories/MessageRepository.kt | 22 ++++++++++++++----- .../repositories/PreferencesRepository.kt | 6 +++++ .../ui/modules/message/MessageFragment.kt | 9 +++++++- .../ui/modules/message/MessagePresenter.kt | 13 ++++++++++- .../ui/modules/message/MessageView.kt | 3 +++ .../message/preview/MessagePreviewFragment.kt | 5 +++++ .../preview/MessagePreviewPresenter.kt | 13 ++++++++++- .../message/preview/MessagePreviewView.kt | 3 +++ .../modules/message/tab/MessageTabFragment.kt | 17 +++++++++----- .../message/tab/MessageTabPresenter.kt | 5 +++-- .../ui/modules/message/tab/MessageTabView.kt | 3 ++- .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 5 +++++ .../res/xml/scheme_preferences_advanced.xml | 7 ++++++ 15 files changed, 96 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index 53d9beadd..c8fccb23d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -3,18 +3,26 @@ package io.github.wulkanowy.data.repositories import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R -import io.github.wulkanowy.data.* +import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.dao.MailboxDao import io.github.wulkanowy.data.db.dao.MessageAttachmentDao import io.github.wulkanowy.data.db.dao.MessagesDao -import io.github.wulkanowy.data.db.entities.* +import io.github.wulkanowy.data.db.entities.Mailbox +import io.github.wulkanowy.data.db.entities.Message +import io.github.wulkanowy.data.db.entities.MessageWithAttachment +import io.github.wulkanowy.data.db.entities.Recipient +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.enums.MessageFolder import io.github.wulkanowy.data.enums.MessageFolder.RECEIVED import io.github.wulkanowy.data.enums.MessageFolder.TRASHED import io.github.wulkanowy.data.mappers.mapFromEntities import io.github.wulkanowy.data.mappers.mapToEntities +import io.github.wulkanowy.data.networkBoundResource +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceSuccess import io.github.wulkanowy.data.pojos.MessageDraft +import io.github.wulkanowy.data.waitForResult import io.github.wulkanowy.domain.messages.GetMailboxByStudentUseCase import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Folder @@ -25,7 +33,6 @@ import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first import kotlinx.coroutines.sync.Mutex -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import timber.log.Timber @@ -97,7 +104,7 @@ class MessageRepository @Inject constructor( shouldFetch = { checkNotNull(it) { "This message no longer exist!" } Timber.d("Message content in db empty: ${it.message.content.isBlank()}") - it.message.unread || it.message.content.isBlank() + (it.message.unread && markAsRead) || it.message.content.isBlank() }, query = { messagesDb.loadMessageWithAttachment(message.messageGlobalKey) @@ -113,7 +120,10 @@ class MessageRepository @Inject constructor( messagesDb.updateAll( listOf(old.message.apply { id = message.id - unread = !markAsRead + unread = when { + markAsRead -> false + else -> unread + } sender = new.sender recipients = new.recipients.singleOrNull() ?: "Wielu adresatów" content = content.ifBlank { new.content } @@ -123,7 +133,7 @@ class MessageRepository @Inject constructor( items = new.attachments.mapToEntities(message.messageGlobalKey), ) - Timber.d("Message ${message.messageId} with blank content: ${old.message.content.isBlank()}, marked as read") + Timber.d("Message ${message.messageId} with blank content: ${old.message.content.isBlank()}, marked as read: $markAsRead") } ) 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 348a4054b..1b4893401 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 @@ -343,6 +343,12 @@ class PreferencesRepository @Inject constructor( ) } + var isIncognitoMode: Boolean + get() = getBoolean(R.string.pref_key_incognito_moge, R.bool.pref_default_incognito_mode) + set(value) = sharedPref.edit { + putBoolean(context.getString(R.string.pref_key_incognito_moge), value) + } + var installationId: String get() = sharedPref.getString(PREF_KEY_INSTALLATION_ID, null).orEmpty() private set(value) = sharedPref.edit { putString(PREF_KEY_INSTALLATION_ID, value) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt index 4317fb7fa..02bc13a16 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt @@ -11,7 +11,9 @@ import androidx.core.view.updateMargins import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R -import io.github.wulkanowy.data.enums.MessageFolder.* +import io.github.wulkanowy.data.enums.MessageFolder.RECEIVED +import io.github.wulkanowy.data.enums.MessageFolder.SENT +import io.github.wulkanowy.data.enums.MessageFolder.TRASHED import io.github.wulkanowy.databinding.FragmentMessageBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter @@ -49,6 +51,7 @@ class MessageFragment : BaseFragment(R.layout.fragment_m override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding = FragmentMessageBinding.bind(view) + messageContainer = binding.messageViewPager presenter.onAttachView(this) } @@ -95,6 +98,10 @@ class MessageFragment : BaseFragment(R.layout.fragment_m binding.messageProgress.visibility = if (show) VISIBLE else INVISIBLE } + override fun showMessage(messageId: Int) { + showMessage(getString(messageId)) + } + override fun showNewMessage(show: Boolean) { binding.openSendMessageButton.run { if (show) show() else hide() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt index cf6bad19e..37a2d422a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt @@ -1,5 +1,7 @@ package io.github.wulkanowy.ui.modules.message +import io.github.wulkanowy.R +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler @@ -9,7 +11,8 @@ import javax.inject.Inject class MessagePresenter @Inject constructor( errorHandler: ErrorHandler, - studentRepository: StudentRepository + studentRepository: StudentRepository, + private val preferencesRepository: PreferencesRepository, ) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: MessageView) { @@ -19,6 +22,14 @@ class MessagePresenter @Inject constructor( Timber.i("Message view was initialized") loadData() } + + showIncognitoModeReminderMessage() + } + + private fun showIncognitoModeReminderMessage() { + if (preferencesRepository.isIncognitoMode) { + view?.showMessage(R.string.message_incognito_mode_on) + } } fun onPageSelected(index: Int) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageView.kt index def4a2751..7fdc6e181 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.message +import androidx.annotation.StringRes import io.github.wulkanowy.ui.base.BaseView interface MessageView : BaseView { @@ -12,6 +13,8 @@ interface MessageView : BaseView { fun showProgress(show: Boolean) + fun showMessage(@StringRes messageId: Int) + fun showNewMessage(show: Boolean) fun showTabLayout(show: Boolean) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index 6c54d9fcb..3ed685cd7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -12,6 +12,7 @@ import android.view.View.VISIBLE import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient +import androidx.annotation.StringRes import androidx.core.content.getSystemService import androidx.core.os.bundleOf import androidx.recyclerview.widget.LinearLayoutManager @@ -164,6 +165,10 @@ class MessagePreviewFragment : binding.messagePreviewErrorRetry.setOnClickListener { callback() } } + override fun showMessage(@StringRes messageId: Int) { + showMessage(getString(messageId)) + } + override fun openMessageReply(message: Message?) { context?.let { it.startActivity(SendMessageActivity.getStartIntent(it, message, true)) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index 56f23b6fa..cd7b72843 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -2,11 +2,13 @@ package io.github.wulkanowy.ui.modules.message.preview import android.annotation.SuppressLint import androidx.core.text.parseAsHtml +import io.github.wulkanowy.R import io.github.wulkanowy.data.* import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.enums.MessageFolder import io.github.wulkanowy.data.repositories.MessageRepository +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler @@ -20,6 +22,7 @@ class MessagePreviewPresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, private val messageRepository: MessageRepository, + private val preferencesRepository: PreferencesRepository, private val analytics: AnalyticsHelper ) : BasePresenter(errorHandler, studentRepository) { @@ -54,7 +57,11 @@ class MessagePreviewPresenter @Inject constructor( private fun loadData(messageToLoad: Message) { flatResourceFlow { val student = studentRepository.getCurrentStudent() - messageRepository.getMessage(student, messageToLoad, true) + messageRepository.getMessage( + student = student, + message = messageToLoad, + markAsRead = !preferencesRepository.isIncognitoMode, + ) } .logResourceStatus("message ${messageToLoad.messageId} preview") .onResourceData { @@ -65,6 +72,10 @@ class MessagePreviewPresenter @Inject constructor( setMessageWithAttachment(it) showContent(true) initOptions() + + if (preferencesRepository.isIncognitoMode && it.message.unread) { + showMessage(R.string.message_incognito_description) + } } } else { view?.run { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt index c5a947939..7f5f140b2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.message.preview +import androidx.annotation.StringRes import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.ui.base.BaseView @@ -43,4 +44,6 @@ interface MessagePreviewView : BaseView { fun popView() fun printDocument(html: String, jobName: String) + + fun showMessage(@StringRes messageId: Int) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt index 592cbd604..4364e8681 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt @@ -7,6 +7,7 @@ import android.view.MenuItem import android.view.View import android.view.View.* import android.widget.CompoundButton +import androidx.annotation.StringRes import androidx.appcompat.view.ActionMode import androidx.appcompat.widget.SearchView import androidx.core.os.bundleOf @@ -134,14 +135,20 @@ class MessageTabFragment : BaseFragment(R.layout.frag } } + @Deprecated("Deprecated in Java") @Suppress("DEPRECATION") override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.action_menu_message_tab, menu) - val searchView = menu.findItem(R.id.action_search).actionView as SearchView - searchView.queryHint = getString(R.string.all_search_hint) - searchView.maxWidth = Int.MAX_VALUE + initializeSearchView(menu) + } + + private fun initializeSearchView(menu: Menu) { + val searchView = (menu.findItem(R.id.action_search).actionView as SearchView).apply { + queryHint = getString(R.string.all_search_hint) + maxWidth = Int.MAX_VALUE + } searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String) = false override fun onQueryTextChange(query: String): Boolean { @@ -207,8 +214,8 @@ class MessageTabFragment : BaseFragment(R.layout.frag binding.messageTabSwipe.isRefreshing = show } - override fun showMessagesDeleted() { - showMessage(getString(R.string.message_messages_deleted)) + override fun showMessage(@StringRes messageId: Int) { + showMessage(getString(messageId)) } override fun notifyParentShowNewMessage(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index ec92e9c20..90f93b145 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.message.tab +import io.github.wulkanowy.R import io.github.wulkanowy.data.* import io.github.wulkanowy.data.db.entities.Mailbox import io.github.wulkanowy.data.db.entities.Message @@ -26,7 +27,7 @@ class MessageTabPresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, private val messageRepository: MessageRepository, - private val analytics: AnalyticsHelper + private val analytics: AnalyticsHelper, ) : BasePresenter(errorHandler, studentRepository) { lateinit var folder: MessageFolder @@ -135,7 +136,7 @@ class MessageTabPresenter @Inject constructor( messageRepository.deleteMessages(student, selectedMailbox, messageList) } .onFailure(errorHandler::dispatch) - .onSuccess { view?.showMessagesDeleted() } + .onSuccess { view?.showMessage(R.string.message_messages_deleted) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt index 6ece6621b..247af4342 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.message.tab +import androidx.annotation.StringRes import io.github.wulkanowy.data.db.entities.Mailbox import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.ui.base.BaseView @@ -26,7 +27,7 @@ interface MessageTabView : BaseView { fun showEmpty(show: Boolean) - fun showMessagesDeleted() + fun showMessage(@StringRes messageId: Int) fun showErrorView(show: Boolean) diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 6c81100d9..fefd9b13c 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -38,4 +38,5 @@ false false + false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 716639c0f..e7fa542a3 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -39,5 +39,6 @@ ads_privacy_policy ads_consent_data_processing ads_over_eighteen + incognito_mode appearance_menu_order diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98c316cb0..9dc7e7969 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -339,6 +339,8 @@ Messages deleted Choose mailbox + Incognito mode is on + Thanks to incognito mode sender is not notified when you read the message @@ -728,6 +730,9 @@ Value of the minus Reply with message history Show arithmetic average when no weights provided + Incognito mode + Do not inform about reading the message + Support Privacy Policy Agreements diff --git a/app/src/main/res/xml/scheme_preferences_advanced.xml b/app/src/main/res/xml/scheme_preferences_advanced.xml index 95f6f383a..8185de81c 100644 --- a/app/src/main/res/xml/scheme_preferences_advanced.xml +++ b/app/src/main/res/xml/scheme_preferences_advanced.xml @@ -53,5 +53,12 @@ app:key="@string/pref_key_fill_message_content" app:singleLineTitle="false" app:title="@string/pref_other_fill_message_content" /> + From 7f6a13a9ee8cae095855b9798b4220b5bd127299 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 17:35:29 +0000 Subject: [PATCH 1210/1526] Bump coroutines from 1.7.2 to 1.7.3 (#2267) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f8603cc88..e188d709f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,7 +187,7 @@ ext { room = "2.5.2" chucker = "3.5.2" mockk = "1.13.5" - coroutines = "1.7.2" + coroutines = "1.7.3" } dependencies { From fc2adff997dd24f2fc75d3cf7bcc60a564bf3716 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 17:35:38 +0000 Subject: [PATCH 1211/1526] Bump androidx.fragment:fragment-ktx from 1.6.0 to 1.6.1 (#2269) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e188d709f..d43b667cd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -202,7 +202,7 @@ dependencies { implementation 'androidx.core:core-splashscreen:1.0.1' implementation "androidx.activity:activity-ktx:1.7.2" implementation "androidx.appcompat:appcompat:1.6.1" - implementation "androidx.fragment:fragment-ktx:1.6.0" + implementation "androidx.fragment:fragment-ktx:1.6.1" implementation "androidx.annotation:annotation:1.6.0" implementation "androidx.preference:preference-ktx:1.2.0" From 0f129109ba25cace9a0e09cc4ed7d26668daa5ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 19:00:17 +0000 Subject: [PATCH 1212/1526] Bump com.android.tools.build:gradle from 8.0.2 to 8.1.0 (#2266) --- app/build.gradle | 26 ++++++++++++------------ build.gradle | 6 +++--- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d43b667cd..74ef02bc2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,6 @@ +import com.github.triplet.gradle.androidpublisher.ReleaseStatus +import ru.cian.huawei.publish.ReleaseNote + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlinx-serialization' @@ -17,7 +20,7 @@ apply from: 'hooks.gradle' android { namespace 'io.github.wulkanowy' - compileSdkVersion 33 + compileSdk 33 defaultConfig { applicationId "io.github.wulkanowy" @@ -78,7 +81,7 @@ android { } } - flavorDimensions "platform" + flavorDimensions += "platform" productFlavors { hms { @@ -117,20 +120,20 @@ android { } } - testOptions.unitTests { - includeAndroidResources = true + testOptions { + unitTests.includeAndroidResources = true // workaround HMS test errors https://github.com/robolectric/robolectric/issues/2750 - all { jvmArgs '-noverify' } + unitTests.all { jvmArgs '-noverify' } } compileOptions { coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = "11" + jvmTarget = "17" freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn", "-Xjvm-default=all"] } @@ -152,14 +155,11 @@ kapt { ksp { arg("room.schemaLocation", "$projectDir/schemas".toString()) } -kotlin { - jvmToolchain(11) -} play { defaultToAppBundles = false track = 'production' - releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS + releaseStatus = ReleaseStatus.IN_PROGRESS userFraction = 0.25d updatePriority = 1 enabled.set(false) @@ -172,7 +172,7 @@ huaweiPublish { buildFormat = "aab" deployType = "publish" releaseNotes = [ - new ru.cian.huawei.publish.ReleaseNote( + new ReleaseNote( "pl-PL", "$projectDir/src/main/play/release-notes/pl-PL/default.txt" ) diff --git a/build.gradle b/build.gradle index 9584caaca..c5a6f5984 100644 --- a/build.gradle +++ b/build.gradle @@ -14,12 +14,12 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.11" - classpath 'com.android.tools.build:gradle:8.0.2' + classpath 'com.android.tools.build:gradle:8.1.0' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.15' classpath 'com.huawei.agconnect:agcp:1.9.1.300' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.7' - classpath "com.github.triplet.gradle:play-publisher:3.6.0" + classpath "com.github.triplet.gradle:play-publisher:3.8.4" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.3.0.3225" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" @@ -37,6 +37,6 @@ allprojects { } } -task clean(type: Delete) { +tasks.register('clean', Delete) { delete rootProject.buildDir } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8707e8b50..9b0a13f0f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 50326c7a48644d6f5997df130d8d88a1496d7188 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 19:00:37 +0000 Subject: [PATCH 1213/1526] Bump androidx.recyclerview:recyclerview from 1.3.0 to 1.3.1 (#2268) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 74ef02bc2..197ea3569 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -206,7 +206,7 @@ dependencies { implementation "androidx.annotation:annotation:1.6.0" implementation "androidx.preference:preference-ktx:1.2.0" - implementation "androidx.recyclerview:recyclerview:1.3.0" + implementation "androidx.recyclerview:recyclerview:1.3.1" implementation "androidx.viewpager2:viewpager2:1.1.0-beta02" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.constraintlayout:constraintlayout:2.1.4" From 74820f9571cb9cf6259f45b73409552277ae975a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 31 Jul 2023 21:32:07 +0200 Subject: [PATCH 1214/1526] New Crowdin updates (#2265) --- app/src/main/res/values-cs/strings.xml | 6 +++++- app/src/main/res/values-da-rDK/strings.xml | 4 ++++ app/src/main/res/values-de/strings.xml | 4 ++++ app/src/main/res/values-es-rES/strings.xml | 4 ++++ app/src/main/res/values-it-rIT/strings.xml | 4 ++++ app/src/main/res/values-pl/strings.xml | 4 ++++ app/src/main/res/values-ru/strings.xml | 4 ++++ app/src/main/res/values-sk/strings.xml | 6 +++++- app/src/main/res/values-uk/strings.xml | 4 ++++ 9 files changed, 38 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 964329dae..ff461d420 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -37,7 +37,7 @@ Přihlášení, číslo PESEL nebo e-mail Heslo Variace deníku UONET+ - Custom domain suffix + Vlastní přípona domény Mobile API Scraper Hybridní @@ -352,6 +352,8 @@ Zprávy odstraněné Vyberte poštovní schránku + Anonymní režim je zapnutý + Díky anonymnímu režimu není odesílatel upozorněn, když si zprávu přečtete Žádné informace o poznámkách Body @@ -738,6 +740,8 @@ Hodnota mínusu Odpovědět s historií zpráv Vypočítat aritmetický průměr, pokud žádná známka nemá váhu + Anonymní režim + Neinformovat o přečtení zprávy Podpora Ochrana osobních údajů Souhlasy diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 5c7d02a0f..259a42647 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -310,6 +310,8 @@ Messages deleted Choose mailbox + Incognito mode is on + Thanks to incognito mode sender is not notified when you read the message No info about notes Points @@ -650,6 +652,8 @@ Value of the minus Reply with message history Show arithmetic average when no weights provided + Incognito mode + Do not inform about reading the message Support Privacy Policy Agreements diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 96423e35e..1836d0479 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -310,6 +310,8 @@ Nachrichten gelöscht Postfach auswählen + Incognito mode is on + Thanks to incognito mode sender is not notified when you read the message Keine Informationen über Eintragen Punkte @@ -650,6 +652,8 @@ Wert des Minus Antwort mit Nachrichtenhistorie Arithmetisches Mittel anzeigen, wenn keine Gewichte angegeben sind + Incognito mode + Do not inform about reading the message Unterstützung Datenschutz-Bestimmungen Vereinbarungen diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 5c7d02a0f..259a42647 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -310,6 +310,8 @@ Messages deleted Choose mailbox + Incognito mode is on + Thanks to incognito mode sender is not notified when you read the message No info about notes Points @@ -650,6 +652,8 @@ Value of the minus Reply with message history Show arithmetic average when no weights provided + Incognito mode + Do not inform about reading the message Support Privacy Policy Agreements diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 5c7d02a0f..259a42647 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -310,6 +310,8 @@ Messages deleted Choose mailbox + Incognito mode is on + Thanks to incognito mode sender is not notified when you read the message No info about notes Points @@ -650,6 +652,8 @@ Value of the minus Reply with message history Show arithmetic average when no weights provided + Incognito mode + Do not inform about reading the message Support Privacy Policy Agreements diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 2c7077977..0c1bbf785 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -352,6 +352,8 @@ Wiadomości zostały usunięte Wybierz skrzynkę + Tryb incognito jest włączony + Dzięki trybowi incognito nadawca nie zobaczy, że przeczytałeś tę wiadomość Brak informacji o uwagach Punkty @@ -738,6 +740,8 @@ Wartość minusa Odpowiadaj z historią wiadomości Licz średnią arytmetyczną, gdy żadna ocena nie ma wagi + Tryb incognito + Nie informuj o przeczytaniu wiadomości Wsparcie Polityka prywatności Zgody diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index eb8be0028..606971740 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -352,6 +352,8 @@ Сообщение удалено Выбрать почтовый ящик + Incognito mode is on + Thanks to incognito mode sender is not notified when you read the message Нет записей о замечаниях и свершениях Баллы @@ -738,6 +740,8 @@ Стоимость минуса Отвечать с историей сообщений Показывать среднее арифметическое при отсутствии стоимости + Incognito mode + Do not inform about reading the message Поддержка Политика приватности Соглашения diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index bcbd832ae..20d8818b3 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -37,7 +37,7 @@ Prihlásenie, číslo PESEL alebo e-mail Heslo Variácia denníka UONET+ - Custom domain suffix + Vlastná prípona domény Mobile API Scraper Hybridné @@ -352,6 +352,8 @@ Správy odstránené Vyberte poštovú schránku + Režim inkognito je zapnutý + Vďaka inkognito režimu nie je odosielateľ upozornený, keď si správu prečítate Žiadne informácie o poznámkach Body @@ -738,6 +740,8 @@ Hodnota mínusu Odpovedať s históriou správ Vypočítať aritmetický priemer, ak žiadna známka nemá váhu + Režim inkognito + Neinformovať o prečítaní správy Podpora Ochrana osobných údajov Súhlasy diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f89e38fcd..db5c3cb0d 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -352,6 +352,8 @@ Листи видалено Вибрати поштову скриньку + Режим анонімності включено + Завдяки режиму анонімності, відправник не буде сповіщений коли ви прочитаєте повідомлення Немає інформації о зауваженнях Бали @@ -738,6 +740,8 @@ Вартість мінуса Відповісти з історією повідомлень Вилічити середню аритметичну, якщо оцінка немає вартості + Анонімний режим + Не повідомляти про прочитання повідомлення Підтримка Політика конфіденційності Угоди From 722b4e58126de65c05dcee6c048cd410a7db6db0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 21:19:33 +0000 Subject: [PATCH 1215/1526] Bump androidx.preference:preference-ktx from 1.2.0 to 1.2.1 (#2274) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 197ea3569..8ff342070 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -205,7 +205,7 @@ dependencies { implementation "androidx.fragment:fragment-ktx:1.6.1" implementation "androidx.annotation:annotation:1.6.0" - implementation "androidx.preference:preference-ktx:1.2.0" + implementation "androidx.preference:preference-ktx:1.2.1" implementation "androidx.recyclerview:recyclerview:1.3.1" implementation "androidx.viewpager2:viewpager2:1.1.0-beta02" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" From c4396036ce7790fb4c35714393b6235be3c36512 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 21:19:49 +0000 Subject: [PATCH 1216/1526] Bump com.google.firebase:firebase-bom from 32.2.0 to 32.2.2 (#2271) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 8ff342070..5f148144a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -247,7 +247,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.10.0' - playImplementation platform('com.google.firebase:firebase-bom:32.2.0') + playImplementation platform('com.google.firebase:firebase-bom:32.2.2') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From e21c17ea99005a578d47f101b020ce1faa9b9985 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 21:20:05 +0000 Subject: [PATCH 1217/1526] Bump com.google.firebase:firebase-crashlytics-gradle from 2.9.7 to 2.9.8 (#2270) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c5a6f5984..2b52c068b 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.15' classpath 'com.huawei.agconnect:agcp:1.9.1.300' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.7' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.8' classpath "com.github.triplet.gradle:play-publisher:3.8.4" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.3.0.3225" From 8fbe341607467ea821e3b58b38193af2fe7fc639 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 21:20:19 +0000 Subject: [PATCH 1218/1526] Bump com.huawei.hms:hianalytics from 6.10.0.302 to 6.10.0.303 (#2272) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5f148144a..824c8376d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -256,7 +256,7 @@ dependencies { playImplementation 'com.google.android.play:core-ktx:1.8.1' playImplementation 'com.google.android.gms:play-services-ads:22.2.0' - hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.302' + hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.303' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.300' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From 7d5a29d4053fecdf7e1b1c6e4cf0d7cdf554789a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 21:20:45 +0000 Subject: [PATCH 1219/1526] Bump org.gradle.toolchains.foojay-resolver-convention (#2276) --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index af9bb737a..16731297d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.6.0' + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' } include ':app' From 024ca897084bf1b939afb747ec4be1220d89ace8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 21:39:04 +0000 Subject: [PATCH 1220/1526] Bump mockk from 1.13.5 to 1.13.7 (#2275) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 824c8376d..37b165c17 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -186,7 +186,7 @@ ext { android_hilt = "1.0.0" room = "2.5.2" chucker = "3.5.2" - mockk = "1.13.5" + mockk = "1.13.7" coroutines = "1.7.3" } From 533157709b3db6ea03827b75660a1c77761cac7f Mon Sep 17 00:00:00 2001 From: Antoni Paduch <70513486+janAte1@users.noreply.github.com> Date: Tue, 22 Aug 2023 23:47:12 +0200 Subject: [PATCH 1221/1526] Add option to show empty tiles in the timetable (#2236) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- app/src/main/assets/contributors.json | 4 + .../wulkanowy/data/enums/TimetableGapsMode.kt | 11 ++ .../repositories/PreferencesRepository.kt | 9 +- .../widgets/TimetableWidgetService.kt | 12 +- .../ui/modules/timetable/TimetableAdapter.kt | 47 ++++++-- .../ui/modules/timetable/TimetableItem.kt | 6 + .../modules/timetable/TimetablePresenter.kt | 71 +++++++++--- .../timetablewidget/TimetableWidgetFactory.kt | 107 ++++++++++++++---- .../timetablewidget/TimetableWidgetItem.kt | 26 +++++ .../main/res/layout/item_timetable_empty.xml | 43 +++++++ .../layout/item_widget_timetable_empty.xml | 36 ++++++ .../main/res/values-pl/preferences_values.xml | 5 + app/src/main/res/values-pl/strings.xml | 7 ++ .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + .../main/res/values/preferences_values.xml | 11 ++ app/src/main/res/values/strings.xml | 5 + .../res/xml/scheme_preferences_appearance.xml | 8 ++ 18 files changed, 363 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/data/enums/TimetableGapsMode.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt create mode 100644 app/src/main/res/layout/item_timetable_empty.xml create mode 100644 app/src/main/res/layout/item_widget_timetable_empty.xml diff --git a/app/src/main/assets/contributors.json b/app/src/main/assets/contributors.json index b2849931a..a7629c22f 100644 --- a/app/src/main/assets/contributors.json +++ b/app/src/main/assets/contributors.json @@ -50,5 +50,9 @@ { "displayName": "Tomasz F.", "githubUsername": "Pengwius" + }, + { + "displayName": "Antoni Paduch", + "githubUsername": "janAte1" } ] diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/TimetableGapsMode.kt b/app/src/main/java/io/github/wulkanowy/data/enums/TimetableGapsMode.kt new file mode 100644 index 000000000..c8310c02d --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/enums/TimetableGapsMode.kt @@ -0,0 +1,11 @@ +package io.github.wulkanowy.data.enums + +enum class TimetableGapsMode(val value: String) { + NO_GAPS("no_gaps"), + BETWEEN_LESSONS("between"), + BETWEEN_AND_BEFORE_LESSONS("before_and_between"); + + companion object { + fun getByValue(value: String) = entries.find { it.value == value } ?: BETWEEN_LESSONS + } +} 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 1b4893401..85c74072e 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 @@ -15,7 +15,6 @@ import io.github.wulkanowy.ui.modules.grade.GradeAverageMode import io.github.wulkanowy.ui.modules.settings.appearance.menuorder.AppMenuItem import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import java.time.Instant @@ -201,6 +200,14 @@ class PreferencesRepository @Inject constructor( R.bool.pref_default_timetable_show_timers ) + val showTimetableGaps: TimetableGapsMode + get() = TimetableGapsMode.getByValue( + getString( + R.string.pref_key_timetable_show_gaps, + R.string.pref_default_timetable_show_gaps + ) + ) + val showSubjectsWithoutGrades: Boolean get() = getBoolean( R.string.pref_key_subjects_without_grades, diff --git a/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt b/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt index d48556fa6..ffdb07ecd 100644 --- a/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt +++ b/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.widget.RemoteViewsService import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.data.db.SharedPrefProvider +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 @@ -26,10 +27,19 @@ class TimetableWidgetService : RemoteViewsService() { @Inject lateinit var sharedPref: SharedPrefProvider + @Inject + lateinit var prefRepository: PreferencesRepository + override fun onGetViewFactory(intent: Intent?): RemoteViewsFactory { Timber.d("TimetableWidgetFactory created") return TimetableWidgetFactory( - timetableRepo, studentRepo, semesterRepo, sharedPref, applicationContext, intent + timetableRepository = timetableRepo, + studentRepository = studentRepo, + semesterRepository = semesterRepo, + sharedPref = sharedPref, + prefRepository = prefRepository, + context = applicationContext, + intent = intent, ) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index d917e7d51..1201937c0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -12,7 +12,9 @@ import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.databinding.ItemTimetableBinding +import io.github.wulkanowy.databinding.ItemTimetableEmptyBinding import io.github.wulkanowy.databinding.ItemTimetableSmallBinding +import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.toFormattedString import javax.inject.Inject @@ -29,9 +31,14 @@ class TimetableAdapter @Inject constructor() : TimetableItemType.SMALL -> SmallViewHolder( ItemTimetableSmallBinding.inflate(inflater, parent, false) ) + TimetableItemType.NORMAL -> NormalViewHolder( ItemTimetableBinding.inflate(inflater, parent, false) ) + + TimetableItemType.EMPTY -> EmptyViewHolder( + ItemTimetableEmptyBinding.inflate(inflater, parent, false) + ) } } @@ -40,12 +47,12 @@ class TimetableAdapter @Inject constructor() : position: Int, payloads: MutableList ) { - if (payloads.isEmpty()) return super.onBindViewHolder(holder, position, payloads) - - if (holder is NormalViewHolder) updateTimeLeft( - binding = holder.binding, - timeLeft = (getItem(position) as TimetableItem.Normal).timeLeft, - ) + if (payloads.isNotEmpty() && holder is NormalViewHolder) { + updateTimeLeft( + binding = holder.binding, + timeLeft = (getItem(position) as TimetableItem.Normal).timeLeft, + ) + } else super.onBindViewHolder(holder, position, payloads) } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { @@ -54,10 +61,16 @@ class TimetableAdapter @Inject constructor() : binding = holder.binding, item = getItem(position) as TimetableItem.Small, ) + is NormalViewHolder -> bindNormalView( binding = holder.binding, item = getItem(position) as TimetableItem.Normal, ) + + is EmptyViewHolder -> bindEmptyView( + binding = holder.binding, + item = getItem(position) as TimetableItem.Empty, + ) } } @@ -100,6 +113,19 @@ class TimetableAdapter @Inject constructor() : } } + private fun bindEmptyView(binding: ItemTimetableEmptyBinding, item: TimetableItem.Empty) { + with(binding) { + timetableEmptyItemNumber.text = when (item.numFrom) { + item.numTo -> item.numFrom.toString() + else -> "${item.numFrom}-${item.numTo}" + } + timetableEmptyItemSubject.text = timetableEmptyItemSubject.context.getPlural( + R.plurals.timetable_no_lesson, + item.numTo - item.numFrom + 1 + ) + } + } + private fun updateTimeLeft(binding: ItemTimetableBinding, timeLeft: TimeLeft?) { with(binding) { when { @@ -137,6 +163,7 @@ class TimetableAdapter @Inject constructor() : timetableItemTimeLeft.visibility = VISIBLE timetableItemTimeLeft.text = root.context.getString(R.string.timetable_finished) } + else -> { timetableItemTimeUntil.visibility = GONE timetableItemTimeLeft.visibility = GONE @@ -191,7 +218,8 @@ class TimetableAdapter @Inject constructor() : ) } else { timetableItemDescription.visibility = GONE - timetableItemRoom.isVisible = lesson.room.isNotBlank() || lesson.roomOld.isNotBlank() + timetableItemRoom.isVisible = + lesson.room.isNotBlank() || lesson.roomOld.isNotBlank() timetableItemGroup.isVisible = item.showGroupsInPlan && lesson.group.isNotBlank() timetableItemTeacher.visibility = VISIBLE } @@ -274,6 +302,9 @@ class TimetableAdapter @Inject constructor() : private class SmallViewHolder(val binding: ItemTimetableSmallBinding) : RecyclerView.ViewHolder(binding.root) + private class EmptyViewHolder(val binding: ItemTimetableEmptyBinding) : + RecyclerView.ViewHolder(binding.root) + companion object { private val differ = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: TimetableItem, newItem: TimetableItem): Boolean = @@ -281,9 +312,11 @@ class TimetableAdapter @Inject constructor() : oldItem is TimetableItem.Small && newItem is TimetableItem.Small -> { oldItem.lesson.start == newItem.lesson.start } + oldItem is TimetableItem.Normal && newItem is TimetableItem.Normal -> { oldItem.lesson.start == newItem.lesson.start } + else -> oldItem == newItem } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt index 92716ace8..105ece38c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt @@ -16,6 +16,11 @@ sealed class TimetableItem(val type: TimetableItemType) { val timeLeft: TimeLeft?, val onClick: (Timetable) -> Unit, ) : TimetableItem(TimetableItemType.NORMAL) + + data class Empty( + val numFrom: Int, + val numTo: Int + ) : TimetableItem(TimetableItemType.EMPTY) } data class TimeLeft( @@ -27,4 +32,5 @@ data class TimeLeft( enum class TimetableItemType { SMALL, NORMAL, + EMPTY } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index d06874082..0f8395ded 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -1,23 +1,44 @@ package io.github.wulkanowy.ui.modules.timetable -import io.github.wulkanowy.data.* 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.NO_GAPS import io.github.wulkanowy.data.enums.TimetableMode +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.onResourceData +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceIntermediate +import io.github.wulkanowy.data.onResourceNotLoading +import io.github.wulkanowy.data.onResourceSuccess 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 io.github.wulkanowy.utils.AnalyticsHelper +import io.github.wulkanowy.utils.capitalise +import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday +import io.github.wulkanowy.utils.isHolidays +import io.github.wulkanowy.utils.isJustFinished +import io.github.wulkanowy.utils.isShowTimeUntil +import io.github.wulkanowy.utils.left +import io.github.wulkanowy.utils.nextOrSameSchoolDay +import io.github.wulkanowy.utils.nextSchoolDay +import io.github.wulkanowy.utils.previousSchoolDay +import io.github.wulkanowy.utils.toFormattedString +import io.github.wulkanowy.utils.until import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach import timber.log.Timber import java.time.Instant import java.time.LocalDate -import java.time.LocalDate.* -import java.util.* +import java.time.LocalDate.now +import java.time.LocalDate.of +import java.time.LocalDate.ofEpochDay +import java.util.Timer import javax.inject.Inject import kotlin.concurrent.timer @@ -192,16 +213,38 @@ class TimetablePresenter @Inject constructor( compareBy({ item -> item.number }, { item -> !item.isStudentPlan }) ) - return filteredItems.mapIndexed { i, it -> - if (it.isStudentPlan) TimetableItem.Normal( - lesson = it, - showGroupsInPlan = prefRepository.showGroupsInPlan, - timeLeft = filteredItems.getTimeLeftForLesson(it, i), - onClick = ::onTimetableItemSelected - ) else TimetableItem.Small( - lesson = it, - onClick = ::onTimetableItemSelected - ) + var prevNum = when (prefRepository.showTimetableGaps) { + BETWEEN_AND_BEFORE_LESSONS -> 0 + else -> null + } + return buildList { + filteredItems.forEachIndexed { i, it -> + if (prefRepository.showTimetableGaps != NO_GAPS && prevNum != null && it.number > prevNum!! + 1) { + val emptyLesson = TimetableItem.Empty( + numFrom = prevNum!! + 1, + numTo = it.number - 1 + ) + add(emptyLesson) + } + + if (it.isStudentPlan) { + val normalLesson = TimetableItem.Normal( + lesson = it, + showGroupsInPlan = prefRepository.showGroupsInPlan, + timeLeft = filteredItems.getTimeLeftForLesson(it, i), + onClick = ::onTimetableItemSelected + ) + add(normalLesson) + } else { + val smallLesson = TimetableItem.Small( + lesson = it, + onClick = ::onTimetableItemSelected + ) + add(smallLesson) + } + + prevNum = it.number + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index d545413da..4e0578e2b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -16,6 +16,9 @@ import io.github.wulkanowy.data.db.SharedPrefProvider 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.enums.TimetableGapsMode.BETWEEN_AND_BEFORE_LESSONS +import io.github.wulkanowy.data.enums.TimetableGapsMode.NO_GAPS +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 @@ -24,6 +27,7 @@ import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Co 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.getPlural import io.github.wulkanowy.utils.toFormattedString import kotlinx.coroutines.runBlocking import timber.log.Timber @@ -35,11 +39,12 @@ class TimetableWidgetFactory( private val studentRepository: StudentRepository, private val semesterRepository: SemesterRepository, private val sharedPref: SharedPrefProvider, + private val prefRepository: PreferencesRepository, private val context: Context, private val intent: Intent? ) : RemoteViewsService.RemoteViewsFactory { - private var lessons = emptyList() + private var items = emptyList() private var timetableCanceledColor: Int? = null @@ -47,18 +52,13 @@ class TimetableWidgetFactory( private var timetableChangeColor: Int? = null - private var lastSyncInstant: Instant? = null - override fun getLoadingView() = null override fun hasStableIds() = true - override fun getCount() = when { - lessons.isEmpty() -> 0 - else -> lessons.size + 1 - } + override fun getCount() = items.size - override fun getViewTypeCount() = 2 + override fun getViewTypeCount() = 3 override fun getItemId(position: Int) = position.toLong() @@ -75,9 +75,10 @@ class TimetableWidgetFactory( runBlocking { val student = getStudent(studentId) ?: return@runBlocking val semester = semesterRepository.getCurrentSemester(student) - lessons = getLessons(student, semester, date) - lastSyncInstant = - timetableRepository.getLastRefreshTimestamp(semester, date, date) + items = createItems( + lessons = getLessons(student, semester, date), + lastSync = timetableRepository.getLastRefreshTimestamp(semester, date, date) + ) if (date == LocalDate.now()) { updateTodayLastLessonEnd(appWidgetId) } @@ -101,8 +102,33 @@ class TimetableWidgetFactory( return lessons.sortedBy { it.number } } + private fun createItems( + lessons: List, + lastSync: Instant?, + ): List { + var prevNum = when (prefRepository.showTimetableGaps) { + BETWEEN_AND_BEFORE_LESSONS -> 0 + else -> null + } + return buildList { + lessons.forEach { + if (prefRepository.showTimetableGaps != NO_GAPS && prevNum != null && it.number > prevNum!! + 1) { + val emptyItem = TimetableWidgetItem.Empty( + numFrom = prevNum!! + 1, + numTo = it.number - 1 + ) + add(emptyItem) + } + add(TimetableWidgetItem.Normal(it)) + prevNum = it.number + } + add(TimetableWidgetItem.Synchronized(lastSync ?: Instant.MIN)) + } + } + private fun updateTodayLastLessonEnd(appWidgetId: Int) { - val todayLastLessonEnd = lessons.maxOfOrNull { it.end } ?: return + val todayLastLessonEnd = items.filterIsInstance() + .maxOfOrNull { it.lesson.end } ?: return val key = getTodayLastLessonEndDateTimeWidgetKey(appWidgetId) sharedPref.putLong(key, todayLastLessonEnd.epochSecond, true) } @@ -112,15 +138,15 @@ class TimetableWidgetFactory( } override fun getViewAt(position: Int): RemoteViews? { - if (position == lessons.size) { - val synchronizationInstant = lastSyncInstant ?: Instant.MIN - val synchronizationText = getSynchronizationInfoText(synchronizationInstant) - return RemoteViews(context.packageName, R.layout.item_widget_timetable_footer).apply { - setTextViewText(R.id.timetableWidgetSynchronizationTime, synchronizationText) - } + return when (val item = items.getOrNull(position) ?: return null) { + is TimetableWidgetItem.Normal -> getNormalItemRemoteView(item) + is TimetableWidgetItem.Empty -> getEmptyItemRemoteView(item) + is TimetableWidgetItem.Synchronized -> getSynchronizedItemRemoteView(item) } + } - val lesson = lessons.getOrNull(position) ?: return null + private fun getNormalItemRemoteView(item: TimetableWidgetItem.Normal): RemoteViews { + val lesson = item.lesson val lessonStartTime = lesson.start.toFormattedString(TIME_FORMAT_STYLE) val lessonEndTime = lesson.end.toFormattedString(TIME_FORMAT_STYLE) @@ -130,30 +156,63 @@ class TimetableWidgetFactory( setTextViewText(R.id.timetableWidgetItemTimeStart, lessonStartTime) setTextViewText(R.id.timetableWidgetItemTimeFinish, lessonEndTime) setTextViewText(R.id.timetableWidgetItemSubject, lesson.subject) + setTextViewText(R.id.timetableWidgetItemTeacher, lesson.teacher) setTextViewText(R.id.timetableWidgetItemDescription, lesson.info) setOnClickFillInIntent(R.id.timetableWidgetItemContainer, Intent()) } - updateTheme() clearLessonStyles(remoteViews) - if (lesson.room.isBlank()) { remoteViews.setViewVisibility(R.id.timetableWidgetItemRoom, GONE) } else { remoteViews.setTextViewText(R.id.timetableWidgetItemRoom, lesson.room) } - when { lesson.canceled -> applyCancelledLessonStyles(remoteViews) lesson.changes or lesson.info.isNotBlank() -> applyChangedLessonStyles( - remoteViews, lesson + remoteViews = remoteViews, + lesson = lesson, ) } - return remoteViews } + private fun getEmptyItemRemoteView(item: TimetableWidgetItem.Empty): RemoteViews { + return RemoteViews( + context.packageName, + R.layout.item_widget_timetable_empty + ).apply { + setTextViewText( + R.id.timetableWidgetEmptyItemNumber, + when (item.numFrom) { + item.numTo -> item.numFrom.toString() + else -> "${item.numFrom}-${item.numTo}" + } + ) + setTextViewText( + R.id.timetableWidgetEmptyItemText, + context.getPlural( + R.plurals.timetable_no_lesson, + item.numTo - item.numFrom + 1 + ) + ) + setOnClickFillInIntent(R.id.timetableWidgetEmptyItemContainer, Intent()) + } + } + + private fun getSynchronizedItemRemoteView(item: TimetableWidgetItem.Synchronized): RemoteViews { + return RemoteViews( + context.packageName, + R.layout.item_widget_timetable_footer + ).apply { + setTextViewText( + R.id.timetableWidgetSynchronizationTime, + getSynchronizationInfoText(item.timestamp) + ) + } + } + private fun updateTheme() { when (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { Configuration.UI_MODE_NIGHT_YES -> { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt new file mode 100644 index 000000000..166b1a8fb --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt @@ -0,0 +1,26 @@ +package io.github.wulkanowy.ui.modules.timetablewidget + +import io.github.wulkanowy.data.db.entities.Timetable +import java.time.Instant + +sealed class TimetableWidgetItem(val type: TimetableWidgetItemType) { + + data class Normal( + val lesson: Timetable, + ) : TimetableWidgetItem(TimetableWidgetItemType.NORMAL) + + data class Empty( + val numFrom: Int, + val numTo: Int + ) : TimetableWidgetItem(TimetableWidgetItemType.EMPTY) + + data class Synchronized( + val timestamp: Instant, + ) : TimetableWidgetItem(TimetableWidgetItemType.SYNCHRONIZED) +} + +enum class TimetableWidgetItemType { + NORMAL, + EMPTY, + SYNCHRONIZED, +} diff --git a/app/src/main/res/layout/item_timetable_empty.xml b/app/src/main/res/layout/item_timetable_empty.xml new file mode 100644 index 000000000..12fddb752 --- /dev/null +++ b/app/src/main/res/layout/item_timetable_empty.xml @@ -0,0 +1,43 @@ + + + + + + + diff --git a/app/src/main/res/layout/item_widget_timetable_empty.xml b/app/src/main/res/layout/item_widget_timetable_empty.xml new file mode 100644 index 000000000..a48b3645e --- /dev/null +++ b/app/src/main/res/layout/item_widget_timetable_empty.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 456005747..8872b7ab1 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -51,6 +51,11 @@ Średnia ze średnich z obu semestrów Średnia wszystkich ocen z całego roku + + Nie pokauj + Tylko między lekcjami + Przed i między lekcjami + Szczęśliwy numerek Nieprzeczytane wiadomości diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 0c1bbf785..a2b5510ec 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -185,6 +185,12 @@ Zmiana sali z %1$s na %2$s Zmiana nauczyciela z %1$s na %2$s Zmiana przedmiotu z %1$s na %2$s + + Brak lekcji + Brak lekcji + Brak lekcji + Brak lekcji + Zmiana planu lekcji Zmiany planu lekcji @@ -700,6 +706,7 @@ Rozwijanie ocen Oznaczaj bieżącą lekcję Pokazuj grupę obok przedmiotu + Pokazuj puste kafelki gdzie nie ma lekcji Pokazuj listę wykresów w ocenach klasy Pokazuj przedmioty bez ocen Schemat kolorów ocen diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index fefd9b13c..8d69f25c8 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -23,6 +23,7 @@ no alphabetic false + between false false 0 diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index e7fa542a3..c48381e8c 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -28,6 +28,7 @@ show_whole_class_plan show_groups_in_plan timetable_show_timers + timetable_show_gaps subjects_without_grades optional_arithmetic_average message_draft diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index 312f0b878..f56707c89 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -123,6 +123,17 @@ all_year + + Don\'t show + Only between lessons + Before and between lessons + + + no_gaps + between + before_and_between + + Lucky number Unread messages diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9dc7e7969..ce277bdce 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -186,6 +186,10 @@ Change of room from %1$s to %2$s Change of teacher from %1$s to %2$s Change of subject from %1$s to %2$s + + No lesson + No lessons + Timetable change Timetable changes @@ -690,6 +694,7 @@ Grades expanding Mark current lesson Show groups next to subjects + Show empty tiles where there\'s no lesson Show chart list in class grades Show subjects without grades Grades color scheme diff --git a/app/src/main/res/xml/scheme_preferences_appearance.xml b/app/src/main/res/xml/scheme_preferences_appearance.xml index 62216c760..7177d396c 100644 --- a/app/src/main/res/xml/scheme_preferences_appearance.xml +++ b/app/src/main/res/xml/scheme_preferences_appearance.xml @@ -111,5 +111,13 @@ app:title="@string/pref_view_timetable_show_whole_class" app:useSimpleSummaryProvider="true" /> --> + From 2e2b13384a214fed9599a713fe7cbeedf0eb9cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 23 Aug 2023 12:24:17 +0200 Subject: [PATCH 1222/1526] Try to switch to next school year before it starts (#2278) --- app/build.gradle | 2 +- .../data/repositories/SemesterRepository.kt | 4 +-- .../wulkanowy/utils/SemesterExtension.kt | 17 ++++++++-- .../repositories/SemesterRepositoryTest.kt | 23 +++++++------ .../utils/SemesterExtensionKtTest.kt | 34 +++++++++++++++++++ 5 files changed, 64 insertions(+), 16 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 37b165c17..136c54303 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.0.8' + implementation 'io.github.wulkanowy:sdk:2.0.9-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt index 92bb37081..dd44df70f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt @@ -41,7 +41,7 @@ class SemesterRepository @Inject constructor( val isRefreshOnModeChangeRequired = when { Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE -> { - semesters.firstOrNull { it.isCurrent }?.let { + semesters.firstOrNull { it.isCurrent() }?.let { 0 == it.diaryId && 0 == it.kindergartenDiaryId } == true } @@ -49,7 +49,7 @@ class SemesterRepository @Inject constructor( } val isRefreshOnNoCurrentAppropriate = - refreshOnNoCurrent && !semesters.any { semester -> semester.isCurrent } + refreshOnNoCurrent && !semesters.any { semester -> semester.isCurrent() } return forceRefresh || isNoSemesters || isRefreshOnModeChangeRequired || isRefreshOnNoCurrentAppropriate } diff --git a/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt index 380d6bf6e..e3b8a3b4c 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt @@ -1,16 +1,27 @@ package io.github.wulkanowy.utils import io.github.wulkanowy.data.db.entities.Semester +import java.time.LocalDate import java.time.LocalDate.now +import java.time.Month -inline val Semester.isCurrent: Boolean - get() = now() in start..end +fun Semester.isCurrent(now: LocalDate = now()): Boolean { + val shiftedStart = if (start.month == Month.SEPTEMBER) { + start.minusDays(3) + } else start + + val shiftedEnd = if (end.month == Month.AUGUST || end.month == Month.SEPTEMBER) { + end.minusDays(3) + } else end + + return now in shiftedStart..shiftedEnd +} fun List.getCurrentOrLast(): Semester { if (isEmpty()) throw RuntimeException("Empty semester list") // when there is only one current semester - singleOrNull { it.isCurrent }?.let { return it } + singleOrNull { it.isCurrent() }?.let { return it } // when there is more than one current semester - find one with higher id singleOrNull { semester -> semester.semesterId == maxByOrNull { it.semesterId }?.semesterId }?.let { return it } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt index d8256869f..31098d2ef 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt @@ -15,6 +15,7 @@ import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK import io.mockk.just import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertNotEquals import org.junit.Before @@ -81,15 +82,15 @@ class SemesterRepositoryTest { } @Test - fun getSemesters_invalidDiary_scrapper() { + fun getSemesters_invalidDiary_scrapper() = runTest { val badSemesters = listOf( - getSemesterPojo(0, 1, now().minusMonths(6), now().minusMonths(3)), - getSemesterPojo(0, 2, now().minusMonths(3), now()) + getSemesterPojo(0, 2, now().minusMonths(6), now()), + getSemesterPojo(0, 2, now(), now().plusMonths(6)), ) val goodSemesters = listOf( - getSemesterPojo(1, 1, now().minusMonths(6), now().minusMonths(3)), - getSemesterPojo(1, 2, now().minusMonths(3), now()) + getSemesterPojo(1, 2, now().minusMonths(6), now()), + getSemesterPojo(2, 3, now(), now().plusMonths(6)), ) coEvery { semesterDb.loadAll(student.studentId, student.classId) } returnsMany listOf( @@ -101,7 +102,9 @@ class SemesterRepositoryTest { coEvery { semesterDb.deleteAll(any()) } just Runs coEvery { semesterDb.insertSemesters(any()) } returns listOf() - val items = runBlocking { semesterRepository.getSemesters(student.copy(loginMode = Sdk.Mode.SCRAPPER.name)) } + val items = semesterRepository.getSemesters( + student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) + ) assertEquals(2, items.size) assertNotEquals(0, items[0].diaryId) } @@ -188,15 +191,15 @@ class SemesterRepositoryTest { } @Test - fun getSemesters_doubleCurrent_refreshOnNoCurrent() { + fun getSemesters_doubleCurrent_refreshOnNoCurrent() = runTest { val semesters = listOf( - getSemesterEntity(1, 1, now(), now()), - getSemesterEntity(1, 2, now(), now()) + getSemesterEntity(1, 1, now().minusMonths(1), now().plusMonths(1)), + getSemesterEntity(1, 2, now().minusMonths(1), now().plusMonths(1)) ) coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters - val items = runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } + val items = semesterRepository.getSemesters(student, refreshOnNoCurrent = true) assertEquals(2, items.size) } diff --git a/app/src/test/java/io/github/wulkanowy/utils/SemesterExtensionKtTest.kt b/app/src/test/java/io/github/wulkanowy/utils/SemesterExtensionKtTest.kt index b7d3ecc94..e8ba8a876 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/SemesterExtensionKtTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/SemesterExtensionKtTest.kt @@ -8,6 +8,40 @@ import kotlin.test.assertEquals class SemesterExtensionKtTest { + @Test + fun `check is first semester is current`() { + val first = getSemesterEntity( + semesterName = 1, + start = LocalDate.of(2023, 9, 1), + end = LocalDate.of(2024, 1, 31), + ) + + // first boundary - school-year start + assertEquals(false, first.isCurrent(LocalDate.of(2023, 8, 28))) + assertEquals(true, first.isCurrent(LocalDate.of(2023, 8, 29))) + + // second boundary + assertEquals(true, first.isCurrent(LocalDate.of(2024, 1, 31))) + assertEquals(false, first.isCurrent(LocalDate.of(2024, 2, 1))) + } + + @Test + fun `check is second semester is current`() { + val second = getSemesterEntity( + semesterName = 2, + start = LocalDate.of(2024, 2, 1), + end = LocalDate.of(2024, 9, 1), + ) + + // first boundary + assertEquals(false, second.isCurrent(LocalDate.of(2024, 1, 31))) + assertEquals(true, second.isCurrent(LocalDate.of(2024, 2, 1))) + + // second boundary - school-year end + assertEquals(true, second.isCurrent(LocalDate.of(2024, 8, 29))) + assertEquals(false, second.isCurrent(LocalDate.of(2024, 8, 30))) + } + @Test(expected = IllegalArgumentException::class) fun `get current semester when current is doubled`() { val semesters = listOf( From fbce9e58d034fe5616736d06bd4e5235f573d593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 23 Aug 2023 19:46:53 +0200 Subject: [PATCH 1223/1526] New Crowdin updates (#2277) --- app/src/main/res/values-cs/preferences_values.xml | 5 +++++ app/src/main/res/values-cs/strings.xml | 7 +++++++ app/src/main/res/values-da-rDK/preferences_values.xml | 5 +++++ app/src/main/res/values-da-rDK/strings.xml | 5 +++++ app/src/main/res/values-de/preferences_values.xml | 5 +++++ app/src/main/res/values-de/strings.xml | 5 +++++ app/src/main/res/values-es-rES/preferences_values.xml | 5 +++++ app/src/main/res/values-es-rES/strings.xml | 5 +++++ app/src/main/res/values-it-rIT/preferences_values.xml | 5 +++++ app/src/main/res/values-it-rIT/strings.xml | 5 +++++ app/src/main/res/values-ru/preferences_values.xml | 5 +++++ app/src/main/res/values-ru/strings.xml | 7 +++++++ app/src/main/res/values-sk/preferences_values.xml | 5 +++++ app/src/main/res/values-sk/strings.xml | 7 +++++++ app/src/main/res/values-uk/preferences_values.xml | 5 +++++ app/src/main/res/values-uk/strings.xml | 7 +++++++ 16 files changed, 88 insertions(+) diff --git a/app/src/main/res/values-cs/preferences_values.xml b/app/src/main/res/values-cs/preferences_values.xml index 23073adf1..2cf402631 100644 --- a/app/src/main/res/values-cs/preferences_values.xml +++ b/app/src/main/res/values-cs/preferences_values.xml @@ -51,6 +51,11 @@ Průměr z průměrů z obou semestrů Průměr známek z celého roku + + Don\'t show + Only between lessons + Before and between lessons + Šťastné číslo Nepřečtené zprávy diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index ff461d420..a63a0aa12 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -185,6 +185,12 @@ Změna učebny z %1$s na %2$s Změna učitele z %1$s na %2$s Změna předmětu z %1$s na %2$s + + No lesson + No lessons + No lessons + No lessons + Změna plánu lekcí Změny plánu lekcí @@ -700,6 +706,7 @@ Rozvíjení známek Označit aktuální lekci Zobrazit skupiny vedle předmětů + Show empty tiles where there\'s no lesson Zobrazit seznam grafů v známkách třídy Zobrazit předměty bez známek Známky barevné schéma 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 ac2b6e9e5..5aff12dec 100644 --- a/app/src/main/res/values-da-rDK/preferences_values.xml +++ b/app/src/main/res/values-da-rDK/preferences_values.xml @@ -51,6 +51,11 @@ Average of averages from both semesters Average of grades from the whole year + + Don\'t show + Only between lessons + Before and between lessons + Lucky number Unread messages diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 259a42647..2abf1a4a6 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -171,6 +171,10 @@ Change of room from %1$s to %2$s Change of teacher from %1$s to %2$s Change of subject from %1$s to %2$s + + No lesson + No lessons + Timetable change Timetable changes @@ -612,6 +616,7 @@ Grades expanding Mark current lesson Show groups next to subjects + Show empty tiles where there\'s no lesson Show chart list in class grades Show subjects without grades Grades color scheme diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index d9cac1959..d1001c74b 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -51,6 +51,11 @@ Durchschnittswert der Durchschnittswerte beider Semester Durchschnitt der Noten aus dem ganzen Jahr + + Don\'t show + Only between lessons + Before and between lessons + Glückszahl Ungelesene Nachrichten diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1836d0479..f08a504a5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -171,6 +171,10 @@ Änderung des Raumes von %1$s zu %2$s Wechsel des Lehrers von %1$s zu %2$s Thema von %1$s zu %2$s wechseln + + No lesson + No lessons + Änderung des Zeitplans Änderungen des Zeitplans @@ -612,6 +616,7 @@ Steigende Sorten Aktuelle Lektion markieren Gruppen neben Schulfächen anzeigen + Show empty tiles where there\'s no lesson Liste der Diagramme in Klassenbewertungen anzeigen Schulfächer ohne Noten anzeigen Farbschema der 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 ac2b6e9e5..5aff12dec 100644 --- a/app/src/main/res/values-es-rES/preferences_values.xml +++ b/app/src/main/res/values-es-rES/preferences_values.xml @@ -51,6 +51,11 @@ Average of averages from both semesters Average of grades from the whole year + + Don\'t show + Only between lessons + Before and between lessons + Lucky number Unread messages diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 259a42647..2abf1a4a6 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -171,6 +171,10 @@ Change of room from %1$s to %2$s Change of teacher from %1$s to %2$s Change of subject from %1$s to %2$s + + No lesson + No lessons + Timetable change Timetable changes @@ -612,6 +616,7 @@ Grades expanding Mark current lesson Show groups next to subjects + Show empty tiles where there\'s no lesson Show chart list in class grades Show subjects without grades Grades color scheme 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 ac2b6e9e5..5aff12dec 100644 --- a/app/src/main/res/values-it-rIT/preferences_values.xml +++ b/app/src/main/res/values-it-rIT/preferences_values.xml @@ -51,6 +51,11 @@ Average of averages from both semesters Average of grades from the whole year + + Don\'t show + Only between lessons + Before and between lessons + Lucky number Unread messages diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 259a42647..2abf1a4a6 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -171,6 +171,10 @@ Change of room from %1$s to %2$s Change of teacher from %1$s to %2$s Change of subject from %1$s to %2$s + + No lesson + No lessons + Timetable change Timetable changes @@ -612,6 +616,7 @@ Grades expanding Mark current lesson Show groups next to subjects + Show empty tiles where there\'s no lesson Show chart list in class grades Show subjects without grades Grades color scheme diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index 8a8c260da..df3629c02 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -51,6 +51,11 @@ Средняя из средних оценок семестров Средняя из оценок со всего года + + Don\'t show + Only between lessons + Before and between lessons + Счастливый номер Непрочитанные письма diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 606971740..d075dac6c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -185,6 +185,12 @@ Аудитория изменена с %1$s на %2$s Учитель изменён с %1$s на %2$s Тема изменена с %1$s на %2$s + + No lesson + No lessons + No lessons + No lessons + Изменение расписания Изменения расписания @@ -700,6 +706,7 @@ Разворачивание оценок Отметить текущий урок Показать группы рядом с темами + Show empty tiles where there\'s no lesson Показывать диаграммы в оценках класса Показать предметы без оценок Цветовая схема оценок diff --git a/app/src/main/res/values-sk/preferences_values.xml b/app/src/main/res/values-sk/preferences_values.xml index e4331315a..fd393394f 100644 --- a/app/src/main/res/values-sk/preferences_values.xml +++ b/app/src/main/res/values-sk/preferences_values.xml @@ -51,6 +51,11 @@ Priemer z priemerov z oboch semestrov Priemer známok z celého roka + + Don\'t show + Only between lessons + Before and between lessons + Šťastné číslo Neprečítané správy diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 20d8818b3..d1990e35e 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -185,6 +185,12 @@ Zmena učebne z %1$s na %2$s Zmena učiteľa z %1$s na %2$s Zmena predmetu z %1$s na %2$s + + No lesson + No lessons + No lessons + No lessons + Zmena plánu lekcií Zmeny plánu lekcií @@ -700,6 +706,7 @@ Rozvijanie známok Označiť aktuálne lekciu Zobraziť skupiny vedľa predmetov + Show empty tiles where there\'s no lesson Zobraziť zoznam grafov v známkach triedy Zobraziť predmety bez známok Známky farebnú schému diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index 44acd18e9..55cf905bb 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -51,6 +51,11 @@ Середнє значення з обох семестрів Середня оцінка з цілого року + + Don\'t show + Only between lessons + Before and between lessons + Щасливий номер Непрочитані листи diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index db5c3cb0d..876562d31 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -185,6 +185,12 @@ Зміна аудіторії з %1$s на %2$s Зміна вчителя з %1$s на %2$s Зміна теми з %1$s на %2$s + + No lesson + No lessons + No lessons + No lessons + Зміна у розкладі Зміни у розкладі @@ -700,6 +706,7 @@ Розгортання оцінок Позначити поточний урок Показувати групи поруч з темами + Show empty tiles where there\'s no lesson Показувати діаграми в оцінках класу Показати предмети без оцінок Схема кольорів оцінок From 3dfc55c4d196cb767704e8f6f73ac1e25f611df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 24 Aug 2023 11:33:40 +0200 Subject: [PATCH 1224/1526] Add admin messages to login screen (#2280) --- app/build.gradle | 2 +- .../57.json | 2443 +++++++++++++++++ .../java/io/github/wulkanowy/data/Resource.kt | 2 +- .../github/wulkanowy/data/db/AppDatabase.kt | 3 +- .../io/github/wulkanowy/data/db/Converters.kt | 6 + .../data/db/entities/AdminMessage.kt | 4 +- .../data/db/migrations/Migration57.kt | 10 + .../wulkanowy/data/enums/MessageType.kt | 9 + .../repositories/AdminMessageRepository.kt | 45 +- .../GetAppropriateAdminMessageUseCase.kt | 64 + .../dashboard/DashboardItemMoveCallback.kt | 3 +- .../modules/dashboard/DashboardPresenter.kt | 34 +- .../dashboard/adapters/DashboardAdapter.kt | 45 +- .../viewholders/AdminMessageViewHolder.kt | 52 + .../modules/login/form/LoginFormFragment.kt | 15 + .../modules/login/form/LoginFormPresenter.kt | 40 +- .../ui/modules/login/form/LoginFormView.kt | 5 + .../main/res/layout/fragment_login_form.xml | 15 +- .../login/form/LoginFormPresenterTest.kt | 10 + 19 files changed, 2722 insertions(+), 85 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/57.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration57.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/enums/MessageType.kt create mode 100644 app/src/main/java/io/github/wulkanowy/domain/adminmessage/GetAppropriateAdminMessageUseCase.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/viewholders/AdminMessageViewHolder.kt diff --git a/app/build.gradle b/app/build.gradle index 136c54303..d0ae8894c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 130 + versionCode 131 // todo: already bumped for 2.1.0 version versionName "2.0.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/57.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/57.json new file mode 100644 index 000000000..2eff12231 --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/57.json @@ -0,0 +1,2443 @@ +{ + "formatVersion": 1, + "database": { + "version": 57, + "identityHash": "d15dbe7d7e4d7df98ec98d9a3a4b5fcd", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `scrapper_domain_suffix` TEXT NOT NULL DEFAULT '', `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperDomainSuffix", + "columnName": "scrapper_domain_suffix", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `kindergarten_diary_id` INTEGER NOT NULL DEFAULT 0, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "kindergartenDiaryId", + "columnName": "kindergarten_diary_id", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "kindergarten_diary_id", + "semester_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `kindergarten_diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`email` TEXT NOT NULL, `message_global_key` TEXT NOT NULL, `mailbox_key` TEXT NOT NULL, `message_id` INTEGER NOT NULL, `correspondents` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `read_by` INTEGER, `unread_by` INTEGER, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `content` TEXT NOT NULL, `sender` TEXT, `recipients` TEXT)", + "fields": [ + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mailboxKey", + "columnName": "mailbox_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "correspondents", + "columnName": "correspondents", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "recipients", + "columnName": "recipients", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`message_global_key` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`message_global_key`, `url`, `filename`))", + "fields": [ + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "message_global_key", + "url", + "filename" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Mailboxes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`globalKey` TEXT NOT NULL, `email` TEXT NOT NULL, `symbol` TEXT NOT NULL, `schoolId` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `studentName` TEXT NOT NULL, `schoolNameShort` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`globalKey`))", + "fields": [ + { + "fieldPath": "globalKey", + "columnName": "globalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolId", + "columnName": "schoolId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "studentName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolNameShort", + "columnName": "schoolNameShort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "globalKey" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`mailboxGlobalKey` TEXT NOT NULL, `studentMailboxGlobalKey` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `schoolShortName` TEXT NOT NULL, `type` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "mailboxGlobalKey", + "columnName": "mailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentMailboxGlobalKey", + "columnName": "studentMailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "schoolShortName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `repeat_id` BLOB DEFAULT NULL, `is_added_by_user` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatId", + "columnName": "repeat_id", + "affinity": "BLOB", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `destination` TEXT NOT NULL DEFAULT '{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}', `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "destination", + "columnName": "destination", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}'" + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `types` TEXT NOT NULL DEFAULT '[]', `is_dismissible` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "types", + "columnName": "types", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'[]'" + }, + { + "fieldPath": "isDismissible", + "columnName": "is_dismissible", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd15dbe7d7e4d7df98ec98d9a3a4b5fcd')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/Resource.kt b/app/src/main/java/io/github/wulkanowy/data/Resource.kt index 6b611e477..2c5bf0ea9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/Resource.kt +++ b/app/src/main/java/io/github/wulkanowy/data/Resource.kt @@ -148,7 +148,7 @@ inline fun networkBoundResource( crossinline saveFetchResult: suspend (old: ResultType, new: RequestType) -> Unit, crossinline onFetchFailed: (Throwable) -> Unit = { }, crossinline shouldFetch: (ResultType) -> Boolean = { true }, - crossinline mapResult: (ResultType) -> T + crossinline mapResult: (ResultType) -> T, ) = flow { emit(Resource.Loading()) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 882a70167..48a2942c9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -50,6 +50,7 @@ import javax.inject.Singleton AutoMigration(from = 51, to = 52), AutoMigration(from = 54, to = 55, spec = Migration55::class), AutoMigration(from = 55, to = 56), + AutoMigration(from = 56, to = 57, spec = Migration57::class), ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -58,7 +59,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 56 + const val VERSION_SCHEMA = 57 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), diff --git a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt index 9d3beae1f..7bc8d12a2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.db import androidx.room.TypeConverter +import io.github.wulkanowy.data.enums.MessageType import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.utils.toTimestamp import kotlinx.serialization.SerializationException @@ -68,4 +69,9 @@ class Converters { @TypeConverter fun stringToDestination(destination: String): Destination = json.decodeFromString(destination) + @TypeConverter + fun messageTypesToString(types: List): String = json.encodeToString(types) + + @TypeConverter + fun stringToMessageTypes(text: String): List = json.decodeFromString(text) } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt index 97fec69b7..875c2a3a5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import io.github.wulkanowy.data.enums.MessageType import kotlinx.serialization.Serializable @Serializable @@ -33,7 +34,8 @@ data class AdminMessage( val priority: String, - val type: String, + @ColumnInfo(name = "types", defaultValue = "[]") + val types: List = emptyList(), @ColumnInfo(name = "is_dismissible") val isDismissible: Boolean = false diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration57.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration57.kt new file mode 100644 index 000000000..2fc8718f9 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration57.kt @@ -0,0 +1,10 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.DeleteColumn +import androidx.room.migration.AutoMigrationSpec + +@DeleteColumn( + tableName = "AdminMessages", + columnName = "type", +) +class Migration57 : AutoMigrationSpec diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/MessageType.kt b/app/src/main/java/io/github/wulkanowy/data/enums/MessageType.kt new file mode 100644 index 000000000..531684e4e --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/enums/MessageType.kt @@ -0,0 +1,9 @@ +package io.github.wulkanowy.data.enums + +enum class MessageType { + GENERAL_MESSAGE, + DASHBOARD_MESSAGE, + LOGIN_MESSAGE, + PASS_RESET_MESSAGE, + ERROR_OVERRIDE, +} diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt index c9655b722..b831ee755 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt @@ -1,10 +1,11 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.api.AdminMessageService import io.github.wulkanowy.data.db.dao.AdminMessageDao -import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.networkBoundResource -import io.github.wulkanowy.utils.AppInfo +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -13,34 +14,20 @@ import javax.inject.Singleton class AdminMessageRepository @Inject constructor( private val adminMessageService: AdminMessageService, private val adminMessageDao: AdminMessageDao, - private val appInfo: AppInfo ) { + private val saveFetchResultMutex = Mutex() - suspend fun getAdminMessages(student: Student) = networkBoundResource( - mutex = saveFetchResultMutex, - isResultEmpty = { it == null }, - query = { adminMessageDao.loadAll() }, - fetch = { adminMessageService.getAdminMessages() }, - shouldFetch = { true }, - saveFetchResult = { oldItems, newItems -> - adminMessageDao.removeOldAndSaveNew(oldItems, newItems) - }, - showSavedOnLoading = false, - mapResult = { adminMessages -> - adminMessages.filter { adminMessage -> - val isCorrectRegister = adminMessage.targetRegisterHost?.let { - student.scrapperBaseUrl.contains(it, true) - } ?: true - val isCorrectFlavor = - adminMessage.targetFlavor?.equals(appInfo.buildFlavor, true) ?: true - val isCorrectMaxVersion = - adminMessage.versionMax?.let { it >= appInfo.versionCode } ?: true - val isCorrectMinVersion = - adminMessage.versionMin?.let { it <= appInfo.versionCode } ?: true - - isCorrectRegister && isCorrectFlavor && isCorrectMaxVersion && isCorrectMinVersion - }.maxByOrNull { it.id } - } - ) + fun getAdminMessages(): Flow>> = + networkBoundResource( + mutex = saveFetchResultMutex, + isResultEmpty = { false }, + query = { adminMessageDao.loadAll() }, + fetch = { adminMessageService.getAdminMessages() }, + shouldFetch = { true }, + saveFetchResult = { oldItems, newItems -> + adminMessageDao.removeOldAndSaveNew(oldItems, newItems) + }, + showSavedOnLoading = false, + ) } diff --git a/app/src/main/java/io/github/wulkanowy/domain/adminmessage/GetAppropriateAdminMessageUseCase.kt b/app/src/main/java/io/github/wulkanowy/domain/adminmessage/GetAppropriateAdminMessageUseCase.kt new file mode 100644 index 000000000..b55bf899d --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/domain/adminmessage/GetAppropriateAdminMessageUseCase.kt @@ -0,0 +1,64 @@ +package io.github.wulkanowy.domain.adminmessage + +import io.github.wulkanowy.data.Resource +import io.github.wulkanowy.data.db.entities.AdminMessage +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.enums.MessageType +import io.github.wulkanowy.data.mapResourceData +import io.github.wulkanowy.data.repositories.AdminMessageRepository +import io.github.wulkanowy.data.repositories.PreferencesRepository +import io.github.wulkanowy.utils.AppInfo +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class GetAppropriateAdminMessageUseCase @Inject constructor( + private val adminMessageRepository: AdminMessageRepository, + private val preferencesRepository: PreferencesRepository, + private val appInfo: AppInfo +) { + + operator fun invoke(student: Student, type: MessageType): Flow> { + return invoke(student.scrapperBaseUrl, type) + } + + operator fun invoke(scrapperBaseUrl: String, type: MessageType): Flow> { + return adminMessageRepository.getAdminMessages().mapResourceData { adminMessages -> + adminMessages + .asSequence() + .filter { it.isNotDismissed() } + .filter { it.isVersionMatch() } + .filter { it.isRegisterHostMatch(scrapperBaseUrl) } + .filter { it.isFlavorMatch() } + .filter { it.isTypeMatch(type) } + .maxByOrNull { it.id } + } + } + + private fun AdminMessage.isNotDismissed(): Boolean { + return id !in preferencesRepository.dismissedAdminMessageIds + } + + private fun AdminMessage.isRegisterHostMatch(scrapperBaseUrl: String): Boolean { + return targetRegisterHost?.let { + scrapperBaseUrl.contains(it, true) + } ?: true + } + + private fun AdminMessage.isFlavorMatch(): Boolean { + return targetFlavor?.equals(appInfo.buildFlavor, true) ?: true + } + + private fun AdminMessage.isVersionMatch(): Boolean { + val isCorrectMaxVersion = versionMax?.let { it >= appInfo.versionCode } ?: true + val isCorrectMinVersion = versionMin?.let { it <= appInfo.versionCode } ?: true + + return isCorrectMaxVersion && isCorrectMinVersion + } + + private fun AdminMessage.isTypeMatch(messageType: MessageType): Boolean { + if (messageType in types) return true + if (MessageType.GENERAL_MESSAGE in types) return true + + return false + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt index 9c15acc35..f033b5947 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardItemMoveCallback.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.dashboard import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.ui.modules.dashboard.adapters.DashboardAdapter +import io.github.wulkanowy.ui.modules.dashboard.viewholders.AdminMessageViewHolder import java.util.* class DashboardItemMoveCallback( @@ -55,5 +56,5 @@ class DashboardItemMoveCallback( } private val RecyclerView.ViewHolder.isAdminMessageOrAccountItem: Boolean - get() = this is DashboardAdapter.AdminMessageViewHolder || this is DashboardAdapter.AccountViewHolder + get() = this is AdminMessageViewHolder || this is DashboardAdapter.AccountViewHolder } 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 ac2c896dc..ecf084c68 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 @@ -5,7 +5,9 @@ import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.enums.MessageFolder +import io.github.wulkanowy.data.enums.MessageType import io.github.wulkanowy.data.repositories.* +import io.github.wulkanowy.domain.adminmessage.GetAppropriateAdminMessageUseCase import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AdsHelper @@ -32,7 +34,7 @@ class DashboardPresenter @Inject constructor( private val conferenceRepository: ConferenceRepository, private val preferencesRepository: PreferencesRepository, private val schoolAnnouncementRepository: SchoolAnnouncementRepository, - private val adminMessageRepository: AdminMessageRepository, + private val getAppropriateAdminMessageUseCase: GetAppropriateAdminMessageUseCase, private val adsHelper: AdsHelper ) : BasePresenter(errorHandler, studentRepository) { @@ -159,19 +161,23 @@ class DashboardPresenter @Inject constructor( DashboardItem.Type.ACCOUNT -> { updateData(DashboardItem.Account(student), forceRefresh) } + DashboardItem.Type.HORIZONTAL_GROUP -> { loadHorizontalGroup(student, forceRefresh) } + DashboardItem.Type.LESSONS -> loadLessons(student, forceRefresh) DashboardItem.Type.GRADES -> loadGrades(student, forceRefresh) DashboardItem.Type.HOMEWORK -> loadHomework(student, forceRefresh) DashboardItem.Type.ANNOUNCEMENTS -> { loadSchoolAnnouncements(student, forceRefresh) } + DashboardItem.Type.EXAMS -> loadExams(student, forceRefresh) DashboardItem.Type.CONFERENCES -> { loadConferences(student, forceRefresh) } + DashboardItem.Type.ADS -> loadAds(forceRefresh) DashboardItem.Type.ADMIN_MESSAGE -> loadAdminMessage(student, forceRefresh) } @@ -355,6 +361,7 @@ class DashboardPresenter @Inject constructor( firstLoadedItemList += DashboardItem.Type.GRADES } } + is Resource.Success -> { Timber.i("Loading dashboard grades result: Success") updateData( @@ -365,6 +372,7 @@ class DashboardPresenter @Inject constructor( forceRefresh ) } + is Resource.Error -> { Timber.i("Loading dashboard grades result: An exception occurred") errorHandler.dispatch(it.error) @@ -402,12 +410,14 @@ class DashboardPresenter @Inject constructor( firstLoadedItemList += DashboardItem.Type.LESSONS } } + is Resource.Success -> { Timber.i("Loading dashboard lessons result: Success") updateData( DashboardItem.Lessons(it.data), forceRefresh ) } + is Resource.Error -> { Timber.i("Loading dashboard lessons result: An exception occurred") errorHandler.dispatch(it.error) @@ -457,10 +467,12 @@ class DashboardPresenter @Inject constructor( firstLoadedItemList += DashboardItem.Type.HOMEWORK } } + is Resource.Success -> { Timber.i("Loading dashboard homework result: Success") updateData(DashboardItem.Homework(it.data), forceRefresh) } + is Resource.Error -> { Timber.i("Loading dashboard homework result: An exception occurred") errorHandler.dispatch(it.error) @@ -489,10 +501,12 @@ class DashboardPresenter @Inject constructor( firstLoadedItemList += DashboardItem.Type.ANNOUNCEMENTS } } + is Resource.Success -> { Timber.i("Loading dashboard announcements result: Success") updateData(DashboardItem.Announcements(it.data), forceRefresh) } + is Resource.Error -> { Timber.i("Loading dashboard announcements result: An exception occurred") errorHandler.dispatch(it.error) @@ -530,10 +544,12 @@ class DashboardPresenter @Inject constructor( firstLoadedItemList += DashboardItem.Type.EXAMS } } + is Resource.Success -> { Timber.i("Loading dashboard exams result: Success") updateData(DashboardItem.Exams(it.data), forceRefresh) } + is Resource.Error -> { Timber.i("Loading dashboard exams result: An exception occurred") errorHandler.dispatch(it.error) @@ -569,10 +585,12 @@ class DashboardPresenter @Inject constructor( firstLoadedItemList += DashboardItem.Type.CONFERENCES } } + is Resource.Success -> { Timber.i("Loading dashboard conferences result: Success") updateData(DashboardItem.Conferences(it.data), forceRefresh) } + is Resource.Error -> { Timber.i("Loading dashboard conferences result: An exception occurred") errorHandler.dispatch(it.error) @@ -584,12 +602,12 @@ class DashboardPresenter @Inject constructor( } private fun loadAdminMessage(student: Student, forceRefresh: Boolean) { - flatResourceFlow { adminMessageRepository.getAdminMessages(student) } - .filter { - val data = it.dataOrNull ?: return@filter true - val isDismissed = data.id in preferencesRepository.dismissedAdminMessageIds - !isDismissed - } + flatResourceFlow { + getAppropriateAdminMessageUseCase( + student = student, + type = MessageType.DASHBOARD_MESSAGE, + ) + } .onEach { when (it) { is Resource.Loading -> { @@ -597,6 +615,7 @@ class DashboardPresenter @Inject constructor( if (forceRefresh) return@onEach updateData(DashboardItem.AdminMessages(), forceRefresh) } + is Resource.Success -> { Timber.i("Loading dashboard admin message result: Success") updateData( @@ -604,6 +623,7 @@ class DashboardPresenter @Inject constructor( forceRefresh = forceRefresh ) } + is Resource.Error -> { Timber.i("Loading dashboard admin message result: An exception occurred") Timber.e(it.error) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt index 4ad4e9d67..7c74cae80 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt @@ -1,8 +1,6 @@ package io.github.wulkanowy.ui.modules.dashboard.adapters import android.annotation.SuppressLint -import android.content.res.ColorStateList -import android.graphics.Color import android.graphics.Typeface import android.os.Handler import android.os.Looper @@ -24,6 +22,7 @@ import io.github.wulkanowy.data.db.entities.TimetableHeader import io.github.wulkanowy.data.enums.GradeColorTheme import io.github.wulkanowy.databinding.* import io.github.wulkanowy.ui.modules.dashboard.DashboardItem +import io.github.wulkanowy.ui.modules.dashboard.viewholders.AdminMessageViewHolder import io.github.wulkanowy.utils.* import timber.log.Timber import java.time.Duration @@ -109,7 +108,9 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter AdminMessageViewHolder( - ItemDashboardAdminMessageBinding.inflate(inflater, parent, false) + ItemDashboardAdminMessageBinding.inflate(inflater, parent, false), + onAdminMessageDismissClickListener = onAdminMessageDismissClickListener, + onAdminMessageClickListener = onAdminMessageClickListener, ) DashboardItem.Type.ADS.ordinal -> AdsViewHolder( ItemDashboardAdsBinding.inflate(inflater, parent, false) @@ -128,7 +129,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter bindAnnouncementsViewHolder(holder, position) is ExamsViewHolder -> bindExamsViewHolder(holder, position) is ConferencesViewHolder -> bindConferencesViewHolder(holder, position) - is AdminMessageViewHolder -> bindAdminMessage(holder, position) + is AdminMessageViewHolder -> holder.bind((items[position] as DashboardItem.AdminMessages).adminMessage) is AdsViewHolder -> bindAdsViewHolder(holder, position) } } @@ -733,39 +734,6 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { - context.getThemeAttrColor(R.attr.colorMessageHigh) to - context.getThemeAttrColor(R.attr.colorOnMessageHigh) - } - "MEDIUM" -> { - context.getThemeAttrColor(R.attr.colorMessageMedium) to Color.BLACK - } - else -> null to context.getThemeAttrColor(R.attr.colorOnSurface) - } - - with(adminMessageViewHolder.binding) { - dashboardAdminMessageItemTitle.text = item.title - dashboardAdminMessageItemTitle.setTextColor(textColor) - dashboardAdminMessageItemDescription.text = item.content - dashboardAdminMessageItemDescription.setTextColor(textColor) - dashboardAdminMessageItemIcon.setColorFilter(textColor) - dashboardAdminMessageItemDismiss.isVisible = item.isDismissible - dashboardAdminMessageItemDismiss.setTextColor(textColor) - dashboardAdminMessageItemDismiss.setOnClickListener { - onAdminMessageDismissClickListener(item) - } - - root.setCardBackgroundColor(backgroundColor?.let { ColorStateList.valueOf(it) }) - item.destinationUrl?.let { url -> - root.setOnClickListener { onAdminMessageClickListener(url) } - } - } - } - private fun bindAdsViewHolder(adsViewHolder: AdsViewHolder, position: Int) { val item = (items[position] as DashboardItem.Ads).adBanner ?: return val binding = adsViewHolder.binding @@ -819,9 +787,6 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter Unit, + private val onAdminMessageClickListener: (String?) -> Unit, +) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: AdminMessage?) { + item ?: return + + val context = binding.root.context + val (backgroundColor, textColor) = when (item.priority) { + "HIGH" -> { + context.getThemeAttrColor(R.attr.colorMessageHigh) to + context.getThemeAttrColor(R.attr.colorOnMessageHigh) + } + "MEDIUM" -> { + context.getThemeAttrColor(R.attr.colorMessageMedium) to Color.BLACK + } + else -> null to context.getThemeAttrColor(R.attr.colorOnSurface) + } + + with(binding) { + dashboardAdminMessageItemTitle.text = item.title + dashboardAdminMessageItemTitle.setTextColor(textColor) + dashboardAdminMessageItemDescription.text = item.content + dashboardAdminMessageItemDescription.setTextColor(textColor) + dashboardAdminMessageItemIcon.setColorFilter(textColor) + dashboardAdminMessageItemDismiss.isVisible = item.isDismissible + dashboardAdminMessageItemDismiss.setTextColor(textColor) + dashboardAdminMessageItemDismiss.setOnClickListener { + onAdminMessageDismissClickListener(item) + } + + root.setCardBackgroundColor(backgroundColor?.let { ColorStateList.valueOf(it) }) + item.destinationUrl?.let { url -> + root.setOnClickListener { onAdminMessageClickListener(url) } + } + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index 1085ff509..ff7fd864b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -9,10 +9,12 @@ import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.FragmentLoginFormBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.dashboard.viewholders.AdminMessageViewHolder import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.utils.* @@ -207,6 +209,19 @@ class LoginFormFragment : BaseFragment(R.layout.fragme binding.loginFormContainer.visibility = if (show) VISIBLE else GONE } + override fun showAdminMessage(message: AdminMessage?) { + AdminMessageViewHolder( + binding = binding.loginFormMessage, + onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, + onAdminMessageClickListener = presenter::onAdminMessageSelected, + ).bind(message) + binding.loginFormMessage.root.isVisible = message != null + } + + override fun openInternetBrowser(url: String) { + requireContext().openInternetBrowser(url) + } + override fun showDomainSuffixInput(show: Boolean) { binding.loginFormDomainSuffixLayout.isVisible = show } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index 85f428415..4e0404d9b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -1,13 +1,19 @@ package io.github.wulkanowy.ui.modules.login.form import androidx.core.net.toUri +import io.github.wulkanowy.data.db.entities.AdminMessage +import io.github.wulkanowy.data.enums.MessageType +import io.github.wulkanowy.data.flatResourceFlow import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.onResourceData import io.github.wulkanowy.data.onResourceError import io.github.wulkanowy.data.onResourceLoading import io.github.wulkanowy.data.onResourceNotLoading import io.github.wulkanowy.data.onResourceSuccess +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.resourceFlow +import io.github.wulkanowy.domain.adminmessage.GetAppropriateAdminMessageUseCase import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.LoginErrorHandler @@ -22,7 +28,9 @@ class LoginFormPresenter @Inject constructor( studentRepository: StudentRepository, private val loginErrorHandler: LoginErrorHandler, private val appInfo: AppInfo, - private val analytics: AnalyticsHelper + private val analytics: AnalyticsHelper, + private val getAppropriateAdminMessageUseCase: GetAppropriateAdminMessageUseCase, + private val preferencesRepository: PreferencesRepository, ) : BasePresenter(loginErrorHandler, studentRepository) { private var lastError: Throwable? = null @@ -41,6 +49,31 @@ class LoginFormPresenter @Inject constructor( Timber.i("Entered wrong username or password") } } + + reloadAdminMessage() + } + + private fun reloadAdminMessage() { + flatResourceFlow { + getAppropriateAdminMessageUseCase( + scrapperBaseUrl = view?.formHostValue.orEmpty(), + type = MessageType.LOGIN_MESSAGE, + ) + } + .logResourceStatus("load login admin message") + .onResourceData { view?.showAdminMessage(it) } + .onResourceError { view?.showAdminMessage(null) } + .launch() + } + + fun onAdminMessageSelected(url: String?) { + url?.let { view?.openInternetBrowser(it) } + } + + fun onAdminMessageDismissed(adminMessage: AdminMessage) { + preferencesRepository.dismissedAdminMessageIds += adminMessage.id + + view?.showAdminMessage(null) } fun onPrivacyLinkClick() { @@ -63,6 +96,7 @@ class LoginFormPresenter @Inject constructor( } updateCustomDomainSuffixVisibility() updateUsernameLabel() + reloadAdminMessage() } } @@ -103,7 +137,9 @@ class LoginFormPresenter @Inject constructor( val email = view?.formUsernameValue.orEmpty().trim() val password = view?.formPassValue.orEmpty().trim() val host = view?.formHostValue.orEmpty().trim() - val domainSuffix = view?.formDomainSuffix.orEmpty().trim() + val domainSuffix = view?.formDomainSuffix.orEmpty().trim().takeIf { + "customSuffix" in host + }.orEmpty() val symbol = view?.formHostSymbol.orEmpty().trim() if (!validateCredentials(email, password, host)) return diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt index 5fb260620..5b4dcadfe 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.login.form +import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.modules.login.LoginData @@ -58,6 +59,10 @@ interface LoginFormView : BaseView { fun showContent(show: Boolean) + fun showAdminMessage(message: AdminMessage?) + + fun openInternetBrowser(url: String) + fun showDomainSuffixInput(show: Boolean) fun showOtherOptionsButton(show: Boolean) diff --git a/app/src/main/res/layout/fragment_login_form.xml b/app/src/main/res/layout/fragment_login_form.xml index 39f3146c8..fc5e5f35e 100644 --- a/app/src/main/res/layout/fragment_login_form.xml +++ b/app/src/main/res/layout/fragment_login_form.xml @@ -105,6 +105,18 @@ android:background="?android:attr/listDivider" /> + + Date: Fri, 25 Aug 2023 00:01:36 +0200 Subject: [PATCH 1225/1526] Version 2.1.0 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d0ae8894c..b09078a9e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 131 // todo: already bumped for 2.1.0 version - versionName "2.0.8" + versionCode 131 + versionName "2.1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -161,7 +161,7 @@ play { track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS userFraction = 0.25d - updatePriority = 1 + updatePriority = 3 enabled.set(false) } @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.0.9-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.1.0' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index e881cfdaf..aa934ce98 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,7 +1,8 @@ -Wersja 2.0.8 +Wersja 2.1.0 -— poprawiliśmy wyświetlanie kilku rodzajów zmian w planie lekcji -— dodaliśmy limit znaków w okienku usprawiedliwiania -— naprawiliśmy wyświetlanie frekwencji w szkołach, gdzie działa już system eduOne (ciągle jednak brak opcji usprawiedliwiania) +— dodaliśmy tryb incognito w wiadomościach +— dodaliśmy wyświetlanie pustych lekcji (okienek) w planie lekcji +— poprawiliśmy widżet planu lekcji (będzie teraz trochę bardziej kompaktowy) +— zmieniliśmy datę rozpoczęcia roku szkolnego na 3 dni przed 1 września (sorry) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 10f9812495f83ec7be0ffcea927b9eb95bdd9adc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 17:04:34 +0000 Subject: [PATCH 1226/1526] Bump com.android.tools.build:gradle from 8.1.0 to 8.1.1 (#2286) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2b52c068b..7adbb4694 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.11" - classpath 'com.android.tools.build:gradle:8.1.0' + 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.3.15' classpath 'com.huawei.agconnect:agcp:1.9.1.300' From 5238e4d187ec314fc180630e0ba1ad687065a7da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 17:04:57 +0000 Subject: [PATCH 1227/1526] Bump com.google.android.gms:play-services-ads from 22.2.0 to 22.3.0 (#2285) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b09078a9e..7d8cc08ba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -254,7 +254,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-config-ktx' playImplementation 'com.google.android.play:core:1.10.3' playImplementation 'com.google.android.play:core-ktx:1.8.1' - playImplementation 'com.google.android.gms:play-services-ads:22.2.0' + playImplementation 'com.google.android.gms:play-services-ads:22.3.0' hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.303' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.300' From aff56a83118e33259039d66c6d89bbfb4e2796f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 17:05:12 +0000 Subject: [PATCH 1228/1526] Bump com.google.firebase:firebase-bom from 32.2.2 to 32.2.3 (#2284) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 7d8cc08ba..03c6c837c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -247,7 +247,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.10.0' - playImplementation platform('com.google.firebase:firebase-bom:32.2.2') + playImplementation platform('com.google.firebase:firebase-bom:32.2.3') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From a77b3d4cd73961f0b17c01dd3866f95fc4b176b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 17:05:29 +0000 Subject: [PATCH 1229/1526] Bump com.google.firebase:firebase-crashlytics-gradle from 2.9.8 to 2.9.9 (#2283) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7adbb4694..3f4d6d73b 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.3.15' classpath 'com.huawei.agconnect:agcp:1.9.1.300' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.8' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.3.0.3225" From 50a177d18c01f1ecbdc04169034a0e49780cae9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 17:05:47 +0000 Subject: [PATCH 1230/1526] Bump org.jetbrains.kotlinx:kotlinx-serialization-json (#2282) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 03c6c837c..b578b4cdd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' - implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" implementation "androidx.core:core-ktx:1.10.1" From c82e6ae95bb25845a15fc067a5858a43c3b39f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 1 Sep 2023 19:06:48 +0200 Subject: [PATCH 1231/1526] New Crowdin updates (#2287) --- app/src/main/res/values-uk/preferences_values.xml | 6 +++--- app/src/main/res/values-uk/strings.xml | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index 55cf905bb..c02efb54a 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -52,9 +52,9 @@ Середня оцінка з цілого року - Don\'t show - Only between lessons - Before and between lessons + Не показувати + Тільки між уроками + Перед і між уроками Щасливий номер diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 876562d31..d01dcfbaf 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -186,10 +186,10 @@ Зміна вчителя з %1$s на %2$s Зміна теми з %1$s на %2$s - No lesson - No lessons - No lessons - No lessons + Немає уроку + Немає уроків + Немає уроків + Немає уроків Зміна у розкладі @@ -706,7 +706,7 @@ Розгортання оцінок Позначити поточний урок Показувати групи поруч з темами - Show empty tiles where there\'s no lesson + Показувати порожні плитки там, де немає уроків Показувати діаграми в оцінках класу Показати предмети без оцінок Схема кольорів оцінок From 8cc69728aac101c6821e08ef062c0470fcbc40f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 17:29:02 +0000 Subject: [PATCH 1232/1526] Bump kotlin_version from 1.9.0 to 1.9.10 (#2281) --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 3f4d6d73b..ba792ef1e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.9.0' + kotlin_version = '1.9.10' about_libraries = '10.8.3' hilt_version = "2.47" } @@ -13,7 +13,7 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.11" + classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.13" 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.3.15' From 8478b8b7ed08043a2f75e7d298f6e2f6dcfa6b70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 18:13:24 +0000 Subject: [PATCH 1233/1526] Bump org.sonarsource.scanner.gradle:sonarqube-gradle-plugin (#2291) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ba792ef1e..b1e35375f 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ buildscript { classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" - classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.3.0.3225" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.3.1.3277" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" } From 017d46e5dbb3e828074d22ab311787d390fc98ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 18:13:39 +0000 Subject: [PATCH 1234/1526] Bump hilt_version from 2.47 to 2.48 (#2290) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b1e35375f..51f4be8f7 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.9.10' about_libraries = '10.8.3' - hilt_version = "2.47" + hilt_version = "2.48" } repositories { mavenCentral() From 0a402378099d02629187a04cb6761a16bfb56ee9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 18:30:02 +0000 Subject: [PATCH 1235/1526] Bump com.github.bastienpaulfr:Treessence from 1.0.5 to 1.1.2 (#2289) --- app/build.gradle | 2 +- app/src/hms/java/io/github/wulkanowy/utils/CrashLogUtils.kt | 4 ++-- app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt | 2 +- app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt | 2 +- .../play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b578b4cdd..fb03ca162 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -239,7 +239,7 @@ dependencies { implementation "com.jakewharton.timber:timber:5.0.1" implementation "at.favre.lib:slf4j-timber:1.0.1" - implementation 'com.github.bastienpaulfr:Treessence:1.0.5' + implementation 'com.github.bastienpaulfr:Treessence:1.1.2' implementation "com.mikepenz:aboutlibraries-core:$about_libraries" implementation "io.coil-kt:coil:2.4.0" implementation "io.github.wulkanowy:AppKillerManager:3.0.1" diff --git a/app/src/hms/java/io/github/wulkanowy/utils/CrashLogUtils.kt b/app/src/hms/java/io/github/wulkanowy/utils/CrashLogUtils.kt index 377e83666..2b1f1d30e 100644 --- a/app/src/hms/java/io/github/wulkanowy/utils/CrashLogUtils.kt +++ b/app/src/hms/java/io/github/wulkanowy/utils/CrashLogUtils.kt @@ -2,8 +2,8 @@ package io.github.wulkanowy.utils import android.util.Log import com.huawei.agconnect.crash.AGConnectCrash -import fr.bipi.tressence.base.FormatterPriorityTree -import fr.bipi.tressence.common.StackTraceRecorder +import fr.bipi.treessence.base.FormatterPriorityTree +import fr.bipi.treessence.common.StackTraceRecorder class CrashLogTree : FormatterPriorityTree(Log.VERBOSE) { diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index a39a38745..dc1061018 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -6,7 +6,7 @@ import androidx.hilt.work.HiltWorkerFactory import androidx.work.Configuration import com.yariksoffice.lingver.Lingver import dagger.hilt.android.HiltAndroidApp -import fr.bipi.tressence.file.FileLoggerTree +import fr.bipi.treessence.file.FileLoggerTree import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.ui.base.ThemeManager import io.github.wulkanowy.utils.* diff --git a/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt index 1e9f49a66..00ed2c110 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager -import fr.bipi.tressence.common.filters.Filter +import fr.bipi.treessence.common.filters.Filter import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import timber.log.Timber diff --git a/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt b/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt index f980bc4bb..2e5fad622 100644 --- a/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt @@ -2,8 +2,8 @@ package io.github.wulkanowy.utils import android.util.Log import com.google.firebase.crashlytics.FirebaseCrashlytics -import fr.bipi.tressence.base.FormatterPriorityTree -import fr.bipi.tressence.common.StackTraceRecorder +import fr.bipi.treessence.base.FormatterPriorityTree +import fr.bipi.treessence.common.StackTraceRecorder class CrashLogTree : FormatterPriorityTree(Log.VERBOSE) { From db02f0c1e12d815a1d0f619ebe99816a18654811 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 20:32:56 +0000 Subject: [PATCH 1236/1526] Bump com.google.android.gms:play-services-ads from 22.3.0 to 22.4.0 (#2301) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index fb03ca162..d1fbfd16a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -254,7 +254,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-config-ktx' playImplementation 'com.google.android.play:core:1.10.3' playImplementation 'com.google.android.play:core-ktx:1.8.1' - playImplementation 'com.google.android.gms:play-services-ads:22.3.0' + playImplementation 'com.google.android.gms:play-services-ads:22.4.0' hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.303' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.300' From 05a804832bd993f3afc5b588ba1eb292548c1a82 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 20:33:10 +0000 Subject: [PATCH 1237/1526] Bump com.google.gms:google-services from 4.3.15 to 4.4.0 (#2300) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 51f4be8f7..8aec83fbb 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ buildscript { classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.13" 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.3.15' + classpath 'com.google.gms:google-services:4.4.0' classpath 'com.huawei.agconnect:agcp:1.9.1.300' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" From 81d8f7ea4826441f9d5b632d83889fadf949a6ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 20:33:30 +0000 Subject: [PATCH 1238/1526] Bump androidx.lifecycle:lifecycle-livedata-ktx from 2.6.1 to 2.6.2 (#2295) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d1fbfd16a..46c6ed719 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -219,7 +219,7 @@ dependencies { implementation "androidx.work:work-runtime-ktx:$work_manager" playImplementation "androidx.work:work-gcm:$work_manager" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2" implementation "androidx.room:room-runtime:$room" implementation "androidx.room:room-ktx:$room" From 09d16cf6d8b5f6016fdeadf6da3ec26b632d518a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 20:33:50 +0000 Subject: [PATCH 1239/1526] Bump androidx.annotation:annotation from 1.6.0 to 1.7.0 (#2293) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 46c6ed719..5b4eeacd1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -203,7 +203,7 @@ dependencies { implementation "androidx.activity:activity-ktx:1.7.2" implementation "androidx.appcompat:appcompat:1.6.1" implementation "androidx.fragment:fragment-ktx:1.6.1" - implementation "androidx.annotation:annotation:1.6.0" + implementation "androidx.annotation:annotation:1.7.0" implementation "androidx.preference:preference-ktx:1.2.1" implementation "androidx.recyclerview:recyclerview:1.3.1" From aabd7345c1521066666f376fdc0c5c0e9b1a65ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 20:49:25 +0000 Subject: [PATCH 1240/1526] Bump com.google.firebase:firebase-bom from 32.2.3 to 32.3.1 (#2299) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5b4eeacd1..6def2c133 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -247,7 +247,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.10.0' - playImplementation platform('com.google.firebase:firebase-bom:32.2.3') + playImplementation platform('com.google.firebase:firebase-bom:32.3.1') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From 1d8d71709ff84c04bb36ae43d52bd186aebcaf7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 20:49:46 +0000 Subject: [PATCH 1241/1526] Bump com.huawei.agconnect:agconnect-crash from 1.9.1.300 to 1.9.1.301 (#2298) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6def2c133..57755d743 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -257,7 +257,7 @@ dependencies { playImplementation 'com.google.android.gms:play-services-ads:22.4.0' hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.303' - hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.300' + hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.301' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From ff2aa6f195990be56bdc87a115075a5ef57e7bb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 20:59:38 +0000 Subject: [PATCH 1242/1526] Bump com.huawei.agconnect:agcp from 1.9.1.300 to 1.9.1.301 (#2297) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8aec83fbb..e7543d972 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { 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.300' + classpath 'com.huawei.agconnect:agcp:1.9.1.301' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" From c4a3da93ca41cb78806ddfd6aff1ab42e72739c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 21:00:06 +0000 Subject: [PATCH 1243/1526] Bump com.huawei.hms:hianalytics from 6.10.0.303 to 6.12.0.300 (#2294) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 57755d743..191a574e9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -256,7 +256,7 @@ dependencies { playImplementation 'com.google.android.play:core-ktx:1.8.1' playImplementation 'com.google.android.gms:play-services-ads:22.4.0' - hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.303' + hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.301' releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" From afd0c8513a034a89bb240f0592d442793b1edb7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 17:43:16 +0000 Subject: [PATCH 1244/1526] Bump mockk from 1.13.7 to 1.13.8 (#2305) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 191a574e9..abe1a4b18 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -186,7 +186,7 @@ ext { android_hilt = "1.0.0" room = "2.5.2" chucker = "3.5.2" - mockk = "1.13.7" + mockk = "1.13.8" coroutines = "1.7.3" } From 646b4a149d64b55ac9699d62332831ad65c8a32e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 17:43:41 +0000 Subject: [PATCH 1245/1526] Bump about_libraries from 10.8.3 to 10.9.0 (#2304) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e7543d972..651e9ca16 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.9.10' - about_libraries = '10.8.3' + about_libraries = '10.9.0' hilt_version = "2.48" } repositories { From 0fa197d5204a5a56b51da2a497dd5241bc60c5cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 25 Sep 2023 19:43:57 +0200 Subject: [PATCH 1246/1526] New Crowdin updates (#2303) --- app/src/main/res/values-cs/preferences_values.xml | 6 +++--- app/src/main/res/values-cs/strings.xml | 10 +++++----- app/src/main/res/values-sk/preferences_values.xml | 6 +++--- app/src/main/res/values-sk/strings.xml | 10 +++++----- app/src/main/res/values-uk/strings.xml | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/values-cs/preferences_values.xml b/app/src/main/res/values-cs/preferences_values.xml index 2cf402631..1590c47ab 100644 --- a/app/src/main/res/values-cs/preferences_values.xml +++ b/app/src/main/res/values-cs/preferences_values.xml @@ -52,9 +52,9 @@ Průměr známek z celého roku - Don\'t show - Only between lessons - Before and between lessons + Nezobrazovat + Pouze mezi lekcemi + Před a mezi lekcemi Šťastné číslo diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index a63a0aa12..e9e049326 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -186,10 +186,10 @@ Změna učitele z %1$s na %2$s Změna předmětu z %1$s na %2$s - No lesson - No lessons - No lessons - No lessons + Žádné lekce + Žádné lekce + Žádné lekce + Žádné lekce Změna plánu lekcí @@ -706,7 +706,7 @@ Rozvíjení známek Označit aktuální lekci Zobrazit skupiny vedle předmětů - Show empty tiles where there\'s no lesson + Zobrazit prázdné dlaždice, kde není žádná lekce Zobrazit seznam grafů v známkách třídy Zobrazit předměty bez známek Známky barevné schéma diff --git a/app/src/main/res/values-sk/preferences_values.xml b/app/src/main/res/values-sk/preferences_values.xml index fd393394f..6cd221540 100644 --- a/app/src/main/res/values-sk/preferences_values.xml +++ b/app/src/main/res/values-sk/preferences_values.xml @@ -52,9 +52,9 @@ Priemer známok z celého roka - Don\'t show - Only between lessons - Before and between lessons + Nezobrazovať + Iba medzi lekciami + Pred a medzi lekciami Šťastné číslo diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d1990e35e..d059927eb 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -186,10 +186,10 @@ Zmena učiteľa z %1$s na %2$s Zmena predmetu z %1$s na %2$s - No lesson - No lessons - No lessons - No lessons + Žiadne lekcie + Žiadne lekcie + Žiadne lekcie + Žiadne lekcie Zmena plánu lekcií @@ -706,7 +706,7 @@ Rozvijanie známok Označiť aktuálne lekciu Zobraziť skupiny vedľa predmetov - Show empty tiles where there\'s no lesson + Zobraziť prázdne dlaždice, kde nie je žiadne lekcie Zobraziť zoznam grafov v známkach triedy Zobraziť predmety bez známok Známky farebnú schému diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index d01dcfbaf..b46b9afe9 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -55,7 +55,7 @@ Використовуйте призначений логін замість адреси e-mail Використовуйте призначений логін або адресу e-mail в @%1$s Неправильний symbol - Студента не знайдено. Перевірте symbol та обранний тип щоденника UONET+ + Студента не знайдено. Перевірте symbol та обраний тип щоденника UONET+ Цього учня вже авторизовано Symbol можно знайти на сторінці щоденника у Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nПереконайтеся, що ви вказали відповідний щоденник у полі Тип щоденника UONET+ на першому екрані логування Виберіть учнів для авторизації в додатку From 95b4d53fac498f81ef82d74b0836763fbd43c9bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 25 Sep 2023 19:44:13 +0200 Subject: [PATCH 1247/1526] Add schools API integration (#2302) --- app/build.gradle | 3 + .../github/wulkanowy/utils/IntegrityHelper.kt | 11 +++ .../github/wulkanowy/utils/IntegrityHelper.kt | 11 +++ .../io/github/wulkanowy/data/DataModule.kt | 17 ++++- .../wulkanowy/data/api/SchoolsService.kt | 14 ++++ .../github/wulkanowy/data/pojos/LoginEvent.kt | 21 ++++++ .../data/repositories/SchoolsRepository.kt | 68 +++++++++++++++++++ .../LoginStudentSelectPresenter.kt | 29 +++++--- .../java/io/github/wulkanowy/utils/AppInfo.kt | 3 +- .../github/wulkanowy/utils/IntegrityHelper.kt | 27 ++++++++ .../LoginStudentSelectPresenterTest.kt | 6 ++ 11 files changed, 195 insertions(+), 15 deletions(-) create mode 100644 app/src/fdroid/java/io/github/wulkanowy/utils/IntegrityHelper.kt create mode 100644 app/src/hms/java/io/github/wulkanowy/utils/IntegrityHelper.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/api/SchoolsService.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/pojos/LoginEvent.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt create mode 100644 app/src/play/java/io/github/wulkanowy/utils/IntegrityHelper.kt diff --git a/app/build.gradle b/app/build.gradle index abe1a4b18..d85d0a3d8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,6 +69,7 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\"" + buildConfigField "String", "SCHOOLS_BASE_URL", '"https://schools.wulkanowy.net.pl"' } debug { minifyEnabled false @@ -78,6 +79,7 @@ android { versionNameSuffix "-dev" ext.enableCrashlytics = project.hasProperty("enableFirebase") buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\"" + buildConfigField "String", "SCHOOLS_BASE_URL", '"https://schools.wulkanowy.net.pl"' } } @@ -255,6 +257,7 @@ dependencies { playImplementation 'com.google.android.play:core:1.10.3' playImplementation 'com.google.android.play:core-ktx:1.8.1' playImplementation 'com.google.android.gms:play-services-ads:22.4.0' + playImplementation "com.google.android.play:integrity:1.2.0" hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.301' diff --git a/app/src/fdroid/java/io/github/wulkanowy/utils/IntegrityHelper.kt b/app/src/fdroid/java/io/github/wulkanowy/utils/IntegrityHelper.kt new file mode 100644 index 000000000..7af68058c --- /dev/null +++ b/app/src/fdroid/java/io/github/wulkanowy/utils/IntegrityHelper.kt @@ -0,0 +1,11 @@ +package io.github.wulkanowy.utils + +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class IntegrityHelper @Inject constructor() { + + @Suppress("UNUSED_PARAMETER") + fun getIntegrityToken(requestId: String): String? = null +} diff --git a/app/src/hms/java/io/github/wulkanowy/utils/IntegrityHelper.kt b/app/src/hms/java/io/github/wulkanowy/utils/IntegrityHelper.kt new file mode 100644 index 000000000..7af68058c --- /dev/null +++ b/app/src/hms/java/io/github/wulkanowy/utils/IntegrityHelper.kt @@ -0,0 +1,11 @@ +package io.github.wulkanowy.utils + +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class IntegrityHelper @Inject constructor() { + + @Suppress("UNUSED_PARAMETER") + fun getIntegrityToken(requestId: String): String? = null +} diff --git a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt index c9e4990f9..bea3f7064 100644 --- a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt @@ -14,6 +14,7 @@ import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import io.github.wulkanowy.data.api.AdminMessageService +import io.github.wulkanowy.data.api.SchoolsService import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.repositories.PreferencesRepository @@ -82,19 +83,29 @@ internal class DataModule { @Singleton @Provides - fun provideRetrofit( + fun provideAdminMessageService( okHttpClient: OkHttpClient, json: Json, appInfo: AppInfo - ): Retrofit = Retrofit.Builder() + ): AdminMessageService = Retrofit.Builder() .baseUrl(appInfo.messagesBaseUrl) .client(okHttpClient) .addConverterFactory(json.asConverterFactory("application/json".toMediaType())) .build() + .create() @Singleton @Provides - fun provideAdminMessageService(retrofit: Retrofit): AdminMessageService = retrofit.create() + fun provideSchoolsService( + okHttpClient: OkHttpClient, + json: Json, + appInfo: AppInfo, + ): SchoolsService = Retrofit.Builder() + .baseUrl(appInfo.schoolsBaseUrl) + .client(okHttpClient) + .addConverterFactory(json.asConverterFactory("application/json".toMediaType())) + .build() + .create() @Singleton @Provides diff --git a/app/src/main/java/io/github/wulkanowy/data/api/SchoolsService.kt b/app/src/main/java/io/github/wulkanowy/data/api/SchoolsService.kt new file mode 100644 index 000000000..a7da9b63c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/api/SchoolsService.kt @@ -0,0 +1,14 @@ +package io.github.wulkanowy.data.api + +import io.github.wulkanowy.data.pojos.IntegrityRequest +import io.github.wulkanowy.data.pojos.LoginEvent +import retrofit2.http.Body +import retrofit2.http.POST +import javax.inject.Singleton + +@Singleton +interface SchoolsService { + + @POST("/log/loginEvent") + suspend fun logLoginEvent(@Body request: IntegrityRequest) +} diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/LoginEvent.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/LoginEvent.kt new file mode 100644 index 000000000..c2b4d2ded --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/LoginEvent.kt @@ -0,0 +1,21 @@ +package io.github.wulkanowy.data.pojos + +import kotlinx.serialization.Serializable + +@Serializable +data class LoginEvent( + val uuid: String, + val schoolName: String, + val schoolShort: String, + val schoolAddress: String, + val scraperBaseUrl: String, + val symbol: String, + val schoolId: String, + val loginType: String, +) + +@Serializable +data class IntegrityRequest( + val tokenString: String, + val data: T, +) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt new file mode 100644 index 000000000..9c6429343 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt @@ -0,0 +1,68 @@ +package io.github.wulkanowy.data.repositories + +import io.github.wulkanowy.data.api.SchoolsService +import io.github.wulkanowy.data.db.entities.Semester +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentWithSemesters +import io.github.wulkanowy.data.pojos.IntegrityRequest +import io.github.wulkanowy.data.pojos.LoginEvent +import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.ui.modules.login.LoginData +import io.github.wulkanowy.utils.IntegrityHelper +import io.github.wulkanowy.utils.getCurrentOrLast +import io.github.wulkanowy.utils.init +import kotlinx.coroutines.withTimeout +import timber.log.Timber +import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton +import kotlin.time.Duration.Companion.seconds + +@Singleton +class SchoolsRepository @Inject constructor( + private val integrityHelper: IntegrityHelper, + private val schoolsService: SchoolsService, + private val sdk: Sdk, +) { + + suspend fun logSchoolLogin(loginData: LoginData, students: List) { + students.forEach { + runCatching { + withTimeout(10.seconds) { + logLogin(loginData, it.student, it.semesters.getCurrentOrLast()) + } + } + .onFailure { Timber.e(it) } + } + } + + private suspend fun logLogin(loginData: LoginData, student: Student, semester: Semester) { + val requestId = UUID.randomUUID().toString() + val token = integrityHelper.getIntegrityToken(requestId) ?: return + + val schoolInfo = sdk + .init(student.copy(password = loginData.password)) + .switchDiary( + diaryId = semester.diaryId, + kindergartenDiaryId = semester.kindergartenDiaryId, + schoolYear = semester.schoolYear + ) + .getSchool() + + schoolsService.logLoginEvent( + IntegrityRequest( + tokenString = token, + data = LoginEvent( + uuid = requestId, + schoolAddress = schoolInfo.address, + schoolName = schoolInfo.name, + schoolShort = student.schoolShortName, + scraperBaseUrl = student.scrapperBaseUrl, + loginType = student.loginType, + symbol = student.symbol, + schoolId = student.schoolSymbol, + ) + ) + ) + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 70862e828..0da86e56e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.data.pojos.RegisterStudent import io.github.wulkanowy.data.pojos.RegisterSymbol import io.github.wulkanowy.data.pojos.RegisterUnit import io.github.wulkanowy.data.pojos.RegisterUser +import io.github.wulkanowy.data.repositories.SchoolsRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.resourceFlow import io.github.wulkanowy.sdk.scrapper.login.AccountPermissionException @@ -26,6 +27,7 @@ import javax.inject.Inject class LoginStudentSelectPresenter @Inject constructor( studentRepository: StudentRepository, + private val schoolsRepository: SchoolsRepository, private val loginErrorHandler: LoginErrorHandler, private val syncManager: SyncManager, private val analytics: AnalyticsHelper, @@ -236,17 +238,20 @@ class LoginStudentSelectPresenter @Inject constructor( } private fun registerStudents(students: List) { - val studentsWithSemesters = students - .filterIsInstance().map { item -> - item.student.mapToStudentWithSemesters( - user = registerUser, - symbol = item.symbol, - scrapperDomainSuffix = loginData.domainSuffix, - unit = item.unit, - colors = appInfo.defaultColorsForAvatar, - ) - } - resourceFlow { studentRepository.saveStudents(studentsWithSemesters) } + val filteredStudents = students.filterIsInstance() + val studentsWithSemesters = filteredStudents.map { item -> + item.student.mapToStudentWithSemesters( + user = registerUser, + symbol = item.symbol, + scrapperDomainSuffix = loginData.domainSuffix, + unit = item.unit, + colors = appInfo.defaultColorsForAvatar, + ) + } + resourceFlow { + studentRepository.saveStudents(studentsWithSemesters) + schoolsRepository.logSchoolLogin(loginData, studentsWithSemesters) + } .logResourceStatus("registration") .onEach { when (it) { @@ -254,11 +259,13 @@ class LoginStudentSelectPresenter @Inject constructor( showProgress(true) showContent(false) } + is Resource.Success -> { syncManager.startOneTimeSyncWorker(quiet = true) view?.navigateToNext() logRegisterEvent(studentsWithSemesters) } + is Resource.Error -> { view?.apply { showProgress(false) diff --git a/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt b/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt index 962e5b208..e16db53c6 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt @@ -25,7 +25,8 @@ open class AppInfo @Inject constructor() { open val systemModel: String get() = Build.MODEL - open val messagesBaseUrl = BuildConfig.MESSAGES_BASE_URL + open val messagesBaseUrl: String = BuildConfig.MESSAGES_BASE_URL + open val schoolsBaseUrl: String = BuildConfig.SCHOOLS_BASE_URL @Suppress("DEPRECATION") open val systemLanguage: String diff --git a/app/src/play/java/io/github/wulkanowy/utils/IntegrityHelper.kt b/app/src/play/java/io/github/wulkanowy/utils/IntegrityHelper.kt new file mode 100644 index 000000000..41df0487a --- /dev/null +++ b/app/src/play/java/io/github/wulkanowy/utils/IntegrityHelper.kt @@ -0,0 +1,27 @@ +package io.github.wulkanowy.utils + +import android.content.Context +import com.google.android.play.core.integrity.IntegrityManagerFactory +import com.google.android.play.core.integrity.IntegrityTokenRequest +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.tasks.await +import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class IntegrityHelper @Inject constructor( + @ApplicationContext private val context: Context, +) { + + suspend fun getIntegrityToken(nonce: String): String? { + val integrityManager = IntegrityManagerFactory.create(context) + + val integrityTokenResponse = integrityManager.requestIntegrityToken( + IntegrityTokenRequest.builder() + .setNonce(nonce) + .build() + ) + return integrityTokenResponse.await().token() + } +} diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index 06aabec72..fad6436d8 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -5,6 +5,7 @@ import io.github.wulkanowy.data.pojos.RegisterStudent import io.github.wulkanowy.data.pojos.RegisterSymbol import io.github.wulkanowy.data.pojos.RegisterUnit import io.github.wulkanowy.data.pojos.RegisterUser +import io.github.wulkanowy.data.repositories.SchoolsRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.scrapper.Scrapper @@ -40,6 +41,9 @@ class LoginStudentSelectPresenterTest { @MockK lateinit var studentRepository: StudentRepository + @MockK + lateinit var schoolsRepository: SchoolsRepository + @MockK(relaxed = true) lateinit var analytics: AnalyticsHelper @@ -110,6 +114,7 @@ class LoginStudentSelectPresenterTest { clearMocks(studentRepository, loginStudentSelectView) coEvery { studentRepository.getSavedStudents(false) } returns emptyList() + coEvery { schoolsRepository.logSchoolLogin(any(), any()) } just Runs every { loginStudentSelectView.initView() } just Runs every { loginStudentSelectView.symbols } returns emptyMap() @@ -120,6 +125,7 @@ class LoginStudentSelectPresenterTest { presenter = LoginStudentSelectPresenter( studentRepository = studentRepository, + schoolsRepository = schoolsRepository, loginErrorHandler = errorHandler, syncManager = syncManager, analytics = analytics, From 4d3b16ec8073285f724448f4e73dbe5b75b9e786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 26 Sep 2023 21:01:25 +0200 Subject: [PATCH 1248/1526] Fix password toggle icon tint after clearing error (#2309) --- .../wulkanowy/ui/modules/login/form/LoginFormFragment.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index ff7fd864b..aa2da3114 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -184,7 +184,9 @@ class LoginFormFragment : BaseFragment(R.layout.fragme override fun clearPassError() { binding.loginFormPassLayout.error = null - binding.loginFormPassLayout.setEndIconTintList(null) + binding.loginFormPassLayout.setEndIconTintList( + requireContext().getAttrColorStateList(R.attr.colorOnSurface) + ) binding.loginFormErrorBox.isVisible = false } From 183544646846be7f6fd1c160825b3a07e8c4e39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 26 Sep 2023 21:01:59 +0200 Subject: [PATCH 1249/1526] Fix password reset related issues (#2308) * Fix login hint in password reset field * Don't hide first password reset button * Change recover button label --- .../wulkanowy/ui/modules/login/form/LoginFormFragment.kt | 3 +-- .../ui/modules/login/recover/LoginRecoverPresenter.kt | 4 ++-- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index aa2da3114..0a2ea5d6d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -238,8 +238,7 @@ class LoginFormFragment : BaseFragment(R.layout.fragme } override fun showContact(show: Boolean) { - binding.loginFormContact.visibility = if (show) VISIBLE else GONE - binding.loginFormRecoverLink.visibility = if (show) GONE else VISIBLE + binding.loginFormContact.isVisible = show } override fun openPrivacyPolicyPage() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt index 3d0493012..a424df40d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt @@ -46,7 +46,7 @@ class LoginRecoverPresenter @Inject constructor( fun updateFields() { view?.run { - setUsernameHint(if ("standard" in recoverHostValue) emailHintString else loginPeselEmailHintString) + setUsernameHint(if ("email" in recoverHostValue) emailHintString else loginPeselEmailHintString) } } @@ -92,7 +92,7 @@ class LoginRecoverPresenter @Inject constructor( isCorrect = false } - if ("standard" in host && "@" !in username) { + if ("email" in host && "@" !in username) { view?.setUsernameError(view?.invalidEmailString.orEmpty()) isCorrect = false } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ce277bdce..7da41b3d4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -76,7 +76,7 @@ Zgłoszenie: Problemy z logowaniem Informacje o aplikacji:\n\nUrządzenie: %1$s\nWersja SDK: %2$s\nWersja aplikacji: %3$s\nDodatkowe informacje: %4$s\nIdentyfikator instalacji: %5$s\nOstatni błąd: %6$s\n\nNazwa szkoły i miejscowość: Make sure you select the correct UONET+ register variation! - I forgot my password + Reset password Recover your account Recover Student is already signed in From 26a95ecb995f701cd9eb7184499c7467c4c4527d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 26 Sep 2023 21:02:36 +0200 Subject: [PATCH 1250/1526] Auto select students for login (#2307) * Auto select students for login * Add sign in icon to sign in button on student select screen --- .../LoginStudentSelectPresenter.kt | 25 ++++++++++++++++++- app/src/main/res/drawable/ic_login.xml | 5 ++++ .../layout/fragment_login_student_select.xml | 2 ++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_login.xml diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 0da86e56e..4e5cd5108 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -21,6 +21,7 @@ import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.ifNullOrBlank +import io.github.wulkanowy.utils.isCurrent import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject @@ -73,7 +74,14 @@ class LoginStudentSelectPresenter @Inject constructor( students = it.dataOrNull.orEmpty() when (it) { is Resource.Loading -> Timber.d("Login student select students load started") - is Resource.Success -> refreshItems() + is Resource.Success -> { + getStudentsWithCurrentlyActiveSemesters() + selectedStudents.clear() + selectedStudents.addAll(getStudentsWithCurrentlyActiveSemesters()) + view?.enableSignIn(selectedStudents.isNotEmpty()) + refreshItems() + } + is Resource.Error -> { errorHandler.dispatch(it.error) lastError = it.error @@ -83,6 +91,21 @@ class LoginStudentSelectPresenter @Inject constructor( }.launch() } + private fun getStudentsWithCurrentlyActiveSemesters(): List { + val students = registerUser.symbols.flatMap { symbol -> + symbol.schools.flatMap { unit -> + unit.students.map { + createStudentItem(it, symbol, unit, students) + } + } + } + return students.filter { student -> + student.student.semesters.any { semester -> + semester.isCurrent() + } + } + } + private fun createItems(): List = buildList { val notEmptySymbols = registerUser.symbols.filter { it.schools.isNotEmpty() } val emptySymbols = registerUser.symbols.filter { it.schools.isEmpty() } diff --git a/app/src/main/res/drawable/ic_login.xml b/app/src/main/res/drawable/ic_login.xml new file mode 100644 index 000000000..57aef3dca --- /dev/null +++ b/app/src/main/res/drawable/ic_login.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_login_student_select.xml b/app/src/main/res/layout/fragment_login_student_select.xml index c47b9ae35..04c808857 100644 --- a/app/src/main/res/layout/fragment_login_student_select.xml +++ b/app/src/main/res/layout/fragment_login_student_select.xml @@ -56,6 +56,8 @@ android:layout_marginBottom="32dp" android:enabled="false" android:text="@string/login_sign_in" + app:icon="@drawable/ic_login" + app:iconGravity="end" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/loginStudentSelectRecycler" /> From 58d5196ac9847ff7db7033e9df95c8febf27b9ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 26 Sep 2023 22:25:23 +0200 Subject: [PATCH 1251/1526] Improve symbol input field (#2312) --- .../ui/modules/login/symbol/LoginSymbolFragment.kt | 7 +++++++ .../ui/modules/login/symbol/LoginSymbolPresenter.kt | 11 +++++++++++ .../ui/modules/login/symbol/LoginSymbolView.kt | 2 ++ app/src/main/res/layout/fragment_login_symbol.xml | 4 +++- app/src/main/res/values/strings.xml | 4 +++- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt index 692aaeb76..679576599 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt @@ -100,6 +100,13 @@ class LoginSymbolFragment : } } + override fun setErrorSymbolDefinitelyInvalid() { + with(binding.loginSymbolNameLayout) { + requestFocus() + error = getString(R.string.login_invalid_symbol_definitely) + } + } + override fun setErrorSymbolRequire() { setErrorSymbol(getString(R.string.error_field_required)) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index 91fe1ac3c..01855fcec 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -53,6 +53,10 @@ class LoginSymbolPresenter @Inject constructor( view?.setErrorSymbolRequire() return } + if (isFormDefinitelyInvalid()) { + view?.setErrorSymbolDefinitelyInvalid() + return + } loginData = loginData.copy( symbol = view?.symbolValue?.getNormalizedSymbol(), @@ -130,6 +134,13 @@ class LoginSymbolPresenter @Inject constructor( }.launch("login") } + private fun isFormDefinitelyInvalid(): Boolean { + val definitelyInvalidSymbols = listOf("vulcan", "uonet", "wulkanowy", "standardowa") + val normalizedSymbol = view?.symbolValue.orEmpty().getNormalizedSymbol() + + return normalizedSymbol in definitelyInvalidSymbols + } + fun onFaqClick() { view?.openFaqPage() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt index 6585c00f4..3c10d5744 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt @@ -18,6 +18,8 @@ interface LoginSymbolView : BaseView { fun setErrorSymbolInvalid() + fun setErrorSymbolDefinitelyInvalid() + fun setErrorSymbolRequire() fun setErrorSymbol(message: String) diff --git a/app/src/main/res/layout/fragment_login_symbol.xml b/app/src/main/res/layout/fragment_login_symbol.xml index d928d65fd..37f4c731a 100644 --- a/app/src/main/res/layout/fragment_login_symbol.xml +++ b/app/src/main/res/layout/fragment_login_symbol.xml @@ -141,7 +141,9 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/loginSymbolHelper"> + app:layout_constraintTop_toBottomOf="@+id/loginSymbolHelper" + app:placeholderText="@string/login_symbol_placeholder" + app:placeholderTextColor="?colorTertiary"> Token PIN Symbol + E.g. \"lodz\" or \"powiatjaroslawski\" Sign in Password too short Login details are incorrect @@ -59,7 +60,8 @@ Invalid email Use the assigned login instead of email Use the assigned login or email in @%1$s - Invalid symbol + Invalid symbol. If you cannot find it, please contact the school + Don\'t make this up! If you cannot find it, please contact the school Student not found. Validate the symbol and the chosen variation of the UONET+ register Selected student is already logged in The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the first login screen From 711de0f77f0954d78b70c2e7d5689aa8bada7919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 26 Sep 2023 22:26:19 +0200 Subject: [PATCH 1252/1526] Fix average calculation when there is no real semesters available (#2310) --- .../github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index 2d63aae4d..ec4bd8e8c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -58,7 +58,7 @@ class GradeAverageProvider @Inject constructor( when (params.gradeAverageMode) { ONE_SEMESTER -> getGradeSubjects( student = student, - semester = semesters.single { it.semesterId == semesterId }, + semester = semesters.first { it.semesterId == semesterId }, forceRefresh = forceRefresh, params = params, ) From fca69e723427dbb67f90cc32bb8be09dad99903a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 26 Sep 2023 22:27:08 +0200 Subject: [PATCH 1253/1526] Add form dialog to login e-mail support (#2306) --- .../modules/login/form/LoginFormFragment.kt | 19 +-- .../modules/login/form/LoginFormPresenter.kt | 41 ++++-- .../ui/modules/login/form/LoginFormView.kt | 3 +- .../LoginStudentSelectFragment.kt | 20 +-- .../LoginStudentSelectPresenter.kt | 33 ++--- .../studentselect/LoginStudentSelectView.kt | 3 +- .../login/support/LoginSupportDialog.kt | 133 ++++++++++++++++++ .../modules/login/support/LoginSupportInfo.kt | 12 ++ .../login/symbol/LoginSymbolFragment.kt | 25 ++-- .../login/symbol/LoginSymbolPresenter.kt | 19 ++- .../modules/login/symbol/LoginSymbolView.kt | 3 +- .../wulkanowy/ui/modules/main/MainActivity.kt | 1 - .../main/res/layout/dialog_login_support.xml | 92 ++++++++++++ .../main/res/layout/fragment_dashboard.xml | 5 +- app/src/main/res/values/strings.xml | 8 +- app/src/main/res/values/styles.xml | 1 - 16 files changed, 322 insertions(+), 96 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportInfo.kt create mode 100644 app/src/main/res/layout/dialog_login_support.xml diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index 0a2ea5d6d..8e9b86fa3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -17,6 +17,8 @@ import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.dashboard.viewholders.AdminMessageViewHolder import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginData +import io.github.wulkanowy.ui.modules.login.support.LoginSupportDialog +import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo import io.github.wulkanowy.utils.* import javax.inject.Inject @@ -282,20 +284,7 @@ class LoginFormFragment : BaseFragment(R.layout.fragme presenter.updateCustomDomainSuffixVisibility() } - override fun openEmail(lastError: String) { - context?.openEmailClient( - chooserTitle = requireContext().getString(R.string.login_email_intent_title), - email = "wulkanowyinc@gmail.com", - subject = requireContext().getString(R.string.login_email_subject), - body = requireContext().getString( - R.string.login_email_text, - "${appInfo.systemManufacturer} ${appInfo.systemModel}", - appInfo.systemVersion.toString(), - "${appInfo.versionName}-${appInfo.buildFlavor}", - "$formHostValue/$formHostSymbol", - preferencesRepository.installationId, - lastError - ) - ) + override fun openEmail(supportInfo: LoginSupportInfo) { + LoginSupportDialog.newInstance(supportInfo).show(childFragmentManager, "support_dialog") } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index 4e0404d9b..ad535c382 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -17,6 +17,7 @@ import io.github.wulkanowy.domain.adminmessage.GetAppropriateAdminMessageUseCase import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.LoginErrorHandler +import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.ifNullOrBlank @@ -133,7 +134,7 @@ class LoginFormPresenter @Inject constructor( } } - fun onSignInClick() { + private fun getLoginData(): LoginData { val email = view?.formUsernameValue.orEmpty().trim() val password = view?.formPassValue.orEmpty().trim() val host = view?.formHostValue.orEmpty().trim() @@ -142,15 +143,27 @@ class LoginFormPresenter @Inject constructor( }.orEmpty() val symbol = view?.formHostSymbol.orEmpty().trim() - if (!validateCredentials(email, password, host)) return + return LoginData( + login = email, + password = password, + baseUrl = host, + domainSuffix = domainSuffix, + symbol = symbol + ) + } + + fun onSignInClick() { + val loginData = getLoginData() + + if (!validateCredentials(loginData.login, loginData.password, loginData.baseUrl)) return resourceFlow { studentRepository.getUserSubjectsFromScrapper( - email = email, - password = password, - scrapperBaseUrl = host, - domainSuffix = domainSuffix, - symbol = symbol + email = loginData.login, + password = loginData.password, + scrapperBaseUrl = loginData.baseUrl, + domainSuffix = loginData.domainSuffix, + symbol = loginData.symbol.orEmpty(), ) } .logResourceStatus("login") @@ -162,7 +175,6 @@ class LoginFormPresenter @Inject constructor( } } .onResourceSuccess { - val loginData = LoginData(email, password, host, domainSuffix, symbol) when (it.symbols.size) { 0 -> view?.navigateToSymbol(loginData) else -> view?.navigateToStudentSelect(loginData, it) @@ -170,7 +182,7 @@ class LoginFormPresenter @Inject constructor( analytics.logEvent( "registration_form", "success" to true, - "scrapperBaseUrl" to host, + "scrapperBaseUrl" to loginData.baseUrl, "error" to "No error" ) } @@ -187,7 +199,7 @@ class LoginFormPresenter @Inject constructor( analytics.logEvent( "registration_form", "success" to false, - "scrapperBaseUrl" to host, + "scrapperBaseUrl" to loginData.baseUrl, "error" to it.message.ifNullOrBlank { "No message" } ) } @@ -199,7 +211,14 @@ class LoginFormPresenter @Inject constructor( } fun onEmailClick() { - view?.openEmail(lastError?.message.ifNullOrBlank { "none" }) + view?.openEmail( + LoginSupportInfo( + loginData = getLoginData(), + lastErrorMessage = lastError?.message, + registerUser = null, + enteredSymbol = null, + ) + ) } fun onRecoverClick() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt index 5b4dcadfe..f2b7b1003 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt @@ -4,6 +4,7 @@ import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.modules.login.LoginData +import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo interface LoginFormView : BaseView { @@ -79,7 +80,7 @@ interface LoginFormView : BaseView { fun openFaqPage() - fun openEmail(lastError: String) + fun openEmail(supportInfo: LoginSupportInfo) fun openAdvancedLogin() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index c33d12faa..06efd8d98 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -10,8 +10,11 @@ import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.FragmentLoginStudentSelectBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginData +import io.github.wulkanowy.ui.modules.login.support.LoginSupportDialog +import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser @@ -106,21 +109,8 @@ class LoginStudentSelectFragment : context?.openInternetBrowser("https://discord.gg/vccAQBr", ::showMessage) } - override fun openEmail(lastError: String) { - context?.openEmailClient( - chooserTitle = requireContext().getString(R.string.login_email_intent_title), - email = "wulkanowyinc@gmail.com", - subject = requireContext().getString(R.string.login_email_subject), - body = requireContext().getString( - R.string.login_email_text, - "${appInfo.systemManufacturer} ${appInfo.systemModel}", - appInfo.systemVersion.toString(), - "${appInfo.versionName}-${appInfo.buildFlavor}", - "Select users to log in", - preferencesRepository.installationId, - lastError - ) - ) + override fun openEmail(supportInfo: LoginSupportInfo) { + LoginSupportDialog.newInstance(supportInfo).show(childFragmentManager, "support_dialog") } override fun onDestroyView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 4e5cd5108..cc9e422ed 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -12,15 +12,14 @@ import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.SchoolsRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.resourceFlow -import io.github.wulkanowy.sdk.scrapper.login.AccountPermissionException import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.LoginErrorHandler +import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AppInfo -import io.github.wulkanowy.utils.ifNullOrBlank import io.github.wulkanowy.utils.isCurrent import kotlinx.coroutines.flow.onEach import timber.log.Timber @@ -311,28 +310,14 @@ class LoginStudentSelectPresenter @Inject constructor( } private fun onEmailClick() { - view?.openEmail(lastError?.message.ifNullOrBlank { - loginData.baseUrl + "/" + loginData.symbol + "\n" + registerUser.symbols.filterNot { - (it.error is AccountPermissionException || it.error is InvalidSymbolException) && it.symbol != loginData.symbol - }.joinToString(";\n") { symbol -> - buildString { - append(" -") - append(symbol.symbol) - append("(${symbol.error?.message?.let { it.take(46) + "..." } ?: symbol.schools.size})") - if (symbol.schools.isNotEmpty()) { - append(": ") - } - append(symbol.schools.joinToString(", ") { unit -> - buildString { - append(unit.schoolShortName) - append("(${unit.error?.message?.let { it.take(46) + "..." } ?: unit.students.size})") - } - }) - } - } + "\nPozostałe: " + registerUser.symbols.filter { - it.error is AccountPermissionException || it.error is InvalidSymbolException - }.joinToString(", ") { it.symbol } - }) + view?.openEmail( + LoginSupportInfo( + loginData = loginData, + registerUser = registerUser, + lastErrorMessage = lastError?.message, + enteredSymbol = loginData.symbol, + ) + ) } private fun logRegisterEvent( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt index 39f312bf3..b69700f17 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt @@ -2,6 +2,7 @@ package io.github.wulkanowy.ui.modules.login.studentselect import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.modules.login.LoginData +import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo interface LoginStudentSelectView : BaseView { @@ -23,5 +24,5 @@ interface LoginStudentSelectView : BaseView { fun openDiscordInvite() - fun openEmail(lastError: String) + fun openEmail(supportInfo: LoginSupportInfo) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt new file mode 100644 index 000000000..d2b1d2ce6 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt @@ -0,0 +1,133 @@ +package io.github.wulkanowy.ui.modules.login.support + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.os.bundleOf +import androidx.core.widget.doOnTextChanged +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R +import io.github.wulkanowy.data.repositories.PreferencesRepository +import io.github.wulkanowy.databinding.DialogLoginSupportBinding +import io.github.wulkanowy.sdk.scrapper.login.AccountPermissionException +import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException +import io.github.wulkanowy.ui.base.BaseDialogFragment +import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.openEmailClient +import io.github.wulkanowy.utils.serializable +import javax.inject.Inject + +@AndroidEntryPoint +class LoginSupportDialog : BaseDialogFragment() { + + @Inject + lateinit var appInfo: AppInfo + + @Inject + lateinit var preferencesRepository: PreferencesRepository + + private lateinit var supportInfo: LoginSupportInfo + + companion object { + private const val ARGUMENT_KEY = "info" + + fun newInstance(info: LoginSupportInfo) = LoginSupportDialog().apply { + arguments = bundleOf(ARGUMENT_KEY to info) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_FRAME, R.style.WulkanowyTheme_NoActionBar) + supportInfo = requireArguments().serializable(ARGUMENT_KEY) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val binding = DialogLoginSupportBinding.inflate(inflater) + .apply { binding = this } + binding.dialogLoginSupportToolbar.setNavigationOnClickListener { dismiss() } + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + with(binding) { + dialogLoginSupportSchoolInput.doOnTextChanged { _, _, _, _ -> + with(dialogLoginSupportSchoolLayout) { + isErrorEnabled = false + error = null + } + } + dialogLoginSupportSubmit.setOnClickListener { + if (dialogLoginSupportSchoolInput.text.isNullOrBlank()) { + with(dialogLoginSupportSchoolLayout) { + isErrorEnabled = true + error = getString(R.string.error_field_required) + } + } else { + onSubmitClick() + dismiss() + } + } + } + } + + private fun onSubmitClick() { + with(binding) { + context?.openEmailClient( + chooserTitle = requireContext().getString(R.string.login_email_intent_title), + email = "wulkanowyinc@gmail.com", + subject = requireContext().getString(R.string.login_email_subject), + body = requireContext().getString( + R.string.login_email_text, + "${appInfo.systemManufacturer} ${appInfo.systemModel}", + appInfo.systemVersion.toString(), + "${appInfo.versionName}-${appInfo.buildFlavor}", + supportInfo.loginData.baseUrl + "/" + supportInfo.loginData.symbol, + preferencesRepository.installationId, + getLastErrorFromStudentSelectScreen(), + dialogLoginSupportSchoolInput.text.takeIf { !it.isNullOrBlank() } + ?: return@with, + dialogLoginSupportAdditionalInput.text, + ) + ) + } + } + + private fun getLastErrorFromStudentSelectScreen(): String { + if (!supportInfo.lastErrorMessage.isNullOrBlank()) { + return supportInfo.lastErrorMessage!! + } + if (supportInfo.registerUser?.symbols.isNullOrEmpty()) { + return "" + } + + return "\n" + supportInfo.registerUser?.symbols?.filterNot { + (it.error is AccountPermissionException || it.error is InvalidSymbolException) && + it.symbol != supportInfo.enteredSymbol + }?.joinToString(";\n") { symbol -> + buildString { + append(" -") + append(symbol.symbol) + append("(${symbol.error?.message?.let { it.take(46) + "..." } ?: symbol.schools.size})") + if (symbol.schools.isNotEmpty()) { + append(": ") + } + append(symbol.schools.joinToString(", ") { unit -> + buildString { + append(unit.schoolShortName) + append("(${unit.error?.message?.let { it.take(46) + "..." } ?: unit.students.size})") + } + }) + } + } + "\nPozostałe: " + supportInfo.registerUser?.symbols?.filter { + it.error is AccountPermissionException || it.error is InvalidSymbolException + }?.joinToString(", ") { it.symbol } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportInfo.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportInfo.kt new file mode 100644 index 000000000..3f101dd63 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportInfo.kt @@ -0,0 +1,12 @@ +package io.github.wulkanowy.ui.modules.login.support + +import io.github.wulkanowy.data.pojos.RegisterUser +import io.github.wulkanowy.ui.modules.login.LoginData +import java.io.Serializable + +data class LoginSupportInfo( + val loginData: LoginData, + val registerUser: RegisterUser?, + val lastErrorMessage: String?, + val enteredSymbol: String?, +) : Serializable diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt index 679576599..23ebffe9d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt @@ -18,7 +18,13 @@ import io.github.wulkanowy.databinding.FragmentLoginSymbolBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginData -import io.github.wulkanowy.utils.* +import io.github.wulkanowy.ui.modules.login.support.LoginSupportDialog +import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo +import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.hideSoftInput +import io.github.wulkanowy.utils.openInternetBrowser +import io.github.wulkanowy.utils.serializable +import io.github.wulkanowy.utils.showSoftInput import javax.inject.Inject @AndroidEntryPoint @@ -170,20 +176,7 @@ class LoginSymbolFragment : ) } - override fun openEmail(host: String, lastError: String) { - context?.openEmailClient( - chooserTitle = requireContext().getString(R.string.login_email_intent_title), - email = "wulkanowyinc@gmail.com", - subject = requireContext().getString(R.string.login_email_subject), - body = requireContext().getString( - R.string.login_email_text, - "${appInfo.systemManufacturer} ${appInfo.systemModel}", - appInfo.systemVersion.toString(), - "${appInfo.versionName}-${appInfo.buildFlavor}", - "$host/${binding.loginSymbolName.text}", - preferencesRepository.installationId, - lastError - ) - ) + override fun openSupportDialog(supportInfo: LoginSupportInfo) { + LoginSupportDialog.newInstance(supportInfo).show(childFragmentManager, "support_dialog") } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index 01855fcec..02bfde5d7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -11,6 +11,7 @@ import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.LoginErrorHandler +import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.ifNullOrBlank import kotlinx.coroutines.flow.onEach @@ -78,6 +79,7 @@ class LoginSymbolPresenter @Inject constructor( showProgress(true) showContent(false) } + is Resource.Success -> { when (user.data.symbols.size) { 0 -> { @@ -87,6 +89,7 @@ class LoginSymbolPresenter @Inject constructor( showContact(true) } } + else -> { val enteredSymbolDetails = user.data.symbols .firstOrNull() @@ -111,6 +114,7 @@ class LoginSymbolPresenter @Inject constructor( "error" to "No error" ) } + is Resource.Error -> { Timber.i("Login with symbol result: An exception occurred") analytics.logEvent( @@ -146,12 +150,13 @@ class LoginSymbolPresenter @Inject constructor( } fun onEmailClick() { - view?.openEmail(loginData.baseUrl, lastError?.message.ifNullOrBlank { - registerUser?.symbols?.flatMap { symbol -> - symbol.schools.map { it.error?.message } + symbol.error?.message - }?.filterNotNull()?.distinct()?.joinToString(";") { - it.take(46) + "..." - } ?: "blank" - }) + view?.openSupportDialog( + LoginSupportInfo( + loginData = loginData, + registerUser = registerUser, + lastErrorMessage = lastError?.message, + enteredSymbol = view?.symbolValue, + ) + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt index 3c10d5744..ace12f780 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.login.symbol import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.modules.login.LoginData +import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo interface LoginSymbolView : BaseView { @@ -42,5 +43,5 @@ interface LoginSymbolView : BaseView { fun openFaqPage() - fun openEmail(host: String, lastError: String) + fun openSupportDialog(supportInfo: LoginSupportInfo) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 091080a55..178d6e94b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -119,7 +119,6 @@ class MainActivity : BaseActivity(), MainVie //https://developer.android.com/guide/playcore/in-app-updates#status_callback @Deprecated("Deprecated in Java") - @Suppress("DEPRECATION") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) updateHelper.onActivityResult(requestCode, resultCode) diff --git a/app/src/main/res/layout/dialog_login_support.xml b/app/src/main/res/layout/dialog_login_support.xml new file mode 100644 index 000000000..c04d78120 --- /dev/null +++ b/app/src/main/res/layout/dialog_login_support.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index 30f85446a..348602d77 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -26,7 +26,8 @@ android:layout_height="match_parent" android:clipToPadding="false" android:paddingTop="6dp" - android:paddingBottom="6dp" /> + android:paddingBottom="6dp" + tools:listitem="@layout/item_dashboard_grades" /> - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df40fe707..08e3ebe61 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -76,7 +76,7 @@ Discord Send email Zgłoszenie: Problemy z logowaniem - Informacje o aplikacji:\n\nUrządzenie: %1$s\nWersja SDK: %2$s\nWersja aplikacji: %3$s\nDodatkowe informacje: %4$s\nIdentyfikator instalacji: %5$s\nOstatni błąd: %6$s\n\nNazwa szkoły i miejscowość: + Informacje o aplikacji:\n\nUrządzenie: %1$s\nWersja SDK: %2$s\nWersja aplikacji: %3$s\nDodatkowe informacje: %4$s\nIdentyfikator instalacji: %5$s\nOstatni błąd: %6$s\n\nNazwa szkoły i miejscowość: %7$s\nDodatkowe informacje: %8$s Make sure you select the correct UONET+ register variation! Reset password Recover your account @@ -86,6 +86,12 @@ Other search locations No active students found Enter a different symbol + Get help + Full school name (required) + Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Additional information in Polish (optional) + Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Submit diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 603e22abc..a0023dda1 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -82,7 +82,6 @@ From 4d085f826652b7fd9a04fa1ddbf8cae3d3a97a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 26 Sep 2023 23:04:27 +0200 Subject: [PATCH 1254/1526] New Crowdin updates (#2311) --- app/src/main/res/values-cs/strings.xml | 12 ++++++++++-- app/src/main/res/values-da-rDK/strings.xml | 12 ++++++++++-- app/src/main/res/values-de/strings.xml | 12 ++++++++++-- app/src/main/res/values-es-rES/strings.xml | 12 ++++++++++-- app/src/main/res/values-it-rIT/strings.xml | 12 ++++++++++-- app/src/main/res/values-pl/strings.xml | 12 ++++++++++-- app/src/main/res/values-ru/strings.xml | 12 ++++++++++-- app/src/main/res/values-sk/strings.xml | 12 ++++++++++-- app/src/main/res/values-uk/strings.xml | 12 ++++++++++-- 9 files changed, 90 insertions(+), 18 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index e9e049326..a365942a8 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -44,6 +44,7 @@ Token PIN Symbol + E.g. \"lodz\" or \"powiatjaroslawski\" Přihlásit Toto heslo je příliš krátké Přihlašovací údaje jsou nesprávné @@ -54,7 +55,8 @@ Neplatný e-mail Místo e-mailu použijte přiřazené přihlašovací údaje Použijte přiřazené přihlašovací nebo e-mail v @%1$s - Neplatný symbol + Invalid symbol. If you cannot find it, please contact the school + Don\'t make this up! If you cannot find it, please contact the school Žák nebyl nalezen. Zkontrolujte správnost symbolu a vybrané varianty deníku UONET+ Vybraný žák je už přihlášen Symbol najdete na stránce deníku v  Uczeń→ Dostęp Mobilny → Wygeneruj kod dostępu.\n\nUjistěte se, že jste nastavili správnou variantu deníku v poli Variace deníku UONET+ na první přihlašovací obrazovce @@ -69,7 +71,7 @@ Discord Poslat e-mail Ujistěte se, že jste vybrali správnou variantu deníku UONET+! - Zapomněl jsem své heslo + Reset password Obnovte svůj účet Obnovit Žák je už přihlášen @@ -77,6 +79,12 @@ Jiná místa vyhledávání Nebyli nalezeni žádní aktivní žáci Zadejte jiný symbol + Get help + Full school name (required) + Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Additional information in Polish (optional) + Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Submit Povolit oznámení Povolit upozornění, abyste nezmeškali zprávu od učitele nebo o nové známce diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 2abf1a4a6..c8846684b 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -44,6 +44,7 @@ Token PIN Symbol + E.g. \"lodz\" or \"powiatjaroslawski\" Sign in Password too short Login details are incorrect @@ -54,7 +55,8 @@ Invalid email Use the assigned login instead of email Use the assigned login or email in @%1$s - Invalid symbol + Invalid symbol. If you cannot find it, please contact the school + Don\'t make this up! If you cannot find it, please contact the school Student not found. Validate the symbol and the chosen variation of the UONET+ register Selected student is already logged in The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the first login screen @@ -69,7 +71,7 @@ Discord Send email Make sure you select the correct UONET+ register variation! - I forgot my password + Reset password Recover your account Recover Student is already signed in @@ -77,6 +79,12 @@ Other search locations No active students found Enter a different symbol + Get help + Full school name (required) + Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Additional information in Polish (optional) + Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Submit Enable notifications Enable notifications so you don\'t miss message from teacher or new grade diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f08a504a5..a909a6b80 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -44,6 +44,7 @@ Token PIN Symbol + E.g. \"lodz\" or \"powiatjaroslawski\" Anmelden Passwort ist zu kurz Anmeldedaten sind falsch @@ -54,7 +55,8 @@ Ungültige email Den zugewiesenen Login anstelle von email verwenden Benutze den zugewiesenen Login oder E-Mail in @%1$s - Ungültige symbol + Invalid symbol. If you cannot find it, please contact the school + Don\'t make this up! If you cannot find it, please contact the school Schüler nicht gefunden. Überprüfen Sie das Symbol und die gewählte Variation des UONET+ Registers Ausgewählter Student ist bereits angemeldet. Das Symbol kann auf der Registerseite in Student → Tost Möbeln → Registrieren Sie Ihr Mobilgerätgefunden werden.\n\nStellen Sie sicher, dass Sie die entsprechende Registervariante im Feld UONET+ Registervariante auf dem vorherigen Bildschirm festgelegt haben @@ -69,7 +71,7 @@ Discord email senden Stellen Sie sicher, dass Sie die richtige UONET+ Registervariation wählen! - Ich habe mein Passwort vergessen. + Reset password Ihr Konto wiederherstellen Wiederherstellen Student ist bereits angemeldet @@ -77,6 +79,12 @@ Andere Suchorte Keine aktiven Schüler gefunden Geben Sie ein anderes Symbol ein + Get help + Full school name (required) + Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Additional information in Polish (optional) + Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Submit Benachrichtigungen aktivieren Aktivieren Sie Benachrichtigungen, damit Sie keine Nachricht vom Lehrer oder eine neue Klasse verpassen diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 2abf1a4a6..c8846684b 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -44,6 +44,7 @@ Token PIN Symbol + E.g. \"lodz\" or \"powiatjaroslawski\" Sign in Password too short Login details are incorrect @@ -54,7 +55,8 @@ Invalid email Use the assigned login instead of email Use the assigned login or email in @%1$s - Invalid symbol + Invalid symbol. If you cannot find it, please contact the school + Don\'t make this up! If you cannot find it, please contact the school Student not found. Validate the symbol and the chosen variation of the UONET+ register Selected student is already logged in The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the first login screen @@ -69,7 +71,7 @@ Discord Send email Make sure you select the correct UONET+ register variation! - I forgot my password + Reset password Recover your account Recover Student is already signed in @@ -77,6 +79,12 @@ Other search locations No active students found Enter a different symbol + Get help + Full school name (required) + Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Additional information in Polish (optional) + Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Submit Enable notifications Enable notifications so you don\'t miss message from teacher or new grade diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 2abf1a4a6..c8846684b 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -44,6 +44,7 @@ Token PIN Symbol + E.g. \"lodz\" or \"powiatjaroslawski\" Sign in Password too short Login details are incorrect @@ -54,7 +55,8 @@ Invalid email Use the assigned login instead of email Use the assigned login or email in @%1$s - Invalid symbol + Invalid symbol. If you cannot find it, please contact the school + Don\'t make this up! If you cannot find it, please contact the school Student not found. Validate the symbol and the chosen variation of the UONET+ register Selected student is already logged in The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the first login screen @@ -69,7 +71,7 @@ Discord Send email Make sure you select the correct UONET+ register variation! - I forgot my password + Reset password Recover your account Recover Student is already signed in @@ -77,6 +79,12 @@ Other search locations No active students found Enter a different symbol + Get help + Full school name (required) + Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Additional information in Polish (optional) + Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Submit Enable notifications Enable notifications so you don\'t miss message from teacher or new grade diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a2b5510ec..4ed2facc8 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -44,6 +44,7 @@ Token PIN Symbol + Np. \"lodz\" czy \"powiatjaroslawski\" Zaloguj To hasło jest za krótkie Dane logowania są niepoprawne @@ -54,7 +55,8 @@ Nieprawidłowy adres e-mail Użyj loginu zamiast adresu e-mail Użyj loginu lub adresu e-mail w @%1$s - Nieprawidłowy symbol + Nieprawidłowy symbol. Jeśli nie możesz go znaleźć, skontaktuj się ze szkołą + Nie zmyślaj! Jeśli nie możesz znaleźć symbolu, skontaktuj się ze szkołą Nie znaleziono ucznia. Sprawdź poprawność symbolu i wybranej odmiany dziennika UONET+ Wybrany uczeń jest już zalogowany Symbol można znaleźć na stronie dziennika w Uczeń→ Dostęp Mobilny → Wygeneruj kod dostępu.\n\nUpewnij się, że ustawiłeś odpowiednią odmianę dziennika w polu Odmiana dziennika UONET+ na pierwszym ekranie logowania @@ -69,7 +71,7 @@ Discord Wyślij wiadomość e-mail Upewnij się, że została wybrana odpowiednia odmiana dziennika UONET+! - Nie pamiętam hasła + Zresetuj hasło Przywróć swoje konto Przywróć Uczeń jest już zalogowany @@ -77,6 +79,12 @@ Inne lokalizacje wyszukiwania Nie znaleziono aktywnych uczniów Wprowadź inny symbol + Uzyskaj pomoc + Pełna nazwa szkoły (wymagana) + Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Dodatkowe informacje (po polsku) (nieobowiązkowo) + Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Wyślij Włącz powiadomienia Włącz powiadomienia, aby nie przegapić wiadomości od nauczyciela lub nowej oceny diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d075dac6c..841fa9f90 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -44,6 +44,7 @@ Token PIN Symbol + E.g. \"lodz\" or \"powiatjaroslawski\" Войти Пароль слишком короткий Данные для входа указаны неверно @@ -54,7 +55,8 @@ Неверный e-mail Используйте назначенный логин вместо e-mail Используйте назначенный логин или email в @%1$s - Неверный symbol + Invalid symbol. If you cannot find it, please contact the school + Don\'t make this up! If you cannot find it, please contact the school Ученик не найден. Проверьте symbol и выбранный тип дненика UONET+ Данный ученик уже авторизован Symbol можно найти на странице регистрации в  Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nУбедитесь, что вы выбрали соответствующий тип дневника в поле Тип дневника UONET+ на первом экране входа @@ -69,7 +71,7 @@ Discord Отправить письмо Убедитесь, что вы выбрали правильный тип дневника UONET+ - Забыли пароль? + Reset password Восстановите свой аккаунт Восстановить Ученик уже авторизован @@ -77,6 +79,12 @@ Другие места поиска Не найдено активных учеников Введите другой symbol + Get help + Full school name (required) + Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Additional information in Polish (optional) + Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Submit Включить уведомления Включить уведомления, чтобы вы не пропустили сообщение от учителя или новую оценку diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d059927eb..018806b68 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -44,6 +44,7 @@ Token PIN Symbol + E.g. \"lodz\" or \"powiatjaroslawski\" Prihlásiť Toto heslo je príliš krátke Prihlasovacie údaje sú nesprávne @@ -54,7 +55,8 @@ Neplatný e-mail Namiesto e-mailu použite priradené prihlasovacie údaje Použite priradené prihlasovacie alebo e-mail v @%1$s - Neplatný symbol + Invalid symbol. If you cannot find it, please contact the school + Don\'t make this up! If you cannot find it, please contact the school Žiak nebol nájdený. Skontrolujte správnosť symbolu a vybrané varianty denníka UONET+ Vybraný žiak už je prihlásený Symbol nájdete na stránke denníka v  Uczeń→ Dostęp Mobilny → Wygeneruj kod dostępu.\n\nUistite sa, že ste nastavili správny variant denníka v poli Variácia denníka UONET+ na prvej prihlasovacej obrazovke @@ -69,7 +71,7 @@ Discord Poslať e-mail Uistite sa, že ste vybrali správny variant denníka UONET+! - Zabudol som heslo + Reset password Obnovte svoj účet Obnoviť Žiak je už prihlásený @@ -77,6 +79,12 @@ Iné miesta vyhľadávania Neboli nájdení žiadni aktívni žiaci Zadajte iný symbol + Get help + Full school name (required) + Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Additional information in Polish (optional) + Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Submit Povoliť oznámenia Povoliť oznámenia, aby ste nezmeškali správu od učiteľa alebo o novej známke diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b46b9afe9..a05634cff 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -44,6 +44,7 @@ Token PIN Symbol + E.g. \"lodz\" or \"powiatjaroslawski\" Увійти Занадто короткий пароль Вказані невірні дані @@ -54,7 +55,8 @@ Недійсна адреса e-mail Використовуйте призначений логін замість адреси e-mail Використовуйте призначений логін або адресу e-mail в @%1$s - Неправильний symbol + Invalid symbol. If you cannot find it, please contact the school + Don\'t make this up! If you cannot find it, please contact the school Студента не знайдено. Перевірте symbol та обраний тип щоденника UONET+ Цього учня вже авторизовано Symbol можно знайти на сторінці щоденника у Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nПереконайтеся, що ви вказали відповідний щоденник у полі Тип щоденника UONET+ на першому екрані логування @@ -69,7 +71,7 @@ Discord Надіслати електронний лист Переконайтеся, що ви вибрали правильний тип щоденника UONET+! - Забули пароль? + Reset password Відновіть свій обліковий запис Відновити Учня вже авторизовано @@ -77,6 +79,12 @@ Інші розташування пошуку Активних учнів не знайдено Введіть інший symbol + Get help + Full school name (required) + Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Additional information in Polish (optional) + Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Submit Увімкнути сповіщення Увімкнути сповіщення, щоб не пропустити лист від вчителя або нову оцінку From 4a2bf539f0f4bc0f0a21e3e733b227e787e130ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 26 Sep 2023 23:13:32 +0200 Subject: [PATCH 1255/1526] Version 2.2.0 --- app/build.gradle | 11 +++++------ app/src/main/play/release-notes/pl-PL/default.txt | 7 ++----- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d85d0a3d8..ec3ee4f34 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,12 +27,11 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 131 - versionName "2.1.0" + versionCode 132 + versionName "2.2.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" - manifestPlaceholders = [ firebase_enabled: project.hasProperty("enableFirebase"), admob_project_id: "" @@ -162,8 +161,8 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.25d - updatePriority = 3 + userFraction = 0.01d + updatePriority = 1 enabled.set(false) } @@ -193,7 +192,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.1.0' + implementation 'io.github.wulkanowy:sdk:2.2.0' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index aa934ce98..898256212 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,8 +1,5 @@ -Wersja 2.1.0 +Wersja 2.2.0 -— dodaliśmy tryb incognito w wiadomościach -— dodaliśmy wyświetlanie pustych lekcji (okienek) w planie lekcji -— poprawiliśmy widżet planu lekcji (będzie teraz trochę bardziej kompaktowy) -— zmieniliśmy datę rozpoczęcia roku szkolnego na 3 dni przed 1 września (sorry) +Dokonaliśmy drobnych usprawnień w obszarze logowania, które powinny pomóc Wam i nam Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From d1d665bbdffb27be240a3e1383095485a0623891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 2 Oct 2023 12:20:34 +0200 Subject: [PATCH 1256/1526] Fix student auto selection if there is already active some students logged (#2314) --- .github/workflows/deploy-store.yml | 4 ++-- .github/workflows/deploy-test.yml | 4 ++-- .github/workflows/test.yml | 6 +++--- .../login/studentselect/LoginStudentSelectPresenter.kt | 10 ++++++---- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/workflows/deploy-store.yml b/.github/workflows/deploy-store.yml index e8a220ddf..e8237a381 100644 --- a/.github/workflows/deploy-store.yml +++ b/.github/workflows/deploy-store.yml @@ -13,7 +13,7 @@ jobs: environment: google-play steps: - uses: actions/checkout@v3 - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 17 @@ -49,7 +49,7 @@ jobs: environment: app-gallery steps: - uses: actions/checkout@v3 - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 17 diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index f2e9f016f..c4f55e6af 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -19,7 +19,7 @@ jobs: environment: app-center steps: - uses: actions/checkout@v3 - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 17 @@ -89,7 +89,7 @@ jobs: if: github.event_name != 'pull_request_target' steps: - uses: actions/checkout@v3 - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 17 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bc4b36470..6d50c45d5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,7 +19,7 @@ jobs: - uses: fkirc/skip-duplicate-actions@master - uses: actions/checkout@v3 - uses: gradle/wrapper-validation-action@v1 - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 17 @@ -45,7 +45,7 @@ jobs: - uses: fkirc/skip-duplicate-actions@master - uses: actions/checkout@v3 - uses: gradle/wrapper-validation-action@v1 - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 17 @@ -71,7 +71,7 @@ jobs: - uses: fkirc/skip-duplicate-actions@master - uses: actions/checkout@v3 - uses: gradle/wrapper-validation-action@v1 - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 17 diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index cc9e422ed..6cbdfbb85 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -98,11 +98,13 @@ class LoginStudentSelectPresenter @Inject constructor( } } } - return students.filter { student -> - student.student.semesters.any { semester -> - semester.isCurrent() + return students + .filter { it.isEnabled } + .filter { student -> + student.student.semesters.any { semester -> + semester.isCurrent() + } } - } } private fun createItems(): List = buildList { From c04b3e40d256ad04bde58d35f212b6173a7fe3f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 2 Oct 2023 12:21:04 +0200 Subject: [PATCH 1257/1526] Add negative e-mail validation in school input on support dialog (#2315) --- .../login/support/LoginSupportDialog.kt | 38 +++++++++++++------ app/src/main/res/values/strings.xml | 3 +- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt index d2b1d2ce6..fcf7f51c9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.modules.login.support import android.os.Bundle +import android.util.Patterns import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -64,21 +65,36 @@ class LoginSupportDialog : BaseDialogFragment() { error = null } } - dialogLoginSupportSubmit.setOnClickListener { - if (dialogLoginSupportSchoolInput.text.isNullOrBlank()) { - with(dialogLoginSupportSchoolLayout) { - isErrorEnabled = true - error = getString(R.string.error_field_required) - } - } else { - onSubmitClick() - dismiss() - } - } + dialogLoginSupportSubmit.setOnClickListener { onSubmitClick() } } } private fun onSubmitClick() { + when { + binding.dialogLoginSupportSchoolInput.text.isNullOrBlank() -> { + with(binding.dialogLoginSupportSchoolLayout) { + isErrorEnabled = true + error = getString(R.string.error_field_required) + } + } + + Patterns.EMAIL_ADDRESS.matcher( + binding.dialogLoginSupportSchoolInput.text.toString() + ).matches() -> { + with(binding.dialogLoginSupportSchoolLayout) { + isErrorEnabled = true + error = getString(R.string.login_support_school_invalid) + } + } + + else -> { + openEmailClientWithFilledTemplate() + dismiss() + } + } + } + + private fun openEmailClientWithFilledTemplate() { with(binding) { context?.openEmailClient( chooserTitle = requireContext().getString(R.string.login_email_intent_title), diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 08e3ebe61..0ba9c9970 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -87,8 +87,9 @@ No active students found Enter a different symbol Get help - Full school name (required) + Full school name with the town (required) Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Enter correct name of the school Additional information in Polish (optional) Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" Submit From 2cdd322ed4b5616b224b8cc9a46e4f53fcdfab1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 2 Oct 2023 12:22:02 +0200 Subject: [PATCH 1258/1526] Add missing class_id colum in JOIN clause of students with semesters (#2317) --- .../wulkanowy/data/db/dao/StudentDao.kt | 9 +++---- .../data/db/entities/StudentWithSemesters.kt | 5 ---- .../data/repositories/StudentRepository.kt | 24 ++++++++++++------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt index a2f0abac6..d7847c240 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.* +import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentName import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar @@ -33,12 +34,12 @@ abstract class StudentDao { abstract suspend fun loadAll(): List @Transaction - @Query("SELECT * FROM Students") - abstract suspend fun loadStudentsWithSemesters(): List + @Query("SELECT * FROM Students JOIN Semesters ON Students.student_id = Semesters.student_id AND Students.class_id = Semesters.class_id") + abstract suspend fun loadStudentsWithSemesters(): Map> @Transaction - @Query("SELECT * FROM Students WHERE id = :id") - abstract suspend fun loadStudentWithSemestersById(id: Long): StudentWithSemesters? + @Query("SELECT * FROM Students JOIN Semesters ON Students.student_id = Semesters.student_id AND Students.class_id = Semesters.class_id WHERE Students.id = :id") + abstract suspend fun loadStudentWithSemestersById(id: Long): Map> @Query("UPDATE Students SET is_current = 1 WHERE id = :id") abstract suspend fun updateCurrent(id: Long) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentWithSemesters.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentWithSemesters.kt index 9362a954e..f9869d4e2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentWithSemesters.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentWithSemesters.kt @@ -1,13 +1,8 @@ package io.github.wulkanowy.data.db.entities -import androidx.room.Embedded -import androidx.room.Relation import java.io.Serializable data class StudentWithSemesters( - @Embedded val student: Student, - - @Relation(parentColumn = "student_id", entityColumn = "student_id") val semesters: List ) : Serializable diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index 42d1eb84e..2e04224aa 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -62,20 +62,28 @@ class StudentRepository @Inject constructor( .getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol) .mapToPojo(password) - suspend fun getSavedStudents(decryptPass: Boolean = true) = - studentDb.loadStudentsWithSemesters() - .map { - it.apply { + suspend fun getSavedStudents(decryptPass: Boolean = true): List { + return studentDb.loadStudentsWithSemesters().map { (student, semesters) -> + StudentWithSemesters( + student = student.apply { if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) { student.password = withContext(dispatchers.io) { decrypt(student.password) } } - } - } + }, + semesters = semesters, + ) + } + } - suspend fun getSavedStudentById(id: Long, decryptPass: Boolean = true) = - studentDb.loadStudentWithSemestersById(id)?.apply { + suspend fun getSavedStudentById(id: Long, decryptPass: Boolean = true): StudentWithSemesters? = + studentDb.loadStudentWithSemestersById(id).let { res -> + StudentWithSemesters( + student = res.keys.firstOrNull() ?: return null, + semesters = res.values.first(), + ) + }.apply { if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) { student.password = withContext(dispatchers.io) { decrypt(student.password) From 693ce8217d1ed871659de3009de1615ab47978af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 3 Oct 2023 00:48:37 +0200 Subject: [PATCH 1259/1526] New Crowdin updates (#2313) --- app/src/main/res/values-cs/strings.xml | 21 ++++++++++--------- app/src/main/res/values-da-rDK/strings.xml | 3 ++- app/src/main/res/values-de/strings.xml | 3 ++- app/src/main/res/values-es-rES/strings.xml | 3 ++- app/src/main/res/values-it-rIT/strings.xml | 3 ++- .../main/res/values-pl/preferences_values.xml | 2 +- app/src/main/res/values-pl/strings.xml | 3 ++- app/src/main/res/values-ru/strings.xml | 3 ++- app/src/main/res/values-sk/strings.xml | 21 ++++++++++--------- app/src/main/res/values-uk/strings.xml | 21 ++++++++++--------- 10 files changed, 46 insertions(+), 37 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index a365942a8..1749548e1 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -44,7 +44,7 @@ Token PIN Symbol - E.g. \"lodz\" or \"powiatjaroslawski\" + Např. „lodz“ nebo „powiatjaroslawski“ Přihlásit Toto heslo je příliš krátké Přihlašovací údaje jsou nesprávné @@ -55,8 +55,8 @@ Neplatný e-mail Místo e-mailu použijte přiřazené přihlašovací údaje Použijte přiřazené přihlašovací nebo e-mail v @%1$s - Invalid symbol. If you cannot find it, please contact the school - Don\'t make this up! If you cannot find it, please contact the school + Neplatný symbol. Pokud jej nemůžete najít, kontaktujte školu + Nevymýšlejte si! Pokud symbol nemůžete najít, kontaktujte školu Žák nebyl nalezen. Zkontrolujte správnost symbolu a vybrané varianty deníku UONET+ Vybraný žák je už přihlášen Symbol najdete na stránce deníku v  Uczeń→ Dostęp Mobilny → Wygeneruj kod dostępu.\n\nUjistěte se, že jste nastavili správnou variantu deníku v poli Variace deníku UONET+ na první přihlašovací obrazovce @@ -71,7 +71,7 @@ Discord Poslat e-mail Ujistěte se, že jste vybrali správnou variantu deníku UONET+! - Reset password + Obnovit heslo Obnovte svůj účet Obnovit Žák je už přihlášen @@ -79,12 +79,13 @@ Jiná místa vyhledávání Nebyli nalezeni žádní aktivní žáci Zadejte jiný symbol - Get help - Full school name (required) - Np. ZSTiO Jarosław lub SP nr 99 w Łodzi - Additional information in Polish (optional) - Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" - Submit + Získat pomoc + Celý název školy s městem (povinný) + Např. ZSTiO Jarosław nebo SP nr 99 w Łodzi + Zadejte správný název školy + Dodatečné informace v polštině (volitelné) + Např. „Ostatnio zmieniłem szkołę i…“ (Nedávno jsem změnil školu a…) nebo „Jestem rodzicem i nie widzę drugiego dziecka…“ (Jsem rodič a nevidím žádné další dítě…) + Odeslat Povolit oznámení Povolit upozornění, abyste nezmeškali zprávu od učitele nebo o nové známce diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index c8846684b..500fba1f3 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -80,8 +80,9 @@ No active students found Enter a different symbol Get help - Full school name (required) + Full school name with the town (required) Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Enter correct name of the school Additional information in Polish (optional) Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" Submit diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a909a6b80..d8cc92984 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -80,8 +80,9 @@ Keine aktiven Schüler gefunden Geben Sie ein anderes Symbol ein Get help - Full school name (required) + Full school name with the town (required) Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Enter correct name of the school Additional information in Polish (optional) Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" Submit diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index c8846684b..500fba1f3 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -80,8 +80,9 @@ No active students found Enter a different symbol Get help - Full school name (required) + Full school name with the town (required) Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Enter correct name of the school Additional information in Polish (optional) Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" Submit diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index c8846684b..500fba1f3 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -80,8 +80,9 @@ No active students found Enter a different symbol Get help - Full school name (required) + Full school name with the town (required) Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Enter correct name of the school Additional information in Polish (optional) Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" Submit diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 8872b7ab1..2f2432e98 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -52,7 +52,7 @@ Średnia wszystkich ocen z całego roku - Nie pokauj + Nie pokazuj Tylko między lekcjami Przed i między lekcjami diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4ed2facc8..9375aeb39 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -80,8 +80,9 @@ Nie znaleziono aktywnych uczniów Wprowadź inny symbol Uzyskaj pomoc - Pełna nazwa szkoły (wymagana) + Pełna nazwa szkoły z miastem (wymagana) Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Wprowadź poprawną nazwę szkoły Dodatkowe informacje (po polsku) (nieobowiązkowo) Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" Wyślij diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 841fa9f90..a6e45d445 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -80,8 +80,9 @@ Не найдено активных учеников Введите другой symbol Get help - Full school name (required) + Full school name with the town (required) Np. ZSTiO Jarosław lub SP nr 99 w Łodzi + Enter correct name of the school Additional information in Polish (optional) Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" Submit diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 018806b68..ed06e023e 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -44,7 +44,7 @@ Token PIN Symbol - E.g. \"lodz\" or \"powiatjaroslawski\" + Napr. „lodz“ alebo „powiatjaroslawski“ Prihlásiť Toto heslo je príliš krátke Prihlasovacie údaje sú nesprávne @@ -55,8 +55,8 @@ Neplatný e-mail Namiesto e-mailu použite priradené prihlasovacie údaje Použite priradené prihlasovacie alebo e-mail v @%1$s - Invalid symbol. If you cannot find it, please contact the school - Don\'t make this up! If you cannot find it, please contact the school + Neplatný symbol. Pokiaľ ho nemôžete nájsť, kontaktujte školu + Nevymýšľajte si! Pokiaľ symbol nemôžete nájsť, kontaktujte školu Žiak nebol nájdený. Skontrolujte správnosť symbolu a vybrané varianty denníka UONET+ Vybraný žiak už je prihlásený Symbol nájdete na stránke denníka v  Uczeń→ Dostęp Mobilny → Wygeneruj kod dostępu.\n\nUistite sa, že ste nastavili správny variant denníka v poli Variácia denníka UONET+ na prvej prihlasovacej obrazovke @@ -71,7 +71,7 @@ Discord Poslať e-mail Uistite sa, že ste vybrali správny variant denníka UONET+! - Reset password + Obnoviť heslo Obnovte svoj účet Obnoviť Žiak je už prihlásený @@ -79,12 +79,13 @@ Iné miesta vyhľadávania Neboli nájdení žiadni aktívni žiaci Zadajte iný symbol - Get help - Full school name (required) - Np. ZSTiO Jarosław lub SP nr 99 w Łodzi - Additional information in Polish (optional) - Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" - Submit + Získať pomoc + Celý názov školy s mestom (povinný) + Napr. ZSTiO Jarosław alebo SP nr 99 w Łodzi + Zadajte správny názov školy + Dodatočné informácie v poľštine (voliteľné) + Napr. „Ostatnio zmieniłem szkołę i…“ (Nedávno som zmenil školu a…) alebo „Jestem rodzicem i nie widzę drugiego dziecka…“ (Som rodič a nevidím žiadne ďalšie dieťa…) + Odoslať Povoliť oznámenia Povoliť oznámenia, aby ste nezmeškali správu od učiteľa alebo o novej známke diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a05634cff..6a79263f7 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -44,7 +44,7 @@ Token PIN Symbol - E.g. \"lodz\" or \"powiatjaroslawski\" + Напр. \"lodz\" чи \"powiatjaroslawski\" Увійти Занадто короткий пароль Вказані невірні дані @@ -55,8 +55,8 @@ Недійсна адреса e-mail Використовуйте призначений логін замість адреси e-mail Використовуйте призначений логін або адресу e-mail в @%1$s - Invalid symbol. If you cannot find it, please contact the school - Don\'t make this up! If you cannot find it, please contact the school + Некоректний символ. Якщо ви не можете знайти його, будь ласка, зв\'яжіться зі школою + Не вигадуйте! Якщо ви не можете знайти його, будь ласка, зв\'яжіться зі школою Студента не знайдено. Перевірте symbol та обраний тип щоденника UONET+ Цього учня вже авторизовано Symbol можно знайти на сторінці щоденника у Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nПереконайтеся, що ви вказали відповідний щоденник у полі Тип щоденника UONET+ на першому екрані логування @@ -71,7 +71,7 @@ Discord Надіслати електронний лист Переконайтеся, що ви вибрали правильний тип щоденника UONET+! - Reset password + Скинути пароль Відновіть свій обліковий запис Відновити Учня вже авторизовано @@ -79,12 +79,13 @@ Інші розташування пошуку Активних учнів не знайдено Введіть інший symbol - Get help - Full school name (required) - Np. ZSTiO Jarosław lub SP nr 99 w Łodzi - Additional information in Polish (optional) - Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" - Submit + Отримати допомогу + Повна назва школи з містом (обов\'язково) + Напр. ZSTiO Jarosław lub SP nr 99 w Łodzi + Введіть правильну назву школи + Додаткова інформація польською мовою (за бажанням) + Напр. \"Я нещодавно змінив школу і...\" або \"Я батько і не бачу другу дитину...\" + Надіслати Увімкнути сповіщення Увімкнути сповіщення, щоб не пропустити лист від вчителя або нову оцінку From 3212efe21ed7e9cf3718cef23f606fdce9894a63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 22:49:05 +0000 Subject: [PATCH 1260/1526] Bump com.android.tools.build:gradle from 8.1.1 to 8.1.2 (#2320) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 651e9ca16..9293d1239 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.13" - classpath 'com.android.tools.build:gradle:8.1.1' + classpath 'com.android.tools.build:gradle:8.1.2' 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' From c8332a064208f646f341f11dd3a5d139ff11b6f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 22:49:26 +0000 Subject: [PATCH 1261/1526] Bump org.sonarsource.scanner.gradle:sonarqube-gradle-plugin (#2321) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9293d1239..33eefd889 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ buildscript { classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" - classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.3.1.3277" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.4.0.3356" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" } From fc5ad16cb761dce29810c753af4edd3ed01bc799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 3 Oct 2023 01:14:10 +0200 Subject: [PATCH 1262/1526] Version 2.2.1 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ec3ee4f34..08070c5d7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 33 - versionCode 132 - versionName "2.2.0" + versionCode 133 + versionName "2.2.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -162,7 +162,7 @@ play { track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS userFraction = 0.01d - updatePriority = 1 + updatePriority = 3 enabled.set(false) } @@ -192,7 +192,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.2.0' + implementation 'io.github.wulkanowy:sdk:2.2.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 898256212..dc78c1e3d 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,6 @@ -Wersja 2.2.0 +Wersja 2.2.1 -Dokonaliśmy drobnych usprawnień w obszarze logowania, które powinny pomóc Wam i nam +– dokonaliśmy kilka poprawek na ekranie logowania +– naprawiliśmy przypadek z błędnym wyświetlaniem starej klasy ucznia po zalogowaniu się na konto z nowej klasy Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 2f5577cc541c458596c5c90aac451ab0f337a2fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 6 Oct 2023 10:07:55 +0200 Subject: [PATCH 1263/1526] Update SDK to 34 (#2322) --- app/build.gradle | 8 +++---- app/jacoco.gradle | 22 +++++++++--------- .../settings/advanced/AdvancedFragment.kt | 2 +- .../settings/advanced/AdvancedPresenter.kt | 3 ++- .../settings/appearance/AppearanceFragment.kt | 2 +- .../appearance/AppearancePresenter.kt | 3 ++- .../notifications/NotificationsFragment.kt | 2 +- .../notifications/NotificationsPresenter.kt | 3 ++- .../ui/modules/settings/sync/SyncFragment.kt | 2 +- .../ui/modules/settings/sync/SyncPresenter.kt | 6 ++++- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.jar | Bin 62076 -> 63375 bytes gradle/wrapper/gradle-wrapper.properties | 3 ++- gradlew | 5 +++- settings.gradle | 3 --- 15 files changed, 38 insertions(+), 30 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 08070c5d7..b3ebb5cbe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,13 +20,13 @@ apply from: 'hooks.gradle' android { namespace 'io.github.wulkanowy' - compileSdk 33 + compileSdk 34 defaultConfig { applicationId "io.github.wulkanowy" testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 - targetSdkVersion 33 + targetSdkVersion 34 versionCode 133 versionName "2.2.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -199,9 +199,9 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" - implementation "androidx.core:core-ktx:1.10.1" + implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.core:core-splashscreen:1.0.1' - implementation "androidx.activity:activity-ktx:1.7.2" + implementation "androidx.activity:activity-ktx:1.8.0" implementation "androidx.appcompat:appcompat:1.6.1" implementation "androidx.fragment:fragment-ktx:1.6.1" implementation "androidx.annotation:annotation:1.7.0" diff --git a/app/jacoco.gradle b/app/jacoco.gradle index f253673e6..434b9218b 100644 --- a/app/jacoco.gradle +++ b/app/jacoco.gradle @@ -1,16 +1,16 @@ apply plugin: "jacoco" jacoco { - toolVersion "0.8.7" + toolVersion "0.8.10" reportsDirectory.set(file("$buildDir/reports")) } -tasks.withType(Test) { +tasks.withType(Test).configureEach { jacoco.includeNoLocationClasses = true jacoco.excludes = ['jdk.internal.*'] } -task jacocoTestReport(type: JacocoReport) { +tasks.register('jacocoTestReport', JacocoReport) { group = "Reporting" description = "Generate Jacoco coverage reports" @@ -33,19 +33,19 @@ task jacocoTestReport(type: JacocoReport) { '**/*_Factory.*'] classDirectories.setFrom(fileTree( - dir: "$buildDir/intermediates/classes/debug", - excludes: excludes + dir: "$buildDir/intermediates/classes/debug", + excludes: excludes ) + fileTree( - dir: "$buildDir/tmp/kotlin-classes/fdroidDebug", - excludes: excludes + dir: "$buildDir/tmp/kotlin-classes/fdroidDebug", + excludes: excludes )) sourceDirectories.setFrom(files([ - "src/main/java", - "src/fdroid/java" + "src/main/java", + "src/fdroid/java" ])) executionData.setFrom(fileTree( - dir: project.projectDir, - includes: ["**/*.exec", "**/*.ec"] + dir: project.projectDir, + includes: ["**/*.exec", "**/*.ec"] )) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt index 41e9e8b1a..1b8d1a8fa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt @@ -35,7 +35,7 @@ class AdvancedFragment : PreferenceFragmentCompat(), setPreferencesFromResource(R.xml.scheme_preferences_advanced, rootKey) } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { presenter.onSharedPreferenceChanged(key) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedPresenter.kt index d38f841fe..4bc24594a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedPresenter.kt @@ -18,7 +18,8 @@ class AdvancedPresenter @Inject constructor( Timber.i("Settings advanced view was initialized") } - fun onSharedPreferenceChanged(key: String) { + fun onSharedPreferenceChanged(key: String?) { + key ?: return Timber.i("Change settings $key") analytics.logEvent("setting_changed", "name" to key) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt index 493ab5d7f..70dd694cc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt @@ -39,7 +39,7 @@ class AppearanceFragment : PreferenceFragmentCompat(), setPreferencesFromResource(R.xml.scheme_preferences_appearance, rootKey) } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { presenter.onSharedPreferenceChanged(key) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearancePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearancePresenter.kt index 14592a6cc..d3410ea84 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearancePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearancePresenter.kt @@ -22,7 +22,8 @@ class AppearancePresenter @Inject constructor( Timber.i("Settings appearance view was initialized") } - fun onSharedPreferenceChanged(key: String) { + fun onSharedPreferenceChanged(key: String?) { + key ?: return Timber.i("Change settings $key") preferencesRepository.apply { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt index 35c1faa45..af4c4e6ae 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt @@ -114,7 +114,7 @@ class NotificationsFragment : PreferenceFragmentCompat(), setPreferencesFromResource(R.xml.scheme_preferences_notifications, rootKey) } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { presenter.onSharedPreferenceChanged(key) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt index 232b03480..b2938cf65 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt @@ -38,7 +38,8 @@ class NotificationsPresenter @Inject constructor( Timber.i("Settings notifications view was initialized") } - fun onSharedPreferenceChanged(key: String) { + fun onSharedPreferenceChanged(key: String?) { + key ?: return Timber.i("Change settings $key") preferencesRepository.apply { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt index df2e1348a..f48abe9ba 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt @@ -52,7 +52,7 @@ class SyncFragment : PreferenceFragmentCompat(), setPreferencesFromResource(R.xml.scheme_preferences_sync, rootKey) } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { presenter.onSharedPreferenceChanged(key) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt index 1ecb4a6ef..594e097af 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncPresenter.kt @@ -31,7 +31,8 @@ class SyncPresenter @Inject constructor( setSyncDateInView() } - fun onSharedPreferenceChanged(key: String) { + fun onSharedPreferenceChanged(key: String?) { + key ?: return Timber.i("Change settings $key") preferencesRepository.apply { @@ -52,10 +53,12 @@ class SyncPresenter @Inject constructor( Timber.i("Setting sync now started") analytics.logEvent("sync_now", "status" to "started") } + WorkInfo.State.SUCCEEDED -> { showMessage(syncSuccessString) analytics.logEvent("sync_now", "status" to "success") } + WorkInfo.State.FAILED -> { showError( syncFailedString, @@ -66,6 +69,7 @@ class SyncPresenter @Inject constructor( ) analytics.logEvent("sync_now", "status" to "failed") } + else -> Timber.d("Sync now state: ${workInfo?.state}") } if (workInfo?.state?.isFinished == true) { diff --git a/build.gradle b/build.gradle index 33eefd889..baa1f9b67 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,8 @@ buildscript { ext { kotlin_version = '1.9.10' - about_libraries = '10.9.0' - hilt_version = "2.48" + about_libraries = '10.9.1' + hilt_version = '2.48.1' } repositories { mavenCentral() diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e0ab67b14947c167a862655af9b..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 16170 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/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. diff --git a/settings.gradle b/settings.gradle index 16731297d..e7b4def49 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1 @@ -plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' -} include ':app' From 9098e74065ebe4821694370e5c0fc8c404d52089 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 19:17:56 +0000 Subject: [PATCH 1264/1526] Bump com.google.android.material:material from 1.9.0 to 1.10.0 (#2325) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b3ebb5cbe..a591d2b2e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -212,7 +212,7 @@ dependencies { implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.constraintlayout:constraintlayout:2.1.4" implementation "androidx.coordinatorlayout:coordinatorlayout:1.2.0" - implementation "com.google.android.material:material:1.9.0" + implementation "com.google.android.material:material:1.10.0" implementation "com.github.wulkanowy:material-chips-input:2.3.1" implementation "com.github.PhilJay:MPAndroidChart:v3.1.0" implementation 'com.github.lopspower:CircularImageView:4.3.0' From 516922d5aa53717d5a964161497a55e09524fa9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 19:18:28 +0000 Subject: [PATCH 1265/1526] Bump org.sonarsource.scanner.gradle:sonarqube-gradle-plugin (#2324) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index baa1f9b67..3fafd2d24 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ buildscript { classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" - classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.4.0.3356" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.4.1.3373" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" } From 5dffbdadfa030f74f62c24b3157ca9c6b65f5ad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 23 Oct 2023 13:04:42 +0200 Subject: [PATCH 1266/1526] Points statistics improvements (#2328) --- .../grade/statistics/GradeStatisticsAdapter.kt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt index 3fce8d57e..e5f1eba0c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsAdapter.kt @@ -22,6 +22,8 @@ import io.github.wulkanowy.databinding.ItemGradeStatisticsHeaderBinding import io.github.wulkanowy.databinding.ItemGradeStatisticsPieBinding import io.github.wulkanowy.utils.getThemeAttrColor import javax.inject.Inject +import kotlin.math.max +import kotlin.math.roundToInt class GradeStatisticsAdapter @Inject constructor() : RecyclerView.Adapter() { @@ -269,7 +271,7 @@ class GradeStatisticsAdapter @Inject constructor() : valueTextSize = 12f valueTextColor = binding.root.context.getThemeAttrColor(android.R.attr.textColorPrimary) valueFormatter = object : ValueFormatter() { - override fun getBarLabel(barEntry: BarEntry) = "${barEntry.y}%" + override fun getBarLabel(barEntry: BarEntry) = "${barEntry.y}" } colors = gradePointsColors } @@ -304,15 +306,20 @@ class GradeStatisticsAdapter @Inject constructor() : } xAxis.setDrawLabels(false) xAxis.setDrawGridLines(false) + + val yMaxFromValues = (max(points.others, points.student)).roundToInt() + 30f + val yMaxFromValuesWithMargin = ((yMaxFromValues / 10.0).roundToInt() * 10).toFloat() + val yMax = yMaxFromValuesWithMargin.coerceAtLeast(100f) + val yLabelCount = (yMax / 10).toInt() + 1 with(axisLeft) { axisMinimum = 0f - axisMaximum = 100f - labelCount = 11 + axisMaximum = yMax + labelCount = yLabelCount } with(axisRight) { axisMinimum = 0f - axisMaximum = 100f - labelCount = 11 + axisMaximum = yMax + labelCount = yLabelCount } invalidate() } From 9d62410530b6dbc707634790f49857412d36db8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 23 Oct 2023 13:05:05 +0200 Subject: [PATCH 1267/1526] Sort teachers by name in school and teachers tab (#2327) --- .../ui/modules/schoolandteachers/teacher/TeacherPresenter.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt index e2af05c92..fef06328d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt @@ -58,7 +58,10 @@ class TeacherPresenter @Inject constructor( .logResourceStatus("load teachers data") .onResourceData { view?.run { - updateData(it.filter { item -> item.name.isNotBlank() }) + updateData(it + .filter { item -> item.name.isNotBlank() } + .sortedBy { it.name } + ) showContent(it.isNotEmpty()) showEmpty(it.isEmpty()) showErrorView(false) From 83527d91f3283ad64566189ee86785775f4430a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 23 Oct 2023 13:05:46 +0200 Subject: [PATCH 1268/1526] Allow direct access to weekend from day navigation when there is any lesson during weekend (#2326) --- .../modules/attendance/AttendanceFragment.kt | 8 +- .../modules/attendance/AttendancePresenter.kt | 97 +++++++++++----- .../ui/modules/attendance/AttendanceView.kt | 2 + .../modules/dashboard/DashboardPresenter.kt | 2 +- .../ui/modules/timetable/TimetableFragment.kt | 9 +- .../modules/timetable/TimetablePresenter.kt | 107 +++++++++++++----- .../ui/modules/timetable/TimetableView.kt | 2 + .../main/res/layout/fragment_attendance.xml | 4 +- .../main/res/layout/fragment_timetable.xml | 4 +- 9 files changed, 172 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index a73c2606e..6e842b4d7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -148,6 +148,10 @@ class AttendanceFragment : BaseFragment(R.layout.frag binding.attendanceNavDate.text = date } + override fun showNavigation(show: Boolean) { + binding.attendanceNavContainer.isVisible = show + } + override fun clearData() { with(attendanceAdapter) { items = emptyList() @@ -281,7 +285,9 @@ class AttendanceFragment : BaseFragment(R.layout.frag override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putLong(SAVED_DATE_KEY, presenter.currentDate.toEpochDay()) + presenter.currentDate?.let { + outState.putLong(SAVED_DATE_KEY, it.toEpochDay()) + } } override fun onDestroyView() { 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 26bfaf19f..f66479daf 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 @@ -3,10 +3,14 @@ package io.github.wulkanowy.ui.modules.attendance import android.annotation.SuppressLint 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.* @@ -14,6 +18,7 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach import timber.log.Timber +import java.time.DayOfWeek import java.time.LocalDate import java.time.LocalDate.now import java.time.LocalDate.ofEpochDay @@ -28,9 +33,10 @@ class AttendancePresenter @Inject constructor( private val analytics: AnalyticsHelper ) : BasePresenter(errorHandler, studentRepository) { - private var baseDate: LocalDate = now().previousOrSameSchoolDay + private var initialDate: LocalDate? = null + private var isWeekendHasLessons: Boolean = false - lateinit var currentDate: LocalDate + var currentDate: LocalDate? = null private set private lateinit var lastError: Throwable @@ -44,27 +50,34 @@ class AttendancePresenter @Inject constructor( view.initView() Timber.i("Attendance view was initialized") errorHandler.showErrorMessage = ::showErrorViewOnError - reloadView(ofEpochDay(date ?: baseDate.toEpochDay())) + currentDate = date?.let(::ofEpochDay) loadData() - if (currentDate.isHolidays) setBaseDateOnHolidays() } fun onPreviousDay() { + val date = if (isWeekendHasLessons) { + currentDate?.minusDays(1) + } else currentDate?.previousSchoolDay + view?.finishActionMode() attendanceToExcuseList.clear() - reloadView(currentDate.previousSchoolDay) + reloadView(date ?: return) loadData() } fun onNextDay() { + val date = if (isWeekendHasLessons) { + currentDate?.plusDays(1) + } else currentDate?.nextSchoolDay + view?.finishActionMode() attendanceToExcuseList.clear() - reloadView(currentDate.nextSchoolDay) + reloadView(date ?: return) loadData() } fun onPickDate() { - view?.showDatePickerDialog(currentDate) + view?.showDatePickerDialog(currentDate ?: return) } fun onDateSet(year: Int, month: Int, day: Int) { @@ -93,10 +106,8 @@ class AttendancePresenter @Inject constructor( Timber.i("Attendance view is reselected") view?.let { view -> if (view.currentStackSize == 1) { - baseDate = now().previousOrSameSchoolDay - - if (currentDate != baseDate) { - reloadView(baseDate) + if (currentDate != initialDate) { + reloadView(initialDate ?: return) loadData() } else if (!view.isViewEmpty) { view.resetView() @@ -188,19 +199,6 @@ class AttendancePresenter @Inject constructor( return true } - private fun setBaseDateOnHolidays() { - flow { - val student = studentRepository.getCurrentStudent() - emit(semesterRepository.getCurrentSemester(student)) - }.catch { - Timber.i("Loading semester result: An exception occurred") - }.onEach { - baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) - currentDate = baseDate - reloadNavigation() - }.launch("holidays") - } - private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading attendance data started") @@ -211,11 +209,13 @@ class AttendancePresenter @Inject constructor( isParent = student.isParent val semester = semesterRepository.getCurrentSemester(student) + + checkInitialAndCurrentDate(student, semester) attendanceRepository.getAttendance( student = student, semester = semester, - start = currentDate, - end = currentDate, + start = currentDate ?: now(), + end = currentDate ?: now(), forceRefresh = forceRefresh ) } @@ -231,6 +231,8 @@ class AttendancePresenter @Inject constructor( }.sortedBy { item -> item.number } } .onResourceData { + isWeekendHasLessons = isWeekendHasLessons || isWeekendHasLessons(it) + view?.run { enableSwipe(true) showProgress(false) @@ -238,6 +240,7 @@ class AttendancePresenter @Inject constructor( showEmpty(it.isEmpty()) showContent(it.isNotEmpty()) updateData(it) + reloadNavigation() } } .onResourceIntermediate { view?.showRefresh(true) } @@ -263,6 +266,43 @@ class AttendancePresenter @Inject constructor( .launch() } + private suspend fun checkInitialAndCurrentDate(student: Student, semester: Semester) { + if (initialDate == null) { + val lessons = attendanceRepository.getAttendance( + student = student, + semester = semester, + start = now().monday, + end = now().sunday, + forceRefresh = false, + ).toFirstResult().dataOrNull.orEmpty() + isWeekendHasLessons = isWeekendHasLessons(lessons) + initialDate = getInitialDate(semester) + } + + if (currentDate == null) { + currentDate = initialDate + } + } + + private fun isWeekendHasLessons( + lessons: List, + ): Boolean = lessons.any { + it.date.dayOfWeek in listOf( + DayOfWeek.SATURDAY, + DayOfWeek.SUNDAY, + ) + } + + private fun getInitialDate(semester: Semester): LocalDate { + val now = now() + + return when { + now.isHolidays -> now.getLastSchoolDayIfHoliday(semester.schoolYear) + isWeekendHasLessons -> now + else -> now.previousOrSameSchoolDay + } + } + private fun excuseAbsence(reason: String?, toExcuseList: List) { resourceFlow { val student = studentRepository.getCurrentStudent() @@ -311,7 +351,7 @@ class AttendancePresenter @Inject constructor( private fun reloadView(date: LocalDate) { currentDate = date - Timber.i("Reload attendance view with the date ${currentDate.toFormattedString()}") + Timber.i("Reload attendance view with the date ${currentDate?.toFormattedString()}") view?.apply { showProgress(true) enableSwipe(false) @@ -326,10 +366,13 @@ class AttendancePresenter @Inject constructor( @SuppressLint("DefaultLocale") private fun reloadNavigation() { + val currentDate = currentDate ?: return + view?.apply { showPreButton(!currentDate.minusDays(1).isHolidays) showNextButton(!currentDate.plusDays(1).isHolidays) updateNavigationDay(currentDate.toFormattedString("EEEE, dd.MM").capitalise()) + showNavigation(true) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt index b0123065a..2629c217e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt @@ -40,6 +40,8 @@ interface AttendanceView : BaseView { fun showContent(show: Boolean) + fun showNavigation(show: Boolean) + fun showPreButton(show: Boolean) fun showNextButton(show: Boolean) 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 ecf084c68..ae451ae15 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 @@ -386,7 +386,7 @@ class DashboardPresenter @Inject constructor( private fun loadLessons(student: Student, forceRefresh: Boolean) { flatResourceFlow { val semester = semesterRepository.getCurrentSemester(student) - val date = LocalDate.now().nextOrSameSchoolDay + val date = LocalDate.now() timetableRepository.getTimetable( student = student, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index ebc16239f..0e6459110 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -9,6 +9,7 @@ import android.view.View.GONE import android.view.View.VISIBLE import androidx.core.os.bundleOf import androidx.core.text.parseAsHtml +import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R @@ -160,6 +161,10 @@ class TimetableFragment : BaseFragment(R.layout.fragme binding.timetableRecycler.visibility = if (show) VISIBLE else GONE } + override fun showNavigation(show: Boolean) { + binding.timetableNavContainer.isVisible = true + } + override fun showPreButton(show: Boolean) { binding.timetablePreviousButton.visibility = if (show) VISIBLE else View.INVISIBLE } @@ -193,7 +198,9 @@ class TimetableFragment : BaseFragment(R.layout.fragme override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putLong(SAVED_DATE_KEY, presenter.currentDate.toEpochDay()) + presenter.currentDate?.toEpochDay()?.let { + outState.putLong(SAVED_DATE_KEY, it) + } } override fun onDestroyView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 0f8395ded..f99970482 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -1,5 +1,8 @@ package io.github.wulkanowy.ui.modules.timetable +import io.github.wulkanowy.data.dataOrNull +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.enums.TimetableGapsMode.BETWEEN_AND_BEFORE_LESSONS import io.github.wulkanowy.data.enums.TimetableGapsMode.NO_GAPS @@ -15,6 +18,8 @@ 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.data.toFirstResult +import io.github.wulkanowy.data.waitForResult import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AnalyticsHelper @@ -24,15 +29,16 @@ import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.isJustFinished import io.github.wulkanowy.utils.isShowTimeUntil import io.github.wulkanowy.utils.left +import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.until -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.firstOrNull import timber.log.Timber +import java.time.DayOfWeek import java.time.Instant import java.time.LocalDate import java.time.LocalDate.now @@ -51,9 +57,10 @@ class TimetablePresenter @Inject constructor( private val analytics: AnalyticsHelper, ) : BasePresenter(errorHandler, studentRepository) { - private var baseDate: LocalDate = now().nextOrSameSchoolDay + private var initialDate: LocalDate? = null + private var isWeekendHasLessons: Boolean = false - lateinit var currentDate: LocalDate + var currentDate: LocalDate? = null private set private lateinit var lastError: Throwable @@ -65,23 +72,30 @@ class TimetablePresenter @Inject constructor( view.initView() Timber.i("Timetable was initialized") errorHandler.showErrorMessage = ::showErrorViewOnError - reloadView(ofEpochDay(date ?: baseDate.toEpochDay())) + currentDate = date?.let(::ofEpochDay) loadData() - if (currentDate.isHolidays) setBaseDateOnHolidays() } fun onPreviousDay() { - reloadView(currentDate.previousSchoolDay) + val date = if (isWeekendHasLessons) { + currentDate?.minusDays(1) + } else currentDate?.previousSchoolDay + + reloadView(date ?: return) loadData() } fun onNextDay() { - reloadView(currentDate.nextSchoolDay) + val date = if (isWeekendHasLessons) { + currentDate?.plusDays(1) + } else currentDate?.nextSchoolDay + + reloadView(date ?: return) loadData() } fun onPickDate() { - view?.showDatePickerDialog(currentDate) + view?.showDatePickerDialog(currentDate ?: return) } fun onDateSet(year: Int, month: Int, day: Int) { @@ -110,10 +124,8 @@ class TimetablePresenter @Inject constructor( Timber.i("Timetable view is reselected") view?.let { view -> if (view.currentStackSize == 1) { - baseDate = now().nextOrSameSchoolDay - - if (currentDate != baseDate) { - reloadView(baseDate) + if (currentDate != initialDate) { + reloadView(initialDate ?: return) loadData() } else if (!view.isViewEmpty) { view.resetView() @@ -134,34 +146,25 @@ class TimetablePresenter @Inject constructor( return true } - private fun setBaseDateOnHolidays() { - flow { - val student = studentRepository.getCurrentStudent() - emit(semesterRepository.getCurrentSemester(student)) - }.catch { - Timber.i("Loading semester result: An exception occurred") - }.onEach { - baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear) - currentDate = baseDate - reloadNavigation() - }.launch("holidays") - } - private fun loadData(forceRefresh: Boolean = false) { flatResourceFlow { val student = studentRepository.getCurrentStudent() val semester = semesterRepository.getCurrentSemester(student) + + checkInitialAndCurrentDate(student, semester) timetableRepository.getTimetable( student = student, semester = semester, - start = currentDate, - end = currentDate, + start = currentDate ?: now(), + end = currentDate ?: now(), forceRefresh = forceRefresh, timetableType = TimetableRepository.TimetableType.NORMAL ) } .logResourceStatus("load timetable data") .onResourceData { + isWeekendHasLessons = isWeekendHasLessons || isWeekendHasLessons(it.lessons) + view?.run { enableSwipe(true) showProgress(false) @@ -169,7 +172,8 @@ class TimetablePresenter @Inject constructor( showContent(it.lessons.isNotEmpty()) showEmpty(it.lessons.isEmpty()) updateData(it.lessons) - setDayHeaderMessage(it.headers.singleOrNull { header -> header.date == currentDate }?.content) + setDayHeaderMessage(it.headers.find { header -> header.date == currentDate }?.content) + reloadNavigation() } } .onResourceIntermediate { view?.showRefresh(true) } @@ -191,6 +195,44 @@ class TimetablePresenter @Inject constructor( .launch() } + private suspend fun checkInitialAndCurrentDate(student: Student, semester: Semester) { + if (initialDate == null) { + val lessons = timetableRepository.getTimetable( + student = student, + semester = semester, + start = now().monday, + end = now().sunday, + forceRefresh = false, + timetableType = TimetableRepository.TimetableType.NORMAL + ).toFirstResult().dataOrNull?.lessons.orEmpty() + isWeekendHasLessons = isWeekendHasLessons(lessons) + initialDate = getInitialDate(semester) + } + + if (currentDate == null) { + currentDate = initialDate + } + } + + private fun isWeekendHasLessons( + lessons: List, + ): Boolean = lessons.any { + it.date.dayOfWeek in listOf( + DayOfWeek.SATURDAY, + DayOfWeek.SUNDAY, + ) + } + + private fun getInitialDate(semester: Semester): LocalDate { + val now = now() + + return when { + now.isHolidays -> now.getLastSchoolDayIfHoliday(semester.schoolYear) + isWeekendHasLessons -> now + else -> now.nextOrSameSchoolDay + } + } + private fun updateData(lessons: List) { tickTimer?.cancel() @@ -285,7 +327,7 @@ class TimetablePresenter @Inject constructor( private fun reloadView(date: LocalDate) { currentDate = date - Timber.i("Reload timetable view with the date ${currentDate.toFormattedString()}") + Timber.i("Reload timetable view with the date ${currentDate?.toFormattedString()}") view?.apply { showProgress(true) enableSwipe(false) @@ -298,10 +340,13 @@ class TimetablePresenter @Inject constructor( } private fun reloadNavigation() { + val currentDate = currentDate ?: return + view?.apply { showPreButton(!currentDate.minusDays(1).isHolidays) showNextButton(!currentDate.plusDays(1).isHolidays) updateNavigationDay(currentDate.toFormattedString("EEEE, dd.MM").capitalise()) + showNavigation(true) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt index 8cfb26204..40190d51f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt @@ -36,6 +36,8 @@ interface TimetableView : BaseView { fun showContent(show: Boolean) + fun showNavigation(show: Boolean) + fun showPreButton(show: Boolean) fun showNextButton(show: Boolean) diff --git a/app/src/main/res/layout/fragment_attendance.xml b/app/src/main/res/layout/fragment_attendance.xml index 14331120c..078daf610 100644 --- a/app/src/main/res/layout/fragment_attendance.xml +++ b/app/src/main/res/layout/fragment_attendance.xml @@ -128,7 +128,9 @@ android:layout_gravity="bottom" android:gravity="center" android:orientation="horizontal" - tools:ignore="UnusedAttribute"> + android:visibility="gone" + tools:ignore="UnusedAttribute" + tools:visibility="visible"> + android:visibility="gone" + tools:ignore="UnusedAttribute" + tools:visibility="visible"> Date: Mon, 23 Oct 2023 16:47:03 +0000 Subject: [PATCH 1269/1526] Bump androidx.recyclerview:recyclerview from 1.3.1 to 1.3.2 (#2332) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a591d2b2e..2d86ff376 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -207,7 +207,7 @@ dependencies { implementation "androidx.annotation:annotation:1.7.0" implementation "androidx.preference:preference-ktx:1.2.1" - implementation "androidx.recyclerview:recyclerview:1.3.1" + implementation "androidx.recyclerview:recyclerview:1.3.2" implementation "androidx.viewpager2:viewpager2:1.1.0-beta02" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.constraintlayout:constraintlayout:2.1.4" From 0e1c20a9527bfa7d1c82d7d851c5d1753b1e8400 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 16:48:23 +0000 Subject: [PATCH 1270/1526] Bump room from 2.5.2 to 2.6.0 (#2329) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 2d86ff376..97b526220 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -185,7 +185,7 @@ huaweiPublish { ext { work_manager = "2.8.1" android_hilt = "1.0.0" - room = "2.5.2" + room = "2.6.0" chucker = "3.5.2" mockk = "1.13.8" coroutines = "1.7.3" From 3d76d41b55278ba21e6d7297b75695ad223f09f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 16:49:58 +0000 Subject: [PATCH 1271/1526] Bump com.squareup.okhttp3:logging-interceptor from 4.11.0 to 4.12.0 (#2330) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 97b526220..47ef3cde0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -236,7 +236,7 @@ dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0" - implementation "com.squareup.okhttp3:logging-interceptor:4.11.0" + implementation "com.squareup.okhttp3:logging-interceptor:4.12.0" implementation "com.jakewharton.timber:timber:5.0.1" implementation "at.favre.lib:slf4j-timber:1.0.1" From a4a191700e5b449efa177125db3caad07421ad8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 17:28:38 +0000 Subject: [PATCH 1272/1526] Bump com.google.firebase:firebase-bom from 32.3.1 to 32.4.0 (#2331) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 47ef3cde0..066b3736d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -248,7 +248,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.10.0' - playImplementation platform('com.google.firebase:firebase-bom:32.3.1') + playImplementation platform('com.google.firebase:firebase-bom:32.4.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From fcea2218b53e06f19a31c5a2f777edb676fa529c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 23 Oct 2023 19:56:46 +0200 Subject: [PATCH 1273/1526] Version 2.2.2 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 066b3736d..42a1f8f74 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 133 - versionName "2.2.1" + versionCode 134 + versionName "2.2.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -192,7 +192,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.2.1' + implementation 'io.github.wulkanowy:sdk:2.2.2' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index dc78c1e3d..2d8d4ce7f 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,7 @@ -Wersja 2.2.1 +Wersja 2.2.2 -– dokonaliśmy kilka poprawek na ekranie logowania -– naprawiliśmy przypadek z błędnym wyświetlaniem starej klasy ucznia po zalogowaniu się na konto z nowej klasy +— dodaliśmy możliwość łatwego wejścia w sobotę i niedziele w planie lekcji przy użyciu strzałek +— poprawiliśmy wsparcie dla statystyk ocen z systemem punktowym +— poprawiliśmy sortowanie nauczycieli w widoku Szkoła i nauczyciele Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 762d4b13931768247bf5b29768dbbaef13c4f7c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 26 Oct 2023 10:06:54 +0200 Subject: [PATCH 1274/1526] Timetable timers fixes (#2333) --- .../wulkanowy/data/repositories/PreferencesRepository.kt | 6 ------ .../wulkanowy/ui/modules/timetable/TimetableAdapter.kt | 2 +- .../wulkanowy/ui/modules/timetable/TimetablePresenter.kt | 8 ++++++-- app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da-rDK/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-es-rES/strings.xml | 1 - app/src/main/res/values-it-rIT/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values/preferences_defaults.xml | 1 - app/src/main/res/values/preferences_keys.xml | 1 - app/src/main/res/values/strings.xml | 1 - app/src/main/res/xml/scheme_preferences_appearance.xml | 5 ----- 16 files changed, 7 insertions(+), 26 deletions(-) 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 85c74072e..495415f9f 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 @@ -194,12 +194,6 @@ class PreferencesRepository @Inject constructor( ) ) - val showTimetableTimers: Boolean - get() = getBoolean( - R.string.pref_key_timetable_show_timers, - R.bool.pref_default_timetable_show_timers - ) - val showTimetableGaps: TimetableGapsMode get() = TimetableGapsMode.getByValue( getString( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index 1201937c0..a957ef798 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -325,7 +325,7 @@ class TimetableAdapter @Inject constructor() : override fun getChangePayload(oldItem: TimetableItem, newItem: TimetableItem): Any? { return if (oldItem is TimetableItem.Normal && newItem is TimetableItem.Normal) { - if (oldItem.lesson == newItem.lesson && oldItem.timeLeft != newItem.timeLeft) { + if (oldItem.lesson == newItem.lesson && oldItem.showGroupsInPlan == newItem.showGroupsInPlan && oldItem.timeLeft != newItem.timeLeft) { "time_left" } else super.getChangePayload(oldItem, newItem) } else super.getChangePayload(oldItem, newItem) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index f99970482..6b442d1c2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -1,5 +1,7 @@ package io.github.wulkanowy.ui.modules.timetable +import android.os.Handler +import android.os.Looper import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student @@ -236,11 +238,13 @@ class TimetablePresenter @Inject constructor( private fun updateData(lessons: List) { tickTimer?.cancel() - if (!prefRepository.showTimetableTimers) { + if (currentDate != now()) { view?.updateData(createItems(lessons)) } else { tickTimer = timer(period = 2_000) { - view?.updateData(createItems(lessons)) + Handler(Looper.getMainLooper()).post { + view?.updateData(createItems(lessons)) + } } } } diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 1749548e1..3af494fa4 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -713,7 +713,6 @@ Zobrazit přítomnost Motiv Rozvíjení známek - Označit aktuální lekci Zobrazit skupiny vedle předmětů Zobrazit prázdné dlaždice, kde není žádná lekce Zobrazit seznam grafů v známkách třídy diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 500fba1f3..a89b83769 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -623,7 +623,6 @@ Show presence Theme Grades expanding - Mark current lesson Show groups next to subjects Show empty tiles where there\'s no lesson Show chart list in class grades diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d8cc92984..4c9aa2d28 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -623,7 +623,6 @@ Anwesendheit zeigen Thema Steigende Sorten - Aktuelle Lektion markieren Gruppen neben Schulfächen anzeigen Show empty tiles where there\'s no lesson Liste der Diagramme in Klassenbewertungen anzeigen diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 500fba1f3..a89b83769 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -623,7 +623,6 @@ Show presence Theme Grades expanding - Mark current lesson Show groups next to subjects Show empty tiles where there\'s no lesson Show chart list in class grades diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 500fba1f3..a89b83769 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -623,7 +623,6 @@ Show presence Theme Grades expanding - Mark current lesson Show groups next to subjects Show empty tiles where there\'s no lesson Show chart list in class grades diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 9375aeb39..31b9ce32c 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -713,7 +713,6 @@ Pokazuj obecność Motyw Rozwijanie ocen - Oznaczaj bieżącą lekcję Pokazuj grupę obok przedmiotu Pokazuj puste kafelki gdzie nie ma lekcji Pokazuj listę wykresów w ocenach klasy diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a6e45d445..89a94a59d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -713,7 +713,6 @@ Показывать присутствия Тема Разворачивание оценок - Отметить текущий урок Показать группы рядом с темами Show empty tiles where there\'s no lesson Показывать диаграммы в оценках класса diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index ed06e023e..3cde8152c 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -713,7 +713,6 @@ Zobraziť prítomnosť Motív Rozvijanie známok - Označiť aktuálne lekciu Zobraziť skupiny vedľa predmetov Zobraziť prázdne dlaždice, kde nie je žiadne lekcie Zobraziť zoznam grafov v známkach triedy diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6a79263f7..20a917aa4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -713,7 +713,6 @@ Показувати присутність Тема Розгортання оцінок - Позначити поточний урок Показувати групи поруч з темами Показувати порожні плитки там, де немає уроків Показувати діаграми в оцінках класу diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 8d69f25c8..8e6fc7d66 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -22,7 +22,6 @@ false no alphabetic - false between false false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index c48381e8c..5afffb649 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -27,7 +27,6 @@ grade_sorting_mode show_whole_class_plan show_groups_in_plan - timetable_show_timers timetable_show_gaps subjects_without_grades optional_arithmetic_average diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0ba9c9970..5cad09d0b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -701,7 +701,6 @@ Show presence Theme Grades expanding - Mark current lesson Show groups next to subjects Show empty tiles where there\'s no lesson Show chart list in class grades diff --git a/app/src/main/res/xml/scheme_preferences_appearance.xml b/app/src/main/res/xml/scheme_preferences_appearance.xml index 7177d396c..9c02a4910 100644 --- a/app/src/main/res/xml/scheme_preferences_appearance.xml +++ b/app/src/main/res/xml/scheme_preferences_appearance.xml @@ -90,11 +90,6 @@ android:layout_height="wrap_content" app:iconSpaceReserved="false" app:title="@string/pref_timetable_appearance_view"> - Date: Thu, 26 Oct 2023 14:01:45 +0200 Subject: [PATCH 1275/1526] New Crowdin updates (#2334) From eef3464d0bc79233a996d711903a8159079bc7ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 26 Oct 2023 18:31:51 +0200 Subject: [PATCH 1276/1526] Version 2.2.3 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 42a1f8f74..afa4ac160 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 134 - versionName "2.2.2" + versionCode 135 + versionName "2.2.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -192,7 +192,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.2.2' + implementation 'io.github.wulkanowy:sdk:2.2.3' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 2d8d4ce7f..dfc045462 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,6 @@ -Wersja 2.2.2 +Wersja 2.2.3 -— dodaliśmy możliwość łatwego wejścia w sobotę i niedziele w planie lekcji przy użyciu strzałek +— ułatwiliśmy przełączenie dnia na weekend w planie lekcji przy użyciu strzałek — poprawiliśmy wsparcie dla statystyk ocen z systemem punktowym — poprawiliśmy sortowanie nauczycieli w widoku Szkoła i nauczyciele From 1dbaa8bfdc327b11ceedaa24fd3f2449355247d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 27 Oct 2023 14:09:42 +0200 Subject: [PATCH 1277/1526] Migrate to separate app-update and review artifacts from play:core (#2336) --- app/build.gradle | 4 +- .../wulkanowy/utils/InAppUpdateHelper.kt | 13 ++++ .../io/github/wulkanowy/utils/UpdateHelper.kt | 17 ------ .../wulkanowy/utils/InAppUpdateHelper.kt | 13 ++++ .../io/github/wulkanowy/utils/UpdateHelper.kt | 17 ------ .../ui/modules/login/LoginActivity.kt | 18 ++---- .../wulkanowy/ui/modules/main/MainActivity.kt | 15 ++--- .../{UpdateHelper.kt => InAppUpdateHelper.kt} | 59 +++++++++++-------- 8 files changed, 71 insertions(+), 85 deletions(-) create mode 100644 app/src/fdroid/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt delete mode 100644 app/src/fdroid/java/io/github/wulkanowy/utils/UpdateHelper.kt create mode 100644 app/src/hms/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt delete mode 100644 app/src/hms/java/io/github/wulkanowy/utils/UpdateHelper.kt rename app/src/play/java/io/github/wulkanowy/utils/{UpdateHelper.kt => InAppUpdateHelper.kt} (76%) diff --git a/app/build.gradle b/app/build.gradle index afa4ac160..88becb9a2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -253,10 +253,10 @@ dependencies { playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.firebase:firebase-config-ktx' - playImplementation 'com.google.android.play:core:1.10.3' - playImplementation 'com.google.android.play:core-ktx:1.8.1' playImplementation 'com.google.android.gms:play-services-ads:22.4.0' playImplementation "com.google.android.play:integrity:1.2.0" + playImplementation 'com.google.android.play:app-update-ktx:2.1.0' + playImplementation 'com.google.android.play:review-ktx:2.0.1' hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.301' diff --git a/app/src/fdroid/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt b/app/src/fdroid/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt new file mode 100644 index 000000000..51b22ec74 --- /dev/null +++ b/app/src/fdroid/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt @@ -0,0 +1,13 @@ +package io.github.wulkanowy.utils + +import android.view.View +import javax.inject.Inject + +class InAppUpdateHelper @Inject constructor() { + + lateinit var messageContainer: View + + fun checkAndInstallUpdates() {} + + fun onResume() {} +} diff --git a/app/src/fdroid/java/io/github/wulkanowy/utils/UpdateHelper.kt b/app/src/fdroid/java/io/github/wulkanowy/utils/UpdateHelper.kt deleted file mode 100644 index 3abab9629..000000000 --- a/app/src/fdroid/java/io/github/wulkanowy/utils/UpdateHelper.kt +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.wulkanowy.utils - -import android.app.Activity -import android.view.View -import javax.inject.Inject - -@Suppress("UNUSED_PARAMETER") -class UpdateHelper @Inject constructor() { - - lateinit var messageContainer: View - - fun checkAndInstallUpdates(activity: Activity) {} - - fun onActivityResult(requestCode: Int, resultCode: Int) {} - - fun onResume(activity: Activity) {} -} diff --git a/app/src/hms/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt b/app/src/hms/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt new file mode 100644 index 000000000..51b22ec74 --- /dev/null +++ b/app/src/hms/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt @@ -0,0 +1,13 @@ +package io.github.wulkanowy.utils + +import android.view.View +import javax.inject.Inject + +class InAppUpdateHelper @Inject constructor() { + + lateinit var messageContainer: View + + fun checkAndInstallUpdates() {} + + fun onResume() {} +} diff --git a/app/src/hms/java/io/github/wulkanowy/utils/UpdateHelper.kt b/app/src/hms/java/io/github/wulkanowy/utils/UpdateHelper.kt deleted file mode 100644 index 3abab9629..000000000 --- a/app/src/hms/java/io/github/wulkanowy/utils/UpdateHelper.kt +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.wulkanowy.utils - -import android.app.Activity -import android.view.View -import javax.inject.Inject - -@Suppress("UNUSED_PARAMETER") -class UpdateHelper @Inject constructor() { - - lateinit var messageContainer: View - - fun checkAndInstallUpdates(activity: Activity) {} - - fun onActivityResult(requestCode: Int, resultCode: Int) {} - - fun onResume(activity: Activity) {} -} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt index c17c92efd..88f295788 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt @@ -23,7 +23,7 @@ import io.github.wulkanowy.ui.modules.login.symbol.LoginSymbolFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.notifications.NotificationsFragment import io.github.wulkanowy.utils.AppInfo -import io.github.wulkanowy.utils.UpdateHelper +import io.github.wulkanowy.utils.InAppUpdateHelper import javax.inject.Inject @AndroidEntryPoint @@ -33,7 +33,7 @@ class LoginActivity : BaseActivity(), Logi override lateinit var presenter: LoginPresenter @Inject - lateinit var updateHelper: UpdateHelper + lateinit var inAppUpdateHelper: InAppUpdateHelper @Inject lateinit var appInfo: AppInfo @@ -47,10 +47,10 @@ class LoginActivity : BaseActivity(), Logi setContentView(ActivityLoginBinding.inflate(layoutInflater).apply { binding = this }.root) setSupportActionBar(binding.loginToolbar) messageContainer = binding.loginContainer - updateHelper.messageContainer = binding.loginContainer + inAppUpdateHelper.messageContainer = binding.loginContainer presenter.onAttachView(this) - updateHelper.checkAndInstallUpdates(this) + inAppUpdateHelper.checkAndInstallUpdates() if (savedInstanceState == null) { openFragment(LoginFormFragment.newInstance(), clearBackStack = true) @@ -117,14 +117,6 @@ class LoginActivity : BaseActivity(), Logi override fun onResume() { super.onResume() - updateHelper.onResume(this) - } - - //https://developer.android.com/guide/playcore/in-app-updates#status_callback - @Deprecated("Deprecated in Java") - @Suppress("DEPRECATION") - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - updateHelper.onActivityResult(requestCode, resultCode) + inAppUpdateHelper.onResume() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 178d6e94b..25ab73bca 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -45,7 +45,7 @@ class MainActivity : BaseActivity(), MainVie lateinit var analytics: AnalyticsHelper @Inject - lateinit var updateHelper: UpdateHelper + lateinit var inAppUpdateHelper: InAppUpdateHelper @Inject lateinit var inAppReviewHelper: InAppReviewHelper @@ -100,7 +100,7 @@ class MainActivity : BaseActivity(), MainVie this.savedInstanceState = savedInstanceState messageContainer = binding.mainMessageContainer messageAnchor = binding.mainMessageContainer - updateHelper.messageContainer = binding.mainFragmentContainer + inAppUpdateHelper.messageContainer = binding.mainFragmentContainer onBackCallback = onBackPressedDispatcher.addCallback(this, enabled = false) { presenter.onBackPressed() } @@ -109,19 +109,12 @@ class MainActivity : BaseActivity(), MainVie ?.takeIf { savedInstanceState == null } presenter.onAttachView(this, destination) - updateHelper.checkAndInstallUpdates(this) + inAppUpdateHelper.checkAndInstallUpdates() } override fun onResume() { super.onResume() - updateHelper.onResume(this) - } - - //https://developer.android.com/guide/playcore/in-app-updates#status_callback - @Deprecated("Deprecated in Java") - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - updateHelper.onActivityResult(requestCode, resultCode) + inAppUpdateHelper.onResume() } override fun onCreateOptionsMenu(menu: Menu): Boolean { diff --git a/app/src/play/java/io/github/wulkanowy/utils/UpdateHelper.kt b/app/src/play/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt similarity index 76% rename from app/src/play/java/io/github/wulkanowy/utils/UpdateHelper.kt rename to app/src/play/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt index 6772237e2..d89dfd5f8 100644 --- a/app/src/play/java/io/github/wulkanowy/utils/UpdateHelper.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/InAppUpdateHelper.kt @@ -3,12 +3,15 @@ package io.github.wulkanowy.utils import android.app.Activity import android.app.Activity.RESULT_OK import android.content.Context -import android.content.IntentSender import android.view.View import android.widget.Toast +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity import com.google.android.material.snackbar.Snackbar import com.google.android.play.core.appupdate.AppUpdateInfo import com.google.android.play.core.appupdate.AppUpdateManagerFactory +import com.google.android.play.core.appupdate.AppUpdateOptions import com.google.android.play.core.install.InstallStateUpdatedListener import com.google.android.play.core.install.model.AppUpdateType.FLEXIBLE import com.google.android.play.core.install.model.AppUpdateType.IMMEDIATE @@ -20,15 +23,16 @@ import com.google.android.play.core.ktx.isFlexibleUpdateAllowed import com.google.android.play.core.ktx.isImmediateUpdateAllowed import com.google.android.play.core.ktx.updatePriority import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.android.scopes.ActivityScoped import io.github.wulkanowy.R import timber.log.Timber import javax.inject.Inject -import javax.inject.Singleton -@Singleton -class UpdateHelper @Inject constructor( +@ActivityScoped +class InAppUpdateHelper @Inject constructor( @ApplicationContext private val context: Context, private val analyticsHelper: AnalyticsHelper, + activity: Activity ) { lateinit var messageContainer: View @@ -39,6 +43,7 @@ class UpdateHelper @Inject constructor( when (state.installStatus()) { PENDING -> Toast.makeText(context, R.string.update_download_started, Toast.LENGTH_SHORT) .show() + DOWNLOADED -> popupSnackBarForCompleteUpdate() else -> Timber.d("Update state: ${state.installStatus()}") } @@ -70,45 +75,55 @@ class UpdateHelper @Inject constructor( return updateAvailability() == UPDATE_AVAILABLE && isFlexibleUpdateAllowed && isUpdatePriorityAllowUpdate } - fun checkAndInstallUpdates(activity: Activity) { + private val activityResultLauncher = (activity as AppCompatActivity).registerForActivityResult( + ActivityResultContracts.StartIntentSenderForResult(), + ::onActivityResult + ) + + fun checkAndInstallUpdates() { Timber.d("Checking for updates...") appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> when { appUpdateInfo.isImmediateUpdateAvailable -> { - startUpdate(activity, appUpdateInfo, IMMEDIATE) + startUpdate(appUpdateInfo, IMMEDIATE) } + appUpdateInfo.isFlexibleUpdateAvailable -> { appUpdateManager.registerListener(flexibleUpdateListener) - startUpdate(activity, appUpdateInfo, FLEXIBLE) + startUpdate(appUpdateInfo, FLEXIBLE) } + else -> Timber.d("No update available") } } } - private fun startUpdate(activity: Activity, appUpdateInfo: AppUpdateInfo, updateType: Int) { + private fun startUpdate(appUpdateInfo: AppUpdateInfo, updateType: Int) { Timber.d("Start update ($updateType): $appUpdateInfo") + try { appUpdateManager.startUpdateFlowForResult( - appUpdateInfo, updateType, activity, IN_APP_UPDATE_REQUEST_CODE + appUpdateInfo, + activityResultLauncher, + AppUpdateOptions.defaultOptions(updateType) ) - } catch (e: IntentSender.SendIntentException) { - Timber.i("Update failed! Duplicated PendingIntent") + } catch (e: Exception) { + Timber.e(e, "Update failed!") } } - fun onActivityResult(requestCode: Int, resultCode: Int) { - if (requestCode == IN_APP_UPDATE_REQUEST_CODE) { - if (resultCode != RESULT_OK) { - Timber.i("Update failed! Result code: $resultCode") - Toast.makeText(context, R.string.update_failed, Toast.LENGTH_LONG).show() - } + private fun onActivityResult(activityResult: ActivityResult) { + val resultCode = activityResult.resultCode - analyticsHelper.logEvent("inapp_update", "code" to resultCode) + if (resultCode != RESULT_OK) { + Timber.i("Update failed! Result code: $resultCode") + Toast.makeText(context, R.string.update_failed, Toast.LENGTH_LONG).show() } + + analyticsHelper.logEvent("inapp_update", "code" to resultCode) } - fun onResume(activity: Activity) { + fun onResume() { appUpdateManager.appUpdateInfo.addOnSuccessListener { info -> Timber.d("InAppUpdate.onResume() listener: $info") @@ -116,7 +131,6 @@ class UpdateHelper @Inject constructor( DOWNLOADED == info.installStatus() -> popupSnackBarForCompleteUpdate() DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS == info.updateAvailability() -> { startUpdate( - activity = activity, appUpdateInfo = info, updateType = if (info.isImmediateUpdateAvailable) IMMEDIATE else FLEXIBLE ) @@ -139,9 +153,4 @@ class UpdateHelper @Inject constructor( show() } } - - private companion object { - - private const val IN_APP_UPDATE_REQUEST_CODE = 1721 - } } From 124b6dfd79bcb5a4898219a7e7db5f5622437c03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 27 Oct 2023 14:49:41 +0200 Subject: [PATCH 1278/1526] Version 2.2.4 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 88becb9a2..0fcedc68e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 135 - versionName "2.2.3" + versionCode 136 + versionName "2.2.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -162,7 +162,7 @@ play { track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS userFraction = 0.01d - updatePriority = 3 + updatePriority = 0 enabled.set(false) } @@ -192,7 +192,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.2.3' + implementation 'io.github.wulkanowy:sdk:2.2.4' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index dfc045462..907221d79 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 2.2.3 +Wersja 2.2.4 — ułatwiliśmy przełączenie dnia na weekend w planie lekcji przy użyciu strzałek — poprawiliśmy wsparcie dla statystyk ocen z systemem punktowym From 3fd2683df7127ac49292515e56c844998a0e0075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 1 Nov 2023 16:47:39 +0100 Subject: [PATCH 1279/1526] Update dependencies and remove deprecations (#2340) --- app/build.gradle | 8 +-- .../data/db/migrations/Migration10.kt | 4 +- .../data/db/migrations/Migration11.kt | 14 +++-- .../data/db/migrations/Migration12.kt | 46 +++++++------- .../data/db/migrations/Migration13.kt | 50 ++++++++------- .../data/db/migrations/Migration14.kt | 7 ++- .../data/db/migrations/Migration15.kt | 8 ++- .../data/db/migrations/Migration16.kt | 8 ++- .../data/db/migrations/Migration17.kt | 18 +++--- .../data/db/migrations/Migration18.kt | 5 +- .../data/db/migrations/Migration19.kt | 62 +++++++++++-------- .../data/db/migrations/Migration2.kt | 8 ++- .../data/db/migrations/Migration20.kt | 20 +++--- .../data/db/migrations/Migration21.kt | 10 +-- .../data/db/migrations/Migration22.kt | 4 +- .../data/db/migrations/Migration23.kt | 10 +-- .../data/db/migrations/Migration24.kt | 10 +-- .../data/db/migrations/Migration25.kt | 6 +- .../data/db/migrations/Migration26.kt | 10 +-- .../data/db/migrations/Migration27.kt | 21 ++++--- .../data/db/migrations/Migration28.kt | 5 +- .../data/db/migrations/Migration29.kt | 13 ++-- .../data/db/migrations/Migration3.kt | 5 +- .../data/db/migrations/Migration30.kt | 8 ++- .../data/db/migrations/Migration31.kt | 4 +- .../data/db/migrations/Migration32.kt | 4 +- .../data/db/migrations/Migration33.kt | 6 +- .../data/db/migrations/Migration34.kt | 6 +- .../data/db/migrations/Migration35.kt | 8 +-- .../data/db/migrations/Migration36.kt | 6 +- .../data/db/migrations/Migration37.kt | 4 +- .../data/db/migrations/Migration38.kt | 8 ++- .../data/db/migrations/Migration39.kt | 8 +-- .../data/db/migrations/Migration4.kt | 7 ++- .../data/db/migrations/Migration40.kt | 6 +- .../data/db/migrations/Migration41.kt | 6 +- .../data/db/migrations/Migration42.kt | 6 +- .../data/db/migrations/Migration43.kt | 6 +- .../data/db/migrations/Migration44.kt | 4 +- .../data/db/migrations/Migration46.kt | 50 +++++++-------- .../data/db/migrations/Migration49.kt | 6 +- .../data/db/migrations/Migration5.kt | 18 ++++-- .../data/db/migrations/Migration50.kt | 6 +- .../data/db/migrations/Migration51.kt | 40 ++++++------ .../data/db/migrations/Migration53.kt | 18 +++--- .../data/db/migrations/Migration54.kt | 18 +++--- .../data/db/migrations/Migration6.kt | 20 +++--- .../data/db/migrations/Migration7.kt | 8 ++- .../data/db/migrations/Migration8.kt | 8 +-- .../data/db/migrations/Migration9.kt | 7 ++- build.gradle | 4 -- 51 files changed, 353 insertions(+), 299 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0fcedc68e..3a90d3fb9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -242,13 +242,13 @@ dependencies { implementation "at.favre.lib:slf4j-timber:1.0.1" implementation 'com.github.bastienpaulfr:Treessence:1.1.2' implementation "com.mikepenz:aboutlibraries-core:$about_libraries" - implementation "io.coil-kt:coil:2.4.0" + implementation 'io.coil-kt:coil:2.5.0' implementation "io.github.wulkanowy:AppKillerManager:3.0.1" implementation 'me.xdrop:fuzzywuzzy:1.4.0' implementation 'com.fredporciuncula:flow-preferences:1.9.1' - implementation 'org.apache.commons:commons-text:1.10.0' + implementation 'org.apache.commons:commons-text:1.11.0' - playImplementation platform('com.google.firebase:firebase-bom:32.4.0') + playImplementation platform('com.google.firebase:firebase-bom:32.4.1') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' @@ -272,7 +272,7 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines" testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" - testImplementation 'org.robolectric:robolectric:4.10.3' + testImplementation 'org.robolectric:robolectric:4.11' testImplementation "androidx.test:runner:1.5.2" testImplementation "androidx.test.ext:junit:1.1.5" testImplementation "androidx.test:core:1.5.0" diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration10.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration10.kt index c26a02d1f..0e7e14097 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration10.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration10.kt @@ -5,7 +5,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration10 : Migration(9, 10) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Grades_Summary RENAME TO GradesSummary") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Grades_Summary RENAME TO GradesSummary") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration11.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration11.kt index 6d129bca0..342e2e2e3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration11.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration11.kt @@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration11 : Migration(10, 11) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Grades_temp ( id INTEGER PRIMARY KEY NOT NULL, is_read INTEGER NOT NULL, @@ -26,9 +27,10 @@ class Migration11 : Migration(10, 11) { date INTEGER NOT NULL, teacher TEXT NOT NULL ) - """) - database.execSQL("INSERT INTO Grades_temp SELECT * FROM Grades") - database.execSQL("DROP TABLE Grades") - database.execSQL("ALTER TABLE Grades_temp RENAME TO Grades") + """ + ) + db.execSQL("INSERT INTO Grades_temp SELECT * FROM Grades") + db.execSQL("DROP TABLE Grades") + db.execSQL("ALTER TABLE Grades_temp RENAME TO Grades") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration12.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration12.kt index c827b82ba..6cc726953 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration12.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration12.kt @@ -5,16 +5,17 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration12 : Migration(11, 12) { - override fun migrate(database: SupportSQLiteDatabase) { - createTempStudentsTable(database) - replaceStudentTable(database) - updateStudentsWithClassId(database, getStudentsIds(database)) - removeStudentsWithNoClassId(database) - ensureThereIsOnlyOneCurrentStudent(database) + override fun migrate(db: SupportSQLiteDatabase) { + createTempStudentsTable(db) + replaceStudentTable(db) + updateStudentsWithClassId(db, getStudentsIds(db)) + removeStudentsWithNoClassId(db) + ensureThereIsOnlyOneCurrentStudent(db) } - private fun createTempStudentsTable(database: SupportSQLiteDatabase) { - database.execSQL(""" + private fun createTempStudentsTable(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Students_tmp ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, endpoint TEXT NOT NULL, @@ -30,15 +31,16 @@ class Migration12 : Migration(11, 12) { registration_date INTEGER NOT NULL, class_id INTEGER NOT NULL ) - """) - database.execSQL("CREATE UNIQUE INDEX index_Students_email_symbol_student_id_school_id_class_id ON Students_tmp (email, symbol, student_id, school_id, class_id)") + """ + ) + db.execSQL("CREATE UNIQUE INDEX index_Students_email_symbol_student_id_school_id_class_id ON Students_tmp (email, symbol, student_id, school_id, class_id)") } - private fun replaceStudentTable(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Students ADD COLUMN class_id INTEGER DEFAULT 0 NOT NULL") - database.execSQL("INSERT INTO Students_tmp SELECT * FROM Students") - database.execSQL("DROP TABLE Students") - database.execSQL("ALTER TABLE Students_tmp RENAME TO Students") + private fun replaceStudentTable(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Students ADD COLUMN class_id INTEGER DEFAULT 0 NOT NULL") + db.execSQL("INSERT INTO Students_tmp SELECT * FROM Students") + db.execSQL("DROP TABLE Students") + db.execSQL("ALTER TABLE Students_tmp RENAME TO Students") } private fun getStudentsIds(database: SupportSQLiteDatabase): List { @@ -54,18 +56,18 @@ class Migration12 : Migration(11, 12) { return students } - private fun updateStudentsWithClassId(database: SupportSQLiteDatabase, students: List) { + private fun updateStudentsWithClassId(db: SupportSQLiteDatabase, students: List) { students.forEach { - database.execSQL("UPDATE Students SET class_id = IFNULL((SELECT class_id FROM Semesters WHERE student_id = $it), 0) WHERE student_id = $it") + db.execSQL("UPDATE Students SET class_id = IFNULL((SELECT class_id FROM Semesters WHERE student_id = $it), 0) WHERE student_id = $it") } } - private fun removeStudentsWithNoClassId(database: SupportSQLiteDatabase) { - database.execSQL("DELETE FROM Students WHERE class_id = 0") + private fun removeStudentsWithNoClassId(db: SupportSQLiteDatabase) { + db.execSQL("DELETE FROM Students WHERE class_id = 0") } - private fun ensureThereIsOnlyOneCurrentStudent(database: SupportSQLiteDatabase) { - database.execSQL("UPDATE Students SET is_current = 0") - database.execSQL("UPDATE Students SET is_current = 1 WHERE id = (SELECT MAX(id) FROM Students)") + private fun ensureThereIsOnlyOneCurrentStudent(db: SupportSQLiteDatabase) { + db.execSQL("UPDATE Students SET is_current = 0") + db.execSQL("UPDATE Students SET is_current = 1 WHERE id = (SELECT MAX(id) FROM Students)") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration13.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration13.kt index 36de1e837..c5030232b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration13.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration13.kt @@ -5,27 +5,30 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration13 : Migration(12, 13) { - override fun migrate(database: SupportSQLiteDatabase) { - addClassNameToStudents(database, getStudentsIds(database)) - updateSemestersTable(database) - markAtLeastAndOnlyOneSemesterAtCurrent(database, getStudentsAndClassIds(database)) - clearMessagesTable(database) + override fun migrate(db: SupportSQLiteDatabase) { + addClassNameToStudents(db, getStudentsIds(db)) + updateSemestersTable(db) + markAtLeastAndOnlyOneSemesterAtCurrent(db, getStudentsAndClassIds(db)) + clearMessagesTable(db) } - private fun addClassNameToStudents(database: SupportSQLiteDatabase, students: List>) { - database.execSQL("ALTER TABLE Students ADD COLUMN class_name TEXT DEFAULT \"\" NOT NULL") + private fun addClassNameToStudents( + db: SupportSQLiteDatabase, + students: List> + ) { + db.execSQL("ALTER TABLE Students ADD COLUMN class_name TEXT DEFAULT \"\" NOT NULL") students.forEach { (id, name) -> val schoolName = name.substringAfter(" - ") val className = name.substringBefore(" - ", "").replace("Klasa ", "") - database.execSQL("UPDATE Students SET class_name = '$className' WHERE id = '$id'") - database.execSQL("UPDATE Students SET school_name = '$schoolName' WHERE id = '$id'") + db.execSQL("UPDATE Students SET class_name = '$className' WHERE id = '$id'") + db.execSQL("UPDATE Students SET school_name = '$schoolName' WHERE id = '$id'") } } - private fun getStudentsIds(database: SupportSQLiteDatabase): MutableList> { + private fun getStudentsIds(db: SupportSQLiteDatabase): MutableList> { val students = mutableListOf>() - database.query("SELECT id, school_name FROM Students").use { + db.query("SELECT id, school_name FROM Students").use { if (it.moveToFirst()) { do { students.add(it.getInt(0) to it.getString(1)) @@ -36,15 +39,15 @@ class Migration13 : Migration(12, 13) { return students } - private fun updateSemestersTable(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Semesters ADD COLUMN school_year INTEGER DEFAULT 1970 NOT NULL") - database.execSQL("ALTER TABLE Semesters ADD COLUMN start INTEGER DEFAULT 0 NOT NULL") - database.execSQL("ALTER TABLE Semesters ADD COLUMN `end` INTEGER DEFAULT 0 NOT NULL") + private fun updateSemestersTable(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Semesters ADD COLUMN school_year INTEGER DEFAULT 1970 NOT NULL") + db.execSQL("ALTER TABLE Semesters ADD COLUMN start INTEGER DEFAULT 0 NOT NULL") + db.execSQL("ALTER TABLE Semesters ADD COLUMN `end` INTEGER DEFAULT 0 NOT NULL") } - private fun getStudentsAndClassIds(database: SupportSQLiteDatabase): List> { + private fun getStudentsAndClassIds(db: SupportSQLiteDatabase): List> { val students = mutableListOf>() - database.query("SELECT student_id, class_id FROM Students").use { + db.query("SELECT student_id, class_id FROM Students").use { if (it.moveToFirst()) { do { students.add(it.getInt(0) to it.getInt(1)) @@ -55,14 +58,17 @@ class Migration13 : Migration(12, 13) { return students } - private fun markAtLeastAndOnlyOneSemesterAtCurrent(database: SupportSQLiteDatabase, students: List>) { + private fun markAtLeastAndOnlyOneSemesterAtCurrent( + db: SupportSQLiteDatabase, + students: List> + ) { students.forEach { (studentId, classId) -> - database.execSQL("UPDATE Semesters SET is_current = 0 WHERE student_id = '$studentId' AND class_id = '$classId'") - database.execSQL("UPDATE Semesters SET is_current = 1 WHERE id = (SELECT id FROM Semesters WHERE student_id = '$studentId' AND class_id = '$classId' ORDER BY semester_id DESC)") + db.execSQL("UPDATE Semesters SET is_current = 0 WHERE student_id = '$studentId' AND class_id = '$classId'") + db.execSQL("UPDATE Semesters SET is_current = 1 WHERE id = (SELECT id FROM Semesters WHERE student_id = '$studentId' AND class_id = '$classId' ORDER BY semester_id DESC)") } } - private fun clearMessagesTable(database: SupportSQLiteDatabase) { - database.execSQL("DELETE FROM Messages") + private fun clearMessagesTable(db: SupportSQLiteDatabase) { + db.execSQL("DELETE FROM Messages") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration14.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration14.kt index 4dac0d306..793b4a9d2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration14.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration14.kt @@ -5,9 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration14 : Migration(13, 14) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS GradesSummary") - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS GradesSummary") + db.execSQL( + """ CREATE TABLE IF NOT EXISTS GradesSummary ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, semester_id INTEGER NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration15.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration15.kt index 5be49a95b..5ff44e9ca 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration15.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration15.kt @@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration15 : Migration(14, 15) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS MobileDevices ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, student_id INTEGER NOT NULL, @@ -14,6 +15,7 @@ class Migration15 : Migration(14, 15) { name TEXT NOT NULL, date INTEGER NOT NULL ) - """) + """ + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration16.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration16.kt index 7f40c0f8d..8a8f5b8f2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration16.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration16.kt @@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration16 : Migration(15, 16) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Teachers ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, student_id INTEGER NOT NULL, @@ -15,6 +16,7 @@ class Migration16 : Migration(15, 16) { name TEXT NOT NULL, short_name TEXT NOT NULL ) - """) + """ + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration17.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration17.kt index e2a2574db..cf3318ad4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration17.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration17.kt @@ -5,13 +5,14 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration17 : Migration(16, 17) { - override fun migrate(database: SupportSQLiteDatabase) { - createGradesPointsStatisticsTable(database) - truncateSemestersTable(database) + override fun migrate(db: SupportSQLiteDatabase) { + createGradesPointsStatisticsTable(db) + truncateSemestersTable(db) } - private fun createGradesPointsStatisticsTable(database: SupportSQLiteDatabase) { - database.execSQL(""" + private fun createGradesPointsStatisticsTable(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS GradesPointsStatistics( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, student_id INTEGER NOT NULL, @@ -20,10 +21,11 @@ class Migration17 : Migration(16, 17) { others REAL NOT NULL, student REAL NOT NULL ) - """) + """ + ) } - private fun truncateSemestersTable(database: SupportSQLiteDatabase) { - database.execSQL("DELETE FROM Semesters") + private fun truncateSemestersTable(db: SupportSQLiteDatabase) { + db.execSQL("DELETE FROM Semesters") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration18.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration18.kt index 6c5e56c6a..713f8e724 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration18.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration18.kt @@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration18 : Migration(17, 18) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS School ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, student_id INTEGER NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration19.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration19.kt index d38f1245a..021cdbb37 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration19.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration19.kt @@ -6,16 +6,17 @@ import io.github.wulkanowy.data.db.SharedPrefProvider class Migration19(private val sharedPrefProvider: SharedPrefProvider) : Migration(18, 19) { - override fun migrate(database: SupportSQLiteDatabase) { - migrateMessages(database) - migrateGrades(database) - migrateStudents(database) + override fun migrate(db: SupportSQLiteDatabase) { + migrateMessages(db) + migrateGrades(db) + migrateStudents(db) migrateSharedPreferences() } - private fun migrateMessages(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE Messages") - database.execSQL(""" + private fun migrateMessages(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE Messages") + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Messages ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, is_notified INTEGER NOT NULL, @@ -34,12 +35,14 @@ class Migration19(private val sharedPrefProvider: SharedPrefProvider) : Migratio read_by INTEGER NOT NULL, removed INTEGER NOT NULL ) - """) + """ + ) } - private fun migrateGrades(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE Grades") - database.execSQL(""" + private fun migrateGrades(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE Grades") + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Grades ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, is_read INTEGER NOT NULL, @@ -59,11 +62,13 @@ class Migration19(private val sharedPrefProvider: SharedPrefProvider) : Migratio date INTEGER NOT NULL, teacher TEXT NOT NULL ) - """) + """ + ) } - private fun migrateStudents(database: SupportSQLiteDatabase) { - database.execSQL(""" + private fun migrateStudents(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Students_tmp ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, scrapper_base_url TEXT NOT NULL, @@ -86,26 +91,29 @@ class Migration19(private val sharedPrefProvider: SharedPrefProvider) : Migratio is_current INTEGER NOT NULL, registration_date INTEGER NOT NULL ) - """) + """ + ) - database.execSQL("ALTER TABLE Students ADD COLUMN scrapperBaseUrl TEXT NOT NULL DEFAULT \"\";") - database.execSQL("ALTER TABLE Students ADD COLUMN apiBaseUrl TEXT NOT NULL DEFAULT \"\";") - database.execSQL("ALTER TABLE Students ADD COLUMN is_parent INT NOT NULL DEFAULT 0;") - database.execSQL("ALTER TABLE Students ADD COLUMN loginMode TEXT NOT NULL DEFAULT \"\";") - database.execSQL("ALTER TABLE Students ADD COLUMN certificateKey TEXT NOT NULL DEFAULT \"\";") - database.execSQL("ALTER TABLE Students ADD COLUMN privateKey TEXT NOT NULL DEFAULT \"\";") - database.execSQL("ALTER TABLE Students ADD COLUMN user_login_id INTEGER NOT NULL DEFAULT 0;") + db.execSQL("ALTER TABLE Students ADD COLUMN scrapperBaseUrl TEXT NOT NULL DEFAULT \"\";") + db.execSQL("ALTER TABLE Students ADD COLUMN apiBaseUrl TEXT NOT NULL DEFAULT \"\";") + db.execSQL("ALTER TABLE Students ADD COLUMN is_parent INT NOT NULL DEFAULT 0;") + db.execSQL("ALTER TABLE Students ADD COLUMN loginMode TEXT NOT NULL DEFAULT \"\";") + db.execSQL("ALTER TABLE Students ADD COLUMN certificateKey TEXT NOT NULL DEFAULT \"\";") + db.execSQL("ALTER TABLE Students ADD COLUMN privateKey TEXT NOT NULL DEFAULT \"\";") + db.execSQL("ALTER TABLE Students ADD COLUMN user_login_id INTEGER NOT NULL DEFAULT 0;") - database.execSQL(""" + db.execSQL( + """ INSERT INTO Students_tmp( id, scrapper_base_url, mobile_base_url, is_parent, login_type, login_mode, certificate_key, private_key, email, password, symbol, student_id, user_login_id, student_name, school_id, school_name, school_id, school_name, class_name, class_id, is_current, registration_date) SELECT id, endpoint, apiBaseUrl, is_parent, loginType, "SCRAPPER", certificateKey, privateKey, email, password, symbol, student_id, user_login_id, student_name, school_id, school_name, school_id, school_name, class_name, class_id, is_current, registration_date FROM Students - """) - database.execSQL("DROP TABLE Students") - database.execSQL("ALTER TABLE Students_tmp RENAME TO Students") - database.execSQL("CREATE UNIQUE INDEX index_Students_email_symbol_student_id_school_id_class_id ON Students (email, symbol, student_id, school_id, class_id)") + """ + ) + db.execSQL("DROP TABLE Students") + db.execSQL("ALTER TABLE Students_tmp RENAME TO Students") + db.execSQL("CREATE UNIQUE INDEX index_Students_email_symbol_student_id_school_id_class_id ON Students (email, symbol, student_id, school_id, class_id)") } private fun migrateSharedPreferences() { diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration2.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration2.kt index c5a30991a..be8675092 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration2.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration2.kt @@ -5,14 +5,16 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration2 : Migration(1, 2) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS LuckyNumbers ( id INTEGER PRIMARY KEY NOT NULL, is_notified INTEGER NOT NULL, student_id INTEGER NOT NULL, date INTEGER NOT NULL, lucky_number INTEGER NOT NULL) - """) + """ + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration20.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration20.kt index 2fcfc183d..7ad43230b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration20.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration20.kt @@ -5,14 +5,15 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration20 : Migration(19, 20) { - override fun migrate(database: SupportSQLiteDatabase) { - migrateTimetable(database) - truncateSubjects(database) + override fun migrate(db: SupportSQLiteDatabase) { + migrateTimetable(db) + truncateSubjects(db) } - private fun migrateTimetable(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE Timetable") - database.execSQL(""" + private fun migrateTimetable(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE Timetable") + db.execSQL( + """ CREATE TABLE IF NOT EXISTS `Timetable` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, @@ -33,10 +34,11 @@ class Migration20 : Migration(19, 20) { `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL ) - """) + """ + ) } - private fun truncateSubjects(database: SupportSQLiteDatabase) { - database.execSQL("DELETE FROM Subjects") + private fun truncateSubjects(db: SupportSQLiteDatabase) { + db.execSQL("DELETE FROM Subjects") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration21.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration21.kt index bc0ff900c..60e044cdc 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration21.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration21.kt @@ -5,11 +5,11 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration21 : Migration(20, 21) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Attendance ADD COLUMN excusable INTEGER NOT NULL DEFAULT 0") - database.execSQL("ALTER TABLE Attendance ADD COLUMN time_id INTEGER NOT NULL DEFAULT 0") - database.execSQL("ALTER TABLE Attendance ADD COLUMN excuse_status TEXT DEFAULT NULL") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Attendance ADD COLUMN excusable INTEGER NOT NULL DEFAULT 0") + db.execSQL("ALTER TABLE Attendance ADD COLUMN time_id INTEGER NOT NULL DEFAULT 0") + db.execSQL("ALTER TABLE Attendance ADD COLUMN excuse_status TEXT DEFAULT NULL") - database.execSQL("DELETE FROM Semesters") + db.execSQL("DELETE FROM Semesters") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration22.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration22.kt index cf50a6c3e..ef525a49d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration22.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration22.kt @@ -5,7 +5,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration22 : Migration(21, 22) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Students ADD COLUMN school_short TEXT NOT NULL DEFAULT ''") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Students ADD COLUMN school_short TEXT NOT NULL DEFAULT ''") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration23.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration23.kt index 22de94c3f..3650307a6 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration23.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration23.kt @@ -5,10 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration23 : Migration(22, 23) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Notes ADD COLUMN teacher_symbol TEXT NOT NULL DEFAULT ''") - database.execSQL("ALTER TABLE Notes ADD COLUMN category_type INTEGER NOT NULL DEFAULT 0") - database.execSQL("ALTER TABLE Notes ADD COLUMN is_points_show INTEGER NOT NULL DEFAULT 0") - database.execSQL("ALTER TABLE Notes ADD COLUMN points INTEGER NOT NULL DEFAULT 0") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Notes ADD COLUMN teacher_symbol TEXT NOT NULL DEFAULT ''") + db.execSQL("ALTER TABLE Notes ADD COLUMN category_type INTEGER NOT NULL DEFAULT 0") + db.execSQL("ALTER TABLE Notes ADD COLUMN is_points_show INTEGER NOT NULL DEFAULT 0") + db.execSQL("ALTER TABLE Notes ADD COLUMN points INTEGER NOT NULL DEFAULT 0") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration24.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration24.kt index 604ed4875..a3cd98197 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration24.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration24.kt @@ -5,9 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration24 : Migration(23, 24) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Messages ADD COLUMN has_attachments INTEGER NOT NULL DEFAULT 0") - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Messages ADD COLUMN has_attachments INTEGER NOT NULL DEFAULT 0") + db.execSQL( + """ CREATE TABLE IF NOT EXISTS MessageAttachments ( real_id INTEGER NOT NULL, message_id INTEGER NOT NULL, @@ -16,6 +17,7 @@ class Migration24 : Migration(23, 24) { filename TEXT NOT NULL, PRIMARY KEY(real_id) ) - """) + """ + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration25.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration25.kt index 4749bac73..cb395d7e0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration25.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration25.kt @@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration25 : Migration(24, 25) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Homework ADD COLUMN is_done INTEGER NOT NULL DEFAULT 0") - database.execSQL("ALTER TABLE Homework ADD COLUMN attachments TEXT NOT NULL DEFAULT \"[]\"") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Homework ADD COLUMN is_done INTEGER NOT NULL DEFAULT 0") + db.execSQL("ALTER TABLE Homework ADD COLUMN attachments TEXT NOT NULL DEFAULT \"[]\"") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration26.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration26.kt index 7130d86d8..94746b456 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration26.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration26.kt @@ -5,10 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration26 : Migration(25, 26) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE GradesSummary ADD COLUMN is_predicted_grade_notified INTEGER NOT NULL DEFAULT 1") - database.execSQL("ALTER TABLE GradesSummary ADD COLUMN is_final_grade_notified INTEGER NOT NULL DEFAULT 1") - database.execSQL("ALTER TABLE GradesSummary ADD COLUMN predicted_grade_last_change INTEGER NOT NULL DEFAULT 0") - database.execSQL("ALTER TABLE GradesSummary ADD COLUMN final_grade_last_change INTEGER NOT NULL DEFAULT 0") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE GradesSummary ADD COLUMN is_predicted_grade_notified INTEGER NOT NULL DEFAULT 1") + db.execSQL("ALTER TABLE GradesSummary ADD COLUMN is_final_grade_notified INTEGER NOT NULL DEFAULT 1") + db.execSQL("ALTER TABLE GradesSummary ADD COLUMN predicted_grade_last_change INTEGER NOT NULL DEFAULT 0") + db.execSQL("ALTER TABLE GradesSummary ADD COLUMN final_grade_last_change INTEGER NOT NULL DEFAULT 0") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration27.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration27.kt index 5c60beead..a7ba763df 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration27.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration27.kt @@ -5,24 +5,25 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration27 : Migration(26, 27) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Students ADD COLUMN user_name TEXT NOT NULL DEFAULT \"\"") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Students ADD COLUMN user_name TEXT NOT NULL DEFAULT \"\"") - val students = getStudentsIdsAndNames(database) - val units = getReportingUnits(database) + val students = getStudentsIdsAndNames(db) + val units = getReportingUnits(db) students.forEach { (id, userLoginId, studentName) -> - val userNameFromUnits = units.singleOrNull { (senderId, _) -> senderId == userLoginId }?.second + val userNameFromUnits = + units.singleOrNull { (senderId, _) -> senderId == userLoginId }?.second val normalizedStudentName = studentName.split(" ").asReversed().joinToString(" ") val userName = userNameFromUnits ?: normalizedStudentName - database.execSQL("UPDATE Students SET user_name = '$userName' WHERE id = '$id'") + db.execSQL("UPDATE Students SET user_name = '$userName' WHERE id = '$id'") } } - private fun getStudentsIdsAndNames(database: SupportSQLiteDatabase): MutableList> { + private fun getStudentsIdsAndNames(db: SupportSQLiteDatabase): MutableList> { val students = mutableListOf>() - database.query("SELECT id, user_login_id, student_name FROM Students").use { + db.query("SELECT id, user_login_id, student_name FROM Students").use { if (it.moveToFirst()) { do { students.add(Triple(it.getLong(0), it.getInt(1), it.getString(2))) @@ -33,9 +34,9 @@ class Migration27 : Migration(26, 27) { return students } - private fun getReportingUnits(database: SupportSQLiteDatabase): MutableList> { + private fun getReportingUnits(db: SupportSQLiteDatabase): MutableList> { val units = mutableListOf>() - database.query("SELECT sender_id, sender_name FROM ReportingUnits").use { + db.query("SELECT sender_id, sender_name FROM ReportingUnits").use { if (it.moveToFirst()) { do { units.add(it.getInt(0) to it.getString(1)) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration28.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration28.kt index 51e7628b5..e8a5a4a86 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration28.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration28.kt @@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration28 : Migration(27, 28) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Conferences ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, student_id INTEGER NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration29.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration29.kt index 327552d75..dac303d27 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration29.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration29.kt @@ -5,9 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration29 : Migration(28, 29) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS GradesStatistics") - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS GradesStatistics") + db.execSQL( + """ CREATE TABLE IF NOT EXISTS GradeSemesterStatistics ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, student_id INTEGER NOT NULL, @@ -16,8 +17,10 @@ class Migration29 : Migration(28, 29) { amounts TEXT NOT NULL, student_grade INTEGER NOT NULL ) - """) - database.execSQL(""" + """ + ) + db.execSQL( + """ CREATE TABLE IF NOT EXISTS GradePartialStatistics ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, student_id INTEGER NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration3.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration3.kt index d9699c0f4..44d421648 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration3.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration3.kt @@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration3 : Migration(2, 3) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS CompletedLesson ( id INTEGER PRIMARY KEY NOT NULL, student_id INTEGER NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration30.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration30.kt index b33914fec..3fea8ec0e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration30.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration30.kt @@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration30 : Migration(29, 30) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE TimetableAdditional ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, student_id INTEGER NOT NULL, @@ -16,6 +17,7 @@ class Migration30 : Migration(29, 30) { date INTEGER NOT NULL, subject TEXT NOT NULL ) - """) + """ + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration31.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration31.kt index 064a3e5bc..28fb10562 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration31.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration31.kt @@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration31 : Migration(30, 31) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL( + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( """CREATE TABLE IF NOT EXISTS StudentInfo ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, student_id INTEGER NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration32.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration32.kt index 508485e08..347873936 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration32.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration32.kt @@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration32 : Migration(31, 32) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Students ADD COLUMN nick TEXT NOT NULL DEFAULT \"\"") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Students ADD COLUMN nick TEXT NOT NULL DEFAULT \"\"") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration33.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration33.kt index 4a57880d4..9778d2790 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration33.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration33.kt @@ -5,10 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration33 : Migration(32, 33) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS StudentInfo") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS StudentInfo") - database.execSQL( + db.execSQL( """CREATE TABLE IF NOT EXISTS StudentInfo ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, student_id INTEGER NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration34.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration34.kt index 2c57eb00a..e9eec58cd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration34.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration34.kt @@ -5,9 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration34 : Migration(33, 34) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("DELETE FROM ReportingUnits") - database.execSQL("DELETE FROM Recipients") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("DELETE FROM ReportingUnits") + db.execSQL("DELETE FROM Recipients") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration35.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration35.kt index f63431d00..b238ce8b4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration35.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration35.kt @@ -7,13 +7,13 @@ import io.github.wulkanowy.utils.AppInfo class Migration35(private val appInfo: AppInfo) : Migration(34, 35) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Students ADD COLUMN `avatar_color` INTEGER NOT NULL DEFAULT 0") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Students ADD COLUMN `avatar_color` INTEGER NOT NULL DEFAULT 0") - database.query("SELECT * FROM Students").use { + db.query("SELECT * FROM Students").use { while (it.moveToNext()) { val studentId = it.getLongOrNull(0) - database.execSQL( + db.execSQL( """ UPDATE Students SET avatar_color = ${appInfo.defaultColorsForAvatar.random()} diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration36.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration36.kt index 7ea106585..62ce346cd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration36.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration36.kt @@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration36 : Migration(35, 36) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Exams ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") - database.execSQL("ALTER TABLE Homework ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Exams ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") + db.execSQL("ALTER TABLE Homework ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration37.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration37.kt index a3fcd51a6..9ab35514f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration37.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration37.kt @@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration37 : Migration(36, 37) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL( + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( """ CREATE TABLE IF NOT EXISTS TimetableHeaders ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration38.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration38.kt index 1f90f5a44..bb9b32bfa 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration38.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration38.kt @@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration38 : Migration(37, 38) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS `SchoolAnnouncements` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `student_id` INTEGER NOT NULL, @@ -14,6 +15,7 @@ class Migration38 : Migration(37, 38) { `subject` TEXT NOT NULL, `content` TEXT NOT NULL ) - """) + """ + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration39.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration39.kt index 6c0d36dd2..2e5315bf4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration39.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration39.kt @@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration39 : Migration(38, 39) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Conferences ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") - database.execSQL("ALTER TABLE SchoolAnnouncements ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Conferences ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") + db.execSQL("ALTER TABLE SchoolAnnouncements ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration4.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration4.kt index 0ae89bdd6..b6089aa62 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration4.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration4.kt @@ -5,9 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration4 : Migration(3, 4) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS Messages") - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS Messages") + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Messages ( id INTEGER PRIMARY KEY NOT NULL, is_notified INTEGER NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration40.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration40.kt index 6d2795c7c..8e38b0c84 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration40.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration40.kt @@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration40 : Migration(39, 40) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL( + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( """ CREATE TABLE IF NOT EXISTS `Notifications` ( `student_id` INTEGER NOT NULL, @@ -20,4 +20,4 @@ class Migration40 : Migration(39, 40) { """ ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt index ccaf85755..bfc28334b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration41.kt @@ -7,9 +7,9 @@ import io.github.wulkanowy.data.enums.GradeExpandMode class Migration41(private val sharedPrefProvider: SharedPrefProvider) : Migration(40, 41) { - override fun migrate(database: SupportSQLiteDatabase) { + override fun migrate(db: SupportSQLiteDatabase) { migrateSharedPreferences() - database.execSQL("ALTER TABLE Homework ADD COLUMN is_added_by_user INTEGER NOT NULL DEFAULT 0") + db.execSQL("ALTER TABLE Homework ADD COLUMN is_added_by_user INTEGER NOT NULL DEFAULT 0") } private fun migrateSharedPreferences() { @@ -18,4 +18,4 @@ class Migration41(private val sharedPrefProvider: SharedPrefProvider) : Migratio } sharedPrefProvider.delete("pref_key_expand_grade") } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration42.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration42.kt index 3d66f301b..14356e279 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration42.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration42.kt @@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration42 : Migration(41, 42) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL( + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( """CREATE TABLE IF NOT EXISTS `AdminMessages` ( `id` INTEGER NOT NULL, `title` TEXT NOT NULL, @@ -21,4 +21,4 @@ class Migration42 : Migration(41, 42) { PRIMARY KEY(`id`))""" ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration43.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration43.kt index 68c2834d6..ef8108166 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration43.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration43.kt @@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration43 : Migration(42, 43) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Timetable ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") - database.execSQL("ALTER TABLE Attendance ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Timetable ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") + db.execSQL("ALTER TABLE Attendance ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration44.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration44.kt index 7bdcab5f4..0a4e5f962 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration44.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration44.kt @@ -5,7 +5,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration44 : Migration(43, 44) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE AdminMessages ADD COLUMN is_dismissible INTEGER NOT NULL DEFAULT 0") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE AdminMessages ADD COLUMN is_dismissible INTEGER NOT NULL DEFAULT 0") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration46.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration46.kt index d3fa5cf93..0bacbaa0e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration46.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration46.kt @@ -8,65 +8,65 @@ import java.time.ZoneOffset class Migration46 : Migration(45, 46) { - override fun migrate(database: SupportSQLiteDatabase) { - migrateConferences(database) - migrateMessages(database) - migrateMobileDevices(database) - migrateNotifications(database) - migrateTimetable(database) - migrateTimetableAdditional(database) + override fun migrate(db: SupportSQLiteDatabase) { + migrateConferences(db) + migrateMessages(db) + migrateMobileDevices(db) + migrateNotifications(db) + migrateTimetable(db) + migrateTimetableAdditional(db) } - private fun migrateConferences(database: SupportSQLiteDatabase) { - database.query("SELECT * FROM Conferences").use { + private fun migrateConferences(db: SupportSQLiteDatabase) { + db.query("SELECT * FROM Conferences").use { while (it.moveToNext()) { val id = it.getLong(it.getColumnIndexOrThrow("id")) val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date")) val timestampUtc = timestampLocal.timestampLocalToUTC() - database.execSQL("UPDATE Conferences SET date = $timestampUtc WHERE id = $id") + db.execSQL("UPDATE Conferences SET date = $timestampUtc WHERE id = $id") } } } - private fun migrateMessages(database: SupportSQLiteDatabase) { - database.query("SELECT * FROM Messages").use { + private fun migrateMessages(db: SupportSQLiteDatabase) { + db.query("SELECT * FROM Messages").use { while (it.moveToNext()) { val id = it.getLong(it.getColumnIndexOrThrow("id")) val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date")) val timestampUtc = timestampLocal.timestampLocalToUTC() - database.execSQL("UPDATE Messages SET date = $timestampUtc WHERE id = $id") + db.execSQL("UPDATE Messages SET date = $timestampUtc WHERE id = $id") } } } - private fun migrateMobileDevices(database: SupportSQLiteDatabase) { - database.query("SELECT * FROM MobileDevices").use { + private fun migrateMobileDevices(db: SupportSQLiteDatabase) { + db.query("SELECT * FROM MobileDevices").use { while (it.moveToNext()) { val id = it.getLong(it.getColumnIndexOrThrow("id")) val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date")) val timestampUtc = timestampLocal.timestampLocalToUTC() - database.execSQL("UPDATE MobileDevices SET date = $timestampUtc WHERE id = $id") + db.execSQL("UPDATE MobileDevices SET date = $timestampUtc WHERE id = $id") } } } - private fun migrateNotifications(database: SupportSQLiteDatabase) { - database.query("SELECT * FROM Notifications").use { + private fun migrateNotifications(db: SupportSQLiteDatabase) { + db.query("SELECT * FROM Notifications").use { while (it.moveToNext()) { val id = it.getLong(it.getColumnIndexOrThrow("id")) val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date")) val timestampUtc = timestampLocal.timestampLocalToUTC() - database.execSQL("UPDATE Notifications SET date = $timestampUtc WHERE id = $id") + db.execSQL("UPDATE Notifications SET date = $timestampUtc WHERE id = $id") } } } - private fun migrateTimetable(database: SupportSQLiteDatabase) { - database.query("SELECT * FROM Timetable").use { + private fun migrateTimetable(db: SupportSQLiteDatabase) { + db.query("SELECT * FROM Timetable").use { while (it.moveToNext()) { val id = it.getLong(it.getColumnIndexOrThrow("id")) val timestampLocalStart = it.getLong(it.getColumnIndexOrThrow("start")) @@ -74,13 +74,13 @@ class Migration46 : Migration(45, 46) { val timestampUtcStart = timestampLocalStart.timestampLocalToUTC() val timestampUtcEnd = timestampLocalEnd.timestampLocalToUTC() - database.execSQL("UPDATE Timetable SET start = $timestampUtcStart, end = $timestampUtcEnd WHERE id = $id") + db.execSQL("UPDATE Timetable SET start = $timestampUtcStart, end = $timestampUtcEnd WHERE id = $id") } } } - private fun migrateTimetableAdditional(database: SupportSQLiteDatabase) { - database.query("SELECT * FROM TimetableAdditional").use { + private fun migrateTimetableAdditional(db: SupportSQLiteDatabase) { + db.query("SELECT * FROM TimetableAdditional").use { while (it.moveToNext()) { val id = it.getLong(it.getColumnIndexOrThrow("id")) val timestampLocalStart = it.getLong(it.getColumnIndexOrThrow("start")) @@ -88,7 +88,7 @@ class Migration46 : Migration(45, 46) { val timestampUtcStart = timestampLocalStart.timestampLocalToUTC() val timestampUtcEnd = timestampLocalEnd.timestampLocalToUTC() - database.execSQL("UPDATE TimetableAdditional SET start = $timestampUtcStart, end = $timestampUtcEnd WHERE id = $id") + db.execSQL("UPDATE TimetableAdditional SET start = $timestampUtcStart, end = $timestampUtcEnd WHERE id = $id") } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration49.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration49.kt index 6e1de19d4..97766c01e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration49.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration49.kt @@ -5,10 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration49 : Migration(48, 49) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS SchoolAnnouncements") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS SchoolAnnouncements") - database.execSQL( + db.execSQL( """ CREATE TABLE IF NOT EXISTS `SchoolAnnouncements` ( `user_login_id` INTEGER NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt index dbcd916ba..a5b4e8e1a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt @@ -7,11 +7,16 @@ import java.time.ZoneOffset class Migration5 : Migration(4, 5) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Students ADD COLUMN registration_date INTEGER DEFAULT 0 NOT NULL") - database.execSQL("UPDATE Students SET registration_date = '${now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli()}'") - database.execSQL("DROP TABLE IF EXISTS Notes") - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Students ADD COLUMN registration_date INTEGER DEFAULT 0 NOT NULL") + db.execSQL( + "UPDATE Students SET registration_date = '${ + now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli() + }'" + ) + db.execSQL("DROP TABLE IF EXISTS Notes") + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Notes ( id INTEGER PRIMARY KEY NOT NULL, is_read INTEGER NOT NULL, @@ -21,6 +26,7 @@ class Migration5 : Migration(4, 5) { teacher TEXT NOT NULL, category TEXT NOT NULL, content TEXT NOT NULL) - """) + """ + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration50.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration50.kt index d45a81570..577998ca0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration50.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration50.kt @@ -5,9 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration50 : Migration(49, 50) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS MobileDevices") - database.execSQL( + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS MobileDevices") + db.execSQL( """ CREATE TABLE IF NOT EXISTS `MobileDevices` ( `user_login_id` INTEGER NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration51.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration51.kt index e78e2e3a7..7023049f9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration51.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration51.kt @@ -5,17 +5,17 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration51 : Migration(50, 51) { - override fun migrate(database: SupportSQLiteDatabase) { - createMailboxTable(database) - recreateMessagesTable(database) - recreateMessageAttachmentsTable(database) - recreateRecipientsTable(database) - deleteReportingUnitTable(database) + override fun migrate(db: SupportSQLiteDatabase) { + createMailboxTable(db) + recreateMessagesTable(db) + recreateMessageAttachmentsTable(db) + recreateRecipientsTable(db) + deleteReportingUnitTable(db) } - private fun createMailboxTable(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS Mailboxes") - database.execSQL( + private fun createMailboxTable(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS Mailboxes") + db.execSQL( """ CREATE TABLE IF NOT EXISTS `Mailboxes` ( `globalKey` TEXT NOT NULL, @@ -30,9 +30,9 @@ class Migration51 : Migration(50, 51) { ) } - private fun recreateMessagesTable(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS Messages") - database.execSQL( + private fun recreateMessagesTable(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS Messages") + db.execSQL( """ CREATE TABLE IF NOT EXISTS `Messages` ( `message_global_key` TEXT NOT NULL, @@ -52,9 +52,9 @@ class Migration51 : Migration(50, 51) { ) } - private fun recreateMessageAttachmentsTable(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS MessageAttachments") - database.execSQL( + private fun recreateMessageAttachmentsTable(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS MessageAttachments") + db.execSQL( """ CREATE TABLE IF NOT EXISTS `MessageAttachments` ( `real_id` INTEGER NOT NULL, @@ -66,9 +66,9 @@ class Migration51 : Migration(50, 51) { ) } - private fun recreateRecipientsTable(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS Recipients") - database.execSQL( + private fun recreateRecipientsTable(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS Recipients") + db.execSQL( """ CREATE TABLE IF NOT EXISTS `Recipients` ( `mailboxGlobalKey` TEXT NOT NULL, @@ -82,7 +82,7 @@ class Migration51 : Migration(50, 51) { ) } - private fun deleteReportingUnitTable(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS ReportingUnits") + private fun deleteReportingUnitTable(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS ReportingUnits") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration53.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration53.kt index 12624a51a..dd9e68c97 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration53.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration53.kt @@ -5,14 +5,14 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration53 : Migration(52, 53) { - override fun migrate(database: SupportSQLiteDatabase) { - createMailboxTable(database) - recreateMessagesTable(database) + override fun migrate(db: SupportSQLiteDatabase) { + createMailboxTable(db) + recreateMessagesTable(db) } - private fun createMailboxTable(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS Mailboxes") - database.execSQL( + private fun createMailboxTable(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS Mailboxes") + db.execSQL( """ CREATE TABLE IF NOT EXISTS `Mailboxes` ( `globalKey` TEXT NOT NULL, @@ -29,9 +29,9 @@ class Migration53 : Migration(52, 53) { ) } - private fun recreateMessagesTable(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS Messages") - database.execSQL( + private fun recreateMessagesTable(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS Messages") + db.execSQL( """ CREATE TABLE IF NOT EXISTS `Messages` ( `email` TEXT NOT NULL, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration54.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration54.kt index 678bd32f2..60bd21f0a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration54.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration54.kt @@ -5,22 +5,24 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration54 : Migration(53, 54) { - override fun migrate(database: SupportSQLiteDatabase) { - migrateResman(database) - removeTomaszowMazowieckiStudents(database) + override fun migrate(db: SupportSQLiteDatabase) { + migrateResman(db) + removeTomaszowMazowieckiStudents(db) } - private fun migrateResman(database: SupportSQLiteDatabase) { - database.execSQL(""" + private fun migrateResman(db: SupportSQLiteDatabase) { + db.execSQL( + """ UPDATE Students SET scrapper_base_url = 'https://vulcan.net.pl', login_type = 'ADFSLightScoped', symbol = 'rzeszowprojekt' WHERE scrapper_base_url = 'https://resman.pl' - """.trimIndent()) + """.trimIndent() + ) } - private fun removeTomaszowMazowieckiStudents(database: SupportSQLiteDatabase) { - database.execSQL("DELETE FROM Students WHERE symbol = 'tomaszowmazowiecki'") + private fun removeTomaszowMazowieckiStudents(db: SupportSQLiteDatabase) { + db.execSQL("DELETE FROM Students WHERE symbol = 'tomaszowmazowiecki'") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration6.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration6.kt index fa9436187..06cd5f0fd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration6.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration6.kt @@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration6 : Migration(5, 6) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS ReportingUnits ( id INTEGER PRIMARY KEY NOT NULL, student_id INTEGER NOT NULL, @@ -15,9 +16,11 @@ class Migration6 : Migration(5, 6) { sender_id INTEGER NOT NULL, sender_name TEXT NOT NULL, roles TEXT NOT NULL) - """) + """ + ) - database.execSQL(""" + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Recipients ( id INTEGER PRIMARY KEY NOT NULL, student_id INTEGER NOT NULL, @@ -28,10 +31,11 @@ class Migration6 : Migration(5, 6) { unit_id INTEGER NOT NULL, role INTEGER NOT NULL, hash TEXT NOT NULL) - """) + """ + ) - database.execSQL("DELETE FROM Semesters WHERE 1") - database.execSQL("ALTER TABLE Semesters ADD COLUMN class_id INTEGER DEFAULT 0 NOT NULL") - database.execSQL("ALTER TABLE Semesters ADD COLUMN unit_id INTEGER DEFAULT 0 NOT NULL") + db.execSQL("DELETE FROM Semesters WHERE 1") + db.execSQL("ALTER TABLE Semesters ADD COLUMN class_id INTEGER DEFAULT 0 NOT NULL") + db.execSQL("ALTER TABLE Semesters ADD COLUMN unit_id INTEGER DEFAULT 0 NOT NULL") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration7.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration7.kt index 120716c81..83a822f22 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration7.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration7.kt @@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration7 : Migration(6, 7) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE IF NOT EXISTS GradesStatistics ( id INTEGER PRIMARY KEY NOT NULL, student_id INTEGER NOT NULL, @@ -15,6 +16,7 @@ class Migration7 : Migration(6, 7) { grade INTEGER NOT NULL, amount INTEGER NOT NULL, is_semester INTEGER NOT NULL) - """) + """ + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration8.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration8.kt index 7009ee129..992e8c68d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration8.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration8.kt @@ -5,9 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration8 : Migration(7, 8) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE Timetable ADD COLUMN subjectOld TEXT DEFAULT \"\" NOT NULL") - database.execSQL("ALTER TABLE Timetable ADD COLUMN roomOld TEXT DEFAULT \"\" NOT NULL") - database.execSQL("ALTER TABLE Timetable ADD COLUMN teacherOld TEXT DEFAULT \"\" NOT NULL") + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE Timetable ADD COLUMN subjectOld TEXT DEFAULT \"\" NOT NULL") + db.execSQL("ALTER TABLE Timetable ADD COLUMN roomOld TEXT DEFAULT \"\" NOT NULL") + db.execSQL("ALTER TABLE Timetable ADD COLUMN teacherOld TEXT DEFAULT \"\" NOT NULL") } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration9.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration9.kt index d79a57062..b83c34c41 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration9.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration9.kt @@ -5,9 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Migration9 : Migration(8, 9) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("DROP TABLE IF EXISTS Messages") - database.execSQL(""" + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("DROP TABLE IF EXISTS Messages") + db.execSQL( + """ CREATE TABLE IF NOT EXISTS Messages ( id INTEGER PRIMARY KEY NOT NULL, student_id INTEGER NOT NULL, diff --git a/build.gradle b/build.gradle index 3fafd2d24..e2b82e9a3 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,3 @@ allprojects { maven { url "https://developer.huawei.com/repo/" } } } - -tasks.register('clean', Delete) { - delete rootProject.buildDir -} From 6802d740020f452348de8c7b5dc374f2ff49ae33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 17:31:05 +0000 Subject: [PATCH 1280/1526] Bump com.google.firebase:firebase-bom from 32.4.1 to 32.5.0 (#2341) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3a90d3fb9..661ebf87e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -248,7 +248,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.11.0' - playImplementation platform('com.google.firebase:firebase-bom:32.4.1') + playImplementation platform('com.google.firebase:firebase-bom:32.5.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From 3bf27baed5f276a148f43b733157bf1d48ef9251 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 17:31:24 +0000 Subject: [PATCH 1281/1526] Bump org.robolectric:robolectric from 4.11 to 4.11.1 (#2342) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 661ebf87e..78a6e084d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -272,7 +272,7 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines" testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" - testImplementation 'org.robolectric:robolectric:4.11' + testImplementation 'org.robolectric:robolectric:4.11.1' testImplementation "androidx.test:runner:1.5.2" testImplementation "androidx.test.ext:junit:1.1.5" testImplementation "androidx.test:core:1.5.0" From 06b6d88dd1179f6d8b8f03f3555af061a1e0fb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 3 Nov 2023 23:05:35 +0100 Subject: [PATCH 1282/1526] Version 2.2.5 --- app/build.gradle | 6 +++--- .../ui/modules/grade/summary/GradeSummaryPresenter.kt | 2 +- app/src/main/play/release-notes/pl-PL/default.txt | 6 ++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 78a6e084d..2feeaac08 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 136 - versionName "2.2.4" + versionCode 137 + versionName "2.2.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -192,7 +192,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.2.4' + implementation 'io.github.wulkanowy:sdk:2.2.5' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 4d5a43d8f..32508ff6f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -42,7 +42,7 @@ class GradeSummaryPresenter @Inject constructor( val student = studentRepository.getCurrentStudent() averageProvider.getGradesDetailsWithAverage(student, semesterId, forceRefresh) } - .logResourceStatus("load grade summary", showData = true) + .logResourceStatus("load grade summary") .mapResourceData { createGradeSummaryItems(it) } .onResourceData { view?.run { diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 907221d79..1f494a355 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,7 +1,5 @@ -Wersja 2.2.4 +Wersja 2.2.5 -— ułatwiliśmy przełączenie dnia na weekend w planie lekcji przy użyciu strzałek -— poprawiliśmy wsparcie dla statystyk ocen z systemem punktowym -— poprawiliśmy sortowanie nauczycieli w widoku Szkoła i nauczyciele +— naprawiliśmy logowanie do aplikacji, które zostało zepsute w piątek aktualizacją dziennika VULCAN Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 7fa9219c7ba83d027b4056ba180575791f0c419d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 6 Nov 2023 09:40:47 +0100 Subject: [PATCH 1283/1526] Bump sdk version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 2feeaac08..3f7f33cb7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -192,7 +192,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.2.5' + implementation 'io.github.wulkanowy:sdk:2.2.6-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' From ce9cb351726578680ff96d5b44fd9a2f70940ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 6 Nov 2023 11:22:15 +0100 Subject: [PATCH 1284/1526] Version 2.2.6 --- app/build.gradle | 10 +++++----- app/src/main/play/release-notes/pl-PL/default.txt | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3f7f33cb7..7448b799a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 137 - versionName "2.2.5" + versionCode 138 + versionName "2.2.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -161,8 +161,8 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.01d - updatePriority = 0 + userFraction = 0.99d + updatePriority = 5 enabled.set(false) } @@ -192,7 +192,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.2.6-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.2.6' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 1f494a355..bb2266809 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,5 @@ -Wersja 2.2.5 +Wersja 2.2.6 -— naprawiliśmy logowanie do aplikacji, które zostało zepsute w piątek aktualizacją dziennika VULCAN +— naprawiliśmy logowanie do aplikacji (tym razem musi się udać) na odmianie standardowej i podobnych Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 037cbb0b1971de04da5992bb7ee6a95b27dc6d48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 23:08:13 +0100 Subject: [PATCH 1285/1526] Bump about_libraries from 10.9.1 to 10.9.2 (#2344) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mikołaj Pich --- .idea/migrations.xml | 10 ++++++++++ app/build.gradle | 2 +- build.gradle | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 .idea/migrations.xml diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 000000000..f8051a6f9 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7448b799a..6d6314661 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -192,7 +192,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.2.6' + implementation 'io.github.wulkanowy:sdk:2.2.7-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' diff --git a/build.gradle b/build.gradle index e2b82e9a3..12e3bd972 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.9.10' - about_libraries = '10.9.1' + about_libraries = '10.9.2' hilt_version = '2.48.1' } repositories { From 650cf7484e177ad11c5f0c1b82f14474d431c119 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:10:11 +0000 Subject: [PATCH 1286/1526] Bump android_hilt from 1.0.0 to 1.1.0 (#2343) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6d6314661..d97a89df8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -184,7 +184,7 @@ huaweiPublish { ext { work_manager = "2.8.1" - android_hilt = "1.0.0" + android_hilt = "1.1.0" room = "2.6.0" chucker = "3.5.2" mockk = "1.13.8" From f61b6a5e78b6c80eb0c9944e7e6d09f688f7d0c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:10:32 +0000 Subject: [PATCH 1287/1526] Bump com.google.android.play:integrity from 1.2.0 to 1.3.0 (#2351) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d97a89df8..20683d27c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -254,7 +254,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.firebase:firebase-config-ktx' playImplementation 'com.google.android.gms:play-services-ads:22.4.0' - playImplementation "com.google.android.play:integrity:1.2.0" + playImplementation "com.google.android.play:integrity:1.3.0" playImplementation 'com.google.android.play:app-update-ktx:2.1.0' playImplementation 'com.google.android.play:review-ktx:2.0.1' From 01f892ce5ca314f3e1d1ea157a309f4cf06f3c5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:19:53 +0000 Subject: [PATCH 1288/1526] Bump com.android.tools.build:gradle from 8.1.2 to 8.1.4 (#2356) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 12e3bd972..a61fad1d1 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.13" - classpath 'com.android.tools.build:gradle:8.1.2' + classpath 'com.android.tools.build:gradle:8.1.4' 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' From 643ad60455cba661ba72d99329a7d71fc0dbb767 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:20:18 +0000 Subject: [PATCH 1289/1526] Bump com.google.firebase:firebase-bom from 32.5.0 to 32.6.0 (#2355) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 20683d27c..1bbb8c375 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -248,7 +248,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.11.0' - playImplementation platform('com.google.firebase:firebase-bom:32.5.0') + playImplementation platform('com.google.firebase:firebase-bom:32.6.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From e9540b4012696df3cdb1132a60c969d5916145c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:20:41 +0000 Subject: [PATCH 1290/1526] Bump androidx.activity:activity-ktx from 1.8.0 to 1.8.1 (#2354) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 1bbb8c375..7038485c9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -201,7 +201,7 @@ dependencies { implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.core:core-splashscreen:1.0.1' - implementation "androidx.activity:activity-ktx:1.8.0" + implementation "androidx.activity:activity-ktx:1.8.1" implementation "androidx.appcompat:appcompat:1.6.1" implementation "androidx.fragment:fragment-ktx:1.6.1" implementation "androidx.annotation:annotation:1.7.0" From 17caa8ecbda7cba09b9804266da16f89ba5f47d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:21:00 +0000 Subject: [PATCH 1291/1526] Bump com.android.tools:desugar_jdk_libs from 2.0.3 to 2.0.4 (#2345) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 7038485c9..3432aa319 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -194,7 +194,7 @@ ext { dependencies { implementation 'io.github.wulkanowy:sdk:2.2.7-SNAPSHOT' - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" From 59d46ce956eadf36b87be3da33f6bdac7a65e5a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:21:19 +0000 Subject: [PATCH 1292/1526] Bump com.google.android.gms:play-services-ads from 22.4.0 to 22.5.0 (#2346) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3432aa319..6dbd5d557 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -253,7 +253,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.firebase:firebase-config-ktx' - playImplementation 'com.google.android.gms:play-services-ads:22.4.0' + playImplementation 'com.google.android.gms:play-services-ads:22.5.0' playImplementation "com.google.android.play:integrity:1.3.0" playImplementation 'com.google.android.play:app-update-ktx:2.1.0' playImplementation 'com.google.android.play:review-ktx:2.0.1' From e82ac78d4a47bb361918dc2d1a91f6fab2f971f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:32:18 +0000 Subject: [PATCH 1293/1526] Bump androidx.fragment:fragment-ktx from 1.6.1 to 1.6.2 (#2348) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6dbd5d557..b4ea30a83 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -203,7 +203,7 @@ dependencies { implementation 'androidx.core:core-splashscreen:1.0.1' implementation "androidx.activity:activity-ktx:1.8.1" implementation "androidx.appcompat:appcompat:1.6.1" - implementation "androidx.fragment:fragment-ktx:1.6.1" + implementation "androidx.fragment:fragment-ktx:1.6.2" implementation "androidx.annotation:annotation:1.7.0" implementation "androidx.preference:preference-ktx:1.2.1" From 2c40c221c356d8c552673b5037589290694931a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:32:32 +0000 Subject: [PATCH 1294/1526] Bump kotlin_version from 1.9.10 to 1.9.21 (#2357) --- build.gradle | 4 ++-- gradle.properties | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index a61fad1d1..7ae2426bd 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.9.10' + kotlin_version = '1.9.21' about_libraries = '10.9.2' hilt_version = '2.48.1' } @@ -13,7 +13,7 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.13" + classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.15" classpath 'com.android.tools.build:gradle:8.1.4' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.4.0' diff --git a/gradle.properties b/gradle.properties index 4c54d414a..7f8fd20a0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,3 +11,5 @@ android.defaults.buildfeatures.buildconfig=true # https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-common-faq-0000001063210244#section17273113244910 apmsInstrumentationEnabled=false +# https://community.sonarsource.com/t/sonarscanner-for-gradle-you-can-now-decide-when-to-compile/102069/2 +systemProp.sonar.gradle.skipCompile=true From 137c30529579269833ca78cd7dbd55f857fb401f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:44:23 +0000 Subject: [PATCH 1295/1526] Bump org.jetbrains.kotlinx:kotlinx-serialization-json (#2365) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b4ea30a83..4985f96ae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -196,7 +196,7 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' - implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" implementation 'androidx.core:core-ktx:1.12.0' From b4c0440a8e62aaef78dd279472f926466ac838fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:44:37 +0000 Subject: [PATCH 1296/1526] Bump hilt_version from 2.48.1 to 2.49 (#2362) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7ae2426bd..f45031b2f 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.9.21' about_libraries = '10.9.2' - hilt_version = '2.48.1' + hilt_version = '2.49' } repositories { mavenCentral() From 003d63b516286d2599f08437f50af522fd093523 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:44:50 +0000 Subject: [PATCH 1297/1526] Bump room from 2.6.0 to 2.6.1 (#2360) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4985f96ae..c8f9515e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -185,7 +185,7 @@ huaweiPublish { ext { work_manager = "2.8.1" android_hilt = "1.1.0" - room = "2.6.0" + room = "2.6.1" chucker = "3.5.2" mockk = "1.13.8" coroutines = "1.7.3" From 0d950fbd860980699b4a3a436b6a3dcb5f48a06e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 15:52:35 +0000 Subject: [PATCH 1298/1526] Bump com.google.android.gms:play-services-ads from 22.5.0 to 22.6.0 (#2367) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c8f9515e0..391eb7a11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -253,7 +253,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.firebase:firebase-config-ktx' - playImplementation 'com.google.android.gms:play-services-ads:22.5.0' + playImplementation 'com.google.android.gms:play-services-ads:22.6.0' playImplementation "com.google.android.play:integrity:1.3.0" playImplementation 'com.google.android.play:app-update-ktx:2.1.0' playImplementation 'com.google.android.play:review-ktx:2.0.1' From eceef3f58297be314701d911a2dfde019f853b9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 15:52:54 +0000 Subject: [PATCH 1299/1526] Bump com.google.firebase:firebase-bom from 32.6.0 to 32.7.0 (#2366) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 391eb7a11..0aecc86ac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -248,7 +248,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.11.0' - playImplementation platform('com.google.firebase:firebase-bom:32.6.0') + playImplementation platform('com.google.firebase:firebase-bom:32.7.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-crashlytics:' From 784ee583840417014ff173a1de38708dc380732a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 16:21:08 +0000 Subject: [PATCH 1300/1526] Bump work_manager from 2.8.1 to 2.9.0 (#2363) --- app/build.gradle | 2 +- .../main/java/io/github/wulkanowy/WulkanowyApp.kt | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0aecc86ac..938392d30 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -183,7 +183,7 @@ huaweiPublish { } ext { - work_manager = "2.8.1" + work_manager = "2.9.0" android_hilt = "1.1.0" room = "2.6.1" chucker = "3.5.2" diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index dc1061018..2e8ca6e67 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -1,7 +1,9 @@ package io.github.wulkanowy import android.app.Application -import android.util.Log.* +import android.util.Log.DEBUG +import android.util.Log.INFO +import android.util.Log.VERBOSE import androidx.hilt.work.HiltWorkerFactory import androidx.work.Configuration import com.yariksoffice.lingver.Lingver @@ -9,7 +11,14 @@ import dagger.hilt.android.HiltAndroidApp import fr.bipi.treessence.file.FileLoggerTree import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.ui.base.ThemeManager -import io.github.wulkanowy.utils.* +import io.github.wulkanowy.utils.ActivityLifecycleLogger +import io.github.wulkanowy.utils.AdsHelper +import io.github.wulkanowy.utils.AnalyticsHelper +import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.CrashLogExceptionTree +import io.github.wulkanowy.utils.CrashLogTree +import io.github.wulkanowy.utils.DebugLogTree +import io.github.wulkanowy.utils.RemoteConfigHelper import timber.log.Timber import javax.inject.Inject @@ -75,7 +84,7 @@ class WulkanowyApp : Application(), Configuration.Provider { } } - override fun getWorkManagerConfiguration() = Configuration.Builder() + override val workManagerConfiguration: Configuration = Configuration.Builder() .setWorkerFactory(workerFactory) .setMinimumLoggingLevel(if (appInfo.isDebug) VERBOSE else INFO) .build() From 71ebf1260b56946e14c22e612df6f365a839de71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 19:44:32 +0000 Subject: [PATCH 1301/1526] Bump com.android.tools.build:gradle from 8.1.4 to 8.2.0 (#2361) --- app/build.gradle | 15 ++++++++------- app/jacoco.gradle | 2 +- .../java/io/github/wulkanowy/WulkanowyApp.kt | 17 +++++++++-------- build.gradle | 2 +- gradle.properties | 1 - 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 938392d30..83db44f96 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -113,6 +113,7 @@ android { buildFeatures { viewBinding true + buildConfig true } bundle { @@ -186,7 +187,7 @@ ext { work_manager = "2.9.0" android_hilt = "1.1.0" room = "2.6.1" - chucker = "3.5.2" + chucker = "4.0.0" mockk = "1.13.8" coroutines = "1.7.3" } @@ -201,10 +202,10 @@ dependencies { implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.core:core-splashscreen:1.0.1' - implementation "androidx.activity:activity-ktx:1.8.1" + implementation "androidx.activity:activity-ktx:1.8.2" implementation "androidx.appcompat:appcompat:1.6.1" implementation "androidx.fragment:fragment-ktx:1.6.2" - implementation "androidx.annotation:annotation:1.7.0" + implementation "androidx.annotation:annotation:1.7.1" implementation "androidx.preference:preference-ktx:1.2.1" implementation "androidx.recyclerview:recyclerview:1.3.2" @@ -217,7 +218,7 @@ dependencies { implementation "com.github.PhilJay:MPAndroidChart:v3.1.0" implementation 'com.github.lopspower:CircularImageView:4.3.0' - implementation "androidx.work:work-runtime-ktx:$work_manager" + implementation "androidx.work:work-runtime:$work_manager" playImplementation "androidx.work:work-gcm:$work_manager" implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2" @@ -250,7 +251,7 @@ dependencies { playImplementation platform('com.google.firebase:firebase-bom:32.7.0') playImplementation 'com.google.firebase:firebase-analytics-ktx' - playImplementation 'com.google.firebase:firebase-messaging:' + playImplementation 'com.google.firebase:firebase-messaging' playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.firebase:firebase-config-ktx' playImplementation 'com.google.android.gms:play-services-ads:22.6.0' @@ -261,9 +262,9 @@ dependencies { hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.301' - releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" + releaseImplementation "com.github.chuckerteam.chucker:library-no-op:$chucker" - debugImplementation "com.github.ChuckerTeam.Chucker:library:$chucker" + debugImplementation "com.github.chuckerteam.chucker:library:$chucker" debugImplementation 'com.github.amitshekhariitbhu.Android-Debug-Database:debug-db:1.0.6' debugImplementation 'com.github.haroldadmin:WhatTheStack:1.0.0-alpha04' diff --git a/app/jacoco.gradle b/app/jacoco.gradle index 434b9218b..67ffdb13b 100644 --- a/app/jacoco.gradle +++ b/app/jacoco.gradle @@ -1,7 +1,7 @@ apply plugin: "jacoco" jacoco { - toolVersion "0.8.10" + toolVersion "0.8.11" reportsDirectory.set(file("$buildDir/reports")) } diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index 2e8ca6e67..cc4d5a026 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -25,9 +25,6 @@ import javax.inject.Inject @HiltAndroidApp class WulkanowyApp : Application(), Configuration.Provider { - @Inject - lateinit var workerFactory: HiltWorkerFactory - @Inject lateinit var themeManager: ThemeManager @@ -46,6 +43,15 @@ class WulkanowyApp : Application(), Configuration.Provider { @Inject lateinit var remoteConfigHelper: RemoteConfigHelper + @Inject + lateinit var workerFactory: HiltWorkerFactory + + override val workManagerConfiguration: Configuration + get() = Configuration.Builder() + .setWorkerFactory(workerFactory) + .setMinimumLoggingLevel(if (appInfo.isDebug) VERBOSE else INFO) + .build() + override fun onCreate() { super.onCreate() initializeAppLanguage() @@ -83,9 +89,4 @@ class WulkanowyApp : Application(), Configuration.Provider { analyticsHelper.logEvent("language", "startup" to preferencesRepository.appLanguage) } } - - override val workManagerConfiguration: Configuration = Configuration.Builder() - .setWorkerFactory(workerFactory) - .setMinimumLoggingLevel(if (appInfo.isDebug) VERBOSE else INFO) - .build() } diff --git a/build.gradle b/build.gradle index f45031b2f..6f2e22ac5 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 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.1.4' + classpath 'com.android.tools.build:gradle:8.2.0' 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' diff --git a/gradle.properties b/gradle.properties index 7f8fd20a0..99305ac50 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,6 @@ kotlin.code.style=official android.useAndroidX=true android.enableJetifier=true android.nonTransitiveRClass=false -android.defaults.buildfeatures.buildconfig=true # # https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-common-faq-0000001063210244#section17273113244910 apmsInstrumentationEnabled=false From 7f4539fd2799b4a44796d30ff3b2e03f99eb4702 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Dec 2023 13:48:13 +0000 Subject: [PATCH 1302/1526] Bump com.google.android.material:material from 1.10.0 to 1.11.0 (#2368) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 83db44f96..83215ceac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -213,7 +213,7 @@ dependencies { implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.constraintlayout:constraintlayout:2.1.4" implementation "androidx.coordinatorlayout:coordinatorlayout:1.2.0" - implementation "com.google.android.material:material:1.10.0" + implementation "com.google.android.material:material:1.11.0" implementation "com.github.wulkanowy:material-chips-input:2.3.1" implementation "com.github.PhilJay:MPAndroidChart:v3.1.0" implementation 'com.github.lopspower:CircularImageView:4.3.0' From 5ceee84f0e2e710a285f89d4ab90115848ab166c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 24 Dec 2023 06:54:09 +0000 Subject: [PATCH 1303/1526] Bump com.huawei.agconnect:agconnect-crash from 1.9.1.301 to 1.9.1.302 (#2374) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 83215ceac..aeda6ea59 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -260,7 +260,7 @@ dependencies { playImplementation 'com.google.android.play:review-ktx:2.0.1' hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300' - hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.301' + hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.302' releaseImplementation "com.github.chuckerteam.chucker:library-no-op:$chucker" From c63a7c03f16af8755046d714df17aabb7f47e1bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 24 Dec 2023 06:54:28 +0000 Subject: [PATCH 1304/1526] Bump com.huawei.agconnect:agcp from 1.9.1.301 to 1.9.1.302 (#2373) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6f2e22ac5..b0959232e 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { classpath 'com.android.tools.build:gradle:8.2.0' 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' + classpath 'com.huawei.agconnect:agcp:1.9.1.302' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" From 9e013f7cd95c8efde27914be320c3d9ecb9dc276 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 24 Dec 2023 07:00:42 +0000 Subject: [PATCH 1305/1526] Bump ru.cian:huawei-publish-gradle-plugin from 1.4.0 to 1.4.2 (#2370) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b0959232e..5ba0676db 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ buildscript { classpath 'com.huawei.agconnect:agcp:1.9.1.302' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" - classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" + classpath "ru.cian:huawei-publish-gradle-plugin:1.4.2" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.4.1.3373" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" From 23d989d22a5e089e65856a721ca07914780a3284 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 24 Dec 2023 07:01:40 +0000 Subject: [PATCH 1306/1526] Bump hilt_version from 2.49 to 2.50 (#2372) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5ba0676db..8727b9b12 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.9.21' about_libraries = '10.9.2' - hilt_version = '2.49' + hilt_version = '2.50' } repositories { mavenCentral() From 75f496b5d2f857150ba1915a5a63f0d5ce2e3d6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Dec 2023 16:11:58 +0000 Subject: [PATCH 1307/1526] Bump kotlin_version from 1.9.21 to 1.9.22 (#2371) --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 8727b9b12..1e1a6dad6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.9.21' + kotlin_version = '1.9.22' about_libraries = '10.9.2' hilt_version = '2.50' } @@ -13,7 +13,7 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 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.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.16" classpath 'com.android.tools.build:gradle:8.2.0' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.4.0' From 5646befbd7d514b7134118e8edf9bfa0d882f6eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 27 Dec 2023 21:52:04 +0100 Subject: [PATCH 1308/1526] Revert "Bump com.google.android.material:material from 1.10.0 to 1.11.0 (#2368)" (#2376) This reverts commit 7f4539fd2799b4a44796d30ff3b2e03f99eb4702. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index aeda6ea59..ce254d039 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -213,7 +213,7 @@ dependencies { implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.constraintlayout:constraintlayout:2.1.4" implementation "androidx.coordinatorlayout:coordinatorlayout:1.2.0" - implementation "com.google.android.material:material:1.11.0" + implementation "com.google.android.material:material:1.10.0" implementation "com.github.wulkanowy:material-chips-input:2.3.1" implementation "com.github.PhilJay:MPAndroidChart:v3.1.0" implementation 'com.github.lopspower:CircularImageView:4.3.0' From a5bc45c5da88829a2215d3011d94163ba3fc37e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 27 Dec 2023 22:21:07 +0100 Subject: [PATCH 1309/1526] Version 2.2.7 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ce254d039..27f102891 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 138 - versionName "2.2.6" + versionCode 139 + versionName "2.2.7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.2.7-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.2.7' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index bb2266809..bbb733809 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,5 @@ -Wersja 2.2.6 +Wersja 2.2.7 -— naprawiliśmy logowanie do aplikacji (tym razem musi się udać) na odmianie standardowej i podobnych +— naprawiliśmy logowanie do aplikacji i odświeżanie danych na odmianie standardowej i podobnych Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From c812310497d6cff0dfe553c1745584556a048f40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 18:36:02 +0100 Subject: [PATCH 1310/1526] Bump about_libraries from 10.9.2 to 10.10.0 (#2380) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1e1a6dad6..6ba8d651e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.9.22' - about_libraries = '10.9.2' + about_libraries = '10.10.0' hilt_version = '2.50' } repositories { From e2f2e21081a0fe77d06824c0a1310d4b34b3f4ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 17:38:29 +0000 Subject: [PATCH 1311/1526] Bump com.huawei.agconnect:agconnect-crash from 1.9.1.302 to 1.9.1.303 (#2379) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 27f102891..5524579a4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -260,7 +260,7 @@ dependencies { playImplementation 'com.google.android.play:review-ktx:2.0.1' hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300' - hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.302' + hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.303' releaseImplementation "com.github.chuckerteam.chucker:library-no-op:$chucker" From d811cdb91905cb4292d986778cba626ee31f5af8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 17:39:08 +0000 Subject: [PATCH 1312/1526] Bump com.huawei.agconnect:agcp from 1.9.1.302 to 1.9.1.303 (#2377) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6ba8d651e..59735b611 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { classpath 'com.android.tools.build:gradle:8.2.0' 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.302' + classpath 'com.huawei.agconnect:agcp:1.9.1.303' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.2" From 7dfa48bbe3d0aa289dba3f815a06b9d1cf943a7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 1 Jan 2024 21:19:00 +0100 Subject: [PATCH 1313/1526] Add User Messaging Platform SDK for ads agreements (#2375) --- app/build.gradle | 6 +- .../io/github/wulkanowy/utils/AdsHelper.kt | 5 +- .../io/github/wulkanowy/utils/AdsHelper.kt | 4 +- .../java/io/github/wulkanowy/WulkanowyApp.kt | 5 - .../repositories/PreferencesRepository.kt | 23 ++--- .../modules/dashboard/DashboardPresenter.kt | 63 ++++++++++--- .../wulkanowy/ui/modules/main/MainActivity.kt | 51 +++------- .../ui/modules/main/MainPresenter.kt | 19 +--- .../wulkanowy/ui/modules/main/MainView.kt | 4 - .../main/res/layout/dialog_ads_consent.xml | 79 ---------------- app/src/main/res/values-cs/strings.xml | 7 -- app/src/main/res/values-da-rDK/strings.xml | 7 -- app/src/main/res/values-de/strings.xml | 7 -- app/src/main/res/values-es-rES/strings.xml | 7 -- app/src/main/res/values-it-rIT/strings.xml | 7 -- app/src/main/res/values-pl/strings.xml | 7 -- app/src/main/res/values-ru/strings.xml | 7 -- app/src/main/res/values-sk/strings.xml | 7 -- app/src/main/res/values-uk/strings.xml | 7 -- app/src/main/res/values/preferences_keys.xml | 3 +- app/src/main/res/values/strings.xml | 9 +- .../ui/modules/settings/ads/AdsFragment.kt | 66 ++++--------- .../ui/modules/settings/ads/AdsPresenter.kt | 40 ++------ .../ui/modules/settings/ads/AdsView.kt | 6 -- .../io/github/wulkanowy/utils/AdsHelper.kt | 94 +++++++++++++++---- .../github/wulkanowy/utils/AnalyticsHelper.kt | 11 +-- .../play/res/xml/scheme_preferences_ads.xml | 20 ++-- 27 files changed, 201 insertions(+), 370 deletions(-) delete mode 100644 app/src/main/res/layout/dialog_ads_consent.xml diff --git a/app/build.gradle b/app/build.gradle index 5524579a4..27fbc7cc4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -250,14 +250,16 @@ dependencies { implementation 'org.apache.commons:commons-text:1.11.0' playImplementation platform('com.google.firebase:firebase-bom:32.7.0') - playImplementation 'com.google.firebase:firebase-analytics-ktx' + playImplementation 'com.google.firebase:firebase-analytics' playImplementation 'com.google.firebase:firebase-messaging' playImplementation 'com.google.firebase:firebase-crashlytics:' - playImplementation 'com.google.firebase:firebase-config-ktx' + playImplementation 'com.google.firebase:firebase-config' + playImplementation 'com.google.android.gms:play-services-ads:22.6.0' playImplementation "com.google.android.play:integrity:1.3.0" playImplementation 'com.google.android.play:app-update-ktx:2.1.0' playImplementation 'com.google.android.play:review-ktx:2.0.1' + playImplementation "com.google.android.ump:user-messaging-platform:2.1.0" hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.303' diff --git a/app/src/fdroid/java/io/github/wulkanowy/utils/AdsHelper.kt b/app/src/fdroid/java/io/github/wulkanowy/utils/AdsHelper.kt index 461d29951..3a3b5948f 100644 --- a/app/src/fdroid/java/io/github/wulkanowy/utils/AdsHelper.kt +++ b/app/src/fdroid/java/io/github/wulkanowy/utils/AdsHelper.kt @@ -5,6 +5,7 @@ import android.view.View import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.ui.modules.dashboard.DashboardItem +import kotlinx.coroutines.flow.MutableStateFlow import javax.inject.Inject @Suppress("unused") @@ -13,9 +14,11 @@ class AdsHelper @Inject constructor( private val preferencesRepository: PreferencesRepository ) { + val isMobileAdsSdkInitialized = MutableStateFlow(false) + val canShowAd = false + fun initialize() { preferencesRepository.isAdsEnabled = false - preferencesRepository.isAgreeToProcessData = false preferencesRepository.selectedDashboardTiles -= DashboardItem.Tile.ADS } diff --git a/app/src/hms/java/io/github/wulkanowy/utils/AdsHelper.kt b/app/src/hms/java/io/github/wulkanowy/utils/AdsHelper.kt index 0e9227022..165a6204f 100644 --- a/app/src/hms/java/io/github/wulkanowy/utils/AdsHelper.kt +++ b/app/src/hms/java/io/github/wulkanowy/utils/AdsHelper.kt @@ -5,6 +5,7 @@ import android.view.View import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.ui.modules.dashboard.DashboardItem +import kotlinx.coroutines.flow.MutableStateFlow import javax.inject.Inject @Suppress("unused") @@ -12,10 +13,11 @@ class AdsHelper @Inject constructor( @ApplicationContext private val context: Context, private val preferencesRepository: PreferencesRepository ) { + val isMobileAdsSdkInitialized = MutableStateFlow(false) + val canShowAd = false fun initialize() { preferencesRepository.isAdsEnabled = false - preferencesRepository.isAgreeToProcessData = false preferencesRepository.selectedDashboardTiles -= DashboardItem.Tile.ADS } diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index cc4d5a026..38fade0a6 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -12,7 +12,6 @@ import fr.bipi.treessence.file.FileLoggerTree import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.ui.base.ThemeManager import io.github.wulkanowy.utils.ActivityLifecycleLogger -import io.github.wulkanowy.utils.AdsHelper import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.CrashLogExceptionTree @@ -37,9 +36,6 @@ class WulkanowyApp : Application(), Configuration.Provider { @Inject lateinit var analyticsHelper: AnalyticsHelper - @Inject - lateinit var adsHelper: AdsHelper - @Inject lateinit var remoteConfigHelper: RemoteConfigHelper @@ -56,7 +52,6 @@ class WulkanowyApp : Application(), Configuration.Provider { super.onCreate() initializeAppLanguage() themeManager.applyDefaultTheme() - adsHelper.initialize() remoteConfigHelper.initialize() initLogging() } 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 495415f9f..64e60a60b 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 @@ -9,7 +9,12 @@ import com.fredporciuncula.flow.preferences.Preference import com.fredporciuncula.flow.preferences.Serializer import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R -import io.github.wulkanowy.data.enums.* +import io.github.wulkanowy.data.enums.AppTheme +import io.github.wulkanowy.data.enums.GradeColorTheme +import io.github.wulkanowy.data.enums.GradeExpandMode +import io.github.wulkanowy.data.enums.GradeSortingMode +import io.github.wulkanowy.data.enums.TimetableGapsMode +import io.github.wulkanowy.data.enums.TimetableMode import io.github.wulkanowy.ui.modules.dashboard.DashboardItem import io.github.wulkanowy.ui.modules.grade.GradeAverageMode import io.github.wulkanowy.ui.modules.settings.appearance.menuorder.AppMenuItem @@ -18,7 +23,7 @@ import kotlinx.coroutines.flow.map import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import java.time.Instant -import java.util.* +import java.util.UUID import javax.inject.Inject import javax.inject.Singleton @@ -303,19 +308,6 @@ class PreferencesRepository @Inject constructor( get() = sharedPref.getBoolean(PREF_KEY_APP_SUPPORT_SHOWN, false) set(value) = sharedPref.edit { putBoolean(PREF_KEY_APP_SUPPORT_SHOWN, value) } - var isAgreeToProcessData: Boolean - get() = getBoolean( - R.string.pref_key_ads_consent_data_processing, - R.bool.pref_default_ads_consent_data_processing - ) - set(value) = sharedPref.edit { - putBoolean(context.getString(R.string.pref_key_ads_consent_data_processing), value) - } - - var isPersonalizedAdsEnabled: Boolean - get() = sharedPref.getBoolean(PREF_KEY_PERSONALIZED_ADS_ENABLED, false) - set(value) = sharedPref.edit { putBoolean(PREF_KEY_PERSONALIZED_ADS_ENABLED, value) } - val isAdsEnabledFlow = flowSharedPref.getBoolean( context.getString(R.string.pref_key_ads_enabled), context.resources.getBoolean(R.bool.pref_default_ads_enabled) @@ -398,7 +390,6 @@ class PreferencesRepository @Inject constructor( private const val PREF_KEY_IN_APP_REVIEW_DATE = "in_app_review_date" private const val PREF_KEY_IN_APP_REVIEW_DONE = "in_app_review_done" private const val PREF_KEY_APP_SUPPORT_SHOWN = "app_support_shown" - private const val PREF_KEY_PERSONALIZED_ADS_ENABLED = "personalized_ads_enabled" private const val PREF_KEY_ADMIN_DISMISSED_MESSAGE_IDS = "admin_message_dismissed_ids" } } 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 ae451ae15..c93dd9e78 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 @@ -1,19 +1,46 @@ package io.github.wulkanowy.ui.modules.dashboard -import io.github.wulkanowy.data.* +import io.github.wulkanowy.data.Resource +import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.enums.MessageFolder import io.github.wulkanowy.data.enums.MessageType -import io.github.wulkanowy.data.repositories.* +import io.github.wulkanowy.data.errorOrNull +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.mapResourceData +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.repositories.AttendanceSummaryRepository +import io.github.wulkanowy.data.repositories.ConferenceRepository +import io.github.wulkanowy.data.repositories.ExamRepository +import io.github.wulkanowy.data.repositories.GradeRepository +import io.github.wulkanowy.data.repositories.HomeworkRepository +import io.github.wulkanowy.data.repositories.LuckyNumberRepository +import io.github.wulkanowy.data.repositories.MessageRepository +import io.github.wulkanowy.data.repositories.PreferencesRepository +import io.github.wulkanowy.data.repositories.SchoolAnnouncementRepository +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.domain.adminmessage.GetAppropriateAdminMessageUseCase import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AdsHelper import io.github.wulkanowy.utils.calculatePercentage import io.github.wulkanowy.utils.nextOrSameSchoolDay -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.filterNot +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import timber.log.Timber import java.time.Instant @@ -48,6 +75,11 @@ class DashboardPresenter @Inject constructor( private val firstLoadedItemList = mutableListOf() + private val selectedDashboardTiles + get() = preferencesRepository.selectedDashboardTiles + .filterNot { it == DashboardItem.Tile.ADS && !adsHelper.canShowAd } + .toSet() + private lateinit var lastError: Throwable override fun onAttachView(view: DashboardView) { @@ -59,10 +91,19 @@ class DashboardPresenter @Inject constructor( showContent(false) } + val selectedDashboardTilesFlow = preferencesRepository.selectedDashboardTilesFlow + .map { selectedDashboardTiles } + val isAdsEnabledFlow = preferencesRepository.isAdsEnabledFlow + .filter { (adsHelper.canShowAd && it) || !it } + .map { selectedDashboardTiles } + val isMobileAdsSdkInitializedFlow = adsHelper.isMobileAdsSdkInitialized + .filter { it } + .map { selectedDashboardTiles } + merge( - preferencesRepository.selectedDashboardTilesFlow, - preferencesRepository.isAdsEnabledFlow - .map { preferencesRepository.selectedDashboardTiles } + selectedDashboardTilesFlow, + isAdsEnabledFlow, + isMobileAdsSdkInitializedFlow ) .onEach { loadData(tilesToLoad = it) } .launch("dashboard_pref") @@ -71,7 +112,7 @@ class DashboardPresenter @Inject constructor( fun onAdminMessageDismissed(adminMessage: AdminMessage) { preferencesRepository.dismissedAdminMessageIds += adminMessage.id - loadData(preferencesRepository.selectedDashboardTiles) + loadData(selectedDashboardTiles) } fun onDragAndDropEnd(list: List) { @@ -187,7 +228,7 @@ class DashboardPresenter @Inject constructor( fun onSwipeRefresh() { Timber.i("Force refreshing the dashboard") - loadData(preferencesRepository.selectedDashboardTiles, forceRefresh = true) + loadData(selectedDashboardTiles, forceRefresh = true) } fun onRetry() { @@ -195,7 +236,7 @@ class DashboardPresenter @Inject constructor( showErrorView(false) showProgress(true) } - loadData(preferencesRepository.selectedDashboardTiles, forceRefresh = true) + loadData(selectedDashboardTiles, forceRefresh = true) } fun onViewReselected() { @@ -216,7 +257,7 @@ class DashboardPresenter @Inject constructor( } fun onDashboardTileSettingsSelected(): Boolean { - view?.showDashboardTileSettings(preferencesRepository.selectedDashboardTiles.toList()) + view?.showDashboardTileSettings(selectedDashboardTiles.toList()) return true } @@ -232,7 +273,7 @@ class DashboardPresenter @Inject constructor( private fun loadHorizontalGroup(student: Student, forceRefresh: Boolean) { flow { - val selectedTiles = preferencesRepository.selectedDashboardTiles + val selectedTiles = selectedDashboardTiles val flowSuccess = flowOf(Resource.Success(null)) val luckyNumberFlow = luckyNumberRepository.getLuckyNumber(student, forceRefresh) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 25ab73bca..ba0ef4050 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -9,7 +9,11 @@ import android.view.MenuItem import android.view.ViewGroup.MarginLayoutParams import androidx.activity.OnBackPressedCallback import androidx.activity.addCallback -import androidx.core.view.* +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment import androidx.preference.Preference @@ -23,12 +27,19 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.databinding.ActivityMainBinding -import io.github.wulkanowy.databinding.DialogAdsConsentBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog import io.github.wulkanowy.ui.modules.settings.appearance.menuorder.AppMenuItem -import io.github.wulkanowy.utils.* +import io.github.wulkanowy.utils.AnalyticsHelper +import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.InAppReviewHelper +import io.github.wulkanowy.utils.InAppUpdateHelper +import io.github.wulkanowy.utils.createNameInitialsDrawable +import io.github.wulkanowy.utils.dpToPx +import io.github.wulkanowy.utils.nickOrName +import io.github.wulkanowy.utils.safelyPopFragments +import io.github.wulkanowy.utils.setOnViewChangeListener import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import timber.log.Timber @@ -312,40 +323,6 @@ class MainActivity : BaseActivity(), MainVie .show() } - override fun showPrivacyPolicyDialog() { - val dialogAdsConsentBinding = DialogAdsConsentBinding.inflate(layoutInflater) - - val dialog = MaterialAlertDialogBuilder(this) - .setTitle(R.string.pref_ads_consent_title) - .setMessage(R.string.pref_ads_consent_description) - .setView(dialogAdsConsentBinding.root) - .show() - - dialogAdsConsentBinding.adsConsentOver.setOnCheckedChangeListener { _, isChecked -> - dialogAdsConsentBinding.adsConsentPersonalised.isEnabled = isChecked - } - - dialogAdsConsentBinding.adsConsentPersonalised.setOnClickListener { - presenter.onPrivacyAgree(true) - dialog.dismiss() - } - - dialogAdsConsentBinding.adsConsentNonPersonalised.setOnClickListener { - presenter.onPrivacyAgree(false) - dialog.dismiss() - } - - dialogAdsConsentBinding.adsConsentPrivacy.setOnClickListener { presenter.onPrivacySelected() } - dialogAdsConsentBinding.adsConsentCancel.setOnClickListener { dialog.cancel() } - } - - override fun openPrivacyPolicy() { - openInternetBrowser( - "https://wulkanowy.github.io/polityka-prywatnosci.html", - ::showMessage - ) - } - override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) navController.onSaveInstanceState(outState) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index ae05ecf22..5469fcad3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -19,7 +19,6 @@ import io.github.wulkanowy.utils.AdsHelper import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AppInfo import kotlinx.coroutines.launch -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import timber.log.Timber import java.time.Duration @@ -52,6 +51,7 @@ class MainPresenter @Inject constructor( destinationType in rootDestinationTypeList -> { rootDestinationTypeList.indexOf(destinationType) } + else -> 4 } @@ -110,6 +110,7 @@ class MainPresenter @Inject constructor( is AccountView, is StudentInfoView, is AccountDetailsView -> false + else -> true } @@ -148,20 +149,8 @@ class MainPresenter @Inject constructor( } fun onEnableAdsSelected() { - view?.showPrivacyPolicyDialog() - } - - fun onPrivacyAgree(isPersonalizedAds: Boolean) { - preferencesRepository.isAgreeToProcessData = true - preferencesRepository.isPersonalizedAdsEnabled = isPersonalizedAds - - adsHelper.initialize() - preferencesRepository.isAdsEnabled = true - } - - fun onPrivacySelected() { - view?.openPrivacyPolicy() + adsHelper.initialize() } private fun checkInAppReview() { @@ -189,8 +178,8 @@ class MainPresenter @Inject constructor( .getOrElse { return@launch } if (Instant.now().minus(Duration.ofDays(28)).isAfter(student.registrationDate)) { - view?.showAppSupport() preferencesRepository.isAppSupportShown = true + view?.showAppSupport() } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt index 62436f3bf..70a94fc81 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt @@ -46,10 +46,6 @@ interface MainView : BaseView { fun showAppSupport() - fun showPrivacyPolicyDialog() - - fun openPrivacyPolicy() - fun openMoreDestination(destination: Destination) interface MainChildView { diff --git a/app/src/main/res/layout/dialog_ads_consent.xml b/app/src/main/res/layout/dialog_ads_consent.xml deleted file mode 100644 index 118fb9c1f..000000000 --- a/app/src/main/res/layout/dialog_ads_consent.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 3af494fa4..7f42d1100 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -769,13 +769,6 @@ Ochrana osobních údajů Reklama se načítá Děkujeme za vaši podporu, vraťte se později pro více reklam - Můžeme použít Vaše data k zobrazení reklam? - Volbu můžete kdykoliv změnit v nastavení aplikace. Můžeme použít Vaše data k zobrazení reklam šitých pro vás nebo pomocí méně vašich dat zobrazovat nepřizpůsobené reklamy. Podrobnosti naleznete v našich Zásadách ochrany osobních údajů - Přizpůsobené reklamy - Nepřizpůsobené reklamy - Je mi více než 18 let - Ano, přizpůsobené reklamy - Ano, nepřizpůsobené reklamy Pokročilé Vzhled a chování Oznámení diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index a89b83769..4c22e9733 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -679,13 +679,6 @@ Privacy policy Ad is loading Thank you for your support, come back later for more ads - Can we use your data to display ads? - You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details - Personalized ads - Non-personalized ads - I am over 18 years old - Yes, personalized ads - Yes, non-personalized ads Advanced Appearance & Behavior Notifications diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4c9aa2d28..5d71dd32d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -679,13 +679,6 @@ Datenschutzerklärung Anzeige wird geladen Vielen Dank für Ihre Unterstützung, kommen Sie später wieder für weitere Anzeigen - Können wir Ihre Daten zur Anzeige von Werbung verwenden? - Sie können Ihre Wahl jederzeit in den App-Einstellungen ändern. Wir verwenden Ihre Daten, um auf Sie zugeschnittene Anzeigen anzuzeigen oder unter Verwendung weniger Ihrer Daten nicht personalisierte Werbung anzuzeigen. Bitte lesen Sie unsere Datenschutzerklärung für Details - Personalisierte Werbung - keine personalisierte Werbung - Ich bin über 18 Jahre alt - Ja, personalisierte Werbung - Ja, nicht personalisierte Werbung Erweitert Aussehen & Verhalten Benachrichtigungen diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index a89b83769..4c22e9733 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -679,13 +679,6 @@ Privacy policy Ad is loading Thank you for your support, come back later for more ads - Can we use your data to display ads? - You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details - Personalized ads - Non-personalized ads - I am over 18 years old - Yes, personalized ads - Yes, non-personalized ads Advanced Appearance & Behavior Notifications diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index a89b83769..4c22e9733 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -679,13 +679,6 @@ Privacy policy Ad is loading Thank you for your support, come back later for more ads - Can we use your data to display ads? - You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details - Personalized ads - Non-personalized ads - I am over 18 years old - Yes, personalized ads - Yes, non-personalized ads Advanced Appearance & Behavior Notifications diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 31b9ce32c..0cf4b0898 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -769,13 +769,6 @@ Polityka prywatności Ładowanie reklamy Dziękujemy za wsparcie, wróć później po więcej reklam - Czy możemy używać Twoich danych do wyświetlania reklam? - Możesz zmienić swój wybór w dowolnym momencie w ustawieniach aplikacji. Możemy wykorzystać Twoje dane do wyświetlania reklam dostosowanych do Ciebie lub, przy użyciu mniejszej ilości danych, wyświetlić niepersonalizowane reklamy. Zobacz naszą Politykę Prywatności, aby uzyskać więcej informacji - Spersonalizowane reklamy - Niespersonalizowane reklamy - Mam ukończone 18 lat - Tak, spersonalizowane reklamy - Tak, niespersonalizowane reklamy Zaawansowane Wygląd i zachowanie Powiadomienia diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 89a94a59d..07a9e2021 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -769,13 +769,6 @@ Политика конфиденциальности Реклама загружается Спасибо за вашу поддержку, возвращайтесь позже для дополнительной рекламы - Можем ли мы использовать ваши данные для показа рекламы? - Вы можете изменить свой выбор в любое время в настройках приложения. Мы можем использовать ваши данные для показа объявлений в соответствии с вашими пожеланиями или, используя меньше данных, отображать неперсональную рекламу. Пожалуйста, ознакомьтесь с нашей политикой конфиденциальности для подробностей - Персонализированная реклама - Неперсонализированная реклама - Я старше 18 лет - Да, персонализировать рекламу - Да, не персонализировать рекламу Расширенные Внешний вид и поведение Уведомления diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 3cde8152c..3ec341d24 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -769,13 +769,6 @@ Ochrana osobných údajov Reklama sa načítava Ďakujeme za vašu podporu, vráťte sa neskôr pre viac reklám - Môžeme použiť Vaše údaje na zobrazenie reklám? - Voľbu môžete kedykoľvek zmeniť v nastavení aplikácie. Môžeme použiť vaše údaje na zobrazenie reklám šitých pre vás alebo pomocou menej vašich dát zobrazovať neprispôsobené reklamy. Podrobnosti nájdete v našich Zásadách ochrany osobných údajov - Prispôsobené reklamy - Neprispôsobené reklamy - Mám viac ako 18 rokov - Áno, prispôsobené reklamy - Áno, neprispôsobené reklamy Pokročilé Vzhľad a správanie Oznámenia diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 20a917aa4..58dc757fa 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -769,13 +769,6 @@ Політика конфіденційності Реклама завантажується Дякуємо за вашу підтримку, повертайтеся пізніше для більшої кількості реклам - Чи можемо ми використовувати ваші дані для висвітлювання реклами? - Ви можете змінити свій вибір в будь-який час в налаштуваннях додатку. Ми можемо використовувати ваші дані для висвітлювання реклами, адаптованої до вас або, використовуючи менше ваших даних, висвітлювати неперсоналізовану рекламу. Перегляньте нашу Політику конфіденційності для подробиць - Персоналізована реклама - Неперсоналізована реклама - Мені більше 18 років - Так, персоналізована реклама - Так, неперсоналізована реклама Додатково Вигляд та поведінка Сповіщення diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 5afffb649..74af9262c 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -37,8 +37,7 @@ single_ad_support ads_enabled ads_privacy_policy - ads_consent_data_processing - ads_over_eighteen + ads_ump_agreements incognito_mode appearance_menu_order diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5cad09d0b..27c454adb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -749,7 +749,7 @@ Support Privacy Policy Agreements - Consent to processing of data related to ads + Show consent to data processing Show ads in app Watch single ad to support project Consent to data processing @@ -758,13 +758,6 @@ Privacy policy Ad is loading Thank you for your support, come back later for more ads - Can we use your data to display ads? - You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details - Personalized ads - Non-personalized ads - I am over 18 years old - Yes, personalized ads - Yes, non-personalized ads Advanced Appearance & Behavior Notifications diff --git a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt index af6a83404..ec6027e98 100644 --- a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt +++ b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt @@ -2,19 +2,17 @@ package io.github.wulkanowy.ui.modules.settings.ads import android.os.Bundle import android.view.View -import androidx.preference.CheckBoxPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd -import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R -import io.github.wulkanowy.databinding.DialogAdsConsentBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.utils.AdsHelper import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject @@ -24,6 +22,9 @@ class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView { @Inject lateinit var presenter: AdsPresenter + @Inject + lateinit var adsHelper: AdsHelper + override val titleStringId = R.string.pref_settings_ads_title override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -46,11 +47,18 @@ class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView { true } - findPreference(getString(R.string.pref_key_ads_consent_data_processing)) - ?.setOnPreferenceChangeListener { _, newValue -> - presenter.onConsentSelected(newValue as Boolean) - true - } + findPreference(getString(R.string.pref_key_ads_ump_agreements))?.setOnPreferenceClickListener { + presenter.onUmpAgreementsSelected() + true + } + + findPreference(getString(R.string.pref_key_ads_single_support)) + ?.isEnabled = adsHelper.canShowAd + + findPreference(getString(R.string.pref_key_ads_enabled))?.setOnPreferenceChangeListener { _, newValue -> + presenter.onAdsEnabledSelected(newValue as Boolean) + true + } } override fun showAd(ad: RewardedInterstitialAd) { @@ -59,48 +67,6 @@ class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView { } } - override fun showPrivacyPolicyDialog() { - val dialogAdsConsentBinding = DialogAdsConsentBinding.inflate(layoutInflater) - - val dialog = MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.pref_ads_consent_title) - .setMessage(R.string.pref_ads_consent_description) - .setView(dialogAdsConsentBinding.root) - .setOnCancelListener { presenter.onPrivacyDialogCanceled() } - .show() - - dialogAdsConsentBinding.adsConsentOver.setOnCheckedChangeListener { _, isChecked -> - dialogAdsConsentBinding.adsConsentPersonalised.isEnabled = isChecked - } - - dialogAdsConsentBinding.adsConsentPersonalised.setOnClickListener { - presenter.onPersonalizedAgree() - dialog.dismiss() - } - - dialogAdsConsentBinding.adsConsentNonPersonalised.setOnClickListener { - presenter.onNonPersonalizedAgree() - dialog.dismiss() - } - - dialogAdsConsentBinding.adsConsentPrivacy.setOnClickListener { presenter.onPrivacySelected() } - dialogAdsConsentBinding.adsConsentCancel.setOnClickListener { dialog.cancel() } - } - - override fun showProcessingDataSummary(isPersonalized: Boolean?) { - val summaryText = isPersonalized?.let { - getString(if (it) R.string.pref_ads_summary_personalized else R.string.pref_ads_summary_non_personalized) - } - - findPreference(getString(R.string.pref_key_ads_consent_data_processing)) - ?.summary = summaryText - } - - override fun setCheckedProcessingData(checked: Boolean) { - findPreference(getString(R.string.pref_key_ads_consent_data_processing)) - ?.isChecked = checked - } - override fun setCheckedAdsEnabled(checked: Boolean) { findPreference(getString(R.string.pref_key_ads_enabled)) ?.isChecked = checked diff --git a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsPresenter.kt b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsPresenter.kt index 28c98e3c3..b3c701541 100644 --- a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsPresenter.kt +++ b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.settings.ads -import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler @@ -13,18 +12,12 @@ class AdsPresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, private val adsHelper: AdsHelper, - private val preferencesRepository: PreferencesRepository ) : BasePresenter(errorHandler, studentRepository) { override fun onAttachView(view: AdsView) { super.onAttachView(view) view.initView() Timber.i("Settings ads view was initialized") - - view.showProcessingDataSummary( - preferencesRepository.isPersonalizedAdsEnabled.takeIf { - preferencesRepository.isAgreeToProcessData - }) } fun onWatchSingleAdSelected() { @@ -50,38 +43,17 @@ class AdsPresenter @Inject constructor( } } - fun onConsentSelected(isChecked: Boolean) { - if (isChecked) { - view?.showPrivacyPolicyDialog() - } else { - view?.showProcessingDataSummary(null) - view?.setCheckedAdsEnabled(false) - } - } - fun onPrivacySelected() { view?.openPrivacyPolicy() } - fun onPrivacyDialogCanceled() { - view?.setCheckedProcessingData(false) + fun onAdsEnabledSelected(newValue: Boolean) { + if (newValue) { + adsHelper.initialize() + } } - fun onNonPersonalizedAgree() { - preferencesRepository.isPersonalizedAdsEnabled = false - - adsHelper.initialize() - - view?.setCheckedProcessingData(true) - view?.showProcessingDataSummary(false) - } - - fun onPersonalizedAgree() { - preferencesRepository.isPersonalizedAdsEnabled = true - - adsHelper.initialize() - - view?.setCheckedProcessingData(true) - view?.showProcessingDataSummary(true) + fun onUmpAgreementsSelected() { + adsHelper.openAdsUmpAgreements() } } diff --git a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsView.kt b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsView.kt index 8de6e60d3..3b3fa5783 100644 --- a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsView.kt +++ b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsView.kt @@ -9,8 +9,6 @@ interface AdsView : BaseView { fun showAd(ad: RewardedInterstitialAd) - fun showPrivacyPolicyDialog() - fun openPrivacyPolicy() fun showLoadingSupportAd(show: Boolean) @@ -18,8 +16,4 @@ interface AdsView : BaseView { fun showWatchAdOncePerVisit(show: Boolean) fun setCheckedAdsEnabled(checked: Boolean) - - fun setCheckedProcessingData(checked: Boolean) - - fun showProcessingDataSummary(isPersonalized: Boolean?) } diff --git a/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt b/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt index d5f65b46d..bd17d52c1 100644 --- a/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt @@ -1,49 +1,110 @@ package io.github.wulkanowy.utils +import android.app.Activity import android.content.Context import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.os.Build -import android.os.Bundle import android.view.View import androidx.core.content.getSystemService -import com.google.ads.mediation.admob.AdMobAdapter -import com.google.android.gms.ads.* +import com.google.android.gms.ads.AdListener +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.AdSize +import com.google.android.gms.ads.AdView +import com.google.android.gms.ads.LoadAdError +import com.google.android.gms.ads.MobileAds import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAdLoadCallback +import com.google.android.ump.ConsentInformation +import com.google.android.ump.ConsentRequestParameters +import com.google.android.ump.UserMessagingPlatform import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.android.scopes.ActivityScoped import io.github.wulkanowy.BuildConfig import io.github.wulkanowy.data.repositories.PreferencesRepository +import kotlinx.coroutines.flow.MutableStateFlow +import timber.log.Timber import java.net.UnknownHostException +import java.util.concurrent.atomic.AtomicBoolean import javax.inject.Inject import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine - +@ActivityScoped class AdsHelper @Inject constructor( + private val activity: Activity, @ApplicationContext private val context: Context, - private val preferencesRepository: PreferencesRepository + preferencesRepository: PreferencesRepository ) { + private var isMobileAdsInitializeCalled = AtomicBoolean(false) + private var consentInformation: ConsentInformation? = null + + private val canRequestAd get() = consentInformation?.canRequestAds() == true + val isMobileAdsSdkInitialized = MutableStateFlow(false) + val canShowAd get() = isMobileAdsSdkInitialized.value && canRequestAd + + init { + if (preferencesRepository.isAdsEnabled) { + initialize() + } + } + fun initialize() { - if (preferencesRepository.isAgreeToProcessData) { - MobileAds.initialize(context) + val consentRequestParameters = ConsentRequestParameters.Builder() + .build() + + consentInformation = UserMessagingPlatform.getConsentInformation(context) + consentInformation?.requestConsentInfoUpdate( + activity, + consentRequestParameters, + { + UserMessagingPlatform.loadAndShowConsentFormIfRequired( + activity + ) { loadAndShowError -> + + if (loadAndShowError != null) { + Timber.e(IllegalStateException("${loadAndShowError.errorCode}: ${loadAndShowError.message}")) + } + + if (canRequestAd) { + initializeMobileAds() + } + } + }, + { requestConsentError -> + Timber.e(IllegalStateException("${requestConsentError.errorCode}: ${requestConsentError.message}")) + }) + + if (canRequestAd) { + initializeMobileAds() + } + } + + fun openAdsUmpAgreements() { + UserMessagingPlatform.showPrivacyOptionsForm(activity) { + if (it != null) { + Timber.e(IllegalStateException("${it.errorCode}: ${it.message}")) + } + } + } + + private fun initializeMobileAds() { + if (isMobileAdsInitializeCalled.getAndSet(true)) return + + MobileAds.initialize(context) { + isMobileAdsSdkInitialized.value = true } } suspend fun getSupportAd(): RewardedInterstitialAd? { + if (!canRequestAd) return null if (!context.isInternetConnected()) { throw UnknownHostException() } - val extra = Bundle().apply { putString("npa", "1") } val adRequest = AdRequest.Builder() - .apply { - if (!preferencesRepository.isPersonalizedAdsEnabled) { - addNetworkExtrasBundle(AdMobAdapter::class.java, extra) - } - } .build() return suspendCoroutine { @@ -64,13 +125,8 @@ class AdsHelper @Inject constructor( } suspend fun getDashboardTileAdBanner(width: Int): AdBanner { - val extra = Bundle().apply { putString("npa", "1") } + if (!canShowAd) throw IllegalStateException("Cannot show ad") val adRequest = AdRequest.Builder() - .apply { - if (!preferencesRepository.isPersonalizedAdsEnabled) { - addNetworkExtrasBundle(AdMobAdapter::class.java, extra) - } - } .build() return suspendCoroutine { diff --git a/app/src/play/java/io/github/wulkanowy/utils/AnalyticsHelper.kt b/app/src/play/java/io/github/wulkanowy/utils/AnalyticsHelper.kt index 3215fa20c..9ded7e1b6 100644 --- a/app/src/play/java/io/github/wulkanowy/utils/AnalyticsHelper.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/AnalyticsHelper.kt @@ -1,25 +1,24 @@ package io.github.wulkanowy.utils import android.app.Activity -import android.content.Context import android.os.Bundle +import com.google.firebase.Firebase import com.google.firebase.analytics.FirebaseAnalytics -import com.google.firebase.crashlytics.FirebaseCrashlytics -import dagger.hilt.android.qualifiers.ApplicationContext +import com.google.firebase.analytics.analytics +import com.google.firebase.crashlytics.crashlytics import io.github.wulkanowy.data.repositories.PreferencesRepository import javax.inject.Inject import javax.inject.Singleton @Singleton class AnalyticsHelper @Inject constructor( - @ApplicationContext private val context: Context, preferencesRepository: PreferencesRepository, appInfo: AppInfo, ) { - private val analytics by lazy { FirebaseAnalytics.getInstance(context) } + private val analytics by lazy { Firebase.analytics } - private val crashlytics by lazy { FirebaseCrashlytics.getInstance() } + private val crashlytics by lazy { Firebase.crashlytics } init { if (!appInfo.isDebug) { diff --git a/app/src/play/res/xml/scheme_preferences_ads.xml b/app/src/play/res/xml/scheme_preferences_ads.xml index 4165561a7..444dde3e4 100644 --- a/app/src/play/res/xml/scheme_preferences_ads.xml +++ b/app/src/play/res/xml/scheme_preferences_ads.xml @@ -1,5 +1,11 @@ + @@ -8,25 +14,17 @@ app:key="@string/pref_key_ads_privacy_policy" app:singleLineTitle="false" app:title="@string/pref_ads_privacy_policy" /> - - Date: Tue, 2 Jan 2024 01:30:31 +0100 Subject: [PATCH 1314/1526] New Crowdin updates (#2381) --- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-da-rDK/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-es-rES/strings.xml | 2 +- app/src/main/res/values-it-rIT/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 7f42d1100..3f0940b58 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -760,7 +760,7 @@ Podpora Ochrana osobních údajů Souhlasy - Souhlas se zpracováním údajů souvisejících s reklamami + Show consent to data processing Zobrazit reklamy v aplikaci Podívejte se na jednu reklamu pro podporu projektu Souhlas se zpracováním dat diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 4c22e9733..512750630 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -670,7 +670,7 @@ Support Privacy Policy Agreements - Consent to processing of data related to ads + Show consent to data processing Show ads in app Watch single ad to support project Consent to data processing diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5d71dd32d..bfc194c03 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -670,7 +670,7 @@ Unterstützung Datenschutz-Bestimmungen Vereinbarungen - Zustimmung zur Verarbeitung von Daten im Zusammenhang mit Anzeigen + Show consent to data processing Anzeigen in der App anzeigen Einzelanzeige ansehen, um Projekt zu unterstützen Einwilligung in die Datenverarbeitung diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 4c22e9733..512750630 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -670,7 +670,7 @@ Support Privacy Policy Agreements - Consent to processing of data related to ads + Show consent to data processing Show ads in app Watch single ad to support project Consent to data processing diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 4c22e9733..512750630 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -670,7 +670,7 @@ Support Privacy Policy Agreements - Consent to processing of data related to ads + Show consent to data processing Show ads in app Watch single ad to support project Consent to data processing diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 0cf4b0898..2872e28e4 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -760,7 +760,7 @@ Wsparcie Polityka prywatności Zgody - Zgoda na przetwarzanie danych związanych z reklamami + Pokaż zgodę na przetwarzanie danych Pokazuj reklamy w aplikacji Obejrzyj pojedynczą reklamę, aby wesprzeć projekt Zgoda na przetwarzanie danych diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 07a9e2021..592e9ee8a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -760,7 +760,7 @@ Поддержка Политика приватности Соглашения - Согласие на обработку данных, связанных с объявлениями + Show consent to data processing Показать рекламу в приложении Посмотреть рекламу для поддержки проекта Согласие на обработку данных diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 3ec341d24..c9ad645e3 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -760,7 +760,7 @@ Podpora Ochrana osobných údajov Súhlasy - Súhlas so spracovaním údajov súvisiacich s reklamami + Show consent to data processing Zobraziť reklamy v aplikácii Pozrite sa na jednu reklamu pre podporu projektu Súhlas so spracovaním dát diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 58dc757fa..86ee0910b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -760,7 +760,7 @@ Підтримка Політика конфіденційності Угоди - Згода на обробку даних, пов\'язаних з рекламою + Показати згоду на обробку даних Показувати рекламу в додатку Подивіться одну рекламу для підтримки проєкту Згода в обробці даних From f69d50d2c1defaa6be25c4cf6fc5a9dced6e2ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 2 Jan 2024 01:51:09 +0100 Subject: [PATCH 1315/1526] Version 2.3.0 --- app/build.gradle | 10 +++++----- app/src/main/play/release-notes/pl-PL/default.txt | 5 +++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 27fbc7cc4..316d11785 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 139 - versionName "2.2.7" + versionCode 140 + versionName "2.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -162,8 +162,8 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.99d - updatePriority = 5 + userFraction = 0.15d + updatePriority = 3 enabled.set(false) } @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.2.7' + implementation 'io.github.wulkanowy:sdk:2.3.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index bbb733809..89f97bdc5 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,6 @@ -Wersja 2.2.7 +Wersja 2.3.0 -— naprawiliśmy logowanie do aplikacji i odświeżanie danych na odmianie standardowej i podobnych +— poprawiliśmy kilka usterek przy odświeżaniu danych (ale pewnie nie wszystkie) +— zaktualizowaliśmy sposób pytania o zgodę na personalizowane reklamy Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 4d1218d1d31e79dd91ac1a03843c05c9b8d98ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 3 Jan 2024 14:53:16 +0100 Subject: [PATCH 1316/1526] Version 2.3.1 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 3 +-- build.gradle | 1 + 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 316d11785..60ef0f3c2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 140 - versionName "2.3.0" + versionCode 141 + versionName "2.3.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.3.1' + implementation 'io.github.wulkanowy:sdk:2.3.3-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 89f97bdc5..2fd7dbee1 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,5 @@ -Wersja 2.3.0 +Wersja 2.3.1 — poprawiliśmy kilka usterek przy odświeżaniu danych (ale pewnie nie wszystkie) -— zaktualizowaliśmy sposób pytania o zgodę na personalizowane reklamy Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases diff --git a/build.gradle b/build.gradle index 59735b611..a0f434e33 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,7 @@ buildscript { allprojects { repositories { + mavenLocal() mavenCentral() google() maven { url "https://jitpack.io" } From 0aa83b020e884044f8ca00d446051617da1fbcb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 3 Jan 2024 16:01:30 +0100 Subject: [PATCH 1317/1526] Bump sdk to 2.3.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 60ef0f3c2..9f1506bf0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -162,7 +162,7 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.15d + userFraction = 0.99d updatePriority = 3 enabled.set(false) } @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.3.3-SNAPSHOT' + implementation 'com.github.wulkanowy:sdk:2.3.3' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' From a3596c35b84268a5c8d63d904a0e2f8ec38f0986 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 4 Jan 2024 09:33:51 +0100 Subject: [PATCH 1318/1526] Update AGP and Gradle (#2385) --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 63375 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 17 +++++++++-------- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index a0f434e33..095d1b72f 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.16" - classpath 'com.android.tools.build:gradle:8.2.0' + classpath 'com.android.tools.build:gradle:8.2.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.303' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 033e24c4cdf41af1ab109bc7f253b2b887023340..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 28216 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 za%0Aoo~v6{I8ONb#igvxd7=aVnxT2gnj@QKwvmG@`A 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 I?qd)S02EvtYybcN diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8838ba97b..e6aba2515 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index fcb6fca14..1aa94a426 100755 --- a/gradlew +++ b/gradlew @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -201,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ From 40df80371cc914e70fd188f523c01cae8f72e7fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 5 Jan 2024 16:03:50 +0100 Subject: [PATCH 1319/1526] Use forked slf4j-timber to fix logging problems with slf4j v2 (#2387) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 9f1506bf0..acfc1bdcf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -240,7 +240,7 @@ dependencies { implementation "com.squareup.okhttp3:logging-interceptor:4.12.0" implementation "com.jakewharton.timber:timber:5.0.1" - implementation "at.favre.lib:slf4j-timber:1.0.1" + implementation 'com.github.Faierbel:slf4j-timber:2.0' implementation 'com.github.bastienpaulfr:Treessence:1.1.2' implementation "com.mikepenz:aboutlibraries-core:$about_libraries" implementation 'io.coil-kt:coil:2.5.0' From 6ee38e9259ca62ec3d3ea030782d157aa0621546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 6 Jan 2024 00:01:33 +0100 Subject: [PATCH 1320/1526] Add clearing all data and key entry when decryption failed (#2386) --- .../wulkanowy/data/db/dao/StudentDao.kt | 12 +- .../data/repositories/StudentRepository.kt | 30 ++- .../github/wulkanowy/ui/base/BaseActivity.kt | 13 +- .../wulkanowy/ui/base/BaseDialogFragment.kt | 8 +- .../github/wulkanowy/ui/base/BaseFragment.kt | 8 +- .../github/wulkanowy/ui/base/BasePresenter.kt | 29 ++- .../io/github/wulkanowy/ui/base/BaseView.kt | 4 +- .../github/wulkanowy/ui/base/ErrorHandler.kt | 10 +- .../ui/modules/dashboard/DashboardFragment.kt | 7 +- .../ui/modules/settings/SettingsFragment.kt | 4 +- .../settings/advanced/AdvancedFragment.kt | 8 +- .../settings/appearance/AppearanceFragment.kt | 8 +- .../notifications/NotificationsFragment.kt | 8 +- .../ui/modules/settings/sync/SyncFragment.kt | 8 +- .../wulkanowy/utils/security/Scrambler.kt | 193 ++++++++++-------- app/src/main/res/values/strings.xml | 2 + .../ui/modules/settings/ads/AdsFragment.kt | 8 +- 17 files changed, 231 insertions(+), 129 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt index d7847c240..d9326ff6c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt @@ -1,11 +1,16 @@ package io.github.wulkanowy.data.db.dao -import androidx.room.* +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Transaction +import androidx.room.Update import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentName import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar -import io.github.wulkanowy.data.db.entities.StudentWithSemesters import javax.inject.Singleton @Singleton @@ -47,6 +52,9 @@ abstract class StudentDao { @Query("UPDATE Students SET is_current = 0") abstract suspend fun resetCurrent() + @Query("DELETE FROM Students WHERE email = :email AND user_name = :userName") + abstract suspend fun deleteByEmailAndUserName(email: String, userName: String) + @Transaction open suspend fun switchCurrent(id: Long) { resetCurrent() diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index 2e04224aa..bfad12a8f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -1,8 +1,6 @@ package io.github.wulkanowy.data.repositories -import android.content.Context import androidx.room.withTransaction -import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.dao.StudentDao @@ -17,20 +15,19 @@ import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.security.decrypt -import io.github.wulkanowy.utils.security.encrypt +import io.github.wulkanowy.utils.security.Scrambler import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @Singleton class StudentRepository @Inject constructor( - @ApplicationContext private val context: Context, private val dispatchers: DispatchersProvider, private val studentDb: StudentDao, private val semesterDb: SemesterDao, private val sdk: Sdk, - private val appDatabase: AppDatabase + private val appDatabase: AppDatabase, + private val scrambler: Scrambler, ) { suspend fun isCurrentStudentSet() = studentDb.loadCurrent()?.isCurrent ?: false @@ -68,7 +65,7 @@ class StudentRepository @Inject constructor( student = student.apply { if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) { student.password = withContext(dispatchers.io) { - decrypt(student.password) + scrambler.decrypt(student.password) } } }, @@ -86,7 +83,7 @@ class StudentRepository @Inject constructor( }.apply { if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) { student.password = withContext(dispatchers.io) { - decrypt(student.password) + scrambler.decrypt(student.password) } } } @@ -96,7 +93,7 @@ class StudentRepository @Inject constructor( if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) { student.password = withContext(dispatchers.io) { - decrypt(student.password) + scrambler.decrypt(student.password) } } return student @@ -107,7 +104,7 @@ class StudentRepository @Inject constructor( if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) { student.password = withContext(dispatchers.io) { - decrypt(student.password) + scrambler.decrypt(student.password) } } return student @@ -120,7 +117,7 @@ class StudentRepository @Inject constructor( it.apply { if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.HEBE) { password = withContext(dispatchers.io) { - encrypt(password, context) + scrambler.encrypt(password) } } } @@ -166,4 +163,15 @@ class StudentRepository @Inject constructor( studentDb.update(studentName) } + + suspend fun deleteStudentsAssociatedWithAccount(student: Student) { + studentDb.deleteByEmailAndUserName(student.email, student.userName) + } + + suspend fun clearAll() { + withContext(dispatchers.io) { + scrambler.clearKeyPair() + appDatabase.clearAllTables() + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index f622209a7..026d38ded 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -68,11 +68,20 @@ abstract class BaseActivity, VB : ViewBinding> : } else Toast.makeText(this, text, Toast.LENGTH_LONG).show() } - override fun showExpiredDialog() { + override fun showExpiredCredentialsDialog() { + MaterialAlertDialogBuilder(this) + .setTitle(R.string.main_expired_credentials_title) + .setMessage(R.string.main_expired_credentials_description) + .setPositiveButton(R.string.main_log_in) { _, _ -> presenter.onConfirmExpiredCredentialsSelected() } + .setNegativeButton(android.R.string.cancel) { _, _ -> } + .show() + } + + override fun showDecryptionFailedDialog() { MaterialAlertDialogBuilder(this) .setTitle(R.string.main_session_expired) .setMessage(R.string.main_session_relogin) - .setPositiveButton(R.string.main_log_in) { _, _ -> presenter.onExpiredLoginSelected() } + .setPositiveButton(R.string.main_log_in) { _, _ -> presenter.onConfirmDecryptionFailedSelected() } .setNegativeButton(android.R.string.cancel) { _, _ -> } .show() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt index 84540b1ca..50e4b05d4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt @@ -28,8 +28,12 @@ abstract class BaseDialogFragment : DialogFragment(), BaseView Toast.makeText(context, text, Toast.LENGTH_LONG).show() } - override fun showExpiredDialog() { - (activity as? BaseActivity<*, *>)?.showExpiredDialog() + override fun showExpiredCredentialsDialog() { + (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() + } + + override fun showDecryptionFailedDialog() { + (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } override fun openClearLoginView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt index b25346a7e..cec2670b2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt @@ -39,8 +39,12 @@ abstract class BaseFragment(@LayoutRes layoutId: Int) : Fragme } } - override fun showExpiredDialog() { - (activity as? BaseActivity<*, *>)?.showExpiredDialog() + override fun showExpiredCredentialsDialog() { + (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() + } + + override fun showDecryptionFailedDialog() { + (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } override fun showAuthDialog() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index 2d913103b..ee92e4fc1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -28,20 +28,37 @@ open class BasePresenter( this.view = view errorHandler.apply { showErrorMessage = view::showError - onSessionExpired = view::showExpiredDialog + onExpiredCredentials = view::showExpiredCredentialsDialog + onDecryptionFailed = view::showDecryptionFailedDialog onNoCurrentStudent = view::openClearLoginView onPasswordChangeRequired = view::showChangePasswordSnackbar onAuthorizationRequired = view::showAuthDialog } } - fun onExpiredLoginSelected() { - Timber.i("Attempt to switch the student after the session expires") + fun onConfirmDecryptionFailedSelected() { + Timber.i("Attempt to clear all data") + + presenterScope.launch { + runCatching { studentRepository.clearAll() } + .onFailure { + Timber.i("Clear data result: An exception occurred") + errorHandler.dispatch(it) + } + .onSuccess { + Timber.i("Clear data result: Open login view") + view?.openClearLoginView() + } + } + } + + fun onConfirmExpiredCredentialsSelected() { + Timber.i("Attempt to delete students associated with the account and switch to new student") presenterScope.launch { runCatching { val student = studentRepository.getCurrentStudent(false) - studentRepository.logoutStudent(student) + studentRepository.deleteStudentsAssociatedWithAccount(student) val students = studentRepository.getSavedStudents(false) if (students.isNotEmpty()) { @@ -50,11 +67,11 @@ open class BasePresenter( } } .onFailure { - Timber.i("Switch student result: An exception occurred") + Timber.i("Delete students result: An exception occurred") errorHandler.dispatch(it) } .onSuccess { - Timber.i("Switch student result: Open login view") + Timber.i("Delete students result: Open login view") view?.openClearLoginView() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt index b31737e2b..e97a6ab90 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt @@ -6,7 +6,9 @@ interface BaseView { fun showMessage(text: String) - fun showExpiredDialog() + fun showExpiredCredentialsDialog() + + fun showDecryptionFailedDialog() fun showAuthDialog() diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index 0a41a47b3..56905709d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -15,7 +15,9 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co var showErrorMessage: (String, Throwable) -> Unit = { _, _ -> } - var onSessionExpired: () -> Unit = {} + var onExpiredCredentials: () -> Unit = {} + + var onDecryptionFailed: () -> Unit = {} var onNoCurrentStudent: () -> Unit = {} @@ -32,7 +34,8 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co showErrorMessage(context.resources.getErrorString(error), error) when (error) { is PasswordChangeRequiredException -> onPasswordChangeRequired(error.redirectUrl) - is ScramblerException, is BadCredentialsException -> onSessionExpired() + is ScramblerException -> onDecryptionFailed() + is BadCredentialsException -> onExpiredCredentials() is NoCurrentStudentException -> onNoCurrentStudent() is AuthorizationRequiredException -> onAuthorizationRequired() } @@ -40,7 +43,8 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co open fun clear() { showErrorMessage = { _, _ -> } - onSessionExpired = {} + onExpiredCredentials = {} + onDecryptionFailed = {} onNoCurrentStudent = {} onPasswordChangeRequired = {} onAuthorizationRequired = {} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt index ce17c7632..301262a04 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt @@ -30,7 +30,12 @@ import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.notificationscenter.NotificationsCenterFragment import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragment import io.github.wulkanowy.ui.modules.timetable.TimetableFragment -import io.github.wulkanowy.utils.* +import io.github.wulkanowy.utils.capitalise +import io.github.wulkanowy.utils.dpToPx +import io.github.wulkanowy.utils.getErrorString +import io.github.wulkanowy.utils.getThemeAttrColor +import io.github.wulkanowy.utils.openInternetBrowser +import io.github.wulkanowy.utils.toFormattedString import java.time.LocalDate import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index 21f564988..19c4ef6b7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -24,7 +24,9 @@ class SettingsFragment : PreferenceFragmentCompat(), MainView.TitledView, Settin override fun showMessage(text: String) {} - override fun showExpiredDialog() {} + override fun showExpiredCredentialsDialog() {} + + override fun showDecryptionFailedDialog() {} override fun openClearLoginView() {} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt index 1b8d1a8fa..256b13375 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt @@ -47,8 +47,12 @@ class AdvancedFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showMessage(text) } - override fun showExpiredDialog() { - (activity as? BaseActivity<*, *>)?.showExpiredDialog() + override fun showExpiredCredentialsDialog() { + (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() + } + + override fun showDecryptionFailedDialog() { + (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } override fun showChangePasswordSnackbar(redirectUrl: String) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt index 70dd694cc..20423eb91 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt @@ -63,8 +63,12 @@ class AppearanceFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showMessage(text) } - override fun showExpiredDialog() { - (activity as? BaseActivity<*, *>)?.showExpiredDialog() + override fun showExpiredCredentialsDialog() { + (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() + } + + override fun showDecryptionFailedDialog() { + (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } override fun showChangePasswordSnackbar(redirectUrl: String) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt index af4c4e6ae..2ae983c26 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt @@ -133,8 +133,12 @@ class NotificationsFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showMessage(text) } - override fun showExpiredDialog() { - (activity as? BaseActivity<*, *>)?.showExpiredDialog() + override fun showExpiredCredentialsDialog() { + (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() + } + + override fun showDecryptionFailedDialog() { + (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } override fun showChangePasswordSnackbar(redirectUrl: String) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt index f48abe9ba..133b1ff44 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt @@ -84,8 +84,12 @@ class SyncFragment : PreferenceFragmentCompat(), } } - override fun showExpiredDialog() { - (activity as? BaseActivity<*, *>)?.showExpiredDialog() + override fun showExpiredCredentialsDialog() { + (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() + } + + override fun showDecryptionFailedDialog() { + (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } override fun showChangePasswordSnackbar(redirectUrl: String) { diff --git a/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt b/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt index c994ebab6..db16a2563 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt @@ -16,6 +16,7 @@ import android.util.Base64.DEFAULT import android.util.Base64.decode import android.util.Base64.encode import android.util.Base64.encodeToString +import dagger.hilt.android.qualifiers.ApplicationContext import timber.log.Timber import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream @@ -33,108 +34,124 @@ import javax.crypto.CipherInputStream import javax.crypto.CipherOutputStream import javax.crypto.spec.OAEPParameterSpec import javax.crypto.spec.PSource.PSpecified +import javax.inject.Inject +import javax.inject.Singleton import javax.security.auth.x500.X500Principal -private const val KEYSTORE_NAME = "AndroidKeyStore" +@Singleton +class Scrambler @Inject constructor( + @ApplicationContext private val context: Context, +) { + private val keyCharset = Charset.forName("UTF-8") -private const val KEY_ALIAS = "wulkanowy_password" + private val isKeyPairExists: Boolean + get() = keyStore.getKey(KEY_ALIAS, null) != null -private val KEY_CHARSET = Charset.forName("UTF-8") + private val keyStore: KeyStore + get() = KeyStore.getInstance(KEYSTORE_NAME).apply { load(null) } -private val isKeyPairExists: Boolean - get() = keyStore.getKey(KEY_ALIAS, null) != null + private val cipher: Cipher + get() { + return if (SDK_INT >= M) Cipher.getInstance( + "RSA/ECB/OAEPWithSHA-256AndMGF1Padding", + "AndroidKeyStoreBCWorkaround" + ) + else Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL") + } -private val keyStore: KeyStore - get() = KeyStore.getInstance(KEYSTORE_NAME).apply { load(null) } + fun encrypt(plainText: String): String { + if (plainText.isEmpty()) throw ScramblerException("Text to be encrypted is empty") -private val cipher: Cipher - get() { - return if (SDK_INT >= M) Cipher.getInstance( - "RSA/ECB/OAEPWithSHA-256AndMGF1Padding", - "AndroidKeyStoreBCWorkaround" - ) - else Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL") + return try { + if (!isKeyPairExists) generateKeyPair() + + cipher.let { + if (SDK_INT >= M) { + OAEPParameterSpec("SHA-256", "MGF1", SHA1, PSpecified.DEFAULT).let { spec -> + it.init(ENCRYPT_MODE, keyStore.getCertificate(KEY_ALIAS).publicKey, spec) + } + } else it.init(ENCRYPT_MODE, keyStore.getCertificate(KEY_ALIAS).publicKey) + + ByteArrayOutputStream().let { output -> + CipherOutputStream(output, it).apply { + write(plainText.toByteArray(keyCharset)) + close() + } + encodeToString(output.toByteArray(), DEFAULT) + } + } + } catch (exception: Exception) { + Timber.e(exception, "An error occurred while encrypting text") + String(encode(plainText.toByteArray(keyCharset), DEFAULT), keyCharset) + } } -fun encrypt(plainText: String, context: Context): String { - if (plainText.isEmpty()) throw ScramblerException("Text to be encrypted is empty") + fun decrypt(cipherText: String): String { + if (cipherText.isEmpty()) throw ScramblerException("Text to be encrypted is empty") - return try { - if (!isKeyPairExists) generateKeyPair(context) + return try { + if (!isKeyPairExists) throw ScramblerException("KeyPair doesn't exist") - cipher.let { - if (SDK_INT >= M) { - OAEPParameterSpec("SHA-256", "MGF1", SHA1, PSpecified.DEFAULT).let { spec -> - it.init(ENCRYPT_MODE, keyStore.getCertificate(KEY_ALIAS).publicKey, spec) + cipher.let { + if (SDK_INT >= M) { + OAEPParameterSpec("SHA-256", "MGF1", SHA1, PSpecified.DEFAULT).let { spec -> + it.init(DECRYPT_MODE, keyStore.getKey(KEY_ALIAS, null), spec) + } + } else it.init(DECRYPT_MODE, keyStore.getKey(KEY_ALIAS, null)) + + CipherInputStream( + ByteArrayInputStream(decode(cipherText, DEFAULT)), + it + ).let { input -> + val values = ArrayList() + var nextByte: Int + while (run { nextByte = input.read(); nextByte } != -1) { + values.add(nextByte.toByte()) + } + val bytes = ByteArray(values.size) + for (i in bytes.indices) { + bytes[i] = values[i] + } + String(bytes, 0, bytes.size, keyCharset) } - } else it.init(ENCRYPT_MODE, keyStore.getCertificate(KEY_ALIAS).publicKey) + } + } catch (e: Exception) { + throw ScramblerException("An error occurred while decrypting text", e) + } + } - ByteArrayOutputStream().let { output -> - CipherOutputStream(output, it).apply { - write(plainText.toByteArray(KEY_CHARSET)) - close() - } - encodeToString(output.toByteArray(), DEFAULT) + private fun generateKeyPair() { + (if (SDK_INT >= M) { + KeyGenParameterSpec.Builder(KEY_ALIAS, PURPOSE_DECRYPT or PURPOSE_ENCRYPT) + .setDigests(DIGEST_SHA256, DIGEST_SHA512) + .setEncryptionPaddings(ENCRYPTION_PADDING_RSA_OAEP) + .setCertificateSerialNumber(BigInteger.TEN) + .setCertificateSubject(X500Principal("CN=Wulkanowy")) + .build() + } else { + KeyPairGeneratorSpec.Builder(context) + .setAlias(KEY_ALIAS) + .setSubject(X500Principal("CN=Wulkanowy")) + .setSerialNumber(BigInteger.TEN) + .setStartDate(Calendar.getInstance().time) + .setEndDate(Calendar.getInstance().apply { add(YEAR, 99) }.time) + .build() + }).let { + KeyPairGenerator.getInstance("RSA", KEYSTORE_NAME).apply { + initialize(it) + genKeyPair() } } - } catch (exception: Exception) { - Timber.e(exception, "An error occurred while encrypting text") - String(encode(plainText.toByteArray(KEY_CHARSET), DEFAULT), KEY_CHARSET) + Timber.i("A new KeyPair has been generated") + } + + fun clearKeyPair() { + keyStore.deleteEntry(KEY_ALIAS) + Timber.i("KeyPair has been cleared") + } + + private companion object { + private const val KEYSTORE_NAME = "AndroidKeyStore" + private const val KEY_ALIAS = "wulkanowy_password" } } - -fun decrypt(cipherText: String): String { - if (cipherText.isEmpty()) throw ScramblerException("Text to be encrypted is empty") - - return try { - if (!isKeyPairExists) throw ScramblerException("KeyPair doesn't exist") - - cipher.let { - if (SDK_INT >= M) { - OAEPParameterSpec("SHA-256", "MGF1", SHA1, PSpecified.DEFAULT).let { spec -> - it.init(DECRYPT_MODE, keyStore.getKey(KEY_ALIAS, null), spec) - } - } else it.init(DECRYPT_MODE, keyStore.getKey(KEY_ALIAS, null)) - - CipherInputStream(ByteArrayInputStream(decode(cipherText, DEFAULT)), it).let { input -> - val values = ArrayList() - var nextByte: Int - while (run { nextByte = input.read(); nextByte } != -1) { - values.add(nextByte.toByte()) - } - val bytes = ByteArray(values.size) - for (i in bytes.indices) { - bytes[i] = values[i] - } - String(bytes, 0, bytes.size, KEY_CHARSET) - } - } - } catch (e: Exception) { - throw ScramblerException("An error occurred while decrypting text", e) - } -} - -private fun generateKeyPair(context: Context) { - (if (SDK_INT >= M) { - KeyGenParameterSpec.Builder(KEY_ALIAS, PURPOSE_DECRYPT or PURPOSE_ENCRYPT) - .setDigests(DIGEST_SHA256, DIGEST_SHA512) - .setEncryptionPaddings(ENCRYPTION_PADDING_RSA_OAEP) - .setCertificateSerialNumber(BigInteger.TEN) - .setCertificateSubject(X500Principal("CN=Wulkanowy")) - .build() - } else { - KeyPairGeneratorSpec.Builder(context) - .setAlias(KEY_ALIAS) - .setSubject(X500Principal("CN=Wulkanowy")) - .setSerialNumber(BigInteger.TEN) - .setStartDate(Calendar.getInstance().time) - .setEndDate(Calendar.getInstance().apply { add(YEAR, 99) }.time) - .build() - }).let { - KeyPairGenerator.getInstance("RSA", KEYSTORE_NAME).apply { - initialize(it) - genKeyPair() - } - } - Timber.i("A new KeyPair has been generated") -} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 27c454adb..72910b85c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -107,6 +107,8 @@ Log in Session expired Session expired, log in again + Your account password has been changed. You need to log in to Wulkanowy again + Password changed Application support Do you like this app? Support its development by enabling non-invasive ads that you can disable at any time Enable ads diff --git a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt index ec6027e98..d7d83e6c9 100644 --- a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt +++ b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt @@ -101,8 +101,12 @@ class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView { (activity as? BaseActivity<*, *>)?.showMessage(text) } - override fun showExpiredDialog() { - (activity as? BaseActivity<*, *>)?.showExpiredDialog() + override fun showExpiredCredentialsDialog() { + (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() + } + + override fun showDecryptionFailedDialog() { + (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } override fun showChangePasswordSnackbar(redirectUrl: String) { From 81e80181f264b375470777b22e1047968f8aceda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 8 Jan 2024 16:32:06 +0100 Subject: [PATCH 1321/1526] New Crowdin updates (#2388) --- app/src/main/res/values-cs/strings.xml | 4 +++- app/src/main/res/values-da-rDK/strings.xml | 2 ++ app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values-es-rES/strings.xml | 2 ++ app/src/main/res/values-it-rIT/strings.xml | 2 ++ app/src/main/res/values-pl/strings.xml | 2 ++ app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values-sk/strings.xml | 4 +++- app/src/main/res/values-uk/strings.xml | 2 ++ 9 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 3f0940b58..8e60b7a65 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -96,6 +96,8 @@ Přihlásit se Relace vypršela Relace vypršela. Přihlaste se prosím znovu + Heslo k vašemu účtu bylo změněno. Musíte se znovu přihlásit do Wulkanového + Heslo bylo změněno Podpora aplikace Líbí se Vám tato aplikace? Podpořte její vývoj tím, že povolíte neinvazivní reklamy, které můžete kdykoliv vypnout Zapnout reklamy @@ -760,7 +762,7 @@ Podpora Ochrana osobních údajů Souhlasy - Show consent to data processing + Zobrazit souhlas se zpracováním údajů Zobrazit reklamy v aplikaci Podívejte se na jednu reklamu pro podporu projektu Souhlas se zpracováním dat diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 512750630..013066629 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -96,6 +96,8 @@ Log in Session expired Session expired, log in again + Your account password has been changed. You need to log in to Wulkanowy again + Password changed Application support Do you like this app? Support its development by enabling non-invasive ads that you can disable at any time Enable ads diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index bfc194c03..09173d38b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -96,6 +96,8 @@ Anmelden Die Sitzung ist abgelaufen Die Sitzung ist abgelaufen, bitte loggen Sie sich erneut ein + Your account password has been changed. You need to log in to Wulkanowy again + Password changed Anwendungsunterstützung Gefällt Ihnen diese App? Unterstützen Sie ihre Entwicklung, indem Sie nicht-invasive Werbung aktivieren, die Sie jederzeit deaktivieren können Werbung aktivieren diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 512750630..013066629 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -96,6 +96,8 @@ Log in Session expired Session expired, log in again + Your account password has been changed. You need to log in to Wulkanowy again + Password changed Application support Do you like this app? Support its development by enabling non-invasive ads that you can disable at any time Enable ads diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 512750630..013066629 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -96,6 +96,8 @@ Log in Session expired Session expired, log in again + Your account password has been changed. You need to log in to Wulkanowy again + Password changed Application support Do you like this app? Support its development by enabling non-invasive ads that you can disable at any time Enable ads diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 2872e28e4..fb9d170a3 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -96,6 +96,8 @@ Zaloguj się Sesja wygasła Sesja wygasła, zaloguj się ponownie + Hasło do Twojego konta zostało zmienione. Musisz zalogować się ponownie do Wulkanowego + Hasło zostało zmienione Wparcie aplikacji Podoba Ci się ta aplikacja? Wspieraj jej rozwój poprzez włączenie nieinwazyjnych reklam, które możesz wyłączyć w dowolnym momencie Włącz reklamy diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 592e9ee8a..c604cd8b3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -96,6 +96,8 @@ Войти Сеанс истёк Сеанс истёк, авторизуйтесь снова + Your account password has been changed. You need to log in to Wulkanowy again + Password changed Поддержка приложения Вам нравится это приложение? Поддержите его разработку, включив неинвазивную рекламу, которую можно отключить в любое время Включить рекламу diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index c9ad645e3..e02b1542a 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -96,6 +96,8 @@ Prihlásiť sa Relácia vypršala Relácia vypršala. Prihláste sa prosím znovu + Heslo k vášmu účtu bolo zmenené. Musíte sa znovu prihlásiť do Wulkanového + Heslo bolo zmenené Podpora aplikácie Páči sa Vám táto aplikácia? Podporte jej vývoj tým, že povolíte neinvazívne reklamy, ktoré môžete kedykoľvek vypnúť Zapnúť reklamy @@ -760,7 +762,7 @@ Podpora Ochrana osobných údajov Súhlasy - Show consent to data processing + Zobraziť súhlas so spracovaním údajov Zobraziť reklamy v aplikácii Pozrite sa na jednu reklamu pre podporu projektu Súhlas so spracovaním dát diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 86ee0910b..32617f429 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -96,6 +96,8 @@ Увійти Минув термін дії сесії Минув термін дії сесії, авторизуйтеся знову + Your account password has been changed. You need to log in to Wulkanowy again + Password changed Підтримка додатку Вам подобається цей додаток? Підтримайте його розвиток, увімкнувши неінвазивну рекламу, яку ви можете відключити в будь-який час Увімкнути рекламу From 5316e3e1bf04291bcd0b5b7e14e0af010018a1a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 15:32:30 +0000 Subject: [PATCH 1322/1526] Bump mockk from 1.13.8 to 1.13.9 (#2389) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index acfc1bdcf..70b542356 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -188,7 +188,7 @@ ext { android_hilt = "1.1.0" room = "2.6.1" chucker = "4.0.0" - mockk = "1.13.8" + mockk = "1.13.9" coroutines = "1.7.3" } From 8324a9cac3f6a22ba3c8733618b7e85addf66c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 9 Jan 2024 19:00:37 +0100 Subject: [PATCH 1323/1526] Use emptyCookieJarInterceptor in SDK configuration (#2390) --- app/build.gradle | 2 +- app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 70b542356..2281848b8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'com.github.wulkanowy:sdk:2.3.3' + implementation 'io.github.wulkanowy:sdk:2.3.4-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt index 889d64ea1..df99be98b 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt @@ -11,6 +11,7 @@ fun Sdk.init(student: Student): Sdk { schoolSymbol = student.schoolSymbol studentId = student.studentId classId = student.classId + emptyCookieJarInterceptor = true if (Sdk.Mode.valueOf(student.loginMode) == Sdk.Mode.HEBE) { mobileBaseUrl = student.mobileBaseUrl From 9dee7f01f63d853ae24f467bcd018723e8ff1980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 9 Jan 2024 19:07:46 +0100 Subject: [PATCH 1324/1526] Avoid deleting luckynumber when SDK returns null (#2391) --- .../data/repositories/LuckyNumberRepository.kt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt index 87e8410f1..4ff4517d0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt @@ -35,12 +35,15 @@ class LuckyNumberRepository @Inject constructor( fetch = { sdk.init(student).getLuckyNumber(student.schoolShortName)?.mapToEntity(student) }, - saveFetchResult = { old, new -> - if (new != old) { - old?.let { luckyNumberDb.deleteAll(listOfNotNull(it)) } - luckyNumberDb.insertAll(listOfNotNull((new?.apply { - if (notify) isNotified = false - }))) + saveFetchResult = { oldLuckyNumber, newLuckyNumber -> + newLuckyNumber ?: return@networkBoundResource + + if (newLuckyNumber != oldLuckyNumber) { + val updatedLuckNumberList = + listOf(newLuckyNumber.apply { if (notify) isNotified = false }) + + oldLuckyNumber?.let { luckyNumberDb.deleteAll(listOfNotNull(it)) } + luckyNumberDb.insertAll(updatedLuckNumberList) } } ) From cff08d63221bf353cb91d069e1a05ab722dab253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 9 Jan 2024 19:27:03 +0100 Subject: [PATCH 1325/1526] Version 2.3.2 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2281848b8..dba4dc2f2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 141 - versionName "2.3.1" + versionCode 142 + versionName "2.3.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.3.4-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.3.4' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 2fd7dbee1..46fac4acf 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,5 @@ -Wersja 2.3.1 +Wersja 2.3.2 -— poprawiliśmy kilka usterek przy odświeżaniu danych (ale pewnie nie wszystkie) +— poprawiliśmy kolejne usterki przy odświeżaniu danych (teraz to powinno działać już dużo lepiej) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From ddbcc7a04c28617765739d2b5774812f235ed611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 9 Jan 2024 21:45:59 +0100 Subject: [PATCH 1326/1526] Version 2.3.3 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index dba4dc2f2..180df1a6a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 142 - versionName "2.3.2" + versionCode 143 + versionName "2.3.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.3.4' + implementation 'io.github.wulkanowy:sdk:2.3.5' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 46fac4acf..0a2eb68f4 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 2.3.2 +Wersja 2.3.3 — poprawiliśmy kolejne usterki przy odświeżaniu danych (teraz to powinno działać już dużo lepiej) From a98e8398fd0a3783af729d6d61965f214c636f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 12 Jan 2024 18:34:43 +0100 Subject: [PATCH 1327/1526] Add webview to obtain cloudflare captcha cookies for okhttp (#2392) --- app/build.gradle | 3 +- .../io/github/wulkanowy/data/DataModule.kt | 2 + .../github/wulkanowy/ui/base/BaseActivity.kt | 5 ++ .../wulkanowy/ui/base/BaseDialogFragment.kt | 4 ++ .../github/wulkanowy/ui/base/BaseFragment.kt | 4 ++ .../github/wulkanowy/ui/base/BasePresenter.kt | 1 + .../io/github/wulkanowy/ui/base/BaseView.kt | 2 + .../github/wulkanowy/ui/base/ErrorHandler.kt | 4 ++ .../ui/modules/captcha/CaptchaDialog.kt | 72 +++++++++++++++++++ .../ui/modules/settings/SettingsFragment.kt | 3 + .../settings/advanced/AdvancedFragment.kt | 4 ++ .../settings/appearance/AppearanceFragment.kt | 4 ++ .../notifications/NotificationsFragment.kt | 4 ++ .../ui/modules/settings/sync/SyncFragment.kt | 4 ++ .../utils/WebkitCookieManagerProxy.kt | 39 ++++++++++ app/src/main/res/layout/dialog_captcha.xml | 12 ++++ .../ui/modules/settings/ads/AdsFragment.kt | 4 ++ 17 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt create mode 100644 app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt create mode 100644 app/src/main/res/layout/dialog_captcha.xml diff --git a/app/build.gradle b/app/build.gradle index 180df1a6a..7069672ad 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.3.5' + implementation 'io.github.wulkanowy:sdk:2.3.6-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' @@ -238,6 +238,7 @@ dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0" implementation "com.squareup.okhttp3:logging-interceptor:4.12.0" + implementation "com.squareup.okhttp3:okhttp-urlconnection:4.12.0" implementation "com.jakewharton.timber:timber:5.0.1" implementation 'com.github.Faierbel:slf4j-timber:2.0' diff --git a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt index bea3f7064..950e817bb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt @@ -21,6 +21,7 @@ import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.RemoteConfigHelper +import io.github.wulkanowy.utils.WebkitCookieManagerProxy import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient @@ -43,6 +44,7 @@ internal class DataModule { buildTag = android.os.Build.MODEL userAgentTemplate = remoteConfig.userAgentTemplate setSimpleHttpLogger { Timber.d(it) } + setAdditionalCookieManager(WebkitCookieManagerProxy()) // for debug only addInterceptor(chuckerInterceptor, network = true) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index 026d38ded..29996db7c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -11,6 +11,7 @@ import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.auth.AuthDialog +import io.github.wulkanowy.ui.modules.captcha.CaptchaDialog import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.utils.FragmentLifecycleLogger import io.github.wulkanowy.utils.getThemeAttrColor @@ -77,6 +78,10 @@ abstract class BaseActivity, VB : ViewBinding> : .show() } + override fun onCaptchaVerificationRequired(url: String?) { + CaptchaDialog.newInstance(url).show(supportFragmentManager, "captcha_dialog") + } + override fun showDecryptionFailedDialog() { MaterialAlertDialogBuilder(this) .setTitle(R.string.main_session_expired) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt index 50e4b05d4..cb85fd8aa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt @@ -32,6 +32,10 @@ abstract class BaseDialogFragment : DialogFragment(), BaseView (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() } + override fun onCaptchaVerificationRequired(url: String?) { + (activity as? BaseActivity<*, *>)?.onCaptchaVerificationRequired(url) + } + override fun showDecryptionFailedDialog() { (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt index cec2670b2..4f919f456 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt @@ -43,6 +43,10 @@ abstract class BaseFragment(@LayoutRes layoutId: Int) : Fragme (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() } + override fun onCaptchaVerificationRequired(url: String?) { + (activity as? BaseActivity<*, *>)?.onCaptchaVerificationRequired(url) + } + override fun showDecryptionFailedDialog() { (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index ee92e4fc1..d4cb20cac 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -29,6 +29,7 @@ open class BasePresenter( errorHandler.apply { showErrorMessage = view::showError onExpiredCredentials = view::showExpiredCredentialsDialog + onCaptchaVerificationRequired = view::onCaptchaVerificationRequired onDecryptionFailed = view::showDecryptionFailedDialog onNoCurrentStudent = view::openClearLoginView onPasswordChangeRequired = view::showChangePasswordSnackbar diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt index e97a6ab90..88d5754f8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseView.kt @@ -8,6 +8,8 @@ interface BaseView { fun showExpiredCredentialsDialog() + fun onCaptchaVerificationRequired(url: String?) + fun showDecryptionFailedDialog() fun showAuthDialog() diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index 56905709d..e17c0c9ec 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -4,6 +4,7 @@ import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.exceptions.NoCurrentStudentException import io.github.wulkanowy.sdk.scrapper.exception.AuthorizationRequiredException +import io.github.wulkanowy.sdk.scrapper.exception.CloudflareVerificationException import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.sdk.scrapper.login.PasswordChangeRequiredException import io.github.wulkanowy.utils.getErrorString @@ -25,6 +26,8 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co var onAuthorizationRequired: () -> Unit = {} + var onCaptchaVerificationRequired: (url: String?) -> Unit = {} + fun dispatch(error: Throwable) { Timber.e(error, "An exception occurred while the Wulkanowy was running") proceed(error) @@ -38,6 +41,7 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co is BadCredentialsException -> onExpiredCredentials() is NoCurrentStudentException -> onNoCurrentStudent() is AuthorizationRequiredException -> onAuthorizationRequired() + is CloudflareVerificationException -> onCaptchaVerificationRequired(error.originalUrl) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt new file mode 100644 index 000000000..6c4d6420f --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt @@ -0,0 +1,72 @@ +package io.github.wulkanowy.ui.modules.captcha + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.core.os.bundleOf +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.databinding.DialogCaptchaBinding +import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.ui.base.BaseDialogFragment +import timber.log.Timber +import javax.inject.Inject + +@AndroidEntryPoint +class CaptchaDialog : BaseDialogFragment() { + + @Inject + lateinit var sdk: Sdk + + companion object { + private const val CAPTCHA_URL = "captcha_url" + fun newInstance(url: String?): CaptchaDialog { + return CaptchaDialog().apply { + arguments = bundleOf(CAPTCHA_URL to url) + } + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View = DialogCaptchaBinding.inflate(inflater).apply { binding = this }.root + + @SuppressLint("SetJavaScriptEnabled") + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + with(binding.captchaWebview) { + with(settings) { + javaScriptEnabled = true + userAgentString = sdk.userAgent + } + + webViewClient = object : WebViewClient() { + override fun onPageFinished(view: WebView?, url: String?) { + view?.evaluateJavascript("document.getElementById('challenge-running') == undefined") { + if (it == "true") { + dismiss() + } else Timber.e("JS result: $it") + } + } + + override fun onReceivedError( + view: WebView?, + request: WebResourceRequest?, + error: WebResourceError? + ) { + super.onReceivedError(view, request, error) + } + } + + loadUrl(arguments?.getString(CAPTCHA_URL).orEmpty()) + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index 19c4ef6b7..f8d1323c6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.settings import android.os.Bundle import androidx.preference.PreferenceFragmentCompat import io.github.wulkanowy.R +import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.modules.main.MainView import timber.log.Timber @@ -26,6 +27,8 @@ class SettingsFragment : PreferenceFragmentCompat(), MainView.TitledView, Settin override fun showExpiredCredentialsDialog() {} + override fun onCaptchaVerificationRequired(url: String?) = Unit + override fun showDecryptionFailedDialog() {} override fun openClearLoginView() {} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt index 256b13375..a1d00227f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt @@ -51,6 +51,10 @@ class AdvancedFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() } + override fun onCaptchaVerificationRequired(url: String?) { + (activity as? BaseActivity<*, *>)?.onCaptchaVerificationRequired(url) + } + override fun showDecryptionFailedDialog() { (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt index 20423eb91..b9b35019a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt @@ -67,6 +67,10 @@ class AppearanceFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() } + override fun onCaptchaVerificationRequired(url: String?) { + (activity as? BaseActivity<*, *>)?.onCaptchaVerificationRequired(url) + } + override fun showDecryptionFailedDialog() { (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt index 2ae983c26..fdc4a24d9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt @@ -137,6 +137,10 @@ class NotificationsFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() } + override fun onCaptchaVerificationRequired(url: String?) { + (activity as? BaseActivity<*, *>)?.onCaptchaVerificationRequired(url) + } + override fun showDecryptionFailedDialog() { (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt index 133b1ff44..1e81e58ac 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt @@ -88,6 +88,10 @@ class SyncFragment : PreferenceFragmentCompat(), (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() } + override fun onCaptchaVerificationRequired(url: String?) { + (activity as? BaseActivity<*, *>)?.onCaptchaVerificationRequired(url) + } + override fun showDecryptionFailedDialog() { (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } diff --git a/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt b/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt new file mode 100644 index 000000000..509f39f58 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt @@ -0,0 +1,39 @@ +package io.github.wulkanowy.utils + +import java.net.CookiePolicy +import java.net.URI +import android.webkit.CookieManager as WebkitCookieManager +import java.net.CookieManager as JavaCookieManager + +class WebkitCookieManagerProxy : JavaCookieManager(null, CookiePolicy.ACCEPT_ALL) { + + private val webkitCookieManager: WebkitCookieManager = WebkitCookieManager.getInstance() + + override fun put(uri: URI?, responseHeaders: Map>?) { + if (uri == null || responseHeaders == null) return + val url = uri.toString() + for (headerKey in responseHeaders.keys) { + if (headerKey == null || !( + headerKey.equals("Set-Cookie2", ignoreCase = true) || + headerKey.equals("Set-Cookie", ignoreCase = true) + ) + ) continue + + // process each of the headers + for (headerValue in responseHeaders[headerKey].orEmpty()) { + webkitCookieManager.setCookie(url, headerValue) + } + } + } + + override operator fun get( + uri: URI?, + requestHeaders: Map?>? + ): Map> { + require(!(uri == null || requestHeaders == null)) { "Argument is null" } + val res = mutableMapOf>() + val cookie = webkitCookieManager.getCookie(uri.toString()) + if (cookie != null) res["Cookie"] = listOf(cookie) + return res + } +} diff --git a/app/src/main/res/layout/dialog_captcha.xml b/app/src/main/res/layout/dialog_captcha.xml new file mode 100644 index 000000000..2df18066d --- /dev/null +++ b/app/src/main/res/layout/dialog_captcha.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt index d7d83e6c9..30b9e6b77 100644 --- a/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt +++ b/app/src/play/java/io/github/wulkanowy/ui/modules/settings/ads/AdsFragment.kt @@ -105,6 +105,10 @@ class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView { (activity as? BaseActivity<*, *>)?.showExpiredCredentialsDialog() } + override fun onCaptchaVerificationRequired(url: String?) { + (activity as? BaseActivity<*, *>)?.onCaptchaVerificationRequired(url) + } + override fun showDecryptionFailedDialog() { (activity as? BaseActivity<*, *>)?.showDecryptionFailedDialog() } From 096fe359e72abb67dc3cd7608428c5f91d29f334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 14 Jan 2024 14:09:04 +0100 Subject: [PATCH 1328/1526] Make some improvements in captcha dialog (#2393) * Add improvements retrying after captcha solved * Add showAuthDialog from BaseActivity instead of displaying this dialog manually * Add getCookieStore() with removeAll impl in WebkitCookieManagerProxy * Add debounce to captcha dialog showing logic * Add refresh button to captcha dialog * Destroy webview along with captcha dialog * Add clear webkit cookies button to debug menu * Add captcha error message * Update captcha verified message --- .../TimetableNotificationSchedulerHelper.kt | 2 - .../wulkanowy/ui/base/BaseDialogFragment.kt | 3 +- .../github/wulkanowy/ui/base/BaseFragment.kt | 3 +- .../ui/modules/captcha/CaptchaDialog.kt | 40 ++++++++++++------ .../ui/modules/dashboard/DashboardFragment.kt | 12 ++++++ .../modules/dashboard/DashboardPresenter.kt | 8 ++++ .../ui/modules/dashboard/DashboardView.kt | 3 +- .../ui/modules/debug/DebugFragment.kt | 5 +++ .../ui/modules/debug/DebugPresenter.kt | 2 + .../wulkanowy/ui/modules/debug/DebugView.kt | 2 + .../modules/login/form/LoginFormFragment.kt | 9 ++++ .../modules/login/form/LoginFormPresenter.kt | 4 ++ .../wulkanowy/ui/modules/main/MainActivity.kt | 34 +++++++++++++++ .../settings/advanced/AdvancedFragment.kt | 3 +- .../settings/appearance/AppearanceFragment.kt | 3 +- .../notifications/NotificationsFragment.kt | 3 +- .../ui/modules/settings/sync/SyncFragment.kt | 3 +- .../wulkanowy/utils/ExceptionExtension.kt | 2 + .../utils/WebkitCookieManagerProxy.kt | 19 +++++++++ app/src/main/res/layout/dialog_captcha.xml | 41 ++++++++++++++++++- app/src/main/res/values/strings.xml | 7 ++++ 21 files changed, 179 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt index 42078d03f..aae7882f1 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationSchedulerHelper.kt @@ -65,8 +65,6 @@ class TimetableNotificationSchedulerHelper @Inject constructor( range = lesson.start..lesson.end, requestCode = getRequestCode(lesson.start, studentId) ) - - Timber.d("TimetableNotification canceled: type 1 & 2, subject: ${lesson.subject}, start: ${lesson.start}, student: $studentId") } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt index cb85fd8aa..e63887b8f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseDialogFragment.kt @@ -8,7 +8,6 @@ import android.widget.Toast import androidx.fragment.app.DialogFragment import androidx.viewbinding.ViewBinding import com.google.android.material.elevation.SurfaceColors -import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.lifecycleAwareVariable import javax.inject.Inject @@ -49,7 +48,7 @@ abstract class BaseDialogFragment : DialogFragment(), BaseView } override fun showAuthDialog() { - AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + (activity as? BaseActivity<*, *>)?.showAuthDialog() } override fun showErrorDetailsDialog(error: Throwable) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt index 4f919f456..ba346131c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt @@ -7,7 +7,6 @@ import androidx.viewbinding.ViewBinding import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG import io.github.wulkanowy.R -import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.utils.lifecycleAwareVariable abstract class BaseFragment(@LayoutRes layoutId: Int) : Fragment(layoutId), @@ -52,7 +51,7 @@ abstract class BaseFragment(@LayoutRes layoutId: Int) : Fragme } override fun showAuthDialog() { - AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + (activity as? BaseActivity<*, *>)?.showAuthDialog() } override fun openClearLoginView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt index 6c4d6420f..098d08ed9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt @@ -5,12 +5,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.webkit.WebResourceError -import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import androidx.core.os.bundleOf import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R import io.github.wulkanowy.databinding.DialogCaptchaBinding import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.ui.base.BaseDialogFragment @@ -23,8 +22,13 @@ class CaptchaDialog : BaseDialogFragment() { @Inject lateinit var sdk: Sdk + private var webView: WebView? = null + companion object { + const val CAPTCHA_SUCCESS = "captcha_success" private const val CAPTCHA_URL = "captcha_url" + private const val CAPTCHA_CHECK_JS = "document.getElementById('challenge-running') == null" + fun newInstance(url: String?): CaptchaDialog { return CaptchaDialog().apply { arguments = bundleOf(CAPTCHA_URL to url) @@ -41,8 +45,14 @@ class CaptchaDialog : BaseDialogFragment() { @SuppressLint("SetJavaScriptEnabled") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + isCancelable = false + binding.captchaRefresh.setOnClickListener { + binding.captchaWebview.loadUrl(arguments?.getString(CAPTCHA_URL).orEmpty()) + } + binding.captchaClose.setOnClickListener { dismiss() } with(binding.captchaWebview) { + webView = this with(settings) { javaScriptEnabled = true userAgentString = sdk.userAgent @@ -50,23 +60,27 @@ class CaptchaDialog : BaseDialogFragment() { webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { - view?.evaluateJavascript("document.getElementById('challenge-running') == undefined") { + view?.evaluateJavascript(CAPTCHA_CHECK_JS) { if (it == "true") { - dismiss() - } else Timber.e("JS result: $it") + onChallengeAccepted() + } } } - - override fun onReceivedError( - view: WebView?, - request: WebResourceRequest?, - error: WebResourceError? - ) { - super.onReceivedError(view, request, error) - } } loadUrl(arguments?.getString(CAPTCHA_URL).orEmpty()) } } + + private fun onChallengeAccepted() { + runCatching { parentFragmentManager.setFragmentResult(CAPTCHA_SUCCESS, bundleOf()) } + .onFailure { Timber.e(it) } + showMessage(getString(R.string.captcha_verified_message)) + dismiss() + } + + override fun onDestroy() { + webView?.destroy() + super.onDestroy() + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt index 301262a04..bedbce231 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt @@ -18,6 +18,7 @@ import io.github.wulkanowy.databinding.FragmentDashboardBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.account.accountdetails.AccountDetailsFragment import io.github.wulkanowy.ui.modules.attendance.summary.AttendanceSummaryFragment +import io.github.wulkanowy.ui.modules.captcha.CaptchaDialog.Companion.CAPTCHA_SUCCESS import io.github.wulkanowy.ui.modules.conference.ConferenceFragment import io.github.wulkanowy.ui.modules.dashboard.adapters.DashboardAdapter import io.github.wulkanowy.ui.modules.exam.ExamFragment @@ -36,6 +37,7 @@ import io.github.wulkanowy.utils.getErrorString import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.toFormattedString +import timber.log.Timber import java.time.LocalDate import javax.inject.Inject @@ -62,6 +64,9 @@ class DashboardFragment : BaseFragment(R.layout.fragme return ((recyclerWidth - margin) / resources.displayMetrics.density).toInt() } + override val isViewEmpty + get() = dashboardAdapter.itemCount == 0 + companion object { fun newInstance() = DashboardFragment() @@ -77,6 +82,13 @@ class DashboardFragment : BaseFragment(R.layout.fragme super.onViewCreated(view, savedInstanceState) binding = FragmentDashboardBinding.bind(view) presenter.onAttachView(this) + initializeCaptchaResultObserver() + } + + private fun initializeCaptchaResultObserver() { + childFragmentManager.setFragmentResultListener(CAPTCHA_SUCCESS, this) { _, _ -> + presenter.onRetryAfterCaptcha() + } } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { 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 c93dd9e78..d7add2c05 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 @@ -239,6 +239,14 @@ class DashboardPresenter @Inject constructor( loadData(selectedDashboardTiles, forceRefresh = true) } + fun onRetryAfterCaptcha() { + view?.run { + showErrorView(false) + showProgress(true) + } + loadData(selectedDashboardTiles, forceRefresh = true) + } + fun onViewReselected() { Timber.i("Dashboard view is reselected") view?.run { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt index 767885434..fe011c929 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt @@ -6,6 +6,8 @@ interface DashboardView : BaseView { val tileWidth: Int + val isViewEmpty: Boolean + fun initView() fun updateData(data: List) @@ -27,6 +29,5 @@ interface DashboardView : BaseView { fun popViewToRoot() fun openNotificationsCenterView() - fun openInternetBrowser(url: String) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugFragment.kt index 000916b17..9db01a307 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugFragment.kt @@ -2,6 +2,7 @@ package io.github.wulkanowy.ui.modules.debug import android.os.Bundle import android.view.View +import android.webkit.CookieManager import androidx.recyclerview.widget.LinearLayoutManager import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R @@ -58,6 +59,10 @@ class DebugFragment : BaseFragment(R.layout.fragment_debug (activity as? MainActivity)?.pushView(NotificationDebugFragment.newInstance()) } + override fun clearWebkitCookies() { + CookieManager.getInstance().removeAllCookies(null) + } + override fun onDestroyView() { presenter.onDetachView() super.onDestroyView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugPresenter.kt index 67ac88861..816b59858 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugPresenter.kt @@ -15,6 +15,7 @@ class DebugPresenter @Inject constructor( val items = listOf( DebugItem(R.string.logviewer_title), DebugItem(R.string.notification_debug_title), + DebugItem(R.string.debug_cookies_clear), ) override fun onAttachView(view: DebugView) { @@ -31,6 +32,7 @@ class DebugPresenter @Inject constructor( when (item.title) { R.string.logviewer_title -> view?.openLogViewer() R.string.notification_debug_title -> view?.openNotificationsDebug() + R.string.debug_cookies_clear -> view?.clearWebkitCookies() else -> Timber.d("Unknown debug item: $item") } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugView.kt index 9396ec6ac..792d63d9e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/DebugView.kt @@ -11,4 +11,6 @@ interface DebugView : BaseView { fun openLogViewer() fun openNotificationsDebug() + + fun clearWebkitCookies() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index 8e9b86fa3..975cad185 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -7,6 +7,7 @@ import android.view.View.GONE import android.view.View.VISIBLE import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged +import androidx.fragment.app.setFragmentResultListener import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.AdminMessage @@ -14,6 +15,7 @@ import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.FragmentLoginFormBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.captcha.CaptchaDialog import io.github.wulkanowy.ui.modules.dashboard.viewholders.AdminMessageViewHolder import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginData @@ -72,6 +74,13 @@ class LoginFormFragment : BaseFragment(R.layout.fragme super.onViewCreated(view, savedInstanceState) binding = FragmentLoginFormBinding.bind(view) presenter.onAttachView(this) + initializeCaptchaResultObserver() + } + + private fun initializeCaptchaResultObserver() { + setFragmentResultListener(CaptchaDialog.CAPTCHA_SUCCESS) { _, _ -> + presenter.onRetryAfterCaptcha() + } } override fun initView() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index ad535c382..c9ae4f27f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -152,6 +152,10 @@ class LoginFormPresenter @Inject constructor( ) } + fun onRetryAfterCaptcha() { + onSignInClick() + } + fun onSignInClick() { val loginData = getLoginData() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index ba0ef4050..62c16257e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -16,6 +16,7 @@ import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -30,6 +31,8 @@ import io.github.wulkanowy.databinding.ActivityMainBinding import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog +import io.github.wulkanowy.ui.modules.auth.AuthDialog +import io.github.wulkanowy.ui.modules.captcha.CaptchaDialog import io.github.wulkanowy.ui.modules.settings.appearance.menuorder.AppMenuItem import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AppInfo @@ -40,10 +43,17 @@ import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.nickOrName import io.github.wulkanowy.utils.safelyPopFragments import io.github.wulkanowy.utils.setOnViewChangeListener +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import timber.log.Timber import javax.inject.Inject +import kotlin.time.Duration.Companion.seconds @AndroidEntryPoint class MainActivity : BaseActivity(), MainView, @@ -73,6 +83,8 @@ class MainActivity : BaseActivity(), MainVie private val navController = FragNavController(supportFragmentManager, R.id.main_fragment_container) + private val captchaVerificationEvent = MutableSharedFlow() + companion object { private const val EXTRA_START_DESTINATION = "start_destination_json" @@ -144,6 +156,7 @@ class MainActivity : BaseActivity(), MainVie initializeToolbar() initializeBottomNavigation(startMenuIndex, rootAppMenuItems) initializeNavController(startMenuIndex, rootUpdatedDestinations) + initializeCaptchaVerificationEvent() } private fun initializeNavController( @@ -323,6 +336,27 @@ class MainActivity : BaseActivity(), MainVie .show() } + @OptIn(FlowPreview::class) + private fun initializeCaptchaVerificationEvent() { + captchaVerificationEvent + .debounce(1.seconds) + .onEach { url -> + Timber.d("Showing captcha dialog for: $url") + showDialogFragment(CaptchaDialog.newInstance(url)) + } + .launchIn(lifecycleScope) + } + + override fun onCaptchaVerificationRequired(url: String?) { + lifecycleScope.launch { + captchaVerificationEvent.emit(url) + } + } + + override fun showAuthDialog() { + showDialogFragment(AuthDialog.newInstance()) + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) navController.onSaveInstanceState(outState) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt index a1d00227f..3ef1a80a3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/advanced/AdvancedFragment.kt @@ -8,7 +8,6 @@ import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog -import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AppInfo import javax.inject.Inject @@ -72,7 +71,7 @@ class AdvancedFragment : PreferenceFragmentCompat(), } override fun showAuthDialog() { - AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + (activity as? BaseActivity<*, *>)?.showAuthDialog() } override fun onResume() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt index b9b35019a..3d0c8052b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt @@ -9,7 +9,6 @@ import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog -import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AppInfo import javax.inject.Inject @@ -88,7 +87,7 @@ class AppearanceFragment : PreferenceFragmentCompat(), } override fun showAuthDialog() { - AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + (activity as? BaseActivity<*, *>)?.showAuthDialog() } override fun onResume() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt index fdc4a24d9..0bf9ddadd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt @@ -21,7 +21,6 @@ import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog -import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.openInternetBrowser @@ -158,7 +157,7 @@ class NotificationsFragment : PreferenceFragmentCompat(), } override fun showAuthDialog() { - AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + (activity as? BaseActivity<*, *>)?.showAuthDialog() } override fun showFixSyncDialog() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt index 1e81e58ac..d57144832 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/sync/SyncFragment.kt @@ -10,7 +10,6 @@ import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.ErrorDialog -import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.main.MainView import javax.inject.Inject @@ -109,7 +108,7 @@ class SyncFragment : PreferenceFragmentCompat(), } override fun showAuthDialog() { - AuthDialog.newInstance().show(childFragmentManager, "auth_dialog") + (activity as? BaseActivity<*, *>)?.showAuthDialog() } override fun onResume() { diff --git a/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt index a4c2537ac..18fc10bba 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.utils import android.content.res.Resources import io.github.wulkanowy.R import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException +import io.github.wulkanowy.sdk.scrapper.exception.CloudflareVerificationException import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import io.github.wulkanowy.sdk.scrapper.exception.ScrapperException import io.github.wulkanowy.sdk.scrapper.exception.ServiceUnavailableException @@ -34,6 +35,7 @@ fun Resources.getErrorString(error: Throwable): String = when (error) { is FeatureNotAvailableException -> R.string.error_feature_not_available is VulcanException -> R.string.error_unknown_uonet is ScrapperException -> R.string.error_unknown_app + is CloudflareVerificationException -> R.string.error_cloudflare_captcha is SSLHandshakeException -> when { error.isCausedByCertificateNotValidNow() -> R.string.error_invalid_device_datetime else -> R.string.error_timeout diff --git a/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt b/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt index 509f39f58..a54978717 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt @@ -1,6 +1,8 @@ package io.github.wulkanowy.utils import java.net.CookiePolicy +import java.net.CookieStore +import java.net.HttpCookie import java.net.URI import android.webkit.CookieManager as WebkitCookieManager import java.net.CookieManager as JavaCookieManager @@ -36,4 +38,21 @@ class WebkitCookieManagerProxy : JavaCookieManager(null, CookiePolicy.ACCEPT_ALL if (cookie != null) res["Cookie"] = listOf(cookie) return res } + + override fun getCookieStore(): CookieStore { + val cookies = super.getCookieStore() + return object : CookieStore { + override fun add(uri: URI?, cookie: HttpCookie?) = cookies.add(uri, cookie) + override fun get(uri: URI?): List = cookies.get(uri) + override fun getCookies(): List = cookies.cookies + override fun getURIs(): List = cookies.urIs + override fun remove(uri: URI?, cookie: HttpCookie?): Boolean = + cookies.remove(uri, cookie) + + override fun removeAll(): Boolean { + webkitCookieManager.removeAllCookies(null) + return true + } + } + } } diff --git a/app/src/main/res/layout/dialog_captcha.xml b/app/src/main/res/layout/dialog_captcha.xml index 2df18066d..539aa0cc9 100644 --- a/app/src/main/res/layout/dialog_captcha.xml +++ b/app/src/main/res/layout/dialog_captcha.xml @@ -1,12 +1,51 @@ + + + + + + + android:layout_height="match_parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/captcha_close" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 72910b85c..60d85606d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ Log viewer Debug Notification debug + Clear webview cookies Contributors Licenses Messages @@ -833,6 +834,11 @@ Skip for now + + Verification is in progress. Wait… + Verified successfully + + No internet connection An error occurred. Check your device clock @@ -842,6 +848,7 @@ Maintenance underway UONET + register. Try again later Unknown UONET + register error. Try again later Unknown application error. Please try again later + Captcha verification required An unexpected error occurred Feature disabled by your school Feature not available. Login in a mode other than Mobile API From 9ececeb4e92b3adb2ac801097159d1bedd1a2de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 14 Jan 2024 16:41:57 +0100 Subject: [PATCH 1329/1526] New Crowdin updates (#2394) --- app/src/main/res/values-cs/strings.xml | 5 +++++ app/src/main/res/values-da-rDK/strings.xml | 5 +++++ app/src/main/res/values-de/strings.xml | 5 +++++ app/src/main/res/values-es-rES/strings.xml | 5 +++++ app/src/main/res/values-it-rIT/strings.xml | 5 +++++ app/src/main/res/values-pl/strings.xml | 5 +++++ app/src/main/res/values-ru/strings.xml | 5 +++++ app/src/main/res/values-sk/strings.xml | 5 +++++ app/src/main/res/values-uk/strings.xml | 5 +++++ 9 files changed, 45 insertions(+) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 8e60b7a65..b4f1f878a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -13,6 +13,7 @@ Prohlížeč protokolů Ladění Ladění oznámení + Vymazat soubory cookie webview Tvůrci Licence Zprávy @@ -833,6 +834,9 @@ Autorizace Pro provoz aplikace potřebujeme potvrdit vaši identitu. Zadejte PESEL žáka <b>%1$s</b> v níže uvedeném poli Zatím přeskočit + + Probíhá ověřování. Počkejte… + Úspěšně ověřeno Žádné internetové připojení Vyskytla se chyba. Zkontrolujte hodiny svého zařízení @@ -842,6 +846,7 @@ Probíhá údržba deníku UONET+. Zkuste to později znovu Neznámá chyba deniku UONET+. Prosím zkuste to znovu později Neznámá chyba aplikace. Prosím zkuste to znovu později + Vyžadováno ověření Captcha Vyskytla se neočekávaná chyba Funkce je deaktivována přes vaší školou Funkce není k dispozici. Přihlaste se v jiném režimu než Mobile API diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 013066629..ac616418c 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -13,6 +13,7 @@ Log viewer Debug Notification debug + Clear webview cookies Contributors Licenses Messages @@ -743,6 +744,9 @@ Authorization To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below Skip for now + + Verification is in progress. Wait… + Verified successfully No internet connection An error occurred. Check your device clock @@ -752,6 +756,7 @@ Maintenance underway UONET + register. Try again later Unknown UONET + register error. Try again later Unknown application error. Please try again later + Captcha verification required An unexpected error occurred Feature disabled by your school Feature not available. Login in a mode other than Mobile API diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 09173d38b..ec6aa655f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -13,6 +13,7 @@ Log Viewer Debuggen Benachrichtigungen debuggen + Clear webview cookies Mitarbeiter Lizenzen Nachrichten @@ -743,6 +744,9 @@ Authorization To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below Skip for now + + Verification is in progress. Wait… + Verified successfully Keine Internetverbindung Es ist ein Fehler aufgetreten. Überprüfen Sie Ihre Geräteuhr @@ -752,6 +756,7 @@ Wartung im Gange UONET + Klassenbuch. Versuchen Sie es später noch einmal Unbekannter UONET + Registerfehler. Versuchen Sie es später erneut Unbekannter Anwendungsfehler. Bitte versuchen Sie es später noch einmal + Captcha verification required Ein unerwarteter Fehler ist aufgetreten Funktion, die von Ihrer Schule deaktiviert wurde Feature in diesem Modus nicht verfügbar diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 013066629..ac616418c 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -13,6 +13,7 @@ Log viewer Debug Notification debug + Clear webview cookies Contributors Licenses Messages @@ -743,6 +744,9 @@ Authorization To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below Skip for now + + Verification is in progress. Wait… + Verified successfully No internet connection An error occurred. Check your device clock @@ -752,6 +756,7 @@ Maintenance underway UONET + register. Try again later Unknown UONET + register error. Try again later Unknown application error. Please try again later + Captcha verification required An unexpected error occurred Feature disabled by your school Feature not available. Login in a mode other than Mobile API diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 013066629..ac616418c 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -13,6 +13,7 @@ Log viewer Debug Notification debug + Clear webview cookies Contributors Licenses Messages @@ -743,6 +744,9 @@ Authorization To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below Skip for now + + Verification is in progress. Wait… + Verified successfully No internet connection An error occurred. Check your device clock @@ -752,6 +756,7 @@ Maintenance underway UONET + register. Try again later Unknown UONET + register error. Try again later Unknown application error. Please try again later + Captcha verification required An unexpected error occurred Feature disabled by your school Feature not available. Login in a mode other than Mobile API diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index fb9d170a3..1b4fbe664 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -13,6 +13,7 @@ Przeglądarka logów Debugowanie Debugowanie powiadomień + Wyczyść ciasteczka webview Twórcy Licencje Wiadomości @@ -833,6 +834,9 @@ Autoryzacja Rodzicu, musimy mieć pewność, że Twój adres e-mail został powiązany z prawidłowym kontem ucznia. W celu autoryzacji konta podaj numer PESEL ucznia <b>%1$s</b> w polu poniżej Na razie pomiń + + Trwa weryfikacja. Czekaj… + Pomyślnie zweryfikowano Brak połączenia z internetem Wystąpił błąd. Sprawdź poprawność daty w urządzeniu @@ -842,6 +846,7 @@ Trwa przerwa techniczna dziennika UONET+. Spróbuj ponownie później Nieznany błąd dziennika UONET+. Spróbuj ponownie później Nieznany błąd aplikacji. Spróbuj ponownie później + Wymagana weryfikacja captcha Wystąpił nieoczekiwany błąd Funkcja wyłączona przez szkołę Funkcja niedostępna. Zaloguj się w trybie innym niż Mobilne API diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c604cd8b3..feb08a03b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -13,6 +13,7 @@ Просмотр журнала Отладка Отладка уведомлений + Clear webview cookies Разработчики Лицензии Сообщения @@ -833,6 +834,9 @@ Авторизация Для работы приложения нам необходимо подтвердить вашу личность. Введите PESEL учащегося <b>%1$s</b> в поле ниже Пропустить сейчас + + Verification is in progress. Wait… + Verified successfully Интернет-соединение отсутствует Произошла ошибка. Проверьте время на вашем устройстве @@ -842,6 +846,7 @@ UONET+ проводит техническое обслуживание, повторите попытку позже Неизвестная ошибка дневника UONET+, повторите попытку позже Неизвестная ошибка приложения, повторите попытку позже + Captcha verification required Произошла непредвиденная ошибка Функция отключена вашей школой Функция недоступна в режиме Mobile API. Воспользуйтесь другим режимом diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e02b1542a..aaf04bc85 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -13,6 +13,7 @@ Prehliadač protokolov Ladenie Ladenie oznámení + Vymazať súbory cookie webview Tvorcovia Licencie Správy @@ -833,6 +834,9 @@ Autorizácia Na prevádzku aplikácie potrebujeme potvrdiť vašu identitu. Zadajte PESEL žiaka <b>%1$s</b> v nižšie uvedenom poli Zatiaľ preskočiť + + Overovanie prebieha. Počkajte… + Úspešne overené Žiadne internetové pripojenie Vyskytla sa chyba. Skontrolujte hodiny svojho zariadenia @@ -842,6 +846,7 @@ Prebieha údržba denníka UONET+. Skúste to neskôr znova Neznáma chyba dennika UONET+. Prosím skúste to znova neskôr Neznáma chyba aplikácie. Prosím skúste to znova neskôr + Vyžaduje sa overenie Captcha Vyskytla sa neočakávaná chyba Funkcia je deaktivovaná cez vašou školou Funkcia nie je k dispozícii. Prihláste sa v inom režime než Mobile API diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 32617f429..fffae003b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -13,6 +13,7 @@ Переглядач логів Відладка Відладка сповіщень + Очистити кукі веб - перегляду Розробники Ліцензії Листи @@ -833,6 +834,9 @@ Авторизувати Для роботи програми нам потрібно підтвердити вашу особу. Будь ласка, введіть число PESEL <b>%1$s</b> студента в поле нижче Поки що пропустити + + Верифікація в процесі. Чекайте… + Верифікація завершена Немає з\'єднання з інтернетом Сталася помилка. Перевірте годинник пристрою @@ -842,6 +846,7 @@ UONET+ проводить технічне осблуговування, спробуйте пізніше Невідома помилка щоденника UONET+, спробуйте пізніше Невідома помилка програми, спробуйте пізніше + Необхідна перевірка Captcha Відбулася несподівана помилка Функція вимкнена вашою школою Функція недоступна в режимі Mobile API. Увійдіть в інший режим From 976eb5a7720fdc2e74356015016f19783ca53e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 14 Jan 2024 16:45:30 +0100 Subject: [PATCH 1330/1526] Fix cancelling dashboard jobs (#2395) --- .../java/io/github/wulkanowy/data/Resource.kt | 16 ++++++++-- .../ui/modules/captcha/CaptchaDialog.kt | 2 +- .../modules/dashboard/DashboardPresenter.kt | 30 ++++++++++++++++--- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/Resource.kt b/app/src/main/java/io/github/wulkanowy/data/Resource.kt index 2c5bf0ea9..d7c2aeed9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/Resource.kt +++ b/app/src/main/java/io/github/wulkanowy/data/Resource.kt @@ -1,6 +1,16 @@ package io.github.wulkanowy.data -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.takeWhile import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import timber.log.Timber @@ -131,7 +141,7 @@ inline fun networkBoundResource( query().map { Resource.Success(filterResult(it)) } } catch (throwable: Throwable) { onFetchFailed(throwable) - query().map { Resource.Error(throwable) } + flowOf(Resource.Error(throwable)) } } else { query().map { Resource.Success(filterResult(it)) } @@ -165,7 +175,7 @@ inline fun networkBoundResource( query().map { Resource.Success(mapResult(it)) } } catch (throwable: Throwable) { onFetchFailed(throwable) - query().map { Resource.Error(throwable) } + flowOf(Resource.Error(throwable)) } } else { query().map { Resource.Success(mapResult(it)) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt index 098d08ed9..ed8293a9f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt @@ -76,7 +76,7 @@ class CaptchaDialog : BaseDialogFragment() { runCatching { parentFragmentManager.setFragmentResult(CAPTCHA_SUCCESS, bundleOf()) } .onFailure { Timber.e(it) } showMessage(getString(R.string.captcha_verified_message)) - dismiss() + dismissAllowingStateLoss() } override fun onDestroy() { 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 d7add2c05..74b427e78 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 @@ -324,7 +324,7 @@ class DashboardPresenter @Inject constructor( ) { luckyNumberResource, messageResource, attendanceResource -> val resList = listOf(luckyNumberResource, messageResource, attendanceResource) - DashboardItem.HorizontalGroup( + resList to DashboardItem.HorizontalGroup( isLoading = resList.any { it is Resource.Loading }, error = resList.map { it.errorOrNull }.let { errors -> if (errors.all { it != null }) { @@ -349,9 +349,9 @@ class DashboardPresenter @Inject constructor( ) }) } - .filterNot { it.isLoading && forceRefresh } + .filterNot { (_, it) -> it.isLoading && forceRefresh } .distinctUntilChanged() - .onEach { + .onEach { (_, it) -> updateData(it, forceRefresh) if (it.isLoading) { @@ -369,7 +369,7 @@ class DashboardPresenter @Inject constructor( ) errorHandler.dispatch(it) } - .launch("horizontal_group ${if (forceRefresh) "-forceRefresh" else ""}") + .launchWithUniqueRefreshJob("horizontal_group", forceRefresh) } private fun loadGrades(student: Student, forceRefresh: Boolean) { @@ -862,6 +862,28 @@ class DashboardPresenter @Inject constructor( onEach { if (it is Resource.Success) { cancelJobs(jobName) + } else if (it is Resource.Error) { + cancelJobs(jobName) + } + }.launch(jobName) + } else { + launch(jobName) + } + } + + @JvmName("launchWithUniqueRefreshJobHorizontalGroup") + private fun Flow>, *>>.launchWithUniqueRefreshJob( + name: String, + forceRefresh: Boolean + ) { + val jobName = if (forceRefresh) "$name-forceRefresh" else name + + if (forceRefresh) { + onEach { (resources, _) -> + if (resources.all { it is Resource.Success<*> }) { + cancelJobs(jobName) + } else if (resources.any { it is Resource.Error<*> }) { + cancelJobs(jobName) } }.launch(jobName) } else { From 497acf9d685102064b670a07038ecae6b2f47098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 14 Jan 2024 17:32:41 +0100 Subject: [PATCH 1331/1526] Version 2.3.4 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7069672ad..8d10ce926 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 143 - versionName "2.3.3" + versionCode 144 + versionName "2.3.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -163,7 +163,7 @@ play { track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS userFraction = 0.99d - updatePriority = 3 + updatePriority = 1 enabled.set(false) } @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.3.6-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.3.6' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 0a2eb68f4..c2c30883e 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,6 @@ -Wersja 2.3.3 +Wersja 2.3.4 -— poprawiliśmy kolejne usterki przy odświeżaniu danych (teraz to powinno działać już dużo lepiej) +— dodaliśmy obsługę captchy, co umożliwi używanie apki np. na odmianie ResMan Rzeszów +— naprawiliśmy wyświetlanie frekwencji w szkołach używających eduOne (piszcie, jeśli nadal nie działa) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From e58c15596109075691dfcb7a7cee974ff037d1ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 14 Jan 2024 18:02:15 +0100 Subject: [PATCH 1332/1526] New Crowdin updates (#2396) --- app/src/main/res/values-da-rDK/strings.xml | 764 --------------------- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-es-rES/strings.xml | 764 --------------------- app/src/main/res/values-it-rIT/strings.xml | 764 --------------------- app/src/main/res/values-ru/strings.xml | 2 +- 5 files changed, 2 insertions(+), 2294 deletions(-) delete mode 100644 app/src/main/res/values-da-rDK/strings.xml delete mode 100644 app/src/main/res/values-es-rES/strings.xml delete mode 100644 app/src/main/res/values-it-rIT/strings.xml diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml deleted file mode 100644 index ac616418c..000000000 --- a/app/src/main/res/values-da-rDK/strings.xml +++ /dev/null @@ -1,764 +0,0 @@ - - - - Login - Wulkanowy - Grades - Attendance - Exams - Timetable - Settings - More - About - Log viewer - Debug - Notification debug - Clear webview cookies - Contributors - Licenses - Messages - New message - New homework - Notes and achievements - Homework - Accounts manager - Select account - Account details - Student info - Dashboard - Notifications center - Menu configuartion - - Semester %1$d, %2$d/%3$d - - Sign in with the student or parent account - Enter the symbol from the register page for account: <b>%1$s</b> - Username - Email - Login, PESEL or e-mail - Password - UONET+ register variant - Custom domain suffix - Mobile API - Scraper - Hybrid - Token - PIN - Symbol - E.g. \"lodz\" or \"powiatjaroslawski\" - Sign in - Password too short - Login details are incorrect - %1$s. Make sure the correct UONET+ register variation is selected below - Invalid PIN - Invalid token - Token expired - Invalid email - Use the assigned login instead of email - Use the assigned login or email in @%1$s - Invalid symbol. If you cannot find it, please contact the school - Don\'t make this up! If you cannot find it, please contact the school - Student not found. Validate the symbol and the chosen variation of the UONET+ register - Selected student is already logged in - The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the first login screen - Select students to log in to the application - Other options - In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices - This mode displays the same data as it appears on the register website - The combination of the best features of the other two modes. It works faster than scraper and provides features not available in the Mobile API mode. It is in the experimental phase - Privacy policy - Trouble signing in? Contact us! - Email - Discord - Send email - Make sure you select the correct UONET+ register variation! - Reset password - Recover your account - Recover - Student is already signed in - Standard - Other search locations - No active students found - Enter a different symbol - Get help - Full school name with the town (required) - Np. ZSTiO Jarosław lub SP nr 99 w Łodzi - Enter correct name of the school - Additional information in Polish (optional) - Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" - Submit - - Enable notifications - Enable notifications so you don\'t miss message from teacher or new grade - Skip - Enable - - Account manager - Log in - Session expired - Session expired, log in again - Your account password has been changed. You need to log in to Wulkanowy again - Password changed - Application support - Do you like this app? Support its development by enabling non-invasive ads that you can disable at any time - Enable ads - - Grade - Semester %d - Change semester - No grades - Weight - Weight: %s - Comment - Number of new ratings: %1$d - Average: %1$.2f - Points: %s - No average - Total points - Final grade - Predicted grade - Calculated average - How does Calculated Average work? - The Calculated Average is the arithmetic average calculated from the subjects averages. It allows you to know the approximate final average. It is calculated in a way selected by the user in the application settings. It is recommended that you choose the appropriate option. This is because the calculation of school averages differs. Additionally, if your school reports the average of the subjects on the Vulcan page, the application downloads them and does not calculate these averages. This can be changed by forcing the calculation of the average in the application settings.\n\nAverage of grades only from selected semester:\n1. Calculating the weighted average for each subject in a given semester\n2.Adding calculated averages\n3. Calculation of the arithmetic average of the summed averages\n\nAverage of averages from both semesters:\n1.Calculating the weighted average for each subject in semester 1 and 2\n2. Calculating the arithmetic average of the calculated averages for semesters 1 and 2 for each subject.\n3. Adding calculated averages\n4. Calculation of the arithmetic average of the summed averages\n\nAverage of grades from the whole year:\n1. Calculating weighted average over the year for each subject. The final average in the 1st semester is irrelevant.\n2. Adding calculated averages\n3. Calculating the arithmetic average of summed averages - How does the Final Average work? - The Final Average is the arithmetic average calculated from all currently available final grades in the given semester.\n\nThe calculation scheme consists of the following steps:\n1. Summing up the final grades given by teachers\n2. Divide by the number of subjects that have already been graded - Final average - from %1$d of %2$d subjects - Summary - Class - Mark as read - Partial - Semester - Points - Legend - Class average: %1$s - Your average: %1$s - Your grade: %1$s - Class - Student - - %d grade - %d grades - - - New grade - New grades - - - New predicted grade - New predicted grades - - - New final grade - New final grades - - - You received %1$d grade - You received %1$d grades - - - You received %1$d predicted grade - You received %1$d predicted grades - - - You received %1$d final grade - You received %1$d final grades - - - Lesson - Room - Group - Hours - Changes - No lessons this day - %s min - %s sec - %1$s left - in %1$s - Finished - Now: %s - Next: %s - Later: %s - %1$s lesson %2$d - %3$s - Change of room from %1$s to %2$s - Change of teacher from %1$s to %2$s - Change of subject from %1$s to %2$s - - No lesson - No lessons - - - Timetable change - Timetable changes - - - %1$s - %2$d change in timetable - %1$s - %2$d changes in timetable - - - %1$d change in timetable - %1$d changes in timetable - - - %d change - %d changes - - - Completed lessons - Show completed lessons - No info about completed lessons - Topic - Absence - Resources - - Additional lessons - Show additional lessons - No info about additional lessons - New lesson - New additional lesson - Additional lesson added successfully - Additional lesson deleted successfully - Repeat weekly - Delete additional lesson - Just this lesson - All in the series - Start time - End time - End time must be greater than start time - - Attendance summary - Absent for school reasons - Excused absence - Unexcused absence - Exemption - Excused lateness - Unexcused lateness - Present - Deleted - Unknown - Number of lesson - No entries - Absence reason (optional) - Send - Absence excuse request sent successfully! - You must select at least one absence! - Excuse - - New attendance - New attendance - - - %1$d new attendance - %1$d attendance - - - %d attendance - %d attendance - - - Total - - No exams this week - Type - Entry date - - New exam - New exams - - - %d new exam - %d new exams - - - %d exam - %d exams - - - Inbox - Sent - Trash - (no subject) - No messages - From: - To: - Date: %1$s - Reply - Forward - Select all - Unselect all - Move to trash - Delete permanently - Message deleted successfully - student - parent - guardian - employee - Share - Print - Subject - Content - Message sent successfully - Message does not exist - You need to choose at least 1 recipient - The message content must be at least 3 characters - All mailboxes - Only unread - Only with attachments - Read: %s - Read by: %1$d of %2$d people - - %1$d message - %1$d messages - - - New message - New messages - - Do you want to restore draft message? - Do you want to restore draft message with recipients: %s? - - You received %1$d message - You received %1$d messages - - - %1$d selected - %1$d selected - - Messages deleted - Choose mailbox - Incognito mode is on - Thanks to incognito mode sender is not notified when you read the message - - No info about notes - Points - - %d note - %d notes - - - New note - New notes - - - You received %1$d note - You received %1$d notes - - - - %d praise - %d praises - - - New praise - New praises - - - You received %1$d praise - You received %1$d praises - - - - %d neutral note - %d neutral notes - - - New neutral note - New neutral notes - - - You received %1$d neutral note - You received %1$d neutral notes - - - No info about homework - Mark as done - Mark as undone - Add homework - Homework added successfully - Homework deleted successfully - Attachments - - New homework - New homework - - - You received %d new homework - You received %d new homework - - - %d homework - %d homework - - - Lucky number - Today\'s lucky number is - No info about the lucky number - Lucky number for today - Today\'s lucky number is: %s - Show history - - Lucky number history - No info about lucky numbers - - Mobile devices - No devices - Deregister - Device removed - QR code - Token - Symbol - PIN - - School and teachers - - School - No info about school - School name - School address - Telephone - Name of headmaster - Name of pedagogue - Show on map - Call - - Teachers - No info about teachers - No subject - - Conferences - No info about conferences - - %d conference - %d conferences - - - New conference - New conferences - - - You have %1$d new conference - You have %1$d new conferences - - Present at conference - Agenda - Place - Topic - - School announcements - No school announcements - - %d school announcement - %d school announcements - - - New school announcement - New school announcements - - - You have %1$d new school announcement - You have %1$d new school announcements - - - Add account - Logout - Do you want to log out this student? - Student logout - Student account - Parent account - Edit data - Accounts manager - Select student - Family - Contact - Residence details - Personal information - - App version - Contributors - List of Wulkanowy developers - Report a bug - Send a bug report via e-mail - FAQ - Read Frequently Asked Questions - Discord server - Join the Wulkanowy community - Facebook fanpage - Twitter page - Follow us on twitter - Like our facebook fanpage - Privacy policy - Rules for collecting personal data - System settings - Open system settings - Homepage - Visit the website and help develop the application - Licenses - Licenses of libraries used in the application - - License - - Avatar - See more on GitHub - - No info about student or student family - Name - Second name - Gender - Polish citizenship - Family name - Mother\'s and father\'s names - Phone - Cellphone - E-mail - Address of residence - Address of registration - Correspondence address - Surname and first name - Degree of kinship - Address - Phones - Male - Female - Last name - Guardian - - Nick - Add nick - Choose avatar color - - Share logs - Refresh - - Lessons - (Tomorrow) - (Today and tomorrow) - In a moment: - Soon: - First: - Now: - End of lessons - Next: - Later: - - %1$d more lesson - %1$d more lessons - - until %1$s - No upcoming lessons - An error occurred while loading the lessons - Homework - No homework to do - An error occurred while loading the homework - - %1$d more homework - %1$d more homework - - due %1$s - Last grades - No new grades - An error occurred while loading the grades - School announcements - No current announcements - An error occurred while loading the announcements - - %1$d more announcement - %1$d more announcements - - Exams - No upcoming exams - An error occurred while loading the exams - - %1$d more exam - %1$d more exams - - Conferences - No upcoming conferences - An error occurred while loading the conferences - - %1$d more conference - %1$d more conferences - - An error occurred while loading data - None - - Check for updates - Before reporting a bug, check first if an update with the bug fix is available - - Content - Retry - Description - No description - Teacher - Date - Entry date - Color - Details - Category - Close - No data - Subject - Prev - Next - Search - Search… - Yes - No - Save - Title - Add - Copied - Undo - Change - Add to calendar - Cancel - - No lessons - Synchronized on %1$s at %2$s - Choose theme - Light - Dark - System Theme - - App - Default view - Calculated average options - Force average calculation by app - Show presence - Theme - Grades expanding - Show groups next to subjects - Show empty tiles where there\'s no lesson - Show chart list in class grades - Show subjects without grades - Grades color scheme - Subjects sorting - Language - Menu configuration - Set the order of functions in the menu - Notifications - Other - Show notifications - Show upcoming lesson notifications - Make upcoming lesson notification persistent - Turn off when notification is not showing in your watch/band - Open system notification settings - Fix synchronization & notifications issues - Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. - Show debug notifications - Synchronization is disabled - Official app notifications - Capture official app notifications - Remove official app notifications after capture - Capture notifications - With this feature you can gain a substitute of push notifications like in the official app. All you need to do is allow Wulkanowy to receive all notifications in your system settings.\n\nHow it works?\nWhen you get a notification in Dziennik VULCAN, Wulkanowy will be notified (that\'s what these extra permissions are for) and will trigger a sync so that can send its own notification.\n\nFOR ADVANCED USERS ONLY - Upcoming lesson notifications - You must allow the Wulkanowy app to set alarms and reminders in your system settings to use this feature. - Go to settings - Synchronization - Automatic update - Suspended on holidays - Updates interval - Wi-Fi only - Sync now - Synced! - Sync failed - Sync in progress - Last full sync: %s - Value of the plus - Value of the minus - Reply with message history - Show arithmetic average when no weights provided - Incognito mode - Do not inform about reading the message - Support - Privacy Policy - Agreements - Show consent to data processing - Show ads in app - Watch single ad to support project - Consent to data processing - To view an advertisement you must agree to the data processing terms of our Privacy Policy - Agree - Privacy policy - Ad is loading - Thank you for your support, come back later for more ads - Advanced - Appearance & Behavior - Notifications - Synchronization - Advertisements - Grades - Dashboard - Tiles visibility - Attendance - Timetable - Grades - Calculated average - Messages - Appearance & Behavior - Languages, themes, subjects sorting - App notifications, fix problems - Notifications - Synchronization - Automatic update, synchronization interval - Plus and minus values, average calculation - Advanced - App version, contributors, social portals - Displaying advertisements, project support - - New grades - New homework - New conferences - New exams - Lucky number - New messages - New notes - New school announcements - Push notifications - Upcoming lessons - Debug - Timetable change - New attendance - - Black - Red - Blue - Green - Purple - No color - - Download of updates has started… - An update has just been downloaded. - Restart - Update failed! Wulkanowy may not function properly. Consider updating - - Application restart - The application must restart for the changes to be saved - Restart - - Authorization has been rejected. The data provided does not match the records in the secretary\'s office. - Invalid PESEL - PESEL - Authorize - Authorization completed successfully - Authorization - To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below - Skip for now - - Verification is in progress. Wait… - Verified successfully - - No internet connection - An error occurred. Check your device clock - Connection to register failed. Servers can be overloaded. Please try again later - Loading data failed. Please try again later - Register password change required - Maintenance underway UONET + register. Try again later - Unknown UONET + register error. Try again later - Unknown application error. Please try again later - Captcha verification required - An unexpected error occurred - Feature disabled by your school - Feature not available. Login in a mode other than Mobile API - This field is required - diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ec6aa655f..7e0ce8689 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -10,7 +10,7 @@ Einstellungen Mehr Über die Applikation - Log Viewer + Log viewer Debuggen Benachrichtigungen debuggen Clear webview cookies diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml deleted file mode 100644 index ac616418c..000000000 --- a/app/src/main/res/values-es-rES/strings.xml +++ /dev/null @@ -1,764 +0,0 @@ - - - - Login - Wulkanowy - Grades - Attendance - Exams - Timetable - Settings - More - About - Log viewer - Debug - Notification debug - Clear webview cookies - Contributors - Licenses - Messages - New message - New homework - Notes and achievements - Homework - Accounts manager - Select account - Account details - Student info - Dashboard - Notifications center - Menu configuartion - - Semester %1$d, %2$d/%3$d - - Sign in with the student or parent account - Enter the symbol from the register page for account: <b>%1$s</b> - Username - Email - Login, PESEL or e-mail - Password - UONET+ register variant - Custom domain suffix - Mobile API - Scraper - Hybrid - Token - PIN - Symbol - E.g. \"lodz\" or \"powiatjaroslawski\" - Sign in - Password too short - Login details are incorrect - %1$s. Make sure the correct UONET+ register variation is selected below - Invalid PIN - Invalid token - Token expired - Invalid email - Use the assigned login instead of email - Use the assigned login or email in @%1$s - Invalid symbol. If you cannot find it, please contact the school - Don\'t make this up! If you cannot find it, please contact the school - Student not found. Validate the symbol and the chosen variation of the UONET+ register - Selected student is already logged in - The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the first login screen - Select students to log in to the application - Other options - In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices - This mode displays the same data as it appears on the register website - The combination of the best features of the other two modes. It works faster than scraper and provides features not available in the Mobile API mode. It is in the experimental phase - Privacy policy - Trouble signing in? Contact us! - Email - Discord - Send email - Make sure you select the correct UONET+ register variation! - Reset password - Recover your account - Recover - Student is already signed in - Standard - Other search locations - No active students found - Enter a different symbol - Get help - Full school name with the town (required) - Np. ZSTiO Jarosław lub SP nr 99 w Łodzi - Enter correct name of the school - Additional information in Polish (optional) - Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" - Submit - - Enable notifications - Enable notifications so you don\'t miss message from teacher or new grade - Skip - Enable - - Account manager - Log in - Session expired - Session expired, log in again - Your account password has been changed. You need to log in to Wulkanowy again - Password changed - Application support - Do you like this app? Support its development by enabling non-invasive ads that you can disable at any time - Enable ads - - Grade - Semester %d - Change semester - No grades - Weight - Weight: %s - Comment - Number of new ratings: %1$d - Average: %1$.2f - Points: %s - No average - Total points - Final grade - Predicted grade - Calculated average - How does Calculated Average work? - The Calculated Average is the arithmetic average calculated from the subjects averages. It allows you to know the approximate final average. It is calculated in a way selected by the user in the application settings. It is recommended that you choose the appropriate option. This is because the calculation of school averages differs. Additionally, if your school reports the average of the subjects on the Vulcan page, the application downloads them and does not calculate these averages. This can be changed by forcing the calculation of the average in the application settings.\n\nAverage of grades only from selected semester:\n1. Calculating the weighted average for each subject in a given semester\n2.Adding calculated averages\n3. Calculation of the arithmetic average of the summed averages\n\nAverage of averages from both semesters:\n1.Calculating the weighted average for each subject in semester 1 and 2\n2. Calculating the arithmetic average of the calculated averages for semesters 1 and 2 for each subject.\n3. Adding calculated averages\n4. Calculation of the arithmetic average of the summed averages\n\nAverage of grades from the whole year:\n1. Calculating weighted average over the year for each subject. The final average in the 1st semester is irrelevant.\n2. Adding calculated averages\n3. Calculating the arithmetic average of summed averages - How does the Final Average work? - The Final Average is the arithmetic average calculated from all currently available final grades in the given semester.\n\nThe calculation scheme consists of the following steps:\n1. Summing up the final grades given by teachers\n2. Divide by the number of subjects that have already been graded - Final average - from %1$d of %2$d subjects - Summary - Class - Mark as read - Partial - Semester - Points - Legend - Class average: %1$s - Your average: %1$s - Your grade: %1$s - Class - Student - - %d grade - %d grades - - - New grade - New grades - - - New predicted grade - New predicted grades - - - New final grade - New final grades - - - You received %1$d grade - You received %1$d grades - - - You received %1$d predicted grade - You received %1$d predicted grades - - - You received %1$d final grade - You received %1$d final grades - - - Lesson - Room - Group - Hours - Changes - No lessons this day - %s min - %s sec - %1$s left - in %1$s - Finished - Now: %s - Next: %s - Later: %s - %1$s lesson %2$d - %3$s - Change of room from %1$s to %2$s - Change of teacher from %1$s to %2$s - Change of subject from %1$s to %2$s - - No lesson - No lessons - - - Timetable change - Timetable changes - - - %1$s - %2$d change in timetable - %1$s - %2$d changes in timetable - - - %1$d change in timetable - %1$d changes in timetable - - - %d change - %d changes - - - Completed lessons - Show completed lessons - No info about completed lessons - Topic - Absence - Resources - - Additional lessons - Show additional lessons - No info about additional lessons - New lesson - New additional lesson - Additional lesson added successfully - Additional lesson deleted successfully - Repeat weekly - Delete additional lesson - Just this lesson - All in the series - Start time - End time - End time must be greater than start time - - Attendance summary - Absent for school reasons - Excused absence - Unexcused absence - Exemption - Excused lateness - Unexcused lateness - Present - Deleted - Unknown - Number of lesson - No entries - Absence reason (optional) - Send - Absence excuse request sent successfully! - You must select at least one absence! - Excuse - - New attendance - New attendance - - - %1$d new attendance - %1$d attendance - - - %d attendance - %d attendance - - - Total - - No exams this week - Type - Entry date - - New exam - New exams - - - %d new exam - %d new exams - - - %d exam - %d exams - - - Inbox - Sent - Trash - (no subject) - No messages - From: - To: - Date: %1$s - Reply - Forward - Select all - Unselect all - Move to trash - Delete permanently - Message deleted successfully - student - parent - guardian - employee - Share - Print - Subject - Content - Message sent successfully - Message does not exist - You need to choose at least 1 recipient - The message content must be at least 3 characters - All mailboxes - Only unread - Only with attachments - Read: %s - Read by: %1$d of %2$d people - - %1$d message - %1$d messages - - - New message - New messages - - Do you want to restore draft message? - Do you want to restore draft message with recipients: %s? - - You received %1$d message - You received %1$d messages - - - %1$d selected - %1$d selected - - Messages deleted - Choose mailbox - Incognito mode is on - Thanks to incognito mode sender is not notified when you read the message - - No info about notes - Points - - %d note - %d notes - - - New note - New notes - - - You received %1$d note - You received %1$d notes - - - - %d praise - %d praises - - - New praise - New praises - - - You received %1$d praise - You received %1$d praises - - - - %d neutral note - %d neutral notes - - - New neutral note - New neutral notes - - - You received %1$d neutral note - You received %1$d neutral notes - - - No info about homework - Mark as done - Mark as undone - Add homework - Homework added successfully - Homework deleted successfully - Attachments - - New homework - New homework - - - You received %d new homework - You received %d new homework - - - %d homework - %d homework - - - Lucky number - Today\'s lucky number is - No info about the lucky number - Lucky number for today - Today\'s lucky number is: %s - Show history - - Lucky number history - No info about lucky numbers - - Mobile devices - No devices - Deregister - Device removed - QR code - Token - Symbol - PIN - - School and teachers - - School - No info about school - School name - School address - Telephone - Name of headmaster - Name of pedagogue - Show on map - Call - - Teachers - No info about teachers - No subject - - Conferences - No info about conferences - - %d conference - %d conferences - - - New conference - New conferences - - - You have %1$d new conference - You have %1$d new conferences - - Present at conference - Agenda - Place - Topic - - School announcements - No school announcements - - %d school announcement - %d school announcements - - - New school announcement - New school announcements - - - You have %1$d new school announcement - You have %1$d new school announcements - - - Add account - Logout - Do you want to log out this student? - Student logout - Student account - Parent account - Edit data - Accounts manager - Select student - Family - Contact - Residence details - Personal information - - App version - Contributors - List of Wulkanowy developers - Report a bug - Send a bug report via e-mail - FAQ - Read Frequently Asked Questions - Discord server - Join the Wulkanowy community - Facebook fanpage - Twitter page - Follow us on twitter - Like our facebook fanpage - Privacy policy - Rules for collecting personal data - System settings - Open system settings - Homepage - Visit the website and help develop the application - Licenses - Licenses of libraries used in the application - - License - - Avatar - See more on GitHub - - No info about student or student family - Name - Second name - Gender - Polish citizenship - Family name - Mother\'s and father\'s names - Phone - Cellphone - E-mail - Address of residence - Address of registration - Correspondence address - Surname and first name - Degree of kinship - Address - Phones - Male - Female - Last name - Guardian - - Nick - Add nick - Choose avatar color - - Share logs - Refresh - - Lessons - (Tomorrow) - (Today and tomorrow) - In a moment: - Soon: - First: - Now: - End of lessons - Next: - Later: - - %1$d more lesson - %1$d more lessons - - until %1$s - No upcoming lessons - An error occurred while loading the lessons - Homework - No homework to do - An error occurred while loading the homework - - %1$d more homework - %1$d more homework - - due %1$s - Last grades - No new grades - An error occurred while loading the grades - School announcements - No current announcements - An error occurred while loading the announcements - - %1$d more announcement - %1$d more announcements - - Exams - No upcoming exams - An error occurred while loading the exams - - %1$d more exam - %1$d more exams - - Conferences - No upcoming conferences - An error occurred while loading the conferences - - %1$d more conference - %1$d more conferences - - An error occurred while loading data - None - - Check for updates - Before reporting a bug, check first if an update with the bug fix is available - - Content - Retry - Description - No description - Teacher - Date - Entry date - Color - Details - Category - Close - No data - Subject - Prev - Next - Search - Search… - Yes - No - Save - Title - Add - Copied - Undo - Change - Add to calendar - Cancel - - No lessons - Synchronized on %1$s at %2$s - Choose theme - Light - Dark - System Theme - - App - Default view - Calculated average options - Force average calculation by app - Show presence - Theme - Grades expanding - Show groups next to subjects - Show empty tiles where there\'s no lesson - Show chart list in class grades - Show subjects without grades - Grades color scheme - Subjects sorting - Language - Menu configuration - Set the order of functions in the menu - Notifications - Other - Show notifications - Show upcoming lesson notifications - Make upcoming lesson notification persistent - Turn off when notification is not showing in your watch/band - Open system notification settings - Fix synchronization & notifications issues - Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. - Show debug notifications - Synchronization is disabled - Official app notifications - Capture official app notifications - Remove official app notifications after capture - Capture notifications - With this feature you can gain a substitute of push notifications like in the official app. All you need to do is allow Wulkanowy to receive all notifications in your system settings.\n\nHow it works?\nWhen you get a notification in Dziennik VULCAN, Wulkanowy will be notified (that\'s what these extra permissions are for) and will trigger a sync so that can send its own notification.\n\nFOR ADVANCED USERS ONLY - Upcoming lesson notifications - You must allow the Wulkanowy app to set alarms and reminders in your system settings to use this feature. - Go to settings - Synchronization - Automatic update - Suspended on holidays - Updates interval - Wi-Fi only - Sync now - Synced! - Sync failed - Sync in progress - Last full sync: %s - Value of the plus - Value of the minus - Reply with message history - Show arithmetic average when no weights provided - Incognito mode - Do not inform about reading the message - Support - Privacy Policy - Agreements - Show consent to data processing - Show ads in app - Watch single ad to support project - Consent to data processing - To view an advertisement you must agree to the data processing terms of our Privacy Policy - Agree - Privacy policy - Ad is loading - Thank you for your support, come back later for more ads - Advanced - Appearance & Behavior - Notifications - Synchronization - Advertisements - Grades - Dashboard - Tiles visibility - Attendance - Timetable - Grades - Calculated average - Messages - Appearance & Behavior - Languages, themes, subjects sorting - App notifications, fix problems - Notifications - Synchronization - Automatic update, synchronization interval - Plus and minus values, average calculation - Advanced - App version, contributors, social portals - Displaying advertisements, project support - - New grades - New homework - New conferences - New exams - Lucky number - New messages - New notes - New school announcements - Push notifications - Upcoming lessons - Debug - Timetable change - New attendance - - Black - Red - Blue - Green - Purple - No color - - Download of updates has started… - An update has just been downloaded. - Restart - Update failed! Wulkanowy may not function properly. Consider updating - - Application restart - The application must restart for the changes to be saved - Restart - - Authorization has been rejected. The data provided does not match the records in the secretary\'s office. - Invalid PESEL - PESEL - Authorize - Authorization completed successfully - Authorization - To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below - Skip for now - - Verification is in progress. Wait… - Verified successfully - - No internet connection - An error occurred. Check your device clock - Connection to register failed. Servers can be overloaded. Please try again later - Loading data failed. Please try again later - Register password change required - Maintenance underway UONET + register. Try again later - Unknown UONET + register error. Try again later - Unknown application error. Please try again later - Captcha verification required - An unexpected error occurred - Feature disabled by your school - Feature not available. Login in a mode other than Mobile API - This field is required - diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml deleted file mode 100644 index ac616418c..000000000 --- a/app/src/main/res/values-it-rIT/strings.xml +++ /dev/null @@ -1,764 +0,0 @@ - - - - Login - Wulkanowy - Grades - Attendance - Exams - Timetable - Settings - More - About - Log viewer - Debug - Notification debug - Clear webview cookies - Contributors - Licenses - Messages - New message - New homework - Notes and achievements - Homework - Accounts manager - Select account - Account details - Student info - Dashboard - Notifications center - Menu configuartion - - Semester %1$d, %2$d/%3$d - - Sign in with the student or parent account - Enter the symbol from the register page for account: <b>%1$s</b> - Username - Email - Login, PESEL or e-mail - Password - UONET+ register variant - Custom domain suffix - Mobile API - Scraper - Hybrid - Token - PIN - Symbol - E.g. \"lodz\" or \"powiatjaroslawski\" - Sign in - Password too short - Login details are incorrect - %1$s. Make sure the correct UONET+ register variation is selected below - Invalid PIN - Invalid token - Token expired - Invalid email - Use the assigned login instead of email - Use the assigned login or email in @%1$s - Invalid symbol. If you cannot find it, please contact the school - Don\'t make this up! If you cannot find it, please contact the school - Student not found. Validate the symbol and the chosen variation of the UONET+ register - Selected student is already logged in - The symbol can be found on the register page in Uczeń → Dostęp Mobilny → Wygeneruj kod dostępu.\n\nMake sure that you have set the appropriate register variant in the UONET+ register variant field on the first login screen - Select students to log in to the application - Other options - In this mode, a lucky number does not work, a class grade stats, summary of attendance, excuse for absence, completed lessons, school information and preview of the list of registered devices - This mode displays the same data as it appears on the register website - The combination of the best features of the other two modes. It works faster than scraper and provides features not available in the Mobile API mode. It is in the experimental phase - Privacy policy - Trouble signing in? Contact us! - Email - Discord - Send email - Make sure you select the correct UONET+ register variation! - Reset password - Recover your account - Recover - Student is already signed in - Standard - Other search locations - No active students found - Enter a different symbol - Get help - Full school name with the town (required) - Np. ZSTiO Jarosław lub SP nr 99 w Łodzi - Enter correct name of the school - Additional information in Polish (optional) - Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" - Submit - - Enable notifications - Enable notifications so you don\'t miss message from teacher or new grade - Skip - Enable - - Account manager - Log in - Session expired - Session expired, log in again - Your account password has been changed. You need to log in to Wulkanowy again - Password changed - Application support - Do you like this app? Support its development by enabling non-invasive ads that you can disable at any time - Enable ads - - Grade - Semester %d - Change semester - No grades - Weight - Weight: %s - Comment - Number of new ratings: %1$d - Average: %1$.2f - Points: %s - No average - Total points - Final grade - Predicted grade - Calculated average - How does Calculated Average work? - The Calculated Average is the arithmetic average calculated from the subjects averages. It allows you to know the approximate final average. It is calculated in a way selected by the user in the application settings. It is recommended that you choose the appropriate option. This is because the calculation of school averages differs. Additionally, if your school reports the average of the subjects on the Vulcan page, the application downloads them and does not calculate these averages. This can be changed by forcing the calculation of the average in the application settings.\n\nAverage of grades only from selected semester:\n1. Calculating the weighted average for each subject in a given semester\n2.Adding calculated averages\n3. Calculation of the arithmetic average of the summed averages\n\nAverage of averages from both semesters:\n1.Calculating the weighted average for each subject in semester 1 and 2\n2. Calculating the arithmetic average of the calculated averages for semesters 1 and 2 for each subject.\n3. Adding calculated averages\n4. Calculation of the arithmetic average of the summed averages\n\nAverage of grades from the whole year:\n1. Calculating weighted average over the year for each subject. The final average in the 1st semester is irrelevant.\n2. Adding calculated averages\n3. Calculating the arithmetic average of summed averages - How does the Final Average work? - The Final Average is the arithmetic average calculated from all currently available final grades in the given semester.\n\nThe calculation scheme consists of the following steps:\n1. Summing up the final grades given by teachers\n2. Divide by the number of subjects that have already been graded - Final average - from %1$d of %2$d subjects - Summary - Class - Mark as read - Partial - Semester - Points - Legend - Class average: %1$s - Your average: %1$s - Your grade: %1$s - Class - Student - - %d grade - %d grades - - - New grade - New grades - - - New predicted grade - New predicted grades - - - New final grade - New final grades - - - You received %1$d grade - You received %1$d grades - - - You received %1$d predicted grade - You received %1$d predicted grades - - - You received %1$d final grade - You received %1$d final grades - - - Lesson - Room - Group - Hours - Changes - No lessons this day - %s min - %s sec - %1$s left - in %1$s - Finished - Now: %s - Next: %s - Later: %s - %1$s lesson %2$d - %3$s - Change of room from %1$s to %2$s - Change of teacher from %1$s to %2$s - Change of subject from %1$s to %2$s - - No lesson - No lessons - - - Timetable change - Timetable changes - - - %1$s - %2$d change in timetable - %1$s - %2$d changes in timetable - - - %1$d change in timetable - %1$d changes in timetable - - - %d change - %d changes - - - Completed lessons - Show completed lessons - No info about completed lessons - Topic - Absence - Resources - - Additional lessons - Show additional lessons - No info about additional lessons - New lesson - New additional lesson - Additional lesson added successfully - Additional lesson deleted successfully - Repeat weekly - Delete additional lesson - Just this lesson - All in the series - Start time - End time - End time must be greater than start time - - Attendance summary - Absent for school reasons - Excused absence - Unexcused absence - Exemption - Excused lateness - Unexcused lateness - Present - Deleted - Unknown - Number of lesson - No entries - Absence reason (optional) - Send - Absence excuse request sent successfully! - You must select at least one absence! - Excuse - - New attendance - New attendance - - - %1$d new attendance - %1$d attendance - - - %d attendance - %d attendance - - - Total - - No exams this week - Type - Entry date - - New exam - New exams - - - %d new exam - %d new exams - - - %d exam - %d exams - - - Inbox - Sent - Trash - (no subject) - No messages - From: - To: - Date: %1$s - Reply - Forward - Select all - Unselect all - Move to trash - Delete permanently - Message deleted successfully - student - parent - guardian - employee - Share - Print - Subject - Content - Message sent successfully - Message does not exist - You need to choose at least 1 recipient - The message content must be at least 3 characters - All mailboxes - Only unread - Only with attachments - Read: %s - Read by: %1$d of %2$d people - - %1$d message - %1$d messages - - - New message - New messages - - Do you want to restore draft message? - Do you want to restore draft message with recipients: %s? - - You received %1$d message - You received %1$d messages - - - %1$d selected - %1$d selected - - Messages deleted - Choose mailbox - Incognito mode is on - Thanks to incognito mode sender is not notified when you read the message - - No info about notes - Points - - %d note - %d notes - - - New note - New notes - - - You received %1$d note - You received %1$d notes - - - - %d praise - %d praises - - - New praise - New praises - - - You received %1$d praise - You received %1$d praises - - - - %d neutral note - %d neutral notes - - - New neutral note - New neutral notes - - - You received %1$d neutral note - You received %1$d neutral notes - - - No info about homework - Mark as done - Mark as undone - Add homework - Homework added successfully - Homework deleted successfully - Attachments - - New homework - New homework - - - You received %d new homework - You received %d new homework - - - %d homework - %d homework - - - Lucky number - Today\'s lucky number is - No info about the lucky number - Lucky number for today - Today\'s lucky number is: %s - Show history - - Lucky number history - No info about lucky numbers - - Mobile devices - No devices - Deregister - Device removed - QR code - Token - Symbol - PIN - - School and teachers - - School - No info about school - School name - School address - Telephone - Name of headmaster - Name of pedagogue - Show on map - Call - - Teachers - No info about teachers - No subject - - Conferences - No info about conferences - - %d conference - %d conferences - - - New conference - New conferences - - - You have %1$d new conference - You have %1$d new conferences - - Present at conference - Agenda - Place - Topic - - School announcements - No school announcements - - %d school announcement - %d school announcements - - - New school announcement - New school announcements - - - You have %1$d new school announcement - You have %1$d new school announcements - - - Add account - Logout - Do you want to log out this student? - Student logout - Student account - Parent account - Edit data - Accounts manager - Select student - Family - Contact - Residence details - Personal information - - App version - Contributors - List of Wulkanowy developers - Report a bug - Send a bug report via e-mail - FAQ - Read Frequently Asked Questions - Discord server - Join the Wulkanowy community - Facebook fanpage - Twitter page - Follow us on twitter - Like our facebook fanpage - Privacy policy - Rules for collecting personal data - System settings - Open system settings - Homepage - Visit the website and help develop the application - Licenses - Licenses of libraries used in the application - - License - - Avatar - See more on GitHub - - No info about student or student family - Name - Second name - Gender - Polish citizenship - Family name - Mother\'s and father\'s names - Phone - Cellphone - E-mail - Address of residence - Address of registration - Correspondence address - Surname and first name - Degree of kinship - Address - Phones - Male - Female - Last name - Guardian - - Nick - Add nick - Choose avatar color - - Share logs - Refresh - - Lessons - (Tomorrow) - (Today and tomorrow) - In a moment: - Soon: - First: - Now: - End of lessons - Next: - Later: - - %1$d more lesson - %1$d more lessons - - until %1$s - No upcoming lessons - An error occurred while loading the lessons - Homework - No homework to do - An error occurred while loading the homework - - %1$d more homework - %1$d more homework - - due %1$s - Last grades - No new grades - An error occurred while loading the grades - School announcements - No current announcements - An error occurred while loading the announcements - - %1$d more announcement - %1$d more announcements - - Exams - No upcoming exams - An error occurred while loading the exams - - %1$d more exam - %1$d more exams - - Conferences - No upcoming conferences - An error occurred while loading the conferences - - %1$d more conference - %1$d more conferences - - An error occurred while loading data - None - - Check for updates - Before reporting a bug, check first if an update with the bug fix is available - - Content - Retry - Description - No description - Teacher - Date - Entry date - Color - Details - Category - Close - No data - Subject - Prev - Next - Search - Search… - Yes - No - Save - Title - Add - Copied - Undo - Change - Add to calendar - Cancel - - No lessons - Synchronized on %1$s at %2$s - Choose theme - Light - Dark - System Theme - - App - Default view - Calculated average options - Force average calculation by app - Show presence - Theme - Grades expanding - Show groups next to subjects - Show empty tiles where there\'s no lesson - Show chart list in class grades - Show subjects without grades - Grades color scheme - Subjects sorting - Language - Menu configuration - Set the order of functions in the menu - Notifications - Other - Show notifications - Show upcoming lesson notifications - Make upcoming lesson notification persistent - Turn off when notification is not showing in your watch/band - Open system notification settings - Fix synchronization & notifications issues - Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings. - Show debug notifications - Synchronization is disabled - Official app notifications - Capture official app notifications - Remove official app notifications after capture - Capture notifications - With this feature you can gain a substitute of push notifications like in the official app. All you need to do is allow Wulkanowy to receive all notifications in your system settings.\n\nHow it works?\nWhen you get a notification in Dziennik VULCAN, Wulkanowy will be notified (that\'s what these extra permissions are for) and will trigger a sync so that can send its own notification.\n\nFOR ADVANCED USERS ONLY - Upcoming lesson notifications - You must allow the Wulkanowy app to set alarms and reminders in your system settings to use this feature. - Go to settings - Synchronization - Automatic update - Suspended on holidays - Updates interval - Wi-Fi only - Sync now - Synced! - Sync failed - Sync in progress - Last full sync: %s - Value of the plus - Value of the minus - Reply with message history - Show arithmetic average when no weights provided - Incognito mode - Do not inform about reading the message - Support - Privacy Policy - Agreements - Show consent to data processing - Show ads in app - Watch single ad to support project - Consent to data processing - To view an advertisement you must agree to the data processing terms of our Privacy Policy - Agree - Privacy policy - Ad is loading - Thank you for your support, come back later for more ads - Advanced - Appearance & Behavior - Notifications - Synchronization - Advertisements - Grades - Dashboard - Tiles visibility - Attendance - Timetable - Grades - Calculated average - Messages - Appearance & Behavior - Languages, themes, subjects sorting - App notifications, fix problems - Notifications - Synchronization - Automatic update, synchronization interval - Plus and minus values, average calculation - Advanced - App version, contributors, social portals - Displaying advertisements, project support - - New grades - New homework - New conferences - New exams - Lucky number - New messages - New notes - New school announcements - Push notifications - Upcoming lessons - Debug - Timetable change - New attendance - - Black - Red - Blue - Green - Purple - No color - - Download of updates has started… - An update has just been downloaded. - Restart - Update failed! Wulkanowy may not function properly. Consider updating - - Application restart - The application must restart for the changes to be saved - Restart - - Authorization has been rejected. The data provided does not match the records in the secretary\'s office. - Invalid PESEL - PESEL - Authorize - Authorization completed successfully - Authorization - To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below - Skip for now - - Verification is in progress. Wait… - Verified successfully - - No internet connection - An error occurred. Check your device clock - Connection to register failed. Servers can be overloaded. Please try again later - Loading data failed. Please try again later - Register password change required - Maintenance underway UONET + register. Try again later - Unknown UONET + register error. Try again later - Unknown application error. Please try again later - Captcha verification required - An unexpected error occurred - Feature disabled by your school - Feature not available. Login in a mode other than Mobile API - This field is required - diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index feb08a03b..2ca669287 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -829,7 +829,7 @@ Авторизация отклонена. Предоставленные данные не соответствуют записям в кабинете секретаря. Неправильный номер PESEL Номер PESEL - Authorize + Авторизовать Авторизация прошла успешно Авторизация Для работы приложения нам необходимо подтвердить вашу личность. Введите PESEL учащегося <b>%1$s</b> в поле ниже From 725668f855eb0ea41217e1a57d2b72547634ceed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 09:22:34 +0000 Subject: [PATCH 1333/1526] Bump androidx.lifecycle:lifecycle-livedata-ktx from 2.6.2 to 2.7.0 (#2398) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 8d10ce926..cd8a1df20 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -221,7 +221,7 @@ dependencies { implementation "androidx.work:work-runtime:$work_manager" playImplementation "androidx.work:work-gcm:$work_manager" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.7.0" implementation "androidx.room:room-runtime:$room" implementation "androidx.room:room-ktx:$room" From 9dfb282e881aa0dc6278777993352740d84b43f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 21 Jan 2024 11:39:55 +0100 Subject: [PATCH 1334/1526] Add X to close admin message (#2401) --- .../58.json | 2451 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 124 +- .../data/db/entities/AdminMessage.kt | 7 +- .../data/db/migrations/Migration58.kt | 10 + .../viewholders/AdminMessageViewHolder.kt | 10 +- app/src/main/res/drawable/ic_close.xml | 10 + .../layout/item_dashboard_admin_message.xml | 15 +- 7 files changed, 2617 insertions(+), 10 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/58.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration58.kt create mode 100644 app/src/main/res/drawable/ic_close.xml diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/58.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/58.json new file mode 100644 index 000000000..e6e71229c --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/58.json @@ -0,0 +1,2451 @@ +{ + "formatVersion": 1, + "database": { + "version": 58, + "identityHash": "cd1d4f8f2b6e3860fbc1de93d4f5ca42", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `scrapper_domain_suffix` TEXT NOT NULL DEFAULT '', `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperDomainSuffix", + "columnName": "scrapper_domain_suffix", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `kindergarten_diary_id` INTEGER NOT NULL DEFAULT 0, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "kindergartenDiaryId", + "columnName": "kindergarten_diary_id", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "kindergarten_diary_id", + "semester_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `kindergarten_diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`email` TEXT NOT NULL, `message_global_key` TEXT NOT NULL, `mailbox_key` TEXT NOT NULL, `message_id` INTEGER NOT NULL, `correspondents` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `read_by` INTEGER, `unread_by` INTEGER, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `content` TEXT NOT NULL, `sender` TEXT, `recipients` TEXT)", + "fields": [ + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mailboxKey", + "columnName": "mailbox_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "correspondents", + "columnName": "correspondents", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "recipients", + "columnName": "recipients", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`message_global_key` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`message_global_key`, `url`, `filename`))", + "fields": [ + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "message_global_key", + "url", + "filename" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Mailboxes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`globalKey` TEXT NOT NULL, `email` TEXT NOT NULL, `symbol` TEXT NOT NULL, `schoolId` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `studentName` TEXT NOT NULL, `schoolNameShort` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`globalKey`))", + "fields": [ + { + "fieldPath": "globalKey", + "columnName": "globalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolId", + "columnName": "schoolId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "studentName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolNameShort", + "columnName": "schoolNameShort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "globalKey" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`mailboxGlobalKey` TEXT NOT NULL, `studentMailboxGlobalKey` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `schoolShortName` TEXT NOT NULL, `type` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "mailboxGlobalKey", + "columnName": "mailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentMailboxGlobalKey", + "columnName": "studentMailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "schoolShortName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `repeat_id` BLOB DEFAULT NULL, `is_added_by_user` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatId", + "columnName": "repeat_id", + "affinity": "BLOB", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `destination` TEXT NOT NULL DEFAULT '{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}', `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "destination", + "columnName": "destination", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}'" + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `types` TEXT NOT NULL DEFAULT '[]', `is_ok_visible` INTEGER NOT NULL DEFAULT 0, `is_x_visible` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "types", + "columnName": "types", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'[]'" + }, + { + "fieldPath": "isOkVisible", + "columnName": "is_ok_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "isXVisible", + "columnName": "is_x_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'cd1d4f8f2b6e3860fbc1de93d4f5ca42')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 48a2942c9..a2f230f4c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -1,11 +1,124 @@ package io.github.wulkanowy.data.db import android.content.Context -import androidx.room.* +import androidx.room.AutoMigration +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase import androidx.room.RoomDatabase.JournalMode.TRUNCATE -import io.github.wulkanowy.data.db.dao.* -import io.github.wulkanowy.data.db.entities.* -import io.github.wulkanowy.data.db.migrations.* +import androidx.room.TypeConverters +import io.github.wulkanowy.data.db.dao.AdminMessageDao +import io.github.wulkanowy.data.db.dao.AttendanceDao +import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao +import io.github.wulkanowy.data.db.dao.CompletedLessonsDao +import io.github.wulkanowy.data.db.dao.ConferenceDao +import io.github.wulkanowy.data.db.dao.ExamDao +import io.github.wulkanowy.data.db.dao.GradeDao +import io.github.wulkanowy.data.db.dao.GradePartialStatisticsDao +import io.github.wulkanowy.data.db.dao.GradePointsStatisticsDao +import io.github.wulkanowy.data.db.dao.GradeSemesterStatisticsDao +import io.github.wulkanowy.data.db.dao.GradeSummaryDao +import io.github.wulkanowy.data.db.dao.HomeworkDao +import io.github.wulkanowy.data.db.dao.LuckyNumberDao +import io.github.wulkanowy.data.db.dao.MailboxDao +import io.github.wulkanowy.data.db.dao.MessageAttachmentDao +import io.github.wulkanowy.data.db.dao.MessagesDao +import io.github.wulkanowy.data.db.dao.MobileDeviceDao +import io.github.wulkanowy.data.db.dao.NoteDao +import io.github.wulkanowy.data.db.dao.NotificationDao +import io.github.wulkanowy.data.db.dao.RecipientDao +import io.github.wulkanowy.data.db.dao.SchoolAnnouncementDao +import io.github.wulkanowy.data.db.dao.SchoolDao +import io.github.wulkanowy.data.db.dao.SemesterDao +import io.github.wulkanowy.data.db.dao.StudentDao +import io.github.wulkanowy.data.db.dao.StudentInfoDao +import io.github.wulkanowy.data.db.dao.SubjectDao +import io.github.wulkanowy.data.db.dao.TeacherDao +import io.github.wulkanowy.data.db.dao.TimetableAdditionalDao +import io.github.wulkanowy.data.db.dao.TimetableDao +import io.github.wulkanowy.data.db.dao.TimetableHeaderDao +import io.github.wulkanowy.data.db.entities.AdminMessage +import io.github.wulkanowy.data.db.entities.Attendance +import io.github.wulkanowy.data.db.entities.AttendanceSummary +import io.github.wulkanowy.data.db.entities.CompletedLesson +import io.github.wulkanowy.data.db.entities.Conference +import io.github.wulkanowy.data.db.entities.Exam +import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradePartialStatistics +import io.github.wulkanowy.data.db.entities.GradePointsStatistics +import io.github.wulkanowy.data.db.entities.GradeSemesterStatistics +import io.github.wulkanowy.data.db.entities.GradeSummary +import io.github.wulkanowy.data.db.entities.Homework +import io.github.wulkanowy.data.db.entities.LuckyNumber +import io.github.wulkanowy.data.db.entities.Mailbox +import io.github.wulkanowy.data.db.entities.Message +import io.github.wulkanowy.data.db.entities.MessageAttachment +import io.github.wulkanowy.data.db.entities.MobileDevice +import io.github.wulkanowy.data.db.entities.Note +import io.github.wulkanowy.data.db.entities.Notification +import io.github.wulkanowy.data.db.entities.Recipient +import io.github.wulkanowy.data.db.entities.School +import io.github.wulkanowy.data.db.entities.SchoolAnnouncement +import io.github.wulkanowy.data.db.entities.Semester +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentInfo +import io.github.wulkanowy.data.db.entities.Subject +import io.github.wulkanowy.data.db.entities.Teacher +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.db.migrations.Migration10 +import io.github.wulkanowy.data.db.migrations.Migration11 +import io.github.wulkanowy.data.db.migrations.Migration12 +import io.github.wulkanowy.data.db.migrations.Migration13 +import io.github.wulkanowy.data.db.migrations.Migration14 +import io.github.wulkanowy.data.db.migrations.Migration15 +import io.github.wulkanowy.data.db.migrations.Migration16 +import io.github.wulkanowy.data.db.migrations.Migration17 +import io.github.wulkanowy.data.db.migrations.Migration18 +import io.github.wulkanowy.data.db.migrations.Migration19 +import io.github.wulkanowy.data.db.migrations.Migration2 +import io.github.wulkanowy.data.db.migrations.Migration20 +import io.github.wulkanowy.data.db.migrations.Migration21 +import io.github.wulkanowy.data.db.migrations.Migration22 +import io.github.wulkanowy.data.db.migrations.Migration23 +import io.github.wulkanowy.data.db.migrations.Migration24 +import io.github.wulkanowy.data.db.migrations.Migration25 +import io.github.wulkanowy.data.db.migrations.Migration26 +import io.github.wulkanowy.data.db.migrations.Migration27 +import io.github.wulkanowy.data.db.migrations.Migration28 +import io.github.wulkanowy.data.db.migrations.Migration29 +import io.github.wulkanowy.data.db.migrations.Migration3 +import io.github.wulkanowy.data.db.migrations.Migration30 +import io.github.wulkanowy.data.db.migrations.Migration31 +import io.github.wulkanowy.data.db.migrations.Migration32 +import io.github.wulkanowy.data.db.migrations.Migration33 +import io.github.wulkanowy.data.db.migrations.Migration34 +import io.github.wulkanowy.data.db.migrations.Migration35 +import io.github.wulkanowy.data.db.migrations.Migration36 +import io.github.wulkanowy.data.db.migrations.Migration37 +import io.github.wulkanowy.data.db.migrations.Migration38 +import io.github.wulkanowy.data.db.migrations.Migration39 +import io.github.wulkanowy.data.db.migrations.Migration4 +import io.github.wulkanowy.data.db.migrations.Migration40 +import io.github.wulkanowy.data.db.migrations.Migration41 +import io.github.wulkanowy.data.db.migrations.Migration42 +import io.github.wulkanowy.data.db.migrations.Migration43 +import io.github.wulkanowy.data.db.migrations.Migration44 +import io.github.wulkanowy.data.db.migrations.Migration46 +import io.github.wulkanowy.data.db.migrations.Migration49 +import io.github.wulkanowy.data.db.migrations.Migration5 +import io.github.wulkanowy.data.db.migrations.Migration50 +import io.github.wulkanowy.data.db.migrations.Migration51 +import io.github.wulkanowy.data.db.migrations.Migration53 +import io.github.wulkanowy.data.db.migrations.Migration54 +import io.github.wulkanowy.data.db.migrations.Migration55 +import io.github.wulkanowy.data.db.migrations.Migration57 +import io.github.wulkanowy.data.db.migrations.Migration58 +import io.github.wulkanowy.data.db.migrations.Migration6 +import io.github.wulkanowy.data.db.migrations.Migration7 +import io.github.wulkanowy.data.db.migrations.Migration8 +import io.github.wulkanowy.data.db.migrations.Migration9 import io.github.wulkanowy.utils.AppInfo import javax.inject.Singleton @@ -51,6 +164,7 @@ import javax.inject.Singleton AutoMigration(from = 54, to = 55, spec = Migration55::class), AutoMigration(from = 55, to = 56), AutoMigration(from = 56, to = 57, spec = Migration57::class), + AutoMigration(from = 57, to = 58, spec = Migration58::class), ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -59,7 +173,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 57 + const val VERSION_SCHEMA = 58 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt index 875c2a3a5..0c8f1a5d1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt @@ -37,6 +37,9 @@ data class AdminMessage( @ColumnInfo(name = "types", defaultValue = "[]") val types: List = emptyList(), - @ColumnInfo(name = "is_dismissible") - val isDismissible: Boolean = false + @ColumnInfo(name = "is_ok_visible", defaultValue = "0") + val isOkVisible: Boolean = false, + + @ColumnInfo(name = "is_x_visible", defaultValue = "0") + val isXVisible: Boolean = false ) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration58.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration58.kt new file mode 100644 index 000000000..c440d58d6 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration58.kt @@ -0,0 +1,10 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.DeleteColumn +import androidx.room.migration.AutoMigrationSpec + +@DeleteColumn( + tableName = "AdminMessages", + columnName = "is_dismissible", +) +class Migration58 : AutoMigrationSpec diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/viewholders/AdminMessageViewHolder.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/viewholders/AdminMessageViewHolder.kt index 81099801a..1e0f0bdbf 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/viewholders/AdminMessageViewHolder.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/viewholders/AdminMessageViewHolder.kt @@ -7,7 +7,6 @@ import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.databinding.ItemDashboardAdminMessageBinding -import io.github.wulkanowy.ui.modules.dashboard.DashboardItem import io.github.wulkanowy.utils.getThemeAttrColor class AdminMessageViewHolder( @@ -25,9 +24,11 @@ class AdminMessageViewHolder( context.getThemeAttrColor(R.attr.colorMessageHigh) to context.getThemeAttrColor(R.attr.colorOnMessageHigh) } + "MEDIUM" -> { context.getThemeAttrColor(R.attr.colorMessageMedium) to Color.BLACK } + else -> null to context.getThemeAttrColor(R.attr.colorOnSurface) } @@ -37,11 +38,16 @@ class AdminMessageViewHolder( dashboardAdminMessageItemDescription.text = item.content dashboardAdminMessageItemDescription.setTextColor(textColor) dashboardAdminMessageItemIcon.setColorFilter(textColor) - dashboardAdminMessageItemDismiss.isVisible = item.isDismissible + dashboardAdminMessageItemDismiss.isVisible = item.isOkVisible + dashboardAdminMessageItemClose.isVisible = item.isXVisible dashboardAdminMessageItemDismiss.setTextColor(textColor) + dashboardAdminMessageItemClose.imageTintList = ColorStateList.valueOf(textColor) dashboardAdminMessageItemDismiss.setOnClickListener { onAdminMessageDismissClickListener(item) } + dashboardAdminMessageItemClose.setOnClickListener { + onAdminMessageDismissClickListener(item) + } root.setCardBackgroundColor(backgroundColor?.let { ColorStateList.valueOf(it) }) item.destinationUrl?.let { url -> diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml new file mode 100644 index 000000000..1d6c00461 --- /dev/null +++ b/app/src/main/res/drawable/ic_close.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/item_dashboard_admin_message.xml b/app/src/main/res/layout/item_dashboard_admin_message.xml index e12241df5..407e12921 100644 --- a/app/src/main/res/layout/item_dashboard_admin_message.xml +++ b/app/src/main/res/layout/item_dashboard_admin_message.xml @@ -34,11 +34,24 @@ android:layout_marginEnd="16dp" android:textSize="18sp" android:textStyle="bold" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@id/dashboard_admin_message_item_close" app:layout_constraintStart_toEndOf="@id/dashboard_admin_message_item_icon" app:layout_constraintTop_toTopOf="parent" tools:text="@tools:sample/lorem" /> + + Date: Sun, 21 Jan 2024 12:39:23 +0100 Subject: [PATCH 1335/1526] Add admin message to error view in dashboard (#2400) --- app/build.gradle | 2 +- .../ui/modules/dashboard/DashboardFragment.kt | 13 +++++-- .../modules/dashboard/DashboardPresenter.kt | 20 ++++++----- .../ui/modules/dashboard/DashboardView.kt | 3 +- .../main/res/layout/fragment_dashboard.xml | 36 +++++++++++++++---- 5 files changed, 54 insertions(+), 20 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cd8a1df20..a67adb6fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.3.6' + implementation 'io.github.wulkanowy:sdk:2.3.7-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt index bedbce231..b7a0796c5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt @@ -21,6 +21,7 @@ import io.github.wulkanowy.ui.modules.attendance.summary.AttendanceSummaryFragme import io.github.wulkanowy.ui.modules.captcha.CaptchaDialog.Companion.CAPTCHA_SUCCESS import io.github.wulkanowy.ui.modules.conference.ConferenceFragment import io.github.wulkanowy.ui.modules.dashboard.adapters.DashboardAdapter +import io.github.wulkanowy.ui.modules.dashboard.viewholders.AdminMessageViewHolder import io.github.wulkanowy.ui.modules.exam.ExamFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment import io.github.wulkanowy.ui.modules.homework.HomeworkFragment @@ -37,7 +38,6 @@ import io.github.wulkanowy.utils.getErrorString import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.toFormattedString -import timber.log.Timber import java.time.LocalDate import javax.inject.Inject @@ -199,8 +199,17 @@ class DashboardFragment : BaseFragment(R.layout.fragme binding.dashboardRecycler.isVisible = show } - override fun showErrorView(show: Boolean) { + override fun showErrorView(show: Boolean, adminMessageItem: DashboardItem.AdminMessages?) { binding.dashboardErrorContainer.isVisible = show + binding.dashboardErrorAdminMessage.root.isVisible = adminMessageItem != null + + if (adminMessageItem != null) { + AdminMessageViewHolder( + binding = binding.dashboardErrorAdminMessage, + onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, + onAdminMessageClickListener = presenter::onAdminMessageSelected, + ).bind(adminMessageItem.adminMessage) + } } override fun setErrorDetails(error: Throwable) { 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 74b427e78..4e1587439 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 @@ -403,7 +403,7 @@ class DashboardPresenter @Inject constructor( subjectWithGrades = it.dataOrNull, gradeTheme = preferencesRepository.gradeColorTheme, isLoading = true - ), forceRefresh + ), false ) if (!it.dataOrNull.isNullOrEmpty()) { @@ -452,7 +452,7 @@ class DashboardPresenter @Inject constructor( if (forceRefresh) return@onEach updateData( DashboardItem.Lessons(it.dataOrNull, isLoading = true), - forceRefresh + false ) if (!it.dataOrNull?.lessons.isNullOrEmpty()) { @@ -509,7 +509,7 @@ class DashboardPresenter @Inject constructor( val data = it.dataOrNull.orEmpty() updateData( DashboardItem.Homework(data, isLoading = true), - forceRefresh + false ) if (data.isNotEmpty()) { @@ -543,7 +543,7 @@ class DashboardPresenter @Inject constructor( if (forceRefresh) return@onEach updateData( DashboardItem.Announcements(it.dataOrNull.orEmpty(), isLoading = true), - forceRefresh + false ) if (!it.dataOrNull.isNullOrEmpty()) { @@ -586,7 +586,7 @@ class DashboardPresenter @Inject constructor( if (forceRefresh) return@onEach updateData( DashboardItem.Exams(it.dataOrNull.orEmpty(), isLoading = true), - forceRefresh + false ) if (!it.dataOrNull.isNullOrEmpty()) { @@ -627,7 +627,7 @@ class DashboardPresenter @Inject constructor( if (forceRefresh) return@onEach updateData( DashboardItem.Conferences(it.dataOrNull.orEmpty(), isLoading = true), - forceRefresh + false ) if (!it.dataOrNull.isNullOrEmpty()) { @@ -662,7 +662,7 @@ class DashboardPresenter @Inject constructor( is Resource.Loading -> { Timber.i("Loading dashboard admin message data started") if (forceRefresh) return@onEach - updateData(DashboardItem.AdminMessages(), forceRefresh) + updateData(DashboardItem.AdminMessages(), false) } is Resource.Success -> { @@ -692,7 +692,7 @@ class DashboardPresenter @Inject constructor( private fun loadAds(forceRefresh: Boolean) { presenterScope.launch { if (!forceRefresh) { - updateData(DashboardItem.Ads(), forceRefresh) + updateData(DashboardItem.Ads(), false) } val dashboardAdItem = @@ -813,6 +813,8 @@ class DashboardPresenter @Inject constructor( val filteredItems = itemsLoadedList.filterNot { it.type == DashboardItem.Type.ACCOUNT || it.type == DashboardItem.Type.ADMIN_MESSAGE } + val dataLoadedAdminMessageItem = + itemsLoadedList.find { it.type == DashboardItem.Type.ADMIN_MESSAGE && it.isDataLoaded } as DashboardItem.AdminMessages? val isAccountItemError = itemsLoadedList.find { it.type == DashboardItem.Type.ACCOUNT }?.error != null val isGeneralError = @@ -834,7 +836,7 @@ class DashboardPresenter @Inject constructor( showRefresh(false) if ((forceRefresh && wasGeneralError) || !forceRefresh) { showContent(false) - showErrorView(true) + showErrorView(true, dataLoadedAdminMessageItem) setErrorDetails(lastError) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt index fe011c929..56a0a773a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt @@ -20,7 +20,7 @@ interface DashboardView : BaseView { fun showRefresh(show: Boolean) - fun showErrorView(show: Boolean) + fun showErrorView(show: Boolean, adminMessageItem: DashboardItem.AdminMessages? = null) fun setErrorDetails(error: Throwable) @@ -29,5 +29,6 @@ interface DashboardView : BaseView { fun popViewToRoot() fun openNotificationsCenterView() + fun openInternetBrowser(url: String) } diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index 348602d77..9de44a70d 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -18,7 +18,8 @@ + android:layout_height="match_parent" + tools:visibility="gone"> - + + @@ -55,14 +70,21 @@ android:gravity="center" android:padding="8dp" android:text="@string/error_unknown" - android:textSize="20sp" /> + android:textSize="20sp" + app:layout_constraintBottom_toTopOf="@id/dashboard_error_buttons" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/dashboard_error_image" /> + android:orientation="horizontal" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/dashboard_error_message"> - + From a51a54dc7ac444f73bb525c5a54c26d9c281ce46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 21 Jan 2024 18:59:54 +0100 Subject: [PATCH 1336/1526] Normalize synchronization date ranges to fix weird notification issues (#2403) --- .../data/repositories/ExamRepository.kt | 18 ++++++++++-------- .../data/repositories/HomeworkRepository.kt | 7 ++++++- .../services/sync/works/AttendanceWork.kt | 13 ++++++++++--- .../wulkanowy/services/sync/works/ExamWork.kt | 16 +++++++++++++--- .../services/sync/works/HomeworkWork.kt | 16 +++++++++++++--- .../services/sync/works/TimetableWork.kt | 13 ++++++++++--- .../ui/modules/dashboard/DashboardPresenter.kt | 4 ++-- 7 files changed, 64 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt index 013c0951d..59f422428 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt @@ -67,14 +67,16 @@ class ExamRepository @Inject constructor( filterResult = { it.filter { item -> item.date in start..end } } ) - fun getExamsFromDatabase(semester: Semester, start: LocalDate): Flow> { - return examDb.loadAll( - diaryId = semester.diaryId, - studentId = semester.studentId, - from = start.startExamsDay, - end = start.endExamsDay - ) - } + fun getExamsFromDatabase( + semester: Semester, + start: LocalDate, + end: LocalDate + ): Flow> = examDb.loadAll( + diaryId = semester.diaryId, + studentId = semester.studentId, + from = start, + end = end, + ) suspend fun updateExam(exam: List) = examDb.updateAll(exam) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt index f564824de..048c95a38 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt @@ -7,7 +7,12 @@ 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.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.uniqueSubtract import kotlinx.coroutines.sync.Mutex import java.time.LocalDate import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt index 657f69638..4fc097492 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt @@ -16,17 +16,24 @@ class AttendanceWork @Inject constructor( ) : Work { override suspend fun doWork(student: Student, semester: Semester, notify: Boolean) { + val startDate = now().previousOrSameSchoolDay + val endDate = startDate.plusDays(7) + attendanceRepository.getAttendance( student = student, semester = semester, - start = now().previousOrSameSchoolDay, - end = now().previousOrSameSchoolDay, + start = startDate, + end = endDate, forceRefresh = true, notify = notify, ) .waitForResult() - attendanceRepository.getAttendanceFromDatabase(semester, now().minusDays(7), now()) + attendanceRepository.getAttendanceFromDatabase( + semester = semester, + start = startDate, + end = endDate, + ) .first() .filterNot { it.isNotified } .let { diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt index 7071bce20..4b0b1bdb3 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt @@ -5,6 +5,8 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.ExamRepository import io.github.wulkanowy.data.waitForResult import io.github.wulkanowy.services.sync.notifications.NewExamNotification +import io.github.wulkanowy.utils.endExamsDay +import io.github.wulkanowy.utils.startExamsDay import kotlinx.coroutines.flow.first import java.time.LocalDate.now import javax.inject.Inject @@ -15,16 +17,24 @@ class ExamWork @Inject constructor( ) : Work { override suspend fun doWork(student: Student, semester: Semester, notify: Boolean) { + val startDate = now().startExamsDay + val endDate = startDate.endExamsDay + examRepository.getExams( student = student, semester = semester, - start = now(), - end = now(), + start = startDate, + end = endDate, forceRefresh = true, notify = notify, ).waitForResult() - examRepository.getExamsFromDatabase(semester, now()).first() + examRepository.getExamsFromDatabase( + semester = semester, + start = startDate, + end = endDate, + ) + .first() .filter { !it.isNotified }.let { if (it.isNotEmpty()) newExamNotification.notify(it, student) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt index 4cfe27d0d..ddff3af7c 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt @@ -5,7 +5,9 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.HomeworkRepository import io.github.wulkanowy.data.waitForResult import io.github.wulkanowy.services.sync.notifications.NewHomeworkNotification +import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.nextOrSameSchoolDay +import io.github.wulkanowy.utils.sunday import kotlinx.coroutines.flow.first import java.time.LocalDate.now import javax.inject.Inject @@ -16,16 +18,24 @@ class HomeworkWork @Inject constructor( ) : Work { override suspend fun doWork(student: Student, semester: Semester, notify: Boolean) { + val startDate = now().nextOrSameSchoolDay.monday + val endDate = startDate.sunday + homeworkRepository.getHomework( student = student, semester = semester, - start = now().nextOrSameSchoolDay, - end = now().nextOrSameSchoolDay, + start = startDate, + end = endDate, forceRefresh = true, notify = notify, ).waitForResult() - homeworkRepository.getHomeworkFromDatabase(semester, now(), now().plusDays(7)).first() + homeworkRepository.getHomeworkFromDatabase( + semester = semester, + start = startDate, + end = endDate + ) + .first() .filter { !it.isNotified }.let { if (it.isNotEmpty()) newHomeworkNotification.notify(it, student) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt index 29b1f13c7..ac9a8eb4c 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt @@ -16,17 +16,24 @@ class TimetableWork @Inject constructor( ) : Work { override suspend fun doWork(student: Student, semester: Semester, notify: Boolean) { + val startDate = now().nextOrSameSchoolDay + val endDate = startDate.plusDays(7) + timetableRepository.getTimetable( student = student, semester = semester, - start = now().nextOrSameSchoolDay, - end = now().nextOrSameSchoolDay, + start = startDate, + end = endDate, forceRefresh = true, notify = notify, ) .waitForResult() - timetableRepository.getTimetableFromDatabase(semester, now(), now().plusDays(7)) + timetableRepository.getTimetableFromDatabase( + semester = semester, + from = startDate, + end = endDate, + ) .first() .filterNot { it.isNotified } .let { 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 4e1587439..ad604499b 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 @@ -435,13 +435,13 @@ class DashboardPresenter @Inject constructor( private fun loadLessons(student: Student, forceRefresh: Boolean) { flatResourceFlow { val semester = semesterRepository.getCurrentSemester(student) - val date = LocalDate.now() + val date = LocalDate.now().nextOrSameSchoolDay timetableRepository.getTimetable( student = student, semester = semester, start = date, - end = date.plusDays(1), + end = date, forceRefresh = forceRefresh ) } From e0f4cad7fb4e35cc38772b02e7b9a8a62de51996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 21 Jan 2024 20:01:00 +0100 Subject: [PATCH 1337/1526] Add missing unitId to sdk switchSemester call (#2402) --- .../data/repositories/AttendanceRepository.kt | 12 +++++++++--- .../data/repositories/AttendanceSummaryRepository.kt | 3 ++- .../data/repositories/CompletedLessonsRepository.kt | 2 +- .../data/repositories/ConferenceRepository.kt | 3 ++- .../wulkanowy/data/repositories/ExamRepository.kt | 10 ++++++++-- .../wulkanowy/data/repositories/GradeRepository.kt | 2 +- .../data/repositories/GradeStatisticsRepository.kt | 7 ++++--- .../data/repositories/HomeworkRepository.kt | 2 +- .../data/repositories/MobileDeviceRepository.kt | 7 ++++--- .../wulkanowy/data/repositories/NoteRepository.kt | 2 +- .../wulkanowy/data/repositories/SchoolRepository.kt | 3 ++- .../wulkanowy/data/repositories/SchoolsRepository.kt | 7 ++----- .../data/repositories/StudentInfoRepository.kt | 3 ++- .../wulkanowy/data/repositories/StudentRepository.kt | 5 +++-- .../wulkanowy/data/repositories/SubjectRepository.kt | 6 ++++-- .../wulkanowy/data/repositories/TeacherRepository.kt | 3 ++- .../data/repositories/TimetableRepository.kt | 2 +- .../java/io/github/wulkanowy/utils/SdkExtension.kt | 10 ++++++++++ 18 files changed, 59 insertions(+), 30 deletions(-) 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 3afb99077..6d782047b 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,7 +9,13 @@ 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.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.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -58,7 +64,7 @@ class AttendanceRepository @Inject constructor( ) } sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getAttendance(start.monday, end.sunday) .mapToEntities(semester, lessons) }, @@ -97,7 +103,7 @@ class AttendanceRepository @Inject constructor( ) } sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .excuseForAbsence(items, reason) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt index 8e0709135..6bdcf9d7f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -40,7 +41,7 @@ class AttendanceSummaryRepository @Inject constructor( query = { attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId) }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getAttendanceSummary(subjectId) .mapToEntities(semester, subjectId) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt index 8f393cadb..1579ae62b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt @@ -48,7 +48,7 @@ class CompletedLessonsRepository @Inject constructor( }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getCompletedLessons(start.monday, end.sunday) .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt index 83204cab0..7eb37f0b7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt @@ -10,6 +10,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -46,7 +47,7 @@ class ConferenceRepository @Inject constructor( }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getConferences() .mapToEntities(semester) .filter { it.date >= startDate } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt index 59f422428..96026a55b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt @@ -7,7 +7,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.utils.* +import io.github.wulkanowy.utils.AutoRefreshHelper +import io.github.wulkanowy.utils.endExamsDay +import io.github.wulkanowy.utils.getRefreshKey +import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.startExamsDay +import io.github.wulkanowy.utils.switchSemester +import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex import java.time.LocalDate @@ -51,7 +57,7 @@ class ExamRepository @Inject constructor( }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getExams(start.startExamsDay, start.endExamsDay) .mapToEntities(semester) }, 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 f5f895d82..b2bb7b906 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 @@ -52,7 +52,7 @@ class GradeRepository @Inject constructor( }, fetch = { val (details, summary) = sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getGrades(semester.semesterId) details.mapToEntities(semester) to summary.mapToEntities(semester) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt index 9fa06c497..23d7b8582 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt @@ -16,6 +16,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import java.util.* @@ -56,7 +57,7 @@ class GradeStatisticsRepository @Inject constructor( query = { gradePartialStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getGradesPartialStatistics(semester.semesterId) .mapToEntities(semester) }, @@ -101,7 +102,7 @@ class GradeStatisticsRepository @Inject constructor( query = { gradeSemesterStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getGradesSemesterStatistics(semester.semesterId) .mapToEntities(semester) }, @@ -157,7 +158,7 @@ class GradeStatisticsRepository @Inject constructor( query = { gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getGradesPointsStatistics(semester.semesterId) .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt index 048c95a38..d4899b19e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt @@ -55,7 +55,7 @@ class HomeworkRepository @Inject constructor( }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getHomework(start.monday, end.sunday) .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt index 07c6959e3..412f9e7f0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt @@ -12,6 +12,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -42,7 +43,7 @@ class MobileDeviceRepository @Inject constructor( query = { mobileDb.loadAll(student.userLoginId) }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getRegisteredDevices() .mapToEntities(student) }, @@ -56,7 +57,7 @@ class MobileDeviceRepository @Inject constructor( suspend fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice) { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .unregisterDevice(device.deviceId) mobileDb.deleteAll(listOf(device)) @@ -64,7 +65,7 @@ class MobileDeviceRepository @Inject constructor( suspend fun getToken(student: Student, semester: Semester): MobileDeviceToken { return sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getToken() .mapToMobileDeviceToken() } 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 4101803f3..eeb1d53ef 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 @@ -41,7 +41,7 @@ class NoteRepository @Inject constructor( query = { noteDb.loadAll(student.studentId) }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getNotes() .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt index 7972ed084..f757ef047 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -40,7 +41,7 @@ class SchoolRepository @Inject constructor( query = { schoolDb.load(semester.studentId, semester.classId) }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getSchool() .mapToEntity(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt index 9c6429343..216a8c112 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt @@ -11,6 +11,7 @@ import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.utils.IntegrityHelper import io.github.wulkanowy.utils.getCurrentOrLast import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.withTimeout import timber.log.Timber import java.util.UUID @@ -42,11 +43,7 @@ class SchoolsRepository @Inject constructor( val schoolInfo = sdk .init(student.copy(password = loginData.password)) - .switchDiary( - diaryId = semester.diaryId, - kindergartenDiaryId = semester.kindergartenDiaryId, - schoolYear = semester.schoolYear - ) + .switchSemester(semester) .getSchool() schoolsService.logLoginEvent( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt index efc82a772..d6cd25c82 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -30,7 +31,7 @@ class StudentInfoRepository @Inject constructor( query = { studentInfoDao.loadStudentInfo(student.studentId) }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getStudentInfo().mapToEntity(semester) }, saveFetchResult = { old, new -> diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index bfad12a8f..e063840cb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -16,6 +16,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.security.Scrambler +import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @@ -149,12 +150,12 @@ class StudentRepository @Inject constructor( suspend fun authorizePermission(student: Student, semester: Semester, pesel: String) = sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .authorizePermission(pesel) suspend fun refreshStudentName(student: Student, semester: Semester) { val newCurrentApiStudent = sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getCurrentStudent() ?: return val studentName = StudentName( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt index 3926122b3..98cb181af 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -39,8 +40,9 @@ class SubjectRepository @Inject constructor( query = { subjectDao.loadAll(semester.diaryId, semester.studentId) }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) - .getSubjects().mapToEntities(semester) + .switchSemester(semester) + .getSubjects() + .mapToEntities(semester) }, saveFetchResult = { old, new -> subjectDao.deleteAll(old uniqueSubtract new) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt index 4e3b40f96..42698f922 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -39,7 +40,7 @@ class TeacherRepository @Inject constructor( query = { teacherDb.loadAll(semester.studentId, semester.classId) }, fetch = { sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getTeachers() .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index 136fb8d5b..9305d3b31 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -65,7 +65,7 @@ class TimetableRepository @Inject constructor( query = { getFullTimetableFromDatabase(student, semester, start, end) }, fetch = { val timetableFull = sdk.init(student) - .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) + .switchSemester(semester) .getTimetable(start.monday, end.sunday) timetableFull.mapToEntities(semester) diff --git a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt index df99be98b..9b6ca7060 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.utils +import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import timber.log.Timber @@ -30,3 +31,12 @@ fun Sdk.init(student: Student): Sdk { return this } + +fun Sdk.switchSemester(semester: Semester): Sdk { + return switchDiary( + diaryId = semester.diaryId, + kindergartenDiaryId = semester.kindergartenDiaryId, + schoolYear = semester.schoolYear, + unitId = semester.unitId, + ) +} From dc59f4ffa35c85bea6db3d0eef81b1b2e484f94f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 21 Jan 2024 21:04:23 +0100 Subject: [PATCH 1338/1526] Version 2.3.5 --- app/build.gradle | 8 ++++---- .../wulkanowy/data/repositories/HomeworkRepository.kt | 1 + app/src/main/play/release-notes/pl-PL/default.txt | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a67adb6fa..7b290e638 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 144 - versionName "2.3.4" + versionCode 145 + versionName "2.3.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -162,7 +162,7 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.99d + userFraction = 0.15d updatePriority = 1 enabled.set(false) } @@ -193,7 +193,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.3.7-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.3.7' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt index d4899b19e..010cf8458 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt @@ -12,6 +12,7 @@ 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.sync.Mutex import java.time.LocalDate diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index c2c30883e..04f3ba463 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,6 @@ -Wersja 2.3.4 +Wersja 2.3.5 -— dodaliśmy obsługę captchy, co umożliwi używanie apki np. na odmianie ResMan Rzeszów -— naprawiliśmy wyświetlanie frekwencji w szkołach używających eduOne (piszcie, jeśli nadal nie działa) +— naprawiliśmy ładowanie frekwencji dla szkół używających eduOne +— naprawiliśmy wielokrotne wysyłanie powiadomień o zmianach w planie lekcji Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 098af9884a4179e2ea44a22330b068b58ae3c2da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:17:29 +0000 Subject: [PATCH 1339/1526] Bump com.google.firebase:firebase-bom from 32.7.0 to 32.7.1 (#2404) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 7b290e638..54659cdd7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -250,7 +250,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.11.0' - playImplementation platform('com.google.firebase:firebase-bom:32.7.0') + playImplementation platform('com.google.firebase:firebase-bom:32.7.1') playImplementation 'com.google.firebase:firebase-analytics' playImplementation 'com.google.firebase:firebase-messaging' playImplementation 'com.google.firebase:firebase-crashlytics:' From 10add8a70ed105a214579d6ee019dc770765f42c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 10:21:30 +0000 Subject: [PATCH 1340/1526] Bump com.android.tools.build:gradle from 8.2.1 to 8.2.2 (#2406) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 095d1b72f..e6e090b80 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.16" - classpath 'com.android.tools.build:gradle:8.2.1' + classpath 'com.android.tools.build:gradle:8.2.2' 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.303' From 88043569ac8cb7a6fe1b418ece97aaec1b29e6f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 10:23:01 +0000 Subject: [PATCH 1341/1526] Bump com.huawei.hms:hianalytics from 6.12.0.300 to 6.12.0.301 (#2407) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 54659cdd7..c40bef8eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -262,7 +262,7 @@ dependencies { playImplementation 'com.google.android.play:review-ktx:2.0.1' playImplementation "com.google.android.ump:user-messaging-platform:2.1.0" - hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300' + hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.301' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.303' releaseImplementation "com.github.chuckerteam.chucker:library-no-op:$chucker" From fc91936884715cc1d46d5af17086364961f8631d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 10:30:36 +0000 Subject: [PATCH 1342/1526] Bump com.google.android.ump:user-messaging-platform from 2.1.0 to 2.2.0 (#2408) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c40bef8eb..c0caf1dd8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -260,7 +260,7 @@ dependencies { playImplementation "com.google.android.play:integrity:1.3.0" playImplementation 'com.google.android.play:app-update-ktx:2.1.0' playImplementation 'com.google.android.play:review-ktx:2.0.1' - playImplementation "com.google.android.ump:user-messaging-platform:2.1.0" + playImplementation "com.google.android.ump:user-messaging-platform:2.2.0" hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.301' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.303' From e58a60410c3a6ee0dda506d2422905fe9cc8ee4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 4 Feb 2024 10:48:59 +0100 Subject: [PATCH 1343/1526] Fix android tests (#2410) --- .gitignore | 2 ++ .idea/migrations.xml | 10 ---------- app/build.gradle | 4 +++- .../wulkanowy/utils/security/ScramblerTest.kt | 15 +++++++++------ 4 files changed, 14 insertions(+), 17 deletions(-) delete mode 100644 .idea/migrations.xml diff --git a/.gitignore b/.gitignore index 921bd0a9a..980085e38 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,8 @@ captures/ .idea/uiDesigner.xml .idea/runConfigurations.xml .idea/discord.xml +.idea/migrations.xml +.idea/androidTestResultsUserPreferences.xml # Keystore files *.jks diff --git a/.idea/migrations.xml b/.idea/migrations.xml deleted file mode 100644 index f8051a6f9..000000000 --- a/.idea/migrations.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c0caf1dd8..b60dc3b4b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -142,7 +142,9 @@ android { packagingOptions { resources { excludes += ['META-INF/library_release.kotlin_module', - 'META-INF/library-core_release.kotlin_module'] + 'META-INF/library-core_release.kotlin_module', + 'META-INF/LICENSE.md', + 'META-INF/LICENSE-notice.md'] } } diff --git a/app/src/androidTest/java/io/github/wulkanowy/utils/security/ScramblerTest.kt b/app/src/androidTest/java/io/github/wulkanowy/utils/security/ScramblerTest.kt index 0c47e6bb6..1b0319f69 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/utils/security/ScramblerTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/utils/security/ScramblerTest.kt @@ -14,34 +14,37 @@ import kotlin.test.assertFailsWith @RunWith(AndroidJUnit4::class) class ScramblerTest { + private val scrambler = Scrambler(ApplicationProvider.getApplicationContext()) + @Test fun encryptDecryptTest() { - assertEquals("TEST", decrypt(encrypt("TEST", - ApplicationProvider.getApplicationContext()))) + assertEquals( + "TEST", scrambler.decrypt(scrambler.encrypt("TEST")) + ) } @Test fun emptyTextEncryptTest() { assertFailsWith { - decrypt("") + scrambler.decrypt("") } assertFailsWith { - encrypt("", ApplicationProvider.getApplicationContext()) + scrambler.encrypt("") } } @Test @SdkSuppress(minSdkVersion = 18) fun emptyKeyStoreTest() { - val text = encrypt("test", ApplicationProvider.getApplicationContext()) + val text = scrambler.encrypt("test") val keyStore = KeyStore.getInstance("AndroidKeyStore") keyStore.load(null) keyStore.deleteEntry("wulkanowy_password") assertFailsWith { - decrypt(text) + scrambler.decrypt(text) } } } From a05f1f70f7f8c7b7dbcc0aefa6f98cd021522943 Mon Sep 17 00:00:00 2001 From: JestemKamil <84380834+JestemKamil@users.noreply.github.com> Date: Tue, 6 Feb 2024 18:21:56 +0100 Subject: [PATCH 1344/1526] Add colors to attendance and ! to unexcused lateness (#2412) --- .../modules/attendance/AttendanceAdapter.kt | 32 ++++++++++++++++++- .../ui/modules/attendance/AttendanceDialog.kt | 12 +++++++ app/src/main/res/values-night-v31/styles.xml | 3 ++ app/src/main/res/values-night/styles.xml | 2 ++ app/src/main/res/values-v31/styles.xml | 3 ++ app/src/main/res/values/attrs.xml | 2 ++ app/src/main/res/values/colors.xml | 6 ++++ app/src/main/res/values/styles.xml | 2 ++ 8 files changed, 61 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt index 39f376f65..4e9baac3a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.attendance +import android.graphics.Typeface import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,6 +11,7 @@ import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.enums.SentExcuseStatus import io.github.wulkanowy.databinding.ItemAttendanceBinding import io.github.wulkanowy.utils.descriptionRes +import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.isExcusableOrNotExcused import javax.inject.Inject @@ -39,7 +41,33 @@ class AttendanceAdapter @Inject constructor() : root.context.getString(R.string.all_no_data) } attendanceItemDescription.setText(item.descriptionRes) - attendanceItemAlert.isVisible = item.let { it.absence && !it.excused } + + attendanceItemDescription.setTextColor( + root.context.getThemeAttrColor( + when { + item.absence && !item.excused -> R.attr.colorAttendanceAbsence + item.lateness && !item.excused -> R.attr.colorAttendanceLateness + else -> android.R.attr.textColorSecondary + } + ) + ) + + if (item.exemption || item.excused) { + attendanceItemDescription.setTypeface(null, Typeface.BOLD) + } else { + attendanceItemDescription.setTypeface(null, Typeface.NORMAL) + } + + attendanceItemAlert.isVisible = + item.let { (it.absence && !it.excused) || (it.lateness && !it.excused) } + + attendanceItemAlert.setColorFilter(root.context.getThemeAttrColor( + when{ + item.absence && !item.excused -> R.attr.colorAttendanceAbsence + item.lateness && !item.excused -> R.attr.colorAttendanceLateness + else -> android.R.attr.colorPrimary + } + )) attendanceItemNumber.visibility = View.GONE attendanceItemExcuseInfo.visibility = View.GONE attendanceItemExcuseCheckbox.visibility = View.GONE @@ -54,10 +82,12 @@ class AttendanceAdapter @Inject constructor() : attendanceItemExcuseInfo.visibility = View.VISIBLE attendanceItemAlert.visibility = View.INVISIBLE } + SentExcuseStatus.DENIED -> { attendanceItemExcuseInfo.setImageResource(R.drawable.ic_excuse_denied) attendanceItemExcuseInfo.visibility = View.VISIBLE } + else -> { if (item.isExcusableOrNotExcused && excuseActionMode) { attendanceItemNumber.visibility = View.GONE diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt index c0026bee5..635033132 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt @@ -6,10 +6,12 @@ import android.view.View import androidx.core.os.bundleOf import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.databinding.DialogAttendanceBinding import io.github.wulkanowy.ui.base.BaseDialogFragment import io.github.wulkanowy.utils.descriptionRes +import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.serializable import io.github.wulkanowy.utils.toFormattedString @@ -44,6 +46,16 @@ class AttendanceDialog : BaseDialogFragment() { with(binding) { attendanceDialogSubjectValue.text = attendance.subject attendanceDialogDescriptionValue.setText(attendance.descriptionRes) + attendanceDialogDescriptionValue.setTextColor( + root.context.getThemeAttrColor( + when { + attendance.absence && !attendance.excused -> R.attr.colorAttendanceAbsence + attendance.lateness && !attendance.excused -> R.attr.colorAttendanceLateness + else -> android.R.attr.textColorSecondary + } + ) + ) + attendanceDialogDateValue.text = attendance.date.toFormattedString() attendanceDialogNumberValue.text = attendance.number.toString() attendanceDialogClose.setOnClickListener { dismiss() } diff --git a/app/src/main/res/values-night-v31/styles.xml b/app/src/main/res/values-night-v31/styles.xml index 6e6c4d79c..808bc714d 100644 --- a/app/src/main/res/values-night-v31/styles.xml +++ b/app/src/main/res/values-night-v31/styles.xml @@ -32,6 +32,9 @@ @color/material_dynamic_primary40 @color/timetable_canceled_dark @color/timetable_change_dark + @color/attendance_absence_dark + @color/attendance_lateness_dark + @color/colorErrorLight @color/colorDividerInverse @color/material_dynamic_secondary20 diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 5d9aa22a6..5840a051e 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -21,6 +21,8 @@ @color/colorSurfaceDark @color/timetable_canceled_dark @color/timetable_change_dark + @color/attendance_absence_dark + @color/attendance_lateness_dark @color/colorErrorLight @color/colorDividerInverse @color/colorSwipeRefreshDark diff --git a/app/src/main/res/values-v31/styles.xml b/app/src/main/res/values-v31/styles.xml index bb47b22ed..358806681 100644 --- a/app/src/main/res/values-v31/styles.xml +++ b/app/src/main/res/values-v31/styles.xml @@ -34,6 +34,9 @@ @color/material_dynamic_primary80 @color/timetable_canceled_light @color/timetable_change_light + @color/attendance_absence_light + @color/attendance_lateness_light + @color/colorError @color/colorDivider @color/material_dynamic_secondary90 diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index aa58fa09e..3c3fdb8e9 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -7,4 +7,6 @@ + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 87057c61d..8ad27ad88 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -49,6 +49,12 @@ #ff8f00 #ffd54f + #d32f2f + #e57373 + + #cd2a01 + #f05d0e + #1f000000 #1fffffff diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a0023dda1..b5b029501 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -19,6 +19,8 @@ @color/colorSurface @color/timetable_canceled_light @color/timetable_change_light + @color/attendance_absence_light + @color/attendance_lateness_light @color/colorError @color/colorDivider @color/colorSwipeRefresh From ed5166333ae3a574bc974737686afb0db994806a Mon Sep 17 00:00:00 2001 From: PoProstuSever <88079246+PoProstuSever@users.noreply.github.com> Date: Tue, 6 Feb 2024 19:48:31 +0100 Subject: [PATCH 1345/1526] Add the ability to dynamically expand the application window (#2413) --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 174c9a1fc..f43dfdd2c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -44,6 +44,7 @@ android:networkSecurityConfig="@xml/network_security_config" android:supportsRtl="false" android:theme="@style/WulkanowyTheme" + android:resizeableActivity="true" tools:ignore="DataExtractionRules,UnusedAttribute"> Date: Thu, 8 Feb 2024 07:49:17 +0100 Subject: [PATCH 1346/1526] Fix displaying lessons for tomorrow if there is no more lessons for today (#2416) --- .../IsStudentHasLessonsOnWeekendUseCase.kt | 33 +++++++++++++++++++ .../timetable/IsWeekendHasLessonsUseCase.kt | 17 ++++++++++ .../modules/dashboard/DashboardPresenter.kt | 12 +++++-- .../modules/timetable/TimetablePresenter.kt | 32 ++++-------------- 4 files changed, 65 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/domain/timetable/IsStudentHasLessonsOnWeekendUseCase.kt create mode 100644 app/src/main/java/io/github/wulkanowy/domain/timetable/IsWeekendHasLessonsUseCase.kt diff --git a/app/src/main/java/io/github/wulkanowy/domain/timetable/IsStudentHasLessonsOnWeekendUseCase.kt b/app/src/main/java/io/github/wulkanowy/domain/timetable/IsStudentHasLessonsOnWeekendUseCase.kt new file mode 100644 index 000000000..efe928e2b --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/domain/timetable/IsStudentHasLessonsOnWeekendUseCase.kt @@ -0,0 +1,33 @@ +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.Student +import io.github.wulkanowy.data.repositories.TimetableRepository +import io.github.wulkanowy.data.toFirstResult +import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday +import java.time.LocalDate +import javax.inject.Inject + +class IsStudentHasLessonsOnWeekendUseCase @Inject constructor( + private val timetableRepository: TimetableRepository, + private val isWeekendHasLessonsUseCase: IsWeekendHasLessonsUseCase, +) { + + suspend operator fun invoke( + student: Student, + semester: Semester, + currentDate: LocalDate = LocalDate.now(), + ): Boolean { + val lessons = timetableRepository.getTimetable( + student = student, + semester = semester, + start = currentDate.monday, + end = currentDate.sunday, + forceRefresh = false, + timetableType = TimetableRepository.TimetableType.NORMAL + ).toFirstResult().dataOrNull?.lessons.orEmpty() + return isWeekendHasLessonsUseCase(lessons) + } +} diff --git a/app/src/main/java/io/github/wulkanowy/domain/timetable/IsWeekendHasLessonsUseCase.kt b/app/src/main/java/io/github/wulkanowy/domain/timetable/IsWeekendHasLessonsUseCase.kt new file mode 100644 index 000000000..908c9df78 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/domain/timetable/IsWeekendHasLessonsUseCase.kt @@ -0,0 +1,17 @@ +package io.github.wulkanowy.domain.timetable + +import io.github.wulkanowy.data.db.entities.Timetable +import java.time.DayOfWeek +import javax.inject.Inject + +class IsWeekendHasLessonsUseCase @Inject constructor() { + + operator fun invoke( + lessons: List, + ): Boolean = lessons.any { + it.date.dayOfWeek in listOf( + DayOfWeek.SATURDAY, + DayOfWeek.SUNDAY, + ) + } +} 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 ad604499b..1e6f1c198 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 @@ -24,11 +24,13 @@ 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.domain.adminmessage.GetAppropriateAdminMessageUseCase +import io.github.wulkanowy.domain.timetable.IsStudentHasLessonsOnWeekendUseCase import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AdsHelper import io.github.wulkanowy.utils.calculatePercentage import io.github.wulkanowy.utils.nextOrSameSchoolDay +import io.github.wulkanowy.utils.sunday import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine @@ -56,6 +58,7 @@ class DashboardPresenter @Inject constructor( private val messageRepository: MessageRepository, private val attendanceSummaryRepository: AttendanceSummaryRepository, private val timetableRepository: TimetableRepository, + private val isStudentHasLessonsOnWeekendUseCase: IsStudentHasLessonsOnWeekendUseCase, private val homeworkRepository: HomeworkRepository, private val examRepository: ExamRepository, private val conferenceRepository: ConferenceRepository, @@ -435,14 +438,17 @@ class DashboardPresenter @Inject constructor( private fun loadLessons(student: Student, forceRefresh: Boolean) { flatResourceFlow { val semester = semesterRepository.getCurrentSemester(student) - val date = LocalDate.now().nextOrSameSchoolDay + val date = when (isStudentHasLessonsOnWeekendUseCase(student, semester)) { + true -> LocalDate.now() + else -> LocalDate.now().nextOrSameSchoolDay + } timetableRepository.getTimetable( student = student, semester = semester, start = date, - end = date, - forceRefresh = forceRefresh + end = date.sunday, + forceRefresh = forceRefresh, ) } .onEach { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 6b442d1c2..7e8c876ef 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -2,7 +2,6 @@ package io.github.wulkanowy.ui.modules.timetable import android.os.Handler import android.os.Looper -import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Timetable @@ -20,8 +19,8 @@ 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.data.toFirstResult -import io.github.wulkanowy.data.waitForResult +import io.github.wulkanowy.domain.timetable.IsStudentHasLessonsOnWeekendUseCase +import io.github.wulkanowy.domain.timetable.IsWeekendHasLessonsUseCase import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AnalyticsHelper @@ -31,16 +30,12 @@ import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.isJustFinished import io.github.wulkanowy.utils.isShowTimeUntil import io.github.wulkanowy.utils.left -import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.until -import kotlinx.coroutines.flow.firstOrNull import timber.log.Timber -import java.time.DayOfWeek import java.time.Instant import java.time.LocalDate import java.time.LocalDate.now @@ -54,6 +49,8 @@ class TimetablePresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, private val timetableRepository: TimetableRepository, + private val isStudentHasLessonsOnWeekendUseCase: IsStudentHasLessonsOnWeekendUseCase, + private val isWeekendHasLessonsUseCase: IsWeekendHasLessonsUseCase, private val semesterRepository: SemesterRepository, private val prefRepository: PreferencesRepository, private val analytics: AnalyticsHelper, @@ -165,7 +162,7 @@ class TimetablePresenter @Inject constructor( } .logResourceStatus("load timetable data") .onResourceData { - isWeekendHasLessons = isWeekendHasLessons || isWeekendHasLessons(it.lessons) + isWeekendHasLessons = isWeekendHasLessons || isWeekendHasLessonsUseCase(it.lessons) view?.run { enableSwipe(true) @@ -199,15 +196,7 @@ class TimetablePresenter @Inject constructor( private suspend fun checkInitialAndCurrentDate(student: Student, semester: Semester) { if (initialDate == null) { - val lessons = timetableRepository.getTimetable( - student = student, - semester = semester, - start = now().monday, - end = now().sunday, - forceRefresh = false, - timetableType = TimetableRepository.TimetableType.NORMAL - ).toFirstResult().dataOrNull?.lessons.orEmpty() - isWeekendHasLessons = isWeekendHasLessons(lessons) + isWeekendHasLessons = isStudentHasLessonsOnWeekendUseCase(student, semester) initialDate = getInitialDate(semester) } @@ -216,15 +205,6 @@ class TimetablePresenter @Inject constructor( } } - private fun isWeekendHasLessons( - lessons: List, - ): Boolean = lessons.any { - it.date.dayOfWeek in listOf( - DayOfWeek.SATURDAY, - DayOfWeek.SUNDAY, - ) - } - private fun getInitialDate(semester: Semester): LocalDate { val now = now() From 22f72981cb7eea613f6b6ac234fbb7c050ccccf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 8 Feb 2024 09:16:09 +0100 Subject: [PATCH 1347/1526] Add descriptive grades (#2411) --- .../59.json | 2501 +++++++++++++++++ .../io/github/wulkanowy/data/DataModule.kt | 4 + .../github/wulkanowy/data/db/AppDatabase.kt | 10 +- .../data/db/dao/GradeDescriptiveDao.kt | 15 + .../data/db/entities/GradeDescriptive.kt | 27 + .../wulkanowy/data/mappers/GradeMapper.kt | 16 +- .../data/repositories/GradeRepository.kt | 63 +- .../notifications/NewGradeNotification.kt | 26 +- .../sync/notifications/NotificationType.kt | 4 + .../services/sync/works/GradeWork.kt | 10 + .../NotificationDebugPresenter.kt | 9 + .../notification/mock/gradeDescriptive.kt | 48 + .../ui/modules/grade/GradeAverageProvider.kt | 93 +- .../ui/modules/grade/GradeSubject.kt | 2 + .../grade/details/GradeDetailsPresenter.kt | 25 +- .../grade/summary/GradeSummaryAdapter.kt | 52 +- .../grade/summary/GradeSummaryFragment.kt | 4 +- .../modules/grade/summary/GradeSummaryItem.kt | 9 + .../grade/summary/GradeSummaryPresenter.kt | 36 +- .../modules/grade/summary/GradeSummaryView.kt | 3 +- .../main/res/layout/item_grade_summary.xml | 46 +- app/src/main/res/values/strings.xml | 9 + .../data/repositories/GradeRepositoryTest.kt | 14 +- .../modules/grade/GradeAverageProviderTest.kt | 446 ++- 24 files changed, 3248 insertions(+), 224 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/59.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDescriptiveDao.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/entities/GradeDescriptive.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/gradeDescriptive.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/59.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/59.json new file mode 100644 index 000000000..a3f2e0dc6 --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/59.json @@ -0,0 +1,2501 @@ +{ + "formatVersion": 1, + "database": { + "version": 59, + "identityHash": "3bd95e40b587e8131a2a2c23aee538c1", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `scrapper_domain_suffix` TEXT NOT NULL DEFAULT '', `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperDomainSuffix", + "columnName": "scrapper_domain_suffix", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `kindergarten_diary_id` INTEGER NOT NULL DEFAULT 0, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "kindergartenDiaryId", + "columnName": "kindergarten_diary_id", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "kindergarten_diary_id", + "semester_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `kindergarten_diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`email` TEXT NOT NULL, `message_global_key` TEXT NOT NULL, `mailbox_key` TEXT NOT NULL, `message_id` INTEGER NOT NULL, `correspondents` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `read_by` INTEGER, `unread_by` INTEGER, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `content` TEXT NOT NULL, `sender` TEXT, `recipients` TEXT)", + "fields": [ + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mailboxKey", + "columnName": "mailbox_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "correspondents", + "columnName": "correspondents", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "recipients", + "columnName": "recipients", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`message_global_key` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`message_global_key`, `url`, `filename`))", + "fields": [ + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "message_global_key", + "url", + "filename" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Mailboxes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`globalKey` TEXT NOT NULL, `email` TEXT NOT NULL, `symbol` TEXT NOT NULL, `schoolId` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `studentName` TEXT NOT NULL, `schoolNameShort` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`globalKey`))", + "fields": [ + { + "fieldPath": "globalKey", + "columnName": "globalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolId", + "columnName": "schoolId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "studentName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolNameShort", + "columnName": "schoolNameShort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "globalKey" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`mailboxGlobalKey` TEXT NOT NULL, `studentMailboxGlobalKey` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `schoolShortName` TEXT NOT NULL, `type` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "mailboxGlobalKey", + "columnName": "mailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentMailboxGlobalKey", + "columnName": "studentMailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "schoolShortName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `repeat_id` BLOB DEFAULT NULL, `is_added_by_user` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatId", + "columnName": "repeat_id", + "affinity": "BLOB", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `destination` TEXT NOT NULL DEFAULT '{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}', `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "destination", + "columnName": "destination", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}'" + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `types` TEXT NOT NULL DEFAULT '[]', `is_ok_visible` INTEGER NOT NULL DEFAULT 0, `is_x_visible` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "types", + "columnName": "types", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'[]'" + }, + { + "fieldPath": "isOkVisible", + "columnName": "is_ok_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "isXVisible", + "columnName": "is_x_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesDescriptive", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `description` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '3bd95e40b587e8131a2a2c23aee538c1')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt index 950e817bb..7c9cf9a3c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt @@ -253,4 +253,8 @@ internal class DataModule { @Singleton @Provides fun provideAdminMessageDao(database: AppDatabase) = database.adminMessagesDao + + @Singleton + @Provides + fun provideGradeDescriptiveDao(database: AppDatabase) = database.gradeDescriptiveDao } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index a2f230f4c..8e5841fe7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.data.db.dao.CompletedLessonsDao import io.github.wulkanowy.data.db.dao.ConferenceDao import io.github.wulkanowy.data.db.dao.ExamDao import io.github.wulkanowy.data.db.dao.GradeDao +import io.github.wulkanowy.data.db.dao.GradeDescriptiveDao import io.github.wulkanowy.data.db.dao.GradePartialStatisticsDao import io.github.wulkanowy.data.db.dao.GradePointsStatisticsDao import io.github.wulkanowy.data.db.dao.GradeSemesterStatisticsDao @@ -44,6 +45,7 @@ import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Conference import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeDescriptive import io.github.wulkanowy.data.db.entities.GradePartialStatistics import io.github.wulkanowy.data.db.entities.GradePointsStatistics import io.github.wulkanowy.data.db.entities.GradeSemesterStatistics @@ -154,7 +156,8 @@ import javax.inject.Singleton TimetableHeader::class, SchoolAnnouncement::class, Notification::class, - AdminMessage::class + AdminMessage::class, + GradeDescriptive::class, ], autoMigrations = [ AutoMigration(from = 44, to = 45), @@ -165,6 +168,7 @@ import javax.inject.Singleton AutoMigration(from = 55, to = 56), AutoMigration(from = 56, to = 57, spec = Migration57::class), AutoMigration(from = 57, to = 58, spec = Migration58::class), + AutoMigration(from = 58, to = 59), ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -173,7 +177,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 58 + const val VERSION_SCHEMA = 59 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), @@ -298,4 +302,6 @@ abstract class AppDatabase : RoomDatabase() { abstract val notificationDao: NotificationDao abstract val adminMessagesDao: AdminMessageDao + + abstract val gradeDescriptiveDao: GradeDescriptiveDao } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDescriptiveDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDescriptiveDao.kt new file mode 100644 index 000000000..6282c0804 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDescriptiveDao.kt @@ -0,0 +1,15 @@ +package io.github.wulkanowy.data.db.dao + +import androidx.room.Dao +import androidx.room.Query +import io.github.wulkanowy.data.db.entities.GradeDescriptive +import kotlinx.coroutines.flow.Flow +import javax.inject.Singleton + +@Singleton +@Dao +interface GradeDescriptiveDao : BaseDao { + + @Query("SELECT * FROM GradesDescriptive WHERE semester_id = :semesterId AND student_id = :studentId") + fun loadAll(semesterId: Int, studentId: Int): Flow> +} diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeDescriptive.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeDescriptive.kt new file mode 100644 index 000000000..9aec9599a --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeDescriptive.kt @@ -0,0 +1,27 @@ +package io.github.wulkanowy.data.db.entities + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import java.io.Serializable + +@Entity(tableName = "GradesDescriptive") +data class GradeDescriptive( + + @ColumnInfo(name = "semester_id") + val semesterId: Int, + + @ColumnInfo(name = "student_id") + val studentId: Int, + + val subject: String, + + val description: String, +) : Serializable { + + @PrimaryKey(autoGenerate = true) + var id: Long = 0 + + @ColumnInfo(name = "is_notified") + var isNotified: Boolean = true +} diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/GradeMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/GradeMapper.kt index 178de682a..66e922171 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/GradeMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/GradeMapper.kt @@ -1,10 +1,12 @@ package io.github.wulkanowy.data.mappers import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeDescriptive import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.sdk.pojo.GradeSummary as SdkGradeSummary import io.github.wulkanowy.sdk.pojo.Grade as SdkGrade +import io.github.wulkanowy.sdk.pojo.GradeDescriptive as SdkGradeDescriptive +import io.github.wulkanowy.sdk.pojo.GradeSummary as SdkGradeSummary fun List.mapToEntities(semester: Semester) = map { Grade( @@ -40,3 +42,15 @@ fun List.mapToEntities(semester: Semester) = map { average = it.average ) } + +@JvmName("mapGradeDescriptiveToEntities") +fun List.mapToEntities(semester: Semester) = map { + GradeDescriptive( + semesterId = semester.semesterId, + studentId = semester.studentId, + subject = it.subject, + description = it.description + ) +} + + 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 b2bb7b906..1e2ea9354 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 @@ -1,15 +1,22 @@ package io.github.wulkanowy.data.repositories import io.github.wulkanowy.data.db.dao.GradeDao +import io.github.wulkanowy.data.db.dao.GradeDescriptiveDao import io.github.wulkanowy.data.db.dao.GradeSummaryDao import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeDescriptive import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester 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.utils.* +import io.github.wulkanowy.utils.AutoRefreshHelper +import io.github.wulkanowy.utils.getRefreshKey +import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester +import io.github.wulkanowy.utils.toLocalDate +import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map @@ -22,14 +29,13 @@ import javax.inject.Singleton class GradeRepository @Inject constructor( private val gradeDb: GradeDao, private val gradeSummaryDb: GradeSummaryDao, + private val gradeDescriptiveDb: GradeDescriptiveDao, private val sdk: Sdk, private val refreshHelper: AutoRefreshHelper, ) { private val saveFetchResultMutex = Mutex() - private val cacheKey = "grade" - fun getGrades( student: Student, semester: Semester, @@ -41,30 +47,52 @@ class GradeRepository @Inject constructor( //When details is empty and summary is not, app will not use summary cache - edge case it.first.isEmpty() }, - shouldFetch = { (details, summaries) -> - val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, semester)) - details.isEmpty() || summaries.isEmpty() || forceRefresh || isExpired + shouldFetch = { (details, summaries, descriptive) -> + val isExpired = + refreshHelper.shouldBeRefreshed(getRefreshKey(GRADE_CACHE_KEY, semester)) + details.isEmpty() || (summaries.isEmpty() && descriptive.isEmpty()) || forceRefresh || isExpired }, query = { val detailsFlow = gradeDb.loadAll(semester.semesterId, semester.studentId) val summaryFlow = gradeSummaryDb.loadAll(semester.semesterId, semester.studentId) - detailsFlow.combine(summaryFlow) { details, summaries -> details to summaries } + val descriptiveFlow = + gradeDescriptiveDb.loadAll(semester.semesterId, semester.studentId) + + combine(detailsFlow, summaryFlow, descriptiveFlow) { details, summaries, descriptive -> + Triple(details, summaries, descriptive) + } }, fetch = { - val (details, summary) = sdk.init(student) + val (details, summary, descriptive) = sdk.init(student) .switchSemester(semester) .getGrades(semester.semesterId) - details.mapToEntities(semester) to summary.mapToEntities(semester) + Triple( + details.mapToEntities(semester), + summary.mapToEntities(semester), + descriptive.mapToEntities(semester) + ) }, - saveFetchResult = { (oldDetails, oldSummary), (newDetails, newSummary) -> + saveFetchResult = { (oldDetails, oldSummary, oldDescriptive), (newDetails, newSummary, newDescriptive) -> refreshGradeDetails(student, oldDetails, newDetails, notify) refreshGradeSummaries(oldSummary, newSummary, notify) + refreshGradeDescriptions(oldDescriptive, newDescriptive, notify) - refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester)) + refreshHelper.updateLastRefreshTimestamp(getRefreshKey(GRADE_CACHE_KEY, semester)) } ) + private suspend fun refreshGradeDescriptions( + old: List, + new: List, + notify: Boolean + ) { + gradeDescriptiveDb.deleteAll(old uniqueSubtract new) + gradeDescriptiveDb.insertAll((new uniqueSubtract old).onEach { + if (notify) it.isNotified = false + }) + } + private suspend fun refreshGradeDetails( student: Student, oldGrades: List, @@ -132,6 +160,10 @@ class GradeRepository @Inject constructor( return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId) } + fun getGradesDescriptiveFromDatabase(semester: Semester): Flow> { + return gradeDescriptiveDb.loadAll(semester.semesterId, semester.studentId) + } + suspend fun updateGrade(grade: Grade) { return gradeDb.updateAll(listOf(grade)) } @@ -143,4 +175,13 @@ class GradeRepository @Inject constructor( suspend fun updateGradesSummary(gradesSummary: List) { return gradeSummaryDb.updateAll(gradesSummary) } + + suspend fun updateGradesDescriptive(gradesDescriptive: List) { + return gradeDescriptiveDb.updateAll(gradesDescriptive) + } + + private companion object { + + private const val GRADE_CACHE_KEY = "grade" + } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt index 9b49ed178..7f90bbddc 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt @@ -4,12 +4,12 @@ import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeDescriptive import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.ui.modules.Destination -import io.github.wulkanowy.ui.modules.splash.SplashActivity import io.github.wulkanowy.utils.getPlural import javax.inject.Inject @@ -88,4 +88,28 @@ class NewGradeNotification @Inject constructor( appNotificationManager.sendMultipleNotifications(groupNotificationData, student) } + + suspend fun notifyDescriptive(items: List, student: Student) { + val notificationDataList = items.map { + NotificationData( + title = context.getPlural(R.plurals.grade_new_items_descriptive, 1), + content = "${it.subject}: ${it.description}", + destination = Destination.Grade, + ) + } + + val groupNotificationData = GroupNotificationData( + notificationDataList = notificationDataList, + title = context.getPlural(R.plurals.grade_new_items_descriptive, items.size), + content = context.getPlural( + R.plurals.grade_notify_new_items_descriptive, + items.size, + items.size + ), + destination = Destination.Grade, + type = NotificationType.NEW_GRADE_DESCRIPTIVE + ) + + appNotificationManager.sendMultipleNotifications(groupNotificationData, student) + } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt index 023ae2e4c..4e7f27351 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NotificationType.kt @@ -37,6 +37,10 @@ enum class NotificationType( channel = NewGradesChannel.CHANNEL_ID, icon = R.drawable.ic_stat_grade, ), + NEW_GRADE_DESCRIPTIVE( + channel = NewGradesChannel.CHANNEL_ID, + icon = R.drawable.ic_stat_grade, + ), NEW_HOMEWORK( channel = NewHomeworkChannel.CHANNEL_ID, icon = R.drawable.ic_more_homework, diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt index ba21b8600..b62ad94b9 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt @@ -45,5 +45,15 @@ class GradeWork @Inject constructor( grade.isFinalGradeNotified = true }) } + + gradeRepository.getGradesDescriptiveFromDatabase(semester).first() + .filter { !it.isNotified } + .let { + if (it.isNotEmpty()) newGradeNotification.notifyDescriptive(it, student) + + gradeRepository.updateGradesDescriptive(it.onEach { grade -> + grade.isNotified = true + }) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt index d0dfcd696..cdd186b94 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/NotificationDebugPresenter.kt @@ -18,6 +18,7 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.debug.notification.mock.debugAttendanceItems import io.github.wulkanowy.ui.modules.debug.notification.mock.debugConferenceItems import io.github.wulkanowy.ui.modules.debug.notification.mock.debugExamItems +import io.github.wulkanowy.ui.modules.debug.notification.mock.debugGradeDescriptiveItems import io.github.wulkanowy.ui.modules.debug.notification.mock.debugGradeDetailsItems import io.github.wulkanowy.ui.modules.debug.notification.mock.debugGradeSummaryItems import io.github.wulkanowy.ui.modules.debug.notification.mock.debugHomeworkItems @@ -55,6 +56,14 @@ class NotificationDebugPresenter @Inject constructor( NotificationDebugItem(R.string.grade_summary_final_grade) { n -> withStudent { newGradeNotification.notifyFinal(debugGradeSummaryItems.take(n), it) } }, + NotificationDebugItem(R.string.grade_summary_descriptive) { n -> + withStudent { + newGradeNotification.notifyDescriptive( + debugGradeDescriptiveItems.take(n), + it + ) + } + }, NotificationDebugItem(R.string.homework_title) { n -> withStudent { newHomeworkNotification.notify(debugHomeworkItems.take(n), it) } }, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/gradeDescriptive.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/gradeDescriptive.kt new file mode 100644 index 000000000..d5a0c089b --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/gradeDescriptive.kt @@ -0,0 +1,48 @@ +package io.github.wulkanowy.ui.modules.debug.notification.mock + +import io.github.wulkanowy.data.db.entities.GradeDescriptive + +val debugGradeDescriptiveItems = listOf( + generateGradeDescriptive( + "Matematyka", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + ), + generateGradeDescriptive("Fizyka", "Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + generateGradeDescriptive( + "Geografia", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + ), + generateGradeDescriptive( + "Sieci komputerowe", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + ), + generateGradeDescriptive( + "Systemy operacyjne", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + ), + generateGradeDescriptive( + "Język polski", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + ), + generateGradeDescriptive( + "Język angielski", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + ), + generateGradeDescriptive("Religia", "Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + generateGradeDescriptive( + "Język niemiecki", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + ), + generateGradeDescriptive( + "Wychowanie fizyczne", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + ), +) + +private fun generateGradeDescriptive(subject: String, description: String) = + GradeDescriptive( + semesterId = 0, + studentId = 0, + subject = subject, + description = description + ) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index ec4bd8e8c..e8a5fa254 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -1,15 +1,23 @@ package io.github.wulkanowy.ui.modules.grade -import io.github.wulkanowy.data.* +import io.github.wulkanowy.data.Resource +import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeDescriptive import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.errorOrNull +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.mapData +import io.github.wulkanowy.data.mapResourceData import io.github.wulkanowy.data.repositories.GradeRepository import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.SemesterRepository import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.* +import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.ALL_YEAR +import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.BOTH_SEMESTERS +import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.ONE_SEMESTER import io.github.wulkanowy.utils.calcAverage import io.github.wulkanowy.utils.changeModifier import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -62,6 +70,7 @@ class GradeAverageProvider @Inject constructor( forceRefresh = forceRefresh, params = params, ) + BOTH_SEMESTERS -> calculateCombinedAverage( student = student, semesters = semesters, @@ -69,6 +78,7 @@ class GradeAverageProvider @Inject constructor( forceRefresh = forceRefresh, config = params, ) + ALL_YEAR -> calculateCombinedAverage( student = student, semesters = semesters, @@ -189,36 +199,73 @@ class GradeAverageProvider @Inject constructor( ): Flow>> { return gradeRepository.getGrades(student, semester, forceRefresh = forceRefresh) .mapResourceData { res -> - val (details, summaries) = res + val (details, summaries, descriptives) = res val isAnyAverage = summaries.any { it.average != .0 } val allGrades = details.groupBy { it.subject } + val descriptiveGradesBySubject = descriptives.associateBy { it.subject } - val items = summaries.emulateEmptySummaries( - student = student, - semester = semester, - grades = allGrades.toList(), - calcAverage = isAnyAverage, - params = params, - ).map { summary -> - val grades = allGrades[summary.subject].orEmpty() - GradeSubject( - subject = summary.subject, - average = if (!isAnyAverage || params.forceAverageCalc) { - grades.updateModifiers(student, params) - .calcAverage(params.isOptionalArithmeticAverage) - } else summary.average, - points = summary.pointsSum, - summary = summary, - grades = grades, - isVulcanAverage = isAnyAverage + val items = summaries + .createEmptySummariesByGradesIfNeeded( + student = student, + semester = semester, + grades = allGrades.toList(), + calcAverage = isAnyAverage, + params = params, ) - } + .createEmptySummariesByDescriptiveGradesIfNeeded( + student = student, + semester = semester, + descriptives = descriptives, + ) + .map { summary -> + val grades = allGrades[summary.subject].orEmpty() + val descriptiveGrade = descriptiveGradesBySubject[summary.subject] + + GradeSubject( + subject = summary.subject, + average = if (!isAnyAverage || params.forceAverageCalc) { + grades.updateModifiers(student, params) + .calcAverage(params.isOptionalArithmeticAverage) + } else summary.average, + points = summary.pointsSum, + summary = summary, + grades = grades, + descriptive = descriptiveGrade, + isVulcanAverage = isAnyAverage + ) + } items } } - private fun List.emulateEmptySummaries( + private fun List.createEmptySummariesByDescriptiveGradesIfNeeded( + student: Student, + semester: Semester, + descriptives: List + ): List { + val summarySubjects = this.map { it.subject } + val gradeSummaryToAdd = descriptives.mapNotNull { gradeDescriptive -> + if (gradeDescriptive.subject in summarySubjects) return@mapNotNull null + + GradeSummary( + studentId = student.studentId, + semesterId = semester.semesterId, + position = 0, + subject = gradeDescriptive.subject, + predictedGrade = "", + finalGrade = "", + proposedPoints = "", + finalPoints = "", + pointsSum = "", + average = .0 + ) + } + + return this + gradeSummaryToAdd + } + + private fun List.createEmptySummariesByGradesIfNeeded( student: Student, semester: Semester, grades: List>>, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSubject.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSubject.kt index 57be55ee3..a465551f9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSubject.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSubject.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.modules.grade import io.github.wulkanowy.data.db.entities.Grade +import io.github.wulkanowy.data.db.entities.GradeDescriptive import io.github.wulkanowy.data.db.entities.GradeSummary data class GradeSubject( @@ -8,6 +9,7 @@ data class GradeSubject( val average: Double, val points: String, val summary: GradeSummary, + val descriptive: GradeDescriptive?, val grades: List, val isVulcanAverage: Boolean ) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index 4261c507d..d9621f51e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -1,13 +1,22 @@ package io.github.wulkanowy.ui.modules.grade.details -import io.github.wulkanowy.data.* import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.enums.GradeExpandMode -import io.github.wulkanowy.data.enums.GradeSortingMode.* +import io.github.wulkanowy.data.enums.GradeSortingMode.ALPHABETIC +import io.github.wulkanowy.data.enums.GradeSortingMode.AVERAGE +import io.github.wulkanowy.data.enums.GradeSortingMode.DATE +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.onResourceData +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceIntermediate +import io.github.wulkanowy.data.onResourceNotLoading +import io.github.wulkanowy.data.onResourceSuccess import io.github.wulkanowy.data.repositories.GradeRepository 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.resourceFlow import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider @@ -207,20 +216,20 @@ class GradeDetailsPresenter @Inject constructor( AVERAGE -> gradeSubjects.sortedByDescending { it.average } } } - .map { (subject, average, points, _, grades) -> - val subItems = grades + .map { gradeSubject -> + val subItems = gradeSubject.grades .sortedByDescending { it.date } .map { GradeDetailsItem(it, ViewType.ITEM) } val gradeDetailsItems = listOf( GradeDetailsItem( GradeDetailsHeader( - subject = subject, - average = average, - pointsSum = points, + subject = gradeSubject.subject, + average = gradeSubject.average, + pointsSum = gradeSubject.points, grades = subItems ).apply { - newGrades = grades.filter { grade -> !grade.isRead }.size + newGrades = gradeSubject.grades.filter { grade -> !grade.isRead }.size }, ViewType.HEADER ) ) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt index 8dcade56e..95cf97bed 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt @@ -2,16 +2,16 @@ package io.github.wulkanowy.ui.modules.grade.summary import android.annotation.SuppressLint import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.ItemGradeSummaryBinding import io.github.wulkanowy.databinding.ScrollableHeaderGradeSummaryBinding import io.github.wulkanowy.sdk.scrapper.grades.isGradeValid import io.github.wulkanowy.utils.calcFinalAverage +import io.github.wulkanowy.utils.ifNullOrBlank import java.util.Locale import javax.inject.Inject @@ -24,7 +24,7 @@ class GradeSummaryAdapter @Inject constructor( ITEM(2) } - var items = emptyList() + var items = emptyList() var onCalculatedHelpClickListener: () -> Unit = {} @@ -44,9 +44,11 @@ class GradeSummaryAdapter @Inject constructor( ViewType.HEADER.id -> HeaderViewHolder( ScrollableHeaderGradeSummaryBinding.inflate(inflater, parent, false) ) + ViewType.ITEM.id -> ItemViewHolder( ItemGradeSummaryBinding.inflate(inflater, parent, false) ) + else -> throw IllegalStateException() } } @@ -60,19 +62,23 @@ class GradeSummaryAdapter @Inject constructor( private fun bindHeaderViewHolder(binding: ScrollableHeaderGradeSummaryBinding) { if (items.isEmpty()) return + val gradeSummaries = items + .filter { it.gradeDescriptive == null } + .map { it.gradeSummary } val context = binding.root.context - val finalItemsCount = items.count { isGradeValid(it.finalGrade) } - val calculatedItemsCount = items.count { value -> value.average != 0.0 } - val allItemsCount = items.count { !it.subject.equals("zachowanie", true) } - val finalAverage = items.calcFinalAverage( + val finalItemsCount = gradeSummaries.count { isGradeValid(it.finalGrade) } + val calculatedItemsCount = gradeSummaries.count { value -> value.average != 0.0 } + val allItemsCount = gradeSummaries.count { !it.subject.equals("zachowanie", true) } + val finalAverage = gradeSummaries.calcFinalAverage( preferencesRepository.gradePlusModifier, preferencesRepository.gradeMinusModifier ) - val calculatedAverage = items.filter { value -> value.average != 0.0 } + val calculatedAverage = gradeSummaries.filter { value -> value.average != 0.0 } .map { values -> values.average } .reversed() // fix average precision .average() + .let { if (it.isNaN()) 0.0 else it } with(binding) { gradeSummaryScrollableHeaderFinal.text = formatAverage(finalAverage) @@ -95,16 +101,28 @@ class GradeSummaryAdapter @Inject constructor( } @SuppressLint("SetTextI18n") - private fun bindItemViewHolder(binding: ItemGradeSummaryBinding, item: GradeSummary) { - with(binding) { - gradeSummaryItemTitle.text = item.subject - gradeSummaryItemPoints.text = item.pointsSum - gradeSummaryItemAverage.text = formatAverage(item.average, "") - gradeSummaryItemPredicted.text = "${item.predictedGrade} ${item.proposedPoints}".trim() - gradeSummaryItemFinal.text = "${item.finalGrade} ${item.finalPoints}".trim() + private fun bindItemViewHolder(binding: ItemGradeSummaryBinding, item: GradeSummaryItem) { + val (gradeSummary, gradeDescriptive) = item - gradeSummaryItemPointsContainer.visibility = - if (item.pointsSum.isBlank()) View.GONE else View.VISIBLE + with(binding) { + gradeSummaryItemTitle.text = gradeSummary.subject + gradeSummaryItemPoints.text = gradeSummary.pointsSum + gradeSummaryItemAverage.text = formatAverage(gradeSummary.average, "") + gradeSummaryItemPredicted.text = + "${gradeSummary.predictedGrade} ${gradeSummary.proposedPoints}".trim() + gradeSummaryItemFinal.text = + "${gradeSummary.finalGrade} ${gradeSummary.finalPoints}".trim() + gradeSummaryItemDescriptive.text = gradeDescriptive?.description.ifNullOrBlank { + root.context.getString(R.string.all_no_data) + } + + gradeSummaryItemFinalDivider.isVisible = gradeDescriptive == null + gradeSummaryItemPredictedDivider.isVisible = gradeDescriptive == null + gradeSummaryItemPointsDivider.isVisible = gradeDescriptive == null + gradeSummaryItemPredictedContainer.isVisible = gradeDescriptive == null + gradeSummaryItemFinalContainer.isVisible = gradeDescriptive == null + gradeSummaryItemDescriptiveContainer.isVisible = gradeDescriptive != null + gradeSummaryItemPointsContainer.isVisible = gradeSummary.pointsSum.isNotBlank() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt index abd0b13c4..35b2edd58 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt @@ -5,12 +5,10 @@ import android.view.View import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.VISIBLE -import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R -import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.databinding.FragmentGradeSummaryBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment @@ -72,7 +70,7 @@ class GradeSummaryFragment : } } - override fun updateData(data: List) { + override fun updateData(data: List) { with(gradeSummaryAdapter) { items = data notifyDataSetChanged() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt new file mode 100644 index 000000000..cf0f1d92e --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt @@ -0,0 +1,9 @@ +package io.github.wulkanowy.ui.modules.grade.summary + +import io.github.wulkanowy.data.db.entities.GradeDescriptive +import io.github.wulkanowy.data.db.entities.GradeSummary + +data class GradeSummaryItem( + val gradeSummary: GradeSummary, + val gradeDescriptive: GradeDescriptive? +) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 32508ff6f..d762df02b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -1,9 +1,16 @@ package io.github.wulkanowy.ui.modules.grade.summary -import io.github.wulkanowy.data.* -import io.github.wulkanowy.data.db.entities.GradeSummary -import io.github.wulkanowy.data.enums.GradeSortingMode -import io.github.wulkanowy.data.enums.GradeSortingMode.* +import io.github.wulkanowy.data.enums.GradeSortingMode.ALPHABETIC +import io.github.wulkanowy.data.enums.GradeSortingMode.AVERAGE +import io.github.wulkanowy.data.enums.GradeSortingMode.DATE +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.mapResourceData +import io.github.wulkanowy.data.onResourceData +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceIntermediate +import io.github.wulkanowy.data.onResourceNotLoading +import io.github.wulkanowy.data.onResourceSuccess import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter @@ -128,7 +135,7 @@ class GradeSummaryPresenter @Inject constructor( view?.showFinalAverageHelpDialog() } - private fun createGradeSummaryItems(items: List): List { + private fun createGradeSummaryItems(items: List): List { return items .filter { !checkEmpty(it) } .let { gradeSubjects -> @@ -136,21 +143,32 @@ class GradeSummaryPresenter @Inject constructor( DATE -> gradeSubjects.sortedByDescending { gradeDetailsWithAverage -> gradeDetailsWithAverage.grades.maxByOrNull { it.date }?.date } + ALPHABETIC -> gradeSubjects.sortedBy { gradeDetailsWithAverage -> gradeDetailsWithAverage.subject.lowercase() } + AVERAGE -> gradeSubjects.sortedByDescending { it.average } } } - .map { it.summary.copy(average = it.average) } + .map { + val gradeSummary = it.summary.copy(average = it.average) + val descriptive = it.descriptive + GradeSummaryItem( + gradeSummary = gradeSummary, + gradeDescriptive = descriptive, + ) + } + } private fun checkEmpty(gradeSummary: GradeSubject): Boolean { return gradeSummary.run { summary.finalGrade.isBlank() - && summary.predictedGrade.isBlank() - && average == .0 - && points.isBlank() + && summary.predictedGrade.isBlank() + && average == .0 + && points.isBlank() + && descriptive == null } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt index 156731c31..36bd61421 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryView.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.grade.summary -import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.ui.base.BaseView interface GradeSummaryView : BaseView { @@ -13,7 +12,7 @@ interface GradeSummaryView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List) fun resetView() diff --git a/app/src/main/res/layout/item_grade_summary.xml b/app/src/main/res/layout/item_grade_summary.xml index 30aa6e77b..2c8c4ea37 100644 --- a/app/src/main/res/layout/item_grade_summary.xml +++ b/app/src/main/res/layout/item_grade_summary.xml @@ -64,10 +64,12 @@ + android:layout_height="1dp" + android:id="@+id/gradeSummaryItemPointsDivider" + android:background="@drawable/ic_all_divider" /> + android:id="@+id/gradeSummaryItemPredictedDivider" + android:layout_height="1dp" + android:background="@drawable/ic_all_divider" /> + android:layout_height="1dp" + android:id="@+id/gradeSummaryItemFinalDivider" + android:background="@drawable/ic_all_divider" /> + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 60d85606d..f1fa3ce73 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -130,6 +130,7 @@ Total points Final grade Predicted grade + Descriptive grade Calculated average How does Calculated Average work? The Calculated Average is the arithmetic average calculated from the subjects averages. It allows you to know the approximate final average. It is calculated in a way selected by the user in the application settings. It is recommended that you choose the appropriate option. This is because the calculation of school averages differs. Additionally, if your school reports the average of the subjects on the Vulcan page, the application downloads them and does not calculate these averages. This can be changed by forcing the calculation of the average in the application settings.\n\nAverage of grades only from selected semester:\n1. Calculating the weighted average for each subject in a given semester\n2.Adding calculated averages\n3. Calculation of the arithmetic average of the summed averages\n\nAverage of averages from both semesters:\n1.Calculating the weighted average for each subject in semester 1 and 2\n2. Calculating the arithmetic average of the calculated averages for semesters 1 and 2 for each subject.\n3. Adding calculated averages\n4. Calculation of the arithmetic average of the summed averages\n\nAverage of grades from the whole year:\n1. Calculating weighted average over the year for each subject. The final average in the 1st semester is irrelevant.\n2. Adding calculated averages\n3. Calculating the arithmetic average of summed averages @@ -165,6 +166,10 @@ New final grade New final grades + + New descriptive grade + New descriptive grades + You received %1$d grade You received %1$d grades @@ -177,6 +182,10 @@ You received %1$d final grade You received %1$d final grades + + You received %1$d descriptive grade + You received %1$d descriptive grades + diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt index 5a1877cc0..515b0d66d 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt @@ -2,6 +2,7 @@ package io.github.wulkanowy.data.repositories import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.GradeDao +import io.github.wulkanowy.data.db.dao.GradeDescriptiveDao import io.github.wulkanowy.data.db.dao.GradeSummaryDao import io.github.wulkanowy.data.errorOrNull import io.github.wulkanowy.data.mappers.mapToEntities @@ -42,6 +43,9 @@ class GradeRepositoryTest { @MockK private lateinit var gradeSummaryDb: GradeSummaryDao + @MockK + private lateinit var gradeDescriptiveDb: GradeDescriptiveDao + @MockK(relaxUnitFun = true) private lateinit var refreshHelper: AutoRefreshHelper @@ -56,7 +60,8 @@ class GradeRepositoryTest { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - gradeRepository = GradeRepository(gradeDb, gradeSummaryDb, sdk, refreshHelper) + gradeRepository = + GradeRepository(gradeDb, gradeSummaryDb, gradeDescriptiveDb, sdk, refreshHelper) coEvery { gradeDb.deleteAll(any()) } just Runs coEvery { gradeDb.insertAll(any()) } returns listOf() @@ -68,6 +73,13 @@ class GradeRepositoryTest { ) coEvery { gradeSummaryDb.deleteAll(any()) } just Runs coEvery { gradeSummaryDb.insertAll(any()) } returns listOf() + + coEvery { gradeDescriptiveDb.loadAll(any(), any()) } returnsMany listOf( + flowOf(listOf()), + ) + + coEvery { gradeDescriptiveDb.deleteAll(any()) } just Runs + coEvery { gradeDescriptiveDb.insertAll(any()) } returns listOf() } @Test diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index 31ea3322b..6a717f6f6 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -1,12 +1,16 @@ package io.github.wulkanowy.ui.modules.grade -import io.github.wulkanowy.data.* +import io.github.wulkanowy.data.Resource +import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.errorOrNull import io.github.wulkanowy.data.repositories.GradeRepository import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.SemesterRepository +import io.github.wulkanowy.data.resourceFlow +import io.github.wulkanowy.data.toFirstResult import io.github.wulkanowy.getSemesterEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.Status @@ -158,7 +162,9 @@ class GradeAverageProviderTest { semesters[2], true ) - } returns resourceFlow { noWeightGrades to noWeightGradesSummary } + } returns resourceFlow { + Triple(noWeightGrades, noWeightGradesSummary, emptyList()) + } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -186,7 +192,9 @@ class GradeAverageProviderTest { semesters[2], true ) - } returns resourceFlow { noWeightGrades to noWeightGradesArithmeticSummary } + } returns resourceFlow { + Triple(noWeightGrades, noWeightGradesArithmeticSummary, emptyList()) + } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -211,8 +219,24 @@ class GradeAverageProviderTest { coEvery { semesterRepository.getSemesters(student) } returns semesters coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flow { emit(Resource.Loading()) - emit(Resource.Intermediate(secondGradeWithModifier to secondSummariesWithModifier)) - emit(Resource.Success(secondGradeWithModifier to secondSummariesWithModifier)) + emit( + Resource.Intermediate( + Triple( + secondGradeWithModifier, + secondSummariesWithModifier, + emptyList() + ) + ) + ) + emit( + Resource.Success( + Triple( + secondGradeWithModifier, + secondSummariesWithModifier, + emptyList() + ) + ) + ) } val items = runBlocking { @@ -253,11 +277,27 @@ class GradeAverageProviderTest { coEvery { gradeRepository.getGrades(student, semesters[2], false) } returns flow { emit(Resource.Loading()) delay(1000) - emit(Resource.Success(secondGradeWithModifier to secondSummariesWithModifier)) + emit( + Resource.Success( + Triple( + secondGradeWithModifier, + secondSummariesWithModifier, + emptyList() + ) + ) + ) } coEvery { gradeRepository.getGrades(student, semesters[1], false) } returns flow { emit(Resource.Loading()) - emit(Resource.Success(secondGradeWithModifier to secondSummariesWithModifier)) + emit( + Resource.Success( + Triple( + secondGradeWithModifier, + secondSummariesWithModifier, + emptyList() + ) + ) + ) } val items = runBlocking { @@ -296,7 +336,13 @@ class GradeAverageProviderTest { semesters[1], false ) - } returns resourceFlow { secondGradeWithModifier to secondSummariesWithModifier } + } returns resourceFlow { + Triple( + secondGradeWithModifier, + secondSummariesWithModifier, + emptyList() + ) + } coEvery { gradeRepository.getGrades( student, @@ -304,8 +350,10 @@ class GradeAverageProviderTest { false ) } returns resourceFlow { - listOf(getGrade(semesters[2].semesterId, "Język polski", .0, .0, .0)) to listOf( - getSummary(semesters[2].semesterId, "Język polski", 2.5) + Triple( + listOf(getGrade(semesters[2].semesterId, "Język polski", .0, .0, .0)), + listOf(getSummary(semesters[2].semesterId, "Język polski", 2.5)), + emptyList() ) } @@ -332,7 +380,13 @@ class GradeAverageProviderTest { semesters[1], false ) - } returns resourceFlow { secondGradeWithModifier to secondSummariesWithModifier } + } returns resourceFlow { + Triple( + secondGradeWithModifier, + secondSummariesWithModifier, + emptyList() + ) + } coEvery { gradeRepository.getGrades( student, @@ -340,12 +394,14 @@ class GradeAverageProviderTest { false ) } returns resourceFlow { - emptyList() to listOf( - getSummary( - 24, - "Język polski", - .0 - ) + Triple( + emptyList(), listOf( + getSummary( + 24, + "Język polski", + .0 + ) + ), emptyList() ) } @@ -372,14 +428,22 @@ class GradeAverageProviderTest { semesters[1], true ) - } returns resourceFlow { emptyList() to emptyList() } + } returns resourceFlow { + Triple( + emptyList(), + emptyList(), + emptyList() + ) + } coEvery { gradeRepository.getGrades( student, semesters[2], true ) - } returns resourceFlow { emptyList() to emptyList() } + } returns resourceFlow { + Triple(emptyList(), emptyList(), emptyList()) + } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -404,7 +468,13 @@ class GradeAverageProviderTest { semesters[2], true ) - } returns resourceFlow { secondGradeWithModifier to secondSummariesWithModifier } + } returns resourceFlow { + Triple( + secondGradeWithModifier, + secondSummariesWithModifier, + emptyList() + ) + } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -438,7 +508,13 @@ class GradeAverageProviderTest { semesters[2], true ) - } returns resourceFlow { secondGradeWithModifier to secondSummariesWithModifier } + } returns resourceFlow { + Triple( + secondGradeWithModifier, + secondSummariesWithModifier, + emptyList() + ) + } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -472,7 +548,13 @@ class GradeAverageProviderTest { semesters[2], true ) - } returns resourceFlow { secondGradeWithModifier to secondSummariesWithModifier } + } returns resourceFlow { + Triple( + secondGradeWithModifier, + secondSummariesWithModifier, + emptyList() + ) + } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -506,7 +588,13 @@ class GradeAverageProviderTest { semesters[2], true ) - } returns resourceFlow { secondGradeWithModifier to secondSummariesWithModifier } + } returns resourceFlow { + Triple( + secondGradeWithModifier, + secondSummariesWithModifier, + emptyList() + ) + } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -534,7 +622,7 @@ class GradeAverageProviderTest { semesters[2], true ) - } returns resourceFlow { secondGrades to secondSummaries } + } returns resourceFlow { Triple(secondGrades, secondSummaries, emptyList()) } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -564,7 +652,7 @@ class GradeAverageProviderTest { semesters[2], true ) - } returns resourceFlow { secondGrades to secondSummaries } + } returns resourceFlow { Triple(secondGrades, secondSummaries, emptyList()) } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -594,7 +682,7 @@ class GradeAverageProviderTest { semesters[1], true ) - } returns resourceFlow { firstGrades to firstSummaries } + } returns resourceFlow { Triple(firstGrades, firstSummaries, emptyList()) } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -625,8 +713,8 @@ class GradeAverageProviderTest { coEvery { semesterRepository.getSemesters(student) } returns semesters coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flow { emit(Resource.Loading()) - emit(Resource.Intermediate(firstGrades to firstSummaries)) - emit(Resource.Success(firstGrades to firstSummaries)) + emit(Resource.Intermediate(Triple(firstGrades, firstSummaries, emptyList()))) + emit(Resource.Success(Triple(firstGrades, firstSummaries, emptyList()))) } val items = runBlocking { @@ -675,9 +763,11 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - firstGrades to listOf( - getSummary(22, "Matematyka", 3.0), - getSummary(22, "Fizyka", 3.5) + Triple( + firstGrades, listOf( + getSummary(22, "Matematyka", 3.0), + getSummary(22, "Fizyka", 3.5) + ), emptyList() ) } coEvery { @@ -687,9 +777,13 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - secondGrades to listOf( - getSummary(22, "Matematyka", 3.5), - getSummary(22, "Fizyka", 4.0) + Triple( + secondGrades, + listOf( + getSummary(22, "Matematyka", 3.5), + getSummary(22, "Fizyka", 4.0) + ), + emptyList() ) } @@ -723,17 +817,21 @@ class GradeAverageProviderTest { emit(Resource.Loading()) emit( Resource.Intermediate( - firstGrades to listOf( - getSummary(22, "Matematyka", 3.0), - getSummary(22, "Fizyka", 3.5) + Triple( + firstGrades, listOf( + getSummary(22, "Matematyka", 3.0), + getSummary(22, "Fizyka", 3.5) + ), emptyList() ) ) ) emit( Resource.Success( - firstGrades to listOf( - getSummary(22, "Matematyka", 3.0), - getSummary(22, "Fizyka", 3.5) + Triple( + firstGrades, listOf( + getSummary(22, "Matematyka", 3.0), + getSummary(22, "Fizyka", 3.5) + ), emptyList() ) ) ) @@ -742,17 +840,21 @@ class GradeAverageProviderTest { emit(Resource.Loading()) emit( Resource.Intermediate( - secondGrades to listOf( - getSummary(22, "Matematyka", 3.5), - getSummary(22, "Fizyka", 4.0) + Triple( + secondGrades, listOf( + getSummary(22, "Matematyka", 3.5), + getSummary(22, "Fizyka", 4.0) + ), emptyList() ) ) ) emit( Resource.Success( - secondGrades to listOf( - getSummary(22, "Matematyka", 3.5), - getSummary(22, "Fizyka", 4.0) + Triple( + secondGrades, listOf( + getSummary(22, "Matematyka", 3.5), + getSummary(22, "Fizyka", 4.0) + ), emptyList() ) ) ) @@ -803,7 +905,7 @@ class GradeAverageProviderTest { semesters[1], true ) - } returns resourceFlow { firstGrades to firstSummaries } + } returns resourceFlow { Triple(firstGrades, firstSummaries, emptyList()) } coEvery { gradeRepository.getGrades( student, @@ -811,9 +913,11 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - secondGrades to listOf( - getSummary(22, "Matematyka", 1.1), - getSummary(22, "Fizyka", 7.26) + Triple( + secondGrades, listOf( + getSummary(22, "Matematyka", 1.1), + getSummary(22, "Fizyka", 7.26) + ), emptyList() ) } @@ -850,9 +954,11 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - firstGrades to listOf( - getSummary(22, "Matematyka", .0), - getSummary(22, "Fizyka", .0) + Triple( + firstGrades, listOf( + getSummary(22, "Matematyka", .0), + getSummary(22, "Fizyka", .0) + ), emptyList() ) } coEvery { @@ -862,9 +968,11 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - secondGrades to listOf( - getSummary(22, "Matematyka", .0), - getSummary(22, "Fizyka", .0) + Triple( + secondGrades, listOf( + getSummary(22, "Matematyka", .0), + getSummary(22, "Fizyka", .0) + ), emptyList() ) } @@ -889,24 +997,28 @@ class GradeAverageProviderTest { coEvery { semesterRepository.getSemesters(student) } returns semesters coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flow { emit(Resource.Loading()) - emit(Resource.Intermediate(firstGrades to firstSummaries)) - emit(Resource.Success(firstGrades to firstSummaries)) + emit(Resource.Intermediate(Triple(firstGrades, firstSummaries, emptyList()))) + emit(Resource.Success(Triple(firstGrades, firstSummaries, emptyList()))) } coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flow { emit(Resource.Loading()) emit( Resource.Intermediate( - secondGrades to listOf( - getSummary(22, "Matematyka", 1.1), - getSummary(22, "Fizyka", 7.26) + Triple( + secondGrades, listOf( + getSummary(22, "Matematyka", 1.1), + getSummary(22, "Fizyka", 7.26) + ), emptyList() ) ) ) emit( Resource.Success( - secondGrades to listOf( - getSummary(22, "Matematyka", 1.1), - getSummary(22, "Fizyka", 7.26) + Triple( + secondGrades, listOf( + getSummary(22, "Matematyka", 1.1), + getSummary(22, "Fizyka", 7.26) + ), emptyList() ) ) ) @@ -958,14 +1070,14 @@ class GradeAverageProviderTest { semesters[1], true ) - } returns resourceFlow { firstGrades to emptyList() } + } returns resourceFlow { Triple(firstGrades, emptyList(), emptyList()) } coEvery { gradeRepository.getGrades( student, semesters[2], true ) - } returns resourceFlow { secondGrades to emptyList() } + } returns resourceFlow { Triple(secondGrades, emptyList(), emptyList()) } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -1000,14 +1112,14 @@ class GradeAverageProviderTest { semesters[1], true ) - } returns resourceFlow { firstGrades to emptyList() } + } returns resourceFlow { Triple(firstGrades, emptyList(), emptyList()) } coEvery { gradeRepository.getGrades( student, semesters[2], true ) - } returns resourceFlow { secondGrades to emptyList() } + } returns resourceFlow { Triple(secondGrades, emptyList(), emptyList()) } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -1043,8 +1155,10 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - firstGrades to listOf( - getSummary(22, "Matematyka", 4.0) + Triple( + firstGrades, listOf( + getSummary(22, "Matematyka", 4.0) + ), emptyList() ) } coEvery { @@ -1054,8 +1168,10 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - secondGrades to listOf( - getSummary(23, "Matematyka", 3.0) + Triple( + secondGrades, listOf( + getSummary(23, "Matematyka", 3.0) + ), emptyList() ) } @@ -1092,14 +1208,20 @@ class GradeAverageProviderTest { semesters[1], true ) - } returns resourceFlow { firstGrades to firstSummaries } + } returns resourceFlow { Triple(firstGrades, firstSummaries, emptyList()) } coEvery { gradeRepository.getGrades( student, semesters[2], true ) - } returns resourceFlow { secondGrades to secondSummaries.dropLast(1) } + } returns resourceFlow { + Triple( + secondGrades, + secondSummaries.dropLast(1), + emptyList() + ) + } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -1134,14 +1256,20 @@ class GradeAverageProviderTest { semesters[1], true ) - } returns resourceFlow { firstGrades to firstSummaries.dropLast(1) } + } returns resourceFlow { + Triple( + firstGrades, + firstSummaries.dropLast(1), + emptyList() + ) + } coEvery { gradeRepository.getGrades( student, semesters[2], true ) - } returns resourceFlow { secondGrades to secondSummaries } + } returns resourceFlow { Triple(secondGrades, secondSummaries, emptyList()) } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -1176,14 +1304,20 @@ class GradeAverageProviderTest { semesters[1], true ) - } returns resourceFlow { firstGrades to firstSummaries.dropLast(1) } + } returns resourceFlow { + Triple( + firstGrades, + firstSummaries.dropLast(1), + emptyList() + ) + } coEvery { gradeRepository.getGrades( student, semesters[2], true ) - } returns resourceFlow { secondGrades to secondSummaries } + } returns resourceFlow { Triple(secondGrades, secondSummaries, emptyList()) } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( @@ -1219,16 +1353,20 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - listOf( - getGrade(22, "Fizyka", 5.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 5.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)) + Triple( + listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ), + listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)), + emptyList() + ) } coEvery { gradeRepository.getGrades( @@ -1237,11 +1375,15 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - listOf( - getGrade(23, "Fizyka", 5.0, weight = 1.0), - getGrade(23, "Fizyka", 5.0, weight = 2.0), - getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)) + Triple( + listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) + ), + listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)), + emptyList() + ) } val items = runBlocking { @@ -1266,23 +1408,31 @@ class GradeAverageProviderTest { every { preferencesRepository.gradeAverageModeFlow } returns flowOf(GradeAverageMode.ALL_YEAR) coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns resourceFlow { - listOf( - getGrade(22, "Fizyka", 5.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 5.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)) + Triple( + listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ), + listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)), + emptyList() + ) } coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns resourceFlow { - listOf( - getGrade(23, "Fizyka", 5.0, weight = 1.0), - getGrade(23, "Fizyka", 5.0, weight = 2.0), - getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)) + Triple( + listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) + ), + listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)), + emptyList() + ) } val items = runBlocking { @@ -1313,23 +1463,31 @@ class GradeAverageProviderTest { coEvery { semesterRepository.getSemesters(student) } returns semesters coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns resourceFlow { - listOf( - getGrade(22, "Fizyka", 5.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 5.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)) + Triple( + listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ), + listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)), + emptyList() + ) } coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns resourceFlow { - listOf( - getGrade(23, "Fizyka", 5.0, weight = 1.0), - getGrade(23, "Fizyka", 5.0, weight = 2.0), - getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)) + Triple( + listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) + ), + listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)), + emptyList() + ) } val items = runBlocking { @@ -1366,16 +1524,20 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - listOf( - getGrade(22, "Fizyka", 5.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 5.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 4.0), - getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)) + Triple( + listOf( + getGrade(22, "Fizyka", 5.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 5.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 4.0), + getGrade(22, "Fizyka", 6.0, weight = 2.0) + ), + listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)), + emptyList() + ) } coEvery { gradeRepository.getGrades( @@ -1384,11 +1546,15 @@ class GradeAverageProviderTest { true ) } returns resourceFlow { - listOf( - getGrade(23, "Fizyka", 5.0, weight = 1.0), - getGrade(23, "Fizyka", 5.0, weight = 2.0), - getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)) + Triple( + listOf( + getGrade(23, "Fizyka", 5.0, weight = 1.0), + getGrade(23, "Fizyka", 5.0, weight = 2.0), + getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) + ), + listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)), + emptyList() + ) } val items = runBlocking { @@ -1413,9 +1579,9 @@ class GradeAverageProviderTest { every { preferencesRepository.isOptionalArithmeticAverageFlow } returns flowOf(false) coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns - resourceFlow { firstGrades to firstSummaries } + resourceFlow { Triple(firstGrades, firstSummaries, emptyList()) } coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns - resourceFlow { listOf() to firstSummaries } + resourceFlow { Triple(listOf(), firstSummaries, emptyList()) } val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage( From 3f199cb610016c72baaa89ae369205125c864411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 9 Feb 2024 13:40:01 +0100 Subject: [PATCH 1348/1526] Replace fakelog.cf to wulkanowy.net.pl (#2419) --- .../ui/modules/login/advanced/LoginAdvancedPresenter.kt | 4 ++-- .../wulkanowy/ui/modules/login/form/LoginFormPresenter.kt | 2 +- .../ui/modules/login/recover/LoginRecoverPresenter.kt | 2 +- app/src/main/res/values/api_hosts.xml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt index a17ad0035..fc26f3765 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt @@ -71,7 +71,7 @@ class LoginAdvancedPresenter @Inject constructor( fun updateUsernameLabel() { view?.apply { - setUsernameLabel(if ("vulcan" in formHostValue || "fakelog" in formHostValue) emailLabel else nicknameLabel) + setUsernameLabel(if ("vulcan" in formHostValue || "wulkanowy" in formHostValue) emailLabel else nicknameLabel) } } @@ -79,7 +79,7 @@ class LoginAdvancedPresenter @Inject constructor( view?.apply { clearPassError() clearUsernameError() - if (formHostValue.contains("fakelog")) { + if (formHostValue.contains("wulkanowy")) { setDefaultCredentials( "jan@fakelog.cf", "jan123", "powiatwulkanowy", "FK100000", "999999" ) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index c9ae4f27f..26b15bff0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -90,7 +90,7 @@ class LoginFormPresenter @Inject constructor( clearPassError() clearUsernameError() clearHostError() - if (formHostValue.contains("fakelog")) { + if (formHostValue.contains("wulkanowy")) { setCredentials("jan@fakelog.cf", "jan123") } else if (formUsernameValue == "jan@fakelog.cf" && formPassValue == "jan123") { setCredentials("", "") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt index a424df40d..879055a9a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt @@ -38,7 +38,7 @@ class LoginRecoverPresenter @Inject constructor( fun onHostSelected() { view?.run { - if ("fakelog" in recoverHostValue) setDefaultCredentials("jan@fakelog.cf") + if ("wulkanowy" in recoverHostValue) setDefaultCredentials("jan@fakelog.cf") clearUsernameError() updateFields() } diff --git a/app/src/main/res/values/api_hosts.xml b/app/src/main/res/values/api_hosts.xml index 522b6e116..94ef8abdc 100644 --- a/app/src/main/res/values/api_hosts.xml +++ b/app/src/main/res/values/api_hosts.xml @@ -44,7 +44,7 @@ https://vulcan.net.pl/?login https://vulcan.net.pl/?login https://vulcan.net.pl/?email&customSuffix - https://fakelog.cf/?email + https://wulkanowy.net.pl/?email Default From 8183d7d5a0f9f62e7d63a8a42f15817525e11d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 9 Feb 2024 16:35:18 +0100 Subject: [PATCH 1349/1526] Change default symbol for standard register variant (#2421) --- app/build.gradle | 2 +- .../java/io/github/wulkanowy/ui/modules/login/LoginData.kt | 3 ++- .../ui/modules/login/advanced/LoginAdvancedPresenter.kt | 2 +- .../wulkanowy/ui/modules/login/form/LoginFormPresenter.kt | 4 ++-- .../ui/modules/login/recover/LoginRecoverPresenter.kt | 4 ++-- .../login/studentselect/LoginStudentSelectFragment.kt | 2 -- .../login/studentselect/LoginStudentSelectPresenter.kt | 6 +++--- .../ui/modules/login/support/LoginSupportDialog.kt | 2 +- .../ui/modules/login/symbol/LoginSymbolPresenter.kt | 6 +++--- app/src/main/res/values/api_hosts.xml | 4 ++-- app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt | 1 + .../login/studentselect/LoginStudentSelectPresenterTest.kt | 2 +- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b60dc3b4b..65a42ce1d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.3.7' + implementation 'io.github.wulkanowy:sdk:2.3.8-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginData.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginData.kt index 2c11bb6d5..b066cceb9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginData.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginData.kt @@ -7,5 +7,6 @@ data class LoginData( val password: String, val baseUrl: String, val domainSuffix: String, - val symbol: String?, + val defaultSymbol: String, + val userEnteredSymbol: String? = null, ) : Serializable diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt index fc26f3765..009f26e17 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt @@ -155,7 +155,7 @@ class LoginAdvancedPresenter @Inject constructor( password = view?.formPassValue.orEmpty().trim(), baseUrl = view?.formHostValue.orEmpty().trim(), domainSuffix = view?.formDomainSuffix.orEmpty().trim(), - symbol = view?.formSymbolValue.orEmpty().trim().getNormalizedSymbol(), + defaultSymbol = view?.formSymbolValue.orEmpty().trim().getNormalizedSymbol(), ) when (it.data.symbols.size) { 0 -> view?.navigateToSymbol(loginData) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index 26b15bff0..af89f147c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -148,7 +148,7 @@ class LoginFormPresenter @Inject constructor( password = password, baseUrl = host, domainSuffix = domainSuffix, - symbol = symbol + defaultSymbol = symbol ) } @@ -167,7 +167,7 @@ class LoginFormPresenter @Inject constructor( password = loginData.password, scrapperBaseUrl = loginData.baseUrl, domainSuffix = loginData.domainSuffix, - symbol = loginData.symbol.orEmpty(), + symbol = loginData.defaultSymbol, ) } .logResourceStatus("login") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt index 879055a9a..18902e014 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt @@ -60,7 +60,7 @@ class LoginRecoverPresenter @Inject constructor( resourceFlow { recoverRepository.getReCaptchaSiteKey( host, - symbol.ifBlank { "Default" }) + symbol.ifBlank { "default" }) }.onEach { when (it) { is Resource.Loading -> view?.run { @@ -103,7 +103,7 @@ class LoginRecoverPresenter @Inject constructor( fun onReCaptchaVerified(reCaptchaResponse: String) { val username = view?.recoverNameValue.orEmpty() val host = view?.recoverHostValue.orEmpty() - val symbol = view?.formHostSymbol.ifNullOrBlank { "Default" } + val symbol = view?.formHostSymbol.ifNullOrBlank { "default" } resourceFlow { recoverRepository.sendRecoverRequest( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index 06efd8d98..0fe36aa99 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -10,13 +10,11 @@ import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.FragmentLoginStudentSelectBinding import io.github.wulkanowy.ui.base.BaseFragment -import io.github.wulkanowy.ui.modules.auth.AuthDialog import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.support.LoginSupportDialog import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo import io.github.wulkanowy.utils.AppInfo -import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.serializable import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 6cbdfbb85..344414180 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -111,8 +111,8 @@ class LoginStudentSelectPresenter @Inject constructor( val notEmptySymbols = registerUser.symbols.filter { it.schools.isNotEmpty() } val emptySymbols = registerUser.symbols.filter { it.schools.isEmpty() } - if (emptySymbols.isNotEmpty() && notEmptySymbols.isNotEmpty() && emptySymbols.any { it.symbol == loginData.symbol }) { - add(createEmptySymbolItem(emptySymbols.first { it.symbol == loginData.symbol })) + if (emptySymbols.isNotEmpty() && notEmptySymbols.isNotEmpty() && emptySymbols.any { it.symbol == loginData.userEnteredSymbol }) { + add(createEmptySymbolItem(emptySymbols.first { it.symbol == loginData.userEnteredSymbol })) } addAll(createNotEmptySymbolItems(notEmptySymbols, students)) @@ -317,7 +317,7 @@ class LoginStudentSelectPresenter @Inject constructor( loginData = loginData, registerUser = registerUser, lastErrorMessage = lastError?.message, - enteredSymbol = loginData.symbol, + enteredSymbol = loginData.userEnteredSymbol, ) ) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt index fcf7f51c9..4be2dbaad 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/support/LoginSupportDialog.kt @@ -105,7 +105,7 @@ class LoginSupportDialog : BaseDialogFragment() { "${appInfo.systemManufacturer} ${appInfo.systemModel}", appInfo.systemVersion.toString(), "${appInfo.versionName}-${appInfo.buildFlavor}", - supportInfo.loginData.baseUrl + "/" + supportInfo.loginData.symbol, + supportInfo.loginData.let { "${it.baseUrl}/${it.defaultSymbol}/${it.userEnteredSymbol}" }, preferencesRepository.installationId, getLastErrorFromStudentSelectScreen(), dialogLoginSupportSchoolInput.text.takeIf { !it.isNullOrBlank() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index 02bfde5d7..cc88b09e9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -60,7 +60,7 @@ class LoginSymbolPresenter @Inject constructor( } loginData = loginData.copy( - symbol = view?.symbolValue?.getNormalizedSymbol(), + userEnteredSymbol = view?.symbolValue?.getNormalizedSymbol(), ) resourceFlow { studentRepository.getUserSubjectsFromScrapper( @@ -68,7 +68,7 @@ class LoginSymbolPresenter @Inject constructor( password = loginData.password, scrapperBaseUrl = loginData.baseUrl, domainSuffix = loginData.domainSuffix, - symbol = loginData.symbol.orEmpty(), + symbol = loginData.userEnteredSymbol.orEmpty(), ) }.onEach { user -> registerUser = user.dataOrNull @@ -93,7 +93,7 @@ class LoginSymbolPresenter @Inject constructor( else -> { val enteredSymbolDetails = user.data.symbols .firstOrNull() - ?.takeIf { it.symbol == loginData.symbol } + ?.takeIf { it.symbol == loginData.userEnteredSymbol } if (enteredSymbolDetails?.error is InvalidSymbolException) { view?.run { diff --git a/app/src/main/res/values/api_hosts.xml b/app/src/main/res/values/api_hosts.xml index 94ef8abdc..6439b462f 100644 --- a/app/src/main/res/values/api_hosts.xml +++ b/app/src/main/res/values/api_hosts.xml @@ -47,7 +47,7 @@ https://wulkanowy.net.pl/?email - Default + warszawa opole gdansk lublin @@ -66,7 +66,7 @@ gminaulanmajorat gminaozorkow gminalopiennikgorny - Default + warszawa powiatwulkanowy diff --git a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt index eac1389f4..9f5d731b6 100644 --- a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt +++ b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt @@ -42,6 +42,7 @@ fun getSemesterPojo(diaryId: Int, semesterId: Int, start: LocalDate, end: LocalD diaryName = "$semesterId", schoolYear = 1970, classId = 0, + className = "Ti", semesterNumber = semesterName, unitId = 1, start = start, diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index fad6436d8..34965f00d 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -58,7 +58,7 @@ class LoginStudentSelectPresenterTest { login = "", password = "", baseUrl = "", - symbol = null, + defaultSymbol = "warszawa", domainSuffix = "", ) From cd853e4d5720881623a18b8e1dbfbfb234640ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 9 Feb 2024 19:34:04 +0100 Subject: [PATCH 1350/1526] New Crowdin updates (#2417) --- app/src/main/res/values-cs/strings.xml | 13 +++++++++++++ app/src/main/res/values-de/strings.xml | 9 +++++++++ app/src/main/res/values-pl/strings.xml | 13 +++++++++++++ app/src/main/res/values-ru/strings.xml | 13 +++++++++++++ app/src/main/res/values-sk/strings.xml | 13 +++++++++++++ app/src/main/res/values-uk/strings.xml | 17 +++++++++++++++-- 6 files changed, 76 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index b4f1f878a..85a67f9b3 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -117,6 +117,7 @@ Součet bodů Konečná známka Předpokládaná známka + Popisná známka Vypočítaný průměr Jak funguje vypočítaný průměr? Vypočítaný průměr je aritmetický průměr vypočítaný z průměrů předmětů. Umožňuje vám to znát přibližný konečný průměr. Vypočítává se způsobem zvoleným uživatelem v nastavení aplikaci. Doporučuje se vybrat příslušnou možnost. Důvodem je rozdílný výpočet školních průměrů. Pokud vaše škola navíc uvádí průměr předmětů na stránce deníku Vulcan, aplikace si je stáhne a tyto průměry nepočítá. To lze změnit vynucením výpočtu průměru v nastavení aplikaci.\n\nPrůměr známek pouze z vybraného semestru:\n1. Výpočet váženého průměru pro každý předmět v daném semestru\n2. Sčítání vypočítaných průměrů\n3. Výpočet aritmetického průměru součtených průměrů\n\nPrůměr průměrů z obou semestrů:\n1. Výpočet váženého průměru pro každý předmět v semestru 1 a 2\n2. Výpočet aritmetického průměru vypočítaných průměrů za semestry 1 a 2 pro každý předmět.\n3. Sčítání vypočítaných průměrů\n4. Výpočet aritmetického průměru sečtených průměrů\n\nPrůměr známek z celého roku:\n1. Výpočet váženého průměru za rok pro každý předmět. Konečný průměr v 1. semestru je nepodstatný.\n2. Sčítání vypočítaných průměrů\n3. Výpočet aritmetického průměru součtených průměrů @@ -160,6 +161,12 @@ Nové konečné známky Nové konečné známky + + Nová popisná známka + Nové popisné známky + Nové popisné známky + Nové popisné známky + Máte %1$d novou známku Máte %1$d nové známky @@ -178,6 +185,12 @@ Máte %1$d nových konečných známek Máte %1$d nových konečných známek + + Máte %1$d novou popisnou známku + Máte %1$d nové popisné známky + Máte %1$d nových popisných známek + Máte %1$d nových popisných známek + Lekce Učebna diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7e0ce8689..0fbba392c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -117,6 +117,7 @@ Gesamtpunkte Finaler Note Vorhergesagte Note + Descriptive grade Berechnender Durchschnitt Wie funktioniert der berechnete Durchschnitt? Der berechnete Mittelwert ist das arithmetische Mittel, das aus den Durchschnittswerten der Probanden errechnet wird. Es erlaubt Ihnen, den ungefähre endgültigen Durchschnitt zu kennen. Sie wird auf eine vom Anwender in den Anwendungseinstellungen gewählte Weise berechnet. Es wird empfohlen, die entsprechende Option zu wählen. Das liegt daran, dass die Berechnung der Schuldurchschnitte unterschiedlich ist. Wenn Ihre Schule den Durchschnitt der Fächer auf der Vulcan-Seite angibt, lädt die Anwendung diese Fächer herunter und berechnet nicht den Durchschnitt. Dies kann geändert werden, indem die Berechnung des Durchschnitts in den Anwendungseinstellungen erzwungen wird. \n\nDurchschnitt der Noten nur aus dem ausgewählten Semester :\n1. Berechnung des gewichteten Durchschnitts für jedes Fach in einem bestimmten Semester\n2. Addition der berechneten Durchschnittswerte\n3. Berechnung des arithmetischen Mittels der summierten Durchschnitte\nDurchschnitt der Durchschnitte aus beiden Semestern:\n1. Berechnung des gewichteten Durchschnitts für jedes Fach in Semester 1 und 2\n2. Berechnung des arithmetischen Mittels der berechneten Durchschnitte für Semester 1 und 2 für jedes Fach. \n3. Hinzufügen von berechneten Durchschnittswerten\n4. Berechnung des arithmetischen Mittels der summierten Durchschnitte\nDurchschnitt der Noten aus dem ganzen Jahr:\n1. Berechnung des gewichteten Jahresdurchschnitts für jedes Fach. Der Abschlussdurchschnitt im 1. Semester ist irrelevant. \n2. Addition der berechneten Durchschnittswerte\n3. Berechnung des arithmetischen Mittels der summierten Mittelwerte @@ -152,6 +153,10 @@ Neue Abschlussnote Neue Abschlussnoten + + New descriptive grade + New descriptive grades + Du hast %1$d Note bekommen Du hast %1$d Noten bekommen @@ -164,6 +169,10 @@ Sie haben %1$d Abschlussnote bekommen Sie haben %1$d Abschlussnoten bekommen + + You received %1$d descriptive grade + You received %1$d descriptive grades + Lektion Klassenzimmer diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 1b4fbe664..df9ef8dbd 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -117,6 +117,7 @@ Suma punktów Ocena końcowa Przewidywana ocena + Ocena opisowa Obliczona średnia Jak działa obliczona średnia? Obliczona średnia jest średnią arytmetyczną obliczoną ze średnich przedmiotów. Pozwala ona na poznanie przybliżonej średniej końcowej. Jest obliczana w sposób wybrany przez użytkownika w ustawieniach aplikacji. Zaleca się wybranie odpowiedniej opcji. Dzieje się tak dlatego, że obliczanie średnich w szkołach różni się. Dodatkowo, jeśli twoja szkoła ma włączone średnie przedmiotów na stronie dziennika Vulcan, aplikacja pobiera je i ich nie oblicza. Można to zmienić, wymuszając obliczanie średniej w ustawieniach aplikacji.\n\nŚrednia ocen tylko z wybranego semestru:\n1. Obliczanie średniej arytmetycznej każdego przedmiotu w danym semestrze\n2. Zsumowanie obliczonych średnich\n3. Obliczanie średniej arytmetycznej zsumowanych średnich\n\nŚrednia ze średnich z obu semestrów:\n1.Obliczanie średniej arytmetycznej każdego przedmiotu w semestrze 1 i 2\n2. Obliczanie średniej arytmetycznej obliczonych średnich w semestrze 1 i 2 każdego przedmiotu.\n3. Zsumowanie obliczonych średnich\n4. Obliczanie średniej arytmetycznej zsumowanych średnich\n\nŚrednia wszystkich ocen z całego roku:\n1. Obliczanie średniej arytmetycznej z każdego przedmiotu w ciągu całego roku. Końcowa ocena w 1 semestrze jest bez znaczenia.\n2. Zsumowanie obliczonych średnich\n3. Obliczanie średniej arytmetycznej z zsumowanych średnich @@ -160,6 +161,12 @@ Nowe oceny końcowe Nowe oceny końcowe + + Nowa ocena opisowa + Nowe oceny opisowe + Nowe oceny opisowe + Nowe oceny opisowe + Masz %1$d nową ocenę Masz %1$d nowe oceny @@ -178,6 +185,12 @@ Masz %1$d nowych końcowych ocen Masz %1$d nowych końcowych ocen + + Masz %1$d nową ocenę opisową + Masz %1$d nowe oceny opisowe + Masz %1$d nowych ocen opisowych + Masz %1$d nowych ocen opisowych + Lekcja Sala diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2ca669287..fffc5ce1e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -117,6 +117,7 @@ Сумма баллов Итоговая оценка Ожидаемая оценка + Descriptive grade Рассчитанная средняя оценка Как работает \"Рассчитанная средняя оценка\"? Рассчитанная средняя оценка - это среднее арифметическое, рассчитанное на основе средних оценок по предметам. Это позволяет узнать приблизительную итоговую среднюю оценку. Она рассчитывается способом, выбранным пользователем в настройках приложения. Рекомендуется выбрать подходящий вариант, так как каждая школа по разному считает среднюю оценку. Кроме того, если ваша школа выставляет средние оценки по предметам на странице Vulcan, приложение просто загрузит их. Это можно изменить, заставив приложение считать среднюю оценку в настройках.\n\nСредняя из оценок выбранного семестра:\n1. Вычисление средневзвешенного значения по каждому предмету за семестр\n2.Суммирование вычисленных значений\n3. Вычисление среднего арифметического суммированных значений\n\nСредняя из средних оценок семестров:\n1.Расчет средневзвешенного значения для каждого предмета в семестрах. \n2. Вычисление среднего арифметического из средневзвешенных значений для каждого предмета в семестрах.\n3. Суммирование средних арифметических\n4. Вычисление среднего арифматического из суммированных значений\n\nСредняя из оценок со всего года:\n1. Расчет средневзвешенного значения по каждому предмету за год. Итоговое среднее значение за 1 семестр не имеет значения.\n2. Суммирование вычисленных средних\n3. Расчет среднего арифметического суммированных чисел @@ -160,6 +161,12 @@ Новые итоговые оценки Новые итоговые оценки + + New descriptive grade + New descriptive grades + New descriptive grades + New descriptive grades + Вы получили %1$d новую оценку Вы получили %1$d новые оценки @@ -178,6 +185,12 @@ Вы получили %1$d новых итоговых оценок Вы получили %1$d новых итоговые оценки + + You received %1$d descriptive grade + You received %1$d descriptive grades + You received %1$d descriptive grades + You received %1$d descriptive grades + Урок Аудитория diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index aaf04bc85..1e822890b 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -117,6 +117,7 @@ Súčet bodov Konečná známka Predpokladaná známka + Popisná známka Vypočítaný priemer Ako funguje vypočítaný priemer? Vypočítaný priemer je aritmetický priemer vypočítaný z priemerov predmetov. Umožňuje vám to poznať približný konečný priemer. Vypočítava sa spôsobom zvoleným užívateľom v nastaveniach aplikácii. Odporúča sa vybrať príslušnú možnosť. Dôvodom je rozdielny výpočet školských priemerov. Ak vaša škola navyše uvádza priemer predmetov na stránke denníka Vulcan, aplikácia si ich stiahne a tieto priemery nepočíta. To možno zmeniť vynútením výpočtu priemeru v nastavení aplikácii.\n\nPriemer známok iba z vybraného semestra:\n1. Výpočet váženého priemeru pre každý predmet v danom semestri\n2. Sčítanie vypočítaných priemerov\n3. Výpočet aritmetického priemeru součtených priemerov\n\nPriemer priemerov z oboch semestrov:\n1. Výpočet váženého priemeru pre každý predmet v semestri 1 a 2\n2. Výpočet aritmetického priemeru vypočítaných priemerov za semestre 1 a 2 pre každý predmet.\n3. Sčítanie vypočítaných priemerov\n4. Výpočet aritmetického priemeru součtených priemerov\n\nPriemer známok z celého roka:\n1. Výpočet váženého priemeru za rok pre každý predmet. Konečný priemer v 1. semestri je nepodstatný.\n2. Sčítanie vypočítaných priemerov\n3. Výpočet aritmetického priemeru součtených priemerov @@ -160,6 +161,12 @@ Nové konečné známky Nové konečné známky + + Nová popisná známka + Nové popisné známky + Nové popisné známky + Nové popisné známky + Máte %1$d novú známku Máte %1$d nové známky @@ -178,6 +185,12 @@ Máte %1$d nových konečných známok Máte %1$d nových konečných známok + + Máte %1$d novú popisnú známku + Máte %1$d nové popisné známky + Máte %1$d nových popisných známok + Máte %1$d nových popisných známok + Lekcia Učebňa diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index fffae003b..47034de62 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -97,8 +97,8 @@ Увійти Минув термін дії сесії Минув термін дії сесії, авторизуйтеся знову - Your account password has been changed. You need to log in to Wulkanowy again - Password changed + Пароль вашого облікового запису був змінений. Ви повинні увійти в Wulkanowy знову + Пароль змінено Підтримка додатку Вам подобається цей додаток? Підтримайте його розвиток, увімкнувши неінвазивну рекламу, яку ви можете відключити в будь-який час Увімкнути рекламу @@ -117,6 +117,7 @@ Всього балів Підсумкова оцінка Передбачувана оцінка + Описова оцінка Розрахована середня оцінка Як працює \"Розрахована середня оцінка\"? Розрахована середня оцінка - це середнє арифметичне, обчислене з середніх оцінок з предметів. Це дозволяє дізнатися приблизну кінцеву середню оцінку. Вона розраховується спосібом, обраним користувачем у налаштуваннях програми. Рекомендується вибрати відповідний варіант, тому що кожна школа по різному розраховує середню оцінку. Крім того, якщо у вашій школі повідомляється середня оцінка з предметів на сторінці Vulcan, програма тільки завантажує ці оцінки і не розраховує їх самостійно. Це можна змінити шляхом примусового розрахунку середньоЇ оцінки в налаштуваннях програми.\n\nСередні оцінки тільки за обраний семестр:\n1. Розрахунок середньозваженого числа для кожного предмета в даному семестрі\n2. Сумування розрахованих числ\n3. Розрахунок середнього арифметичного з сумованих чисел\n\nСереднє значення з обох семестрів:\n1. Обчислення середньозваженого числа для кожного предмета у 1 та 2 семестрі\n2. Обчислення середнього арифметичного з розрахованих середньозважених числ за 1 та 2 семестри для кожного предмета.\n3. Додавання розрахованих середніх\n4. Розрахунок середнього арифметичного підсумованих середніх значень\n\nСереднє значення оцінок за весь рік: \n1. Розрахунок середньозваженого числа за рік для кожного предмета. Підсумковий середній показник у 1-му семестрі не має значення.\n2. Сумування розрахованих середніх\n3. Обчислення середнього арифметичного з суммованих середніх @@ -160,6 +161,12 @@ Нові підсумкові оцінки Нові підсумкові оцінки + + Нова описова оцінка + Нових описових оцінок + Описових оцінок + Нові описові оцінки + Ви отримали %1$d нову оцінку Ви отримали %1$d нові оцінки @@ -178,6 +185,12 @@ Ви отримали %1$d нових підсумкових оцінок Ви отримали %1$d нових підсумкових оцінок + + Ви отримали %1$d описову оцінку + Ви отримали %1$d нові описові оцінки + Ви отримали %1$d нових описових оцінок + Ви отримали %1$d нових описових оцінок + Урок Аудиторія From 2d4a1bff830b172232b6ca7074f097057bc5a608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 9 Feb 2024 19:44:55 +0100 Subject: [PATCH 1351/1526] Version 2.4.0 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 65a42ce1d..766bee8dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 145 - versionName "2.3.5" + versionCode 146 + versionName "2.4.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -164,7 +164,7 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.15d + userFraction = 0.50d updatePriority = 1 enabled.set(false) } @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.3.8-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.4.0' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 04f3ba463..012bbd26d 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,8 @@ -Wersja 2.3.5 +Wersja 2.4.0 -— naprawiliśmy ładowanie frekwencji dla szkół używających eduOne -— naprawiliśmy wielokrotne wysyłanie powiadomień o zmianach w planie lekcji +— naprawiliśmy logowanie do aplikacji na odmianie standardowej +— naprawiliśmy wyświetlanie lekcji na kolejny dzień w kafelku na ekranie Start +— dodaliśmy oceny opisowe +— dodaliśmy kolorowe opisy we frekwencji we wpisach innych niż obecność Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From cc01525f167d4d313bc8f1a48a1d8e895e6db431 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Feb 2024 18:49:46 +0000 Subject: [PATCH 1352/1526] Bump com.google.gms:google-services from 4.4.0 to 4.4.1 (#2423) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e6e090b80..f7f3d209e 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ buildscript { classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.16" classpath 'com.android.tools.build:gradle:8.2.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" - classpath 'com.google.gms:google-services:4.4.0' + classpath 'com.google.gms:google-services:4.4.1' classpath 'com.huawei.agconnect:agcp:1.9.1.303' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" From b5e17c4ff7b607eed9d1f9b65e82114c7b00d01a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Feb 2024 18:50:07 +0000 Subject: [PATCH 1353/1526] Bump com.google.firebase:firebase-bom from 32.7.1 to 32.7.2 (#2424) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 766bee8dd..5ca8c3b5b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -252,7 +252,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.11.0' - playImplementation platform('com.google.firebase:firebase-bom:32.7.1') + playImplementation platform('com.google.firebase:firebase-bom:32.7.2') playImplementation 'com.google.firebase:firebase-analytics' playImplementation 'com.google.firebase:firebase-messaging' playImplementation 'com.google.firebase:firebase-crashlytics:' From 6f4a8d5534916eabfa32f21dbd34139bbac1ced7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 17 Feb 2024 11:41:32 +0100 Subject: [PATCH 1354/1526] Add missing symbol and custom domain suffix validation (#2425) --- app/build.gradle | 2 +- .../modules/login/form/LoginFormFragment.kt | 11 ++++++ .../modules/login/form/LoginFormPresenter.kt | 36 +++++++++++++------ .../ui/modules/login/form/LoginFormView.kt | 4 +++ .../login/symbol/LoginSymbolPresenter.kt | 15 +++++--- .../main/res/layout/fragment_login_form.xml | 1 + app/src/main/res/values/strings.xml | 1 + 7 files changed, 55 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5ca8c3b5b..f40b74dbb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.4.0' + implementation 'io.github.wulkanowy:sdk:2.4.1-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index 975cad185..1c4920696 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -94,6 +94,7 @@ class LoginFormFragment : BaseFragment(R.layout.fragme loginFormUsername.doOnTextChanged { _, _, _, _ -> presenter.onUsernameTextChanged() } loginFormPass.doOnTextChanged { _, _, _, _ -> presenter.onPassTextChanged() } loginFormHost.setOnItemClickListener { _, _, _, _ -> presenter.onHostSelected() } + loginFormDomainSuffix.doOnTextChanged { _, _, _, _ -> presenter.onDomainSuffixChanged() } loginFormSignIn.setOnClickListener { presenter.onSignInClick() } loginFormAdvancedButton.setOnClickListener { presenter.onAdvancedLoginClick() } loginFormPrivacyLink.setOnClickListener { presenter.onPrivacyLinkClick() } @@ -188,6 +189,12 @@ class LoginFormFragment : BaseFragment(R.layout.fragme } } + override fun setDomainSuffixInvalid() { + with(binding.loginFormDomainSuffixLayout) { + error = getString(R.string.login_invalid_domain_suffix) + } + } + override fun clearUsernameError() { binding.loginFormUsernameLayout.error = null binding.loginFormErrorBox.isVisible = false @@ -206,6 +213,10 @@ class LoginFormFragment : BaseFragment(R.layout.fragme binding.loginFormErrorBox.isVisible = false } + override fun clearDomainSuffixError() { + binding.loginFormDomainSuffixLayout.error = null + } + override fun showSoftKeyboard() { activity?.showSoftInput() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index af89f147c..69e1d027d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -101,6 +101,12 @@ class LoginFormPresenter @Inject constructor( } } + fun onDomainSuffixChanged() { + view?.apply { + clearDomainSuffixError() + } + } + fun updateCustomDomainSuffixVisibility() { view?.run { showDomainSuffixInput("customSuffix" in formHostValue) @@ -159,7 +165,7 @@ class LoginFormPresenter @Inject constructor( fun onSignInClick() { val loginData = getLoginData() - if (!validateCredentials(loginData.login, loginData.password, loginData.baseUrl)) return + if (!validateCredentials(loginData)) return resourceFlow { studentRepository.getUserSubjectsFromScrapper( @@ -229,24 +235,29 @@ class LoginFormPresenter @Inject constructor( view?.onRecoverClick() } - private fun validateCredentials(login: String, password: String, host: String): Boolean { + private fun validateCredentials(loginData: LoginData): Boolean { var isCorrect = true - if (login.isEmpty()) { + if (loginData.login.isEmpty()) { view?.setErrorUsernameRequired() isCorrect = false } else { - if ("@" in login && "login" in host) { + if ("@" in loginData.login && "login" in loginData.baseUrl) { view?.setErrorLoginRequired() isCorrect = false } - if ("@" !in login && "email" in host) { + if ("@" !in loginData.login && "email" in loginData.baseUrl) { view?.setErrorEmailRequired() isCorrect = false } - if ("@" in login && "||" !in login && "login" !in host && "email" !in host) { - val emailHost = login.substringAfter("@") - val emailDomain = URL(host).host + + val isEmailLogin = "@" in loginData.login + val isEmailWithLogin = "||" !in loginData.login + val isLoginNotRequired = "login" !in loginData.baseUrl + val isEmailNotRequired = "email" !in loginData.baseUrl + if (isEmailLogin && isEmailWithLogin && isLoginNotRequired && isEmailNotRequired) { + val emailHost = loginData.login.substringAfter("@") + val emailDomain = URL(loginData.baseUrl).host if (!emailHost.equals(emailDomain, true)) { view?.setErrorEmailInvalid(domain = emailDomain) isCorrect = false @@ -254,16 +265,21 @@ class LoginFormPresenter @Inject constructor( } } - if (password.isEmpty()) { + if (loginData.password.isEmpty()) { view?.setErrorPassRequired(focus = isCorrect) isCorrect = false } - if (password.length < 6 && password.isNotEmpty()) { + if (loginData.password.length < 6 && loginData.password.isNotEmpty()) { view?.setErrorPassInvalid(focus = isCorrect) isCorrect = false } + if (loginData.domainSuffix !in listOf("", "rc", "kurs")) { + view?.setDomainSuffixInvalid() + isCorrect = false + } + return isCorrect } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt index f2b7b1003..6ea22d180 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormView.kt @@ -46,12 +46,16 @@ interface LoginFormView : BaseView { fun setErrorEmailInvalid(domain: String) + fun setDomainSuffixInvalid() + fun clearUsernameError() fun clearPassError() fun clearHostError() + fun clearDomainSuffixError() + fun showSoftKeyboard() fun hideSoftKeyboard() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index cc88b09e9..5c31f14d4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -96,10 +96,7 @@ class LoginSymbolPresenter @Inject constructor( ?.takeIf { it.symbol == loginData.userEnteredSymbol } if (enteredSymbolDetails?.error is InvalidSymbolException) { - view?.run { - setErrorSymbolInvalid() - showContact(true) - } + showInvalidSymbolError() } else { Timber.i("Login with symbol result: Success") view?.navigateToStudentSelect(loginData, requireNotNull(user.data)) @@ -128,6 +125,9 @@ class LoginSymbolPresenter @Inject constructor( loginErrorHandler.dispatch(user.error) lastError = user.error view?.showContact(true) + if (user.error is InvalidSymbolException) { + showInvalidSymbolError() + } } } }.onResourceNotLoading { @@ -145,6 +145,13 @@ class LoginSymbolPresenter @Inject constructor( return normalizedSymbol in definitelyInvalidSymbols } + private fun showInvalidSymbolError() { + view?.run { + setErrorSymbolInvalid() + showContact(true) + } + } + fun onFaqClick() { view?.openFaqPage() } diff --git a/app/src/main/res/layout/fragment_login_form.xml b/app/src/main/res/layout/fragment_login_form.xml index fc5e5f35e..10864e640 100644 --- a/app/src/main/res/layout/fragment_login_form.xml +++ b/app/src/main/res/layout/fragment_login_form.xml @@ -261,6 +261,7 @@ android:layout_marginEnd="24dp" android:layout_marginRight="24dp" android:hint="@string/login_domain_suffix_hint" + app:errorEnabled="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/loginFormHostLayout" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f1fa3ce73..0a4dcf7f4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -61,6 +61,7 @@ Invalid email Use the assigned login instead of email Use the assigned login or email in @%1$s + Invalid domain suffix Invalid symbol. If you cannot find it, please contact the school Don\'t make this up! If you cannot find it, please contact the school Student not found. Validate the symbol and the chosen variation of the UONET+ register From 736d16a7ab475c86c5306df17de5be8457533620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 17 Feb 2024 12:31:14 +0100 Subject: [PATCH 1355/1526] Make WebkitCookieManagerProxy no-op if webview is not available on the device (#2427) --- .../utils/WebkitCookieManagerProxy.kt | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt b/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt index a54978717..3d41c711c 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.utils +import android.util.AndroidRuntimeException import java.net.CookiePolicy import java.net.CookieStore import java.net.HttpCookie @@ -9,7 +10,18 @@ import java.net.CookieManager as JavaCookieManager class WebkitCookieManagerProxy : JavaCookieManager(null, CookiePolicy.ACCEPT_ALL) { - private val webkitCookieManager: WebkitCookieManager = WebkitCookieManager.getInstance() + private val webkitCookieManager: WebkitCookieManager? = getWebkitCookieManager() + + /** + * @see [https://stackoverflow.com/a/70354583/6695449] + */ + private fun getWebkitCookieManager(): WebkitCookieManager? { + return try { + WebkitCookieManager.getInstance() + } catch (e: AndroidRuntimeException) { + null + } + } override fun put(uri: URI?, responseHeaders: Map>?) { if (uri == null || responseHeaders == null) return @@ -23,7 +35,7 @@ class WebkitCookieManagerProxy : JavaCookieManager(null, CookiePolicy.ACCEPT_ALL // process each of the headers for (headerValue in responseHeaders[headerKey].orEmpty()) { - webkitCookieManager.setCookie(url, headerValue) + webkitCookieManager?.setCookie(url, headerValue) } } } @@ -34,7 +46,7 @@ class WebkitCookieManagerProxy : JavaCookieManager(null, CookiePolicy.ACCEPT_ALL ): Map> { require(!(uri == null || requestHeaders == null)) { "Argument is null" } val res = mutableMapOf>() - val cookie = webkitCookieManager.getCookie(uri.toString()) + val cookie = webkitCookieManager?.getCookie(uri.toString()) if (cookie != null) res["Cookie"] = listOf(cookie) return res } @@ -50,7 +62,7 @@ class WebkitCookieManagerProxy : JavaCookieManager(null, CookiePolicy.ACCEPT_ALL cookies.remove(uri, cookie) override fun removeAll(): Boolean { - webkitCookieManager.removeAllCookies(null) + webkitCookieManager?.removeAllCookies(null) ?: return false return true } } From e757585bd38030e09282d1ce6ceb0d083298e6b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 17 Feb 2024 12:43:52 +0100 Subject: [PATCH 1356/1526] New Crowdin updates (#2426) --- app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + 6 files changed, 6 insertions(+) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 85a67f9b3..e1cafa6ea 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -56,6 +56,7 @@ Neplatný e-mail Místo e-mailu použijte přiřazené přihlašovací údaje Použijte přiřazené přihlašovací nebo e-mail v @%1$s + Invalid domain suffix Neplatný symbol. Pokud jej nemůžete najít, kontaktujte školu Nevymýšlejte si! Pokud symbol nemůžete najít, kontaktujte školu Žák nebyl nalezen. Zkontrolujte správnost symbolu a vybrané varianty deníku UONET+ diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0fbba392c..5bd71bb29 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -56,6 +56,7 @@ Ungültige email Den zugewiesenen Login anstelle von email verwenden Benutze den zugewiesenen Login oder E-Mail in @%1$s + Invalid domain suffix Invalid symbol. If you cannot find it, please contact the school Don\'t make this up! If you cannot find it, please contact the school Schüler nicht gefunden. Überprüfen Sie das Symbol und die gewählte Variation des UONET+ Registers diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index df9ef8dbd..70d4982b9 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -56,6 +56,7 @@ Nieprawidłowy adres e-mail Użyj loginu zamiast adresu e-mail Użyj loginu lub adresu e-mail w @%1$s + Nieprawidłowy sufiks domeny Nieprawidłowy symbol. Jeśli nie możesz go znaleźć, skontaktuj się ze szkołą Nie zmyślaj! Jeśli nie możesz znaleźć symbolu, skontaktuj się ze szkołą Nie znaleziono ucznia. Sprawdź poprawność symbolu i wybranej odmiany dziennika UONET+ diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fffc5ce1e..717e02131 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -56,6 +56,7 @@ Неверный e-mail Используйте назначенный логин вместо e-mail Используйте назначенный логин или email в @%1$s + Invalid domain suffix Invalid symbol. If you cannot find it, please contact the school Don\'t make this up! If you cannot find it, please contact the school Ученик не найден. Проверьте symbol и выбранный тип дненика UONET+ diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 1e822890b..368ead9d5 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -56,6 +56,7 @@ Neplatný e-mail Namiesto e-mailu použite priradené prihlasovacie údaje Použite priradené prihlasovacie alebo e-mail v @%1$s + Invalid domain suffix Neplatný symbol. Pokiaľ ho nemôžete nájsť, kontaktujte školu Nevymýšľajte si! Pokiaľ symbol nemôžete nájsť, kontaktujte školu Žiak nebol nájdený. Skontrolujte správnosť symbolu a vybrané varianty denníka UONET+ diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 47034de62..3d10f1179 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -56,6 +56,7 @@ Недійсна адреса e-mail Використовуйте призначений логін замість адреси e-mail Використовуйте призначений логін або адресу e-mail в @%1$s + Invalid domain suffix Некоректний символ. Якщо ви не можете знайти його, будь ласка, зв\'яжіться зі школою Не вигадуйте! Якщо ви не можете знайти його, будь ласка, зв\'яжіться зі школою Студента не знайдено. Перевірте symbol та обраний тип щоденника UONET+ From 3cf6c295b01512f6acabd27e864d821c3f5a79cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 17 Feb 2024 13:07:45 +0100 Subject: [PATCH 1357/1526] Version 2.4.1 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 7 ++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f40b74dbb..e6d35f548 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 146 - versionName "2.4.0" + versionCode 147 + versionName "2.4.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.4.1-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.4.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 012bbd26d..5736992bf 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,8 +1,5 @@ -Wersja 2.4.0 +Wersja 2.4.1 -— naprawiliśmy logowanie do aplikacji na odmianie standardowej -— naprawiliśmy wyświetlanie lekcji na kolejny dzień w kafelku na ekranie Start -— dodaliśmy oceny opisowe -— dodaliśmy kolorowe opisy we frekwencji we wpisach innych niż obecność +- drobne poprawki stabilności aplikacji i odświeżania danych Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 7d8be1b9fc63e7e232ea93754abd385a62bd825c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 18 Feb 2024 14:21:38 +0000 Subject: [PATCH 1358/1526] Bump coroutines from 1.7.3 to 1.8.0 (#2428) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e6d35f548..0b9512cb9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ ext { room = "2.6.1" chucker = "4.0.0" mockk = "1.13.9" - coroutines = "1.7.3" + coroutines = "1.8.0" } dependencies { From cfec79405fe8c683012ff5583ccbe508bee502c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 18 Feb 2024 14:21:59 +0000 Subject: [PATCH 1359/1526] Bump org.jetbrains.kotlinx:kotlinx-serialization-json (#2429) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0b9512cb9..1408fedf1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -199,7 +199,7 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' - implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" implementation 'androidx.core:core-ktx:1.12.0' From ec101c1f52a6ea150d52484314cf66003891c0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 19 Feb 2024 11:30:05 +0100 Subject: [PATCH 1360/1526] Fix error handling in widgets (#2430) --- .../java/io/github/wulkanowy/data/Resource.kt | 11 +++- .../LuckyNumberWidgetProvider.kt | 15 ++--- .../timetablewidget/TimetableWidgetFactory.kt | 59 +++++++++++++------ .../timetablewidget/TimetableWidgetItem.kt | 5 ++ .../layout/item_widget_timetable_error.xml | 12 ++++ app/src/main/res/layout/widget_timetable.xml | 2 - 6 files changed, 72 insertions(+), 32 deletions(-) create mode 100644 app/src/main/res/layout/item_widget_timetable_error.xml diff --git a/app/src/main/java/io/github/wulkanowy/data/Resource.kt b/app/src/main/java/io/github/wulkanowy/data/Resource.kt index d7c2aeed9..108b0d58e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/Resource.kt +++ b/app/src/main/java/io/github/wulkanowy/data/Resource.kt @@ -30,8 +30,15 @@ val Resource.dataOrNull: T? get() = when (this) { is Resource.Success -> this.data is Resource.Intermediate -> this.data - is Resource.Loading -> null - is Resource.Error -> null + else -> null + } + +val Resource.dataOrThrow: T + get() = when (this) { + is Resource.Success -> this.data + is Resource.Intermediate -> this.data + is Resource.Loading -> throw IllegalStateException("Resource is in loading state") + is Resource.Error -> throw this.error } val Resource.errorOrNull: Throwable? diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index bafb2d7e5..1ab079a3a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -11,10 +11,8 @@ import android.view.View import android.widget.RemoteViews import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R -import io.github.wulkanowy.data.Resource -import io.github.wulkanowy.data.dataOrNull +import io.github.wulkanowy.data.dataOrThrow import io.github.wulkanowy.data.db.SharedPrefProvider -import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.repositories.LuckyNumberRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.toFirstResult @@ -69,8 +67,7 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { appWidgetIds?.forEach { widgetId -> val studentId = sharedPref.getLong(getStudentWidgetKey(widgetId), 0) - val luckyNumberResource = getLuckyNumber(studentId, widgetId) - val luckyNumber = luckyNumberResource.dataOrNull?.luckyNumber?.toString() + val luckyNumber = getLuckyNumber(studentId, widgetId)?.luckyNumber?.toString() val remoteView = RemoteViews(context.packageName, R.layout.widget_luckynumber) .apply { setTextViewText(R.id.luckyNumberWidgetValue, luckyNumber ?: "-") @@ -143,18 +140,18 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } } + else -> null } if (currentStudent != null) { luckyNumberRepository.getLuckyNumber(currentStudent, forceRefresh = false) .toFirstResult() - } else { - Resource.Success(null) - } + .dataOrThrow + } else null } catch (e: Exception) { Timber.e(e, "An error has occurred in lucky number provider") - Resource.Error(e) + null } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index 4e0578e2b..4cfc03229 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -11,7 +11,7 @@ import android.view.View.VISIBLE import android.widget.RemoteViews import android.widget.RemoteViewsService import io.github.wulkanowy.R -import io.github.wulkanowy.data.dataOrNull +import io.github.wulkanowy.data.dataOrThrow import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student @@ -27,6 +27,7 @@ import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Co 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.getErrorString import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.toFormattedString import kotlinx.coroutines.runBlocking @@ -67,25 +68,31 @@ class TimetableWidgetFactory( override fun onDestroy() {} override fun onDataSetChanged() { - intent?.extras?.getInt(EXTRA_APPWIDGET_ID)?.let { appWidgetId -> - val date = LocalDate.ofEpochDay(sharedPref.getLong(getDateWidgetKey(appWidgetId), 0)) - val studentId = sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0) + val appWidgetId = intent?.extras?.getInt(EXTRA_APPWIDGET_ID) ?: return + val date = LocalDate.ofEpochDay(sharedPref.getLong(getDateWidgetKey(appWidgetId), 0)) + val studentId = sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0) + items = emptyList() + + runBlocking { runCatching { - runBlocking { - val student = getStudent(studentId) ?: return@runBlocking - val semester = semesterRepository.getCurrentSemester(student) - items = createItems( - lessons = getLessons(student, semester, date), - lastSync = timetableRepository.getLastRefreshTimestamp(semester, date, date) - ) + val student = getStudent(studentId) ?: return@runBlocking + val semester = semesterRepository.getCurrentSemester(student) + val lessons = getLessons(student, semester, date) + val lastSync = timetableRepository.getLastRefreshTimestamp(semester, date, date) + + createItems(lessons, lastSync) + } + .onFailure { + items = listOf(TimetableWidgetItem.Error(it)) + Timber.e(it, "An error has occurred in timetable widget factory") + } + .onSuccess { + items = it if (date == LocalDate.now()) { updateTodayLastLessonEnd(appWidgetId) } } - }.onFailure { - Timber.e(it, "An error has occurred in timetable widget factory") - } } } @@ -98,7 +105,7 @@ class TimetableWidgetFactory( student: Student, semester: Semester, date: LocalDate ): List { val timetable = timetableRepository.getTimetable(student, semester, date, date, false) - val lessons = timetable.toFirstResult().dataOrNull?.lessons.orEmpty() + val lessons = timetable.toFirstResult().dataOrThrow.lessons return lessons.sortedBy { it.number } } @@ -110,6 +117,7 @@ class TimetableWidgetFactory( BETWEEN_AND_BEFORE_LESSONS -> 0 else -> null } + return buildList { lessons.forEach { if (prefRepository.showTimetableGaps != NO_GAPS && prevNum != null && it.number > prevNum!! + 1) { @@ -133,15 +141,12 @@ class TimetableWidgetFactory( sharedPref.putLong(key, todayLastLessonEnd.epochSecond, true) } - companion object { - const val TIME_FORMAT_STYLE = "HH:mm" - } - override fun getViewAt(position: Int): RemoteViews? { return when (val item = items.getOrNull(position) ?: return null) { is TimetableWidgetItem.Normal -> getNormalItemRemoteView(item) is TimetableWidgetItem.Empty -> getEmptyItemRemoteView(item) is TimetableWidgetItem.Synchronized -> getSynchronizedItemRemoteView(item) + is TimetableWidgetItem.Error -> getErrorItemRemoteView(item) } } @@ -213,6 +218,18 @@ class TimetableWidgetFactory( } } + private fun getErrorItemRemoteView(item: TimetableWidgetItem.Error): RemoteViews { + return RemoteViews( + context.packageName, + R.layout.item_widget_timetable_error + ).apply { + setTextViewText( + R.id.timetable_widget_item_error_message, + context.resources.getErrorString(item.error) + ) + } + } + private fun updateTheme() { when (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { Configuration.UI_MODE_NIGHT_YES -> { @@ -300,4 +317,8 @@ class TimetableWidgetFactory( synchronizationTime, ) } + + private companion object { + private const val TIME_FORMAT_STYLE = "HH:mm" + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt index 166b1a8fb..fb02f8919 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt @@ -17,10 +17,15 @@ sealed class TimetableWidgetItem(val type: TimetableWidgetItemType) { data class Synchronized( val timestamp: Instant, ) : TimetableWidgetItem(TimetableWidgetItemType.SYNCHRONIZED) + + data class Error( + val error: Throwable + ) : TimetableWidgetItem(TimetableWidgetItemType.ERROR) } enum class TimetableWidgetItemType { NORMAL, EMPTY, SYNCHRONIZED, + ERROR, } diff --git a/app/src/main/res/layout/item_widget_timetable_error.xml b/app/src/main/res/layout/item_widget_timetable_error.xml new file mode 100644 index 000000000..6f9ab067a --- /dev/null +++ b/app/src/main/res/layout/item_widget_timetable_error.xml @@ -0,0 +1,12 @@ + + diff --git a/app/src/main/res/layout/widget_timetable.xml b/app/src/main/res/layout/widget_timetable.xml index b07cc78f6..b438da6c3 100644 --- a/app/src/main/res/layout/widget_timetable.xml +++ b/app/src/main/res/layout/widget_timetable.xml @@ -114,7 +114,5 @@ android:text="@string/widget_timetable_no_items" android:textAppearance="?attr/textAppearanceBody1" android:visibility="gone" /> - - From 729e72cddb4c9b04e509914a66e654b9608db3df Mon Sep 17 00:00:00 2001 From: Kacper Majcher Date: Wed, 21 Feb 2024 21:36:20 +0100 Subject: [PATCH 1361/1526] Fix text pasting into date field in additional lesson add dialog (#2433) --- app/src/main/res/layout/dialog_additional_add.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/dialog_additional_add.xml b/app/src/main/res/layout/dialog_additional_add.xml index 4be436d76..78967394b 100644 --- a/app/src/main/res/layout/dialog_additional_add.xml +++ b/app/src/main/res/layout/dialog_additional_add.xml @@ -39,7 +39,7 @@ android:layout_height="wrap_content" android:editable="false" android:focusable="false" - android:inputType="text" + android:inputType="none" tools:ignore="Deprecated" /> @@ -67,7 +67,7 @@ android:layout_height="wrap_content" android:editable="false" android:focusable="false" - android:inputType="text" + android:inputType="none" tools:ignore="Deprecated" /> @@ -87,7 +87,7 @@ android:layout_height="wrap_content" android:editable="false" android:focusable="false" - android:inputType="text" + android:inputType="none" tools:ignore="Deprecated" /> From 2776d019b957062b87a31f93ff6a282f5548124b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 22 Feb 2024 15:52:40 +0100 Subject: [PATCH 1362/1526] =?UTF-8?q?Revert=20"Bump=20com.google.android.u?= =?UTF-8?q?mp:user-messaging-platform=20from=202.1.0=20to=202.2=E2=80=A6"?= =?UTF-8?q?=20(#2434)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit fc91936884715cc1d46d5af17086364961f8631d. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 1408fedf1..c3a7baabd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -262,7 +262,7 @@ dependencies { playImplementation "com.google.android.play:integrity:1.3.0" playImplementation 'com.google.android.play:app-update-ktx:2.1.0' playImplementation 'com.google.android.play:review-ktx:2.0.1' - playImplementation "com.google.android.ump:user-messaging-platform:2.2.0" + playImplementation "com.google.android.ump:user-messaging-platform:2.1.0" hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.301' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.303' From b613b844692580874099e0d205919fb11b1d7b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 22 Feb 2024 16:15:24 +0100 Subject: [PATCH 1363/1526] Version 2.4.2 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c3a7baabd..26c2547e5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 147 - versionName "2.4.1" + versionCode 148 + versionName "2.4.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -164,8 +164,8 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.50d - updatePriority = 1 + userFraction = 0.99d + updatePriority = 2 enabled.set(false) } diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 5736992bf..ef6308b6c 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,7 @@ -Wersja 2.4.1 +Wersja 2.4.2 -- drobne poprawki stabilności aplikacji i odświeżania danych +- naprawiliśmy crash przy przełączaniu uczniów, motywów i języków +- naprawiliśmy crash przy dodawaniu dodatkowych lekcji +- naprawiliśmy obsługę błędów widżetach Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 31854fc4b86f3b66f63720709d423a62fa13b2c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 25 Feb 2024 16:35:56 +0100 Subject: [PATCH 1364/1526] Fix text cut off across the app when text size is set to 200% (#2435) --- app/src/main/res/layout/activity_main.xml | 2 +- .../main/res/layout/dialog_account_edit.xml | 6 ++-- .../main/res/layout/dialog_additional_add.xml | 6 ++-- app/src/main/res/layout/dialog_attendance.xml | 3 +- app/src/main/res/layout/dialog_conference.xml | 3 +- app/src/main/res/layout/dialog_exam.xml | 6 ++-- app/src/main/res/layout/dialog_grade.xml | 3 +- app/src/main/res/layout/dialog_homework.xml | 6 ++-- .../main/res/layout/dialog_homework_add.xml | 6 ++-- .../res/layout/dialog_lesson_completed.xml | 3 +- .../main/res/layout/dialog_mobile_device.xml | 18 +++++----- app/src/main/res/layout/dialog_note.xml | 3 +- .../res/layout/dialog_school_announcement.xml | 3 +- app/src/main/res/layout/dialog_timetable.xml | 3 +- .../main/res/layout/header_grade_details.xml | 15 +++++++++ app/src/main/res/layout/item_timetable.xml | 33 ++++++++++++------- .../layout/subitem_dashboard_small_grade.xml | 4 +++ 17 files changed, 86 insertions(+), 37 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d14de50a1..a9284234e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -16,7 +16,7 @@ + android:layout_height="wrap_content" /> diff --git a/app/src/main/res/layout/dialog_homework.xml b/app/src/main/res/layout/dialog_homework.xml index 8c6cf0a76..10b719077 100644 --- a/app/src/main/res/layout/dialog_homework.xml +++ b/app/src/main/res/layout/dialog_homework.xml @@ -27,7 +27,7 @@ android:id="@+id/homeworkDialogRead" style="@style/Widget.Material3.Button.TextButton.Dialog" android:layout_width="wrap_content" - android:layout_height="36dp" + android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginEnd="8dp" android:layout_marginBottom="24dp" @@ -35,6 +35,7 @@ android:insetTop="0dp" android:insetRight="0dp" android:insetBottom="0dp" + android:minHeight="36dp" android:text="@string/homework_mark_as_done" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/homeworkDialogClose" /> @@ -43,13 +44,14 @@ android:id="@+id/homeworkDialogClose" style="@style/Widget.Material3.Button.TextButton.Dialog" android:layout_width="wrap_content" - android:layout_height="36dp" + android:layout_height="wrap_content" android:layout_marginEnd="24dp" android:layout_marginBottom="24dp" android:insetLeft="0dp" android:insetTop="0dp" android:insetRight="0dp" android:insetBottom="0dp" + android:minHeight="36dp" android:text="@string/all_close" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/dialog_homework_add.xml b/app/src/main/res/layout/dialog_homework_add.xml index e0ff5b749..dc7ae32d5 100644 --- a/app/src/main/res/layout/dialog_homework_add.xml +++ b/app/src/main/res/layout/dialog_homework_add.xml @@ -94,7 +94,7 @@ android:id="@+id/homeworkDialogClose" style="@style/Widget.Material3.Button.TextButton.Dialog" android:layout_width="wrap_content" - android:layout_height="36dp" + android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="24dp" android:layout_marginEnd="8dp" @@ -103,6 +103,7 @@ android:insetTop="0dp" android:insetRight="0dp" android:insetBottom="0dp" + android:minHeight="36dp" android:text="@string/all_close" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/homeworkDialogAdd" @@ -112,13 +113,14 @@ android:id="@+id/homeworkDialogAdd" style="@style/Widget.Material3.Button.TextButton.Dialog" android:layout_width="wrap_content" - android:layout_height="36dp" + android:layout_height="wrap_content" android:layout_marginTop="24dp" android:layout_marginBottom="24dp" android:insetLeft="0dp" android:insetTop="0dp" android:insetRight="0dp" android:insetBottom="0dp" + android:minHeight="36dp" android:text="@string/all_add" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/dialog_lesson_completed.xml b/app/src/main/res/layout/dialog_lesson_completed.xml index 3a1d3fd00..fc32a252a 100644 --- a/app/src/main/res/layout/dialog_lesson_completed.xml +++ b/app/src/main/res/layout/dialog_lesson_completed.xml @@ -212,7 +212,7 @@ android:id="@+id/completedLessonDialogClose" style="@style/Widget.Material3.Button.TextButton.Dialog" android:layout_width="wrap_content" - android:layout_height="36dp" + android:layout_height="wrap_content" android:layout_marginTop="24dp" android:layout_marginEnd="16dp" android:layout_marginBottom="24dp" @@ -220,6 +220,7 @@ android:insetTop="0dp" android:insetRight="0dp" android:insetBottom="0dp" + android:minHeight="36dp" android:text="@string/all_close" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/dialog_mobile_device.xml b/app/src/main/res/layout/dialog_mobile_device.xml index 9b81737fb..c526ed74c 100644 --- a/app/src/main/res/layout/dialog_mobile_device.xml +++ b/app/src/main/res/layout/dialog_mobile_device.xml @@ -18,10 +18,10 @@ android:layout_marginTop="24dp" android:adjustViewBounds="true" android:contentDescription="@string/mobile_device_qr" - tools:src="@tools:sample/avatars" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:src="@tools:sample/avatars" /> + + app:constraint_referenced_ids="mobileDeviceQr,mobileDeviceDialogTokenTitle,mobileDeviceDialogTokenValue,mobileDeviceDialogSymbolTitle,mobileDeviceDialogSymbolValue,mobileDeviceDialogPinTitle,mobileDeviceDialogPinValue,mobileDeviceDialogClose" + tools:visibility="visible" /> + tools:visibility="invisible" /> diff --git a/app/src/main/res/layout/dialog_note.xml b/app/src/main/res/layout/dialog_note.xml index 9c8b18b32..3b88ea5f8 100644 --- a/app/src/main/res/layout/dialog_note.xml +++ b/app/src/main/res/layout/dialog_note.xml @@ -180,7 +180,7 @@ android:id="@+id/noteDialogClose" style="@style/Widget.Material3.Button.TextButton.Dialog" android:layout_width="wrap_content" - android:layout_height="36dp" + android:layout_height="wrap_content" android:layout_marginTop="24dp" android:layout_marginEnd="16dp" android:layout_marginBottom="24dp" @@ -188,6 +188,7 @@ android:insetTop="0dp" android:insetRight="0dp" android:insetBottom="0dp" + android:minHeight="36dp" android:text="@string/all_close" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/dialog_school_announcement.xml b/app/src/main/res/layout/dialog_school_announcement.xml index 4e0ef556f..a771b772f 100644 --- a/app/src/main/res/layout/dialog_school_announcement.xml +++ b/app/src/main/res/layout/dialog_school_announcement.xml @@ -122,7 +122,7 @@ android:id="@+id/announcementDialogClose" style="@style/Widget.Material3.Button.TextButton.Dialog" android:layout_width="wrap_content" - android:layout_height="36dp" + android:layout_height="wrap_content" android:layout_marginTop="24dp" android:layout_marginEnd="16dp" android:layout_marginBottom="24dp" @@ -130,6 +130,7 @@ android:insetTop="0dp" android:insetRight="0dp" android:insetBottom="0dp" + android:minHeight="36dp" android:text="@string/all_close" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/dialog_timetable.xml b/app/src/main/res/layout/dialog_timetable.xml index aeb01b3ba..de2696482 100644 --- a/app/src/main/res/layout/dialog_timetable.xml +++ b/app/src/main/res/layout/dialog_timetable.xml @@ -263,7 +263,7 @@ android:id="@+id/timetableDialogClose" style="@style/Widget.Material3.Button.TextButton.Dialog" android:layout_width="wrap_content" - android:layout_height="36dp" + android:layout_height="wrap_content" android:layout_marginTop="24dp" android:layout_marginEnd="16dp" android:layout_marginBottom="24dp" @@ -271,6 +271,7 @@ android:insetTop="0dp" android:insetRight="0dp" android:insetBottom="0dp" + android:minHeight="36dp" android:text="@string/all_close" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/header_grade_details.xml b/app/src/main/res/layout/header_grade_details.xml index f2ba9a8c9..e43e8993f 100644 --- a/app/src/main/res/layout/header_grade_details.xml +++ b/app/src/main/res/layout/header_grade_details.xml @@ -45,6 +45,9 @@ android:textColor="?android:textColorSecondary" android:textSize="12sp" app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@id/gradeHeaderPointsSum" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintStart_toStartOf="@id/gradeHeaderSubject" app:layout_constraintTop_toBottomOf="@+id/gradeHeaderSubject" tools:text="Average: 6,00" /> @@ -55,8 +58,12 @@ android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginTop="5dp" + android:ellipsize="end" + android:maxLines="1" android:textColor="?android:textColorSecondary" android:textSize="12sp" + app:layout_constrainedWidth="true" + app:layout_constraintEnd_toStartOf="@id/gradeHeaderNumber" app:layout_constraintStart_toEndOf="@+id/gradeHeaderAverage" app:layout_constraintTop_toBottomOf="@+id/gradeHeaderSubject" tools:text="Points: 123/200 (61,5%)" /> @@ -67,8 +74,13 @@ android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginTop="5dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:maxLines="1" android:textColor="?android:textColorSecondary" android:textSize="12sp" + app:layout_constrainedWidth="true" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/gradeHeaderPointsSum" app:layout_constraintTop_toBottomOf="@id/gradeHeaderSubject" tools:text="12 grades" /> @@ -85,6 +97,9 @@ android:paddingRight="5dp" android:textColor="?colorOnPrimary" android:textSize="14sp" + app:autoSizeMaxTextSize="16dp" + app:autoSizeMinTextSize="10dp" + app:autoSizeTextType="uniform" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/item_timetable.xml b/app/src/main/res/layout/item_timetable.xml index 57af6f7ea..b9966c121 100644 --- a/app/src/main/res/layout/item_timetable.xml +++ b/app/src/main/res/layout/item_timetable.xml @@ -1,7 +1,6 @@ @@ -49,8 +49,9 @@ android:maxLines="1" android:textColor="?android:textColorSecondary" android:textSize="13sp" + app:layout_constraintBottom_toTopOf="@id/timetableItemTimeFinish" app:layout_constraintStart_toEndOf="@id/timetableItemNumber" - app:layout_constraintTop_toTopOf="@id/timetableItemNumber" + app:layout_constraintTop_toTopOf="parent" tools:text="11:11" /> @@ -83,13 +91,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" - android:layout_marginTop="0dp" - android:layout_marginEnd="5dp" + android:layout_marginEnd="0dp" + android:ellipsize="end" + android:maxLines="1" android:textColor="?android:textColorSecondary" android:textSize="13sp" app:layout_constraintEnd_toStartOf="@+id/timetableItemTeacher" app:layout_constraintStart_toEndOf="@+id/timetableItemRoom" - app:layout_constraintTop_toTopOf="@+id/timetableItemTimeFinish" + app:layout_constraintTop_toTopOf="@id/timetableItemTimeFinish" tools:text="(2/2)" tools:visibility="visible" /> @@ -98,13 +107,15 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" - android:layout_marginEnd="16dp" + android:layout_marginEnd="8dp" android:ellipsize="end" android:maxLines="1" android:textColor="?android:textColorSecondary" android:textSize="13sp" - app:layout_constraintBottom_toBottomOf="@+id/timetableItemNumber" + app:layout_constrainedWidth="true" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/timetableItemGroup" + app:layout_constraintTop_toTopOf="@id/timetableItemTimeFinish" tools:text="Agata Kowalska - Błaszczyk" tools:visibility="visible" /> diff --git a/app/src/main/res/layout/subitem_dashboard_small_grade.xml b/app/src/main/res/layout/subitem_dashboard_small_grade.xml index 6800b72e9..3684c2677 100644 --- a/app/src/main/res/layout/subitem_dashboard_small_grade.xml +++ b/app/src/main/res/layout/subitem_dashboard_small_grade.xml @@ -1,5 +1,6 @@ From e378b4c70adc8b4e4be7f302c51a16c9377066cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 25 Feb 2024 16:36:50 +0100 Subject: [PATCH 1365/1526] Fix loading timetable and attendance when should be refreshed returns true (#2436) --- .../wulkanowy/data/db/dao/TimetableDao.kt | 2 +- .../data/repositories/AttendanceRepository.kt | 10 +++------ .../data/repositories/TimetableRepository.kt | 22 ++++++++++++++----- .../IsStudentHasLessonsOnWeekendUseCase.kt | 11 ++-------- .../services/sync/works/TimetableWork.kt | 4 +--- .../modules/attendance/AttendancePresenter.kt | 18 ++++++--------- .../modules/dashboard/DashboardPresenter.kt | 2 +- .../modules/timetable/TimetablePresenter.kt | 7 +++--- 8 files changed, 34 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt index b4b7379f2..40d97ea96 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt @@ -15,5 +15,5 @@ interface TimetableDao : BaseDao { fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow> @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 + suspend fun load(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List } 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 6d782047b..bbf627de0 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 @@ -16,10 +16,8 @@ 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.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.withContext import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime @@ -58,11 +56,9 @@ class AttendanceRepository @Inject constructor( attendanceDb.loadAll(semester.diaryId, semester.studentId, start.monday, end.sunday) }, fetch = { - val lessons = withContext(Dispatchers.IO) { - timetableDb.load( - semester.diaryId, semester.studentId, start.monday, end.sunday - ) - } + val lessons = timetableDb.load( + semester.diaryId, semester.studentId, start.monday, end.sunday + ) sdk.init(student) .switchSemester(semester) .getAttendance(start.monday, end.sunday) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index 9305d3b31..acbd02d18 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -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.TimetableDao 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.networkBoundResource import io.github.wulkanowy.data.pojos.TimetableFull import io.github.wulkanowy.sdk.Sdk 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.combine import kotlinx.coroutines.sync.Mutex @@ -121,12 +131,12 @@ class TimetableRepository @Inject constructor( } } - fun getTimetableFromDatabase( + suspend fun getTimetableFromDatabase( semester: Semester, - from: LocalDate, + start: LocalDate, end: LocalDate - ): Flow> { - return timetableDb.loadAll(semester.diaryId, semester.studentId, from, end) + ): List { + return timetableDb.load(semester.diaryId, semester.studentId, start, end) } suspend fun updateTimetable(timetable: List) { diff --git a/app/src/main/java/io/github/wulkanowy/domain/timetable/IsStudentHasLessonsOnWeekendUseCase.kt b/app/src/main/java/io/github/wulkanowy/domain/timetable/IsStudentHasLessonsOnWeekendUseCase.kt index efe928e2b..ffd005740 100644 --- a/app/src/main/java/io/github/wulkanowy/domain/timetable/IsStudentHasLessonsOnWeekendUseCase.kt +++ b/app/src/main/java/io/github/wulkanowy/domain/timetable/IsStudentHasLessonsOnWeekendUseCase.kt @@ -1,10 +1,7 @@ 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.Student import io.github.wulkanowy.data.repositories.TimetableRepository -import io.github.wulkanowy.data.toFirstResult import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.sunday import java.time.LocalDate @@ -16,18 +13,14 @@ class IsStudentHasLessonsOnWeekendUseCase @Inject constructor( ) { suspend operator fun invoke( - student: Student, semester: Semester, currentDate: LocalDate = LocalDate.now(), ): Boolean { - val lessons = timetableRepository.getTimetable( - student = student, + val lessons = timetableRepository.getTimetableFromDatabase( semester = semester, start = currentDate.monday, end = currentDate.sunday, - forceRefresh = false, - timetableType = TimetableRepository.TimetableType.NORMAL - ).toFirstResult().dataOrNull?.lessons.orEmpty() + ) return isWeekendHasLessonsUseCase(lessons) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt index ac9a8eb4c..2d10d925c 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.repositories.TimetableRepository import io.github.wulkanowy.data.waitForResult import io.github.wulkanowy.services.sync.notifications.ChangeTimetableNotification import io.github.wulkanowy.utils.nextOrSameSchoolDay -import kotlinx.coroutines.flow.first import java.time.LocalDate.now import javax.inject.Inject @@ -31,10 +30,9 @@ class TimetableWork @Inject constructor( timetableRepository.getTimetableFromDatabase( semester = semester, - from = startDate, + start = startDate, end = endDate, ) - .first() .filterNot { it.isNotified } .let { if (it.isNotEmpty()) changeTimetableNotification.notify(it, student) 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 f66479daf..82fe69cb7 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 @@ -4,18 +4,14 @@ import android.annotation.SuppressLint 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.firstOrNull import kotlinx.coroutines.flow.onEach import timber.log.Timber import java.time.DayOfWeek @@ -210,7 +206,7 @@ class AttendancePresenter @Inject constructor( val semester = semesterRepository.getCurrentSemester(student) - checkInitialAndCurrentDate(student, semester) + checkInitialAndCurrentDate(semester) attendanceRepository.getAttendance( student = student, semester = semester, @@ -266,15 +262,13 @@ class AttendancePresenter @Inject constructor( .launch() } - private suspend fun checkInitialAndCurrentDate(student: Student, semester: Semester) { + private suspend fun checkInitialAndCurrentDate(semester: Semester) { if (initialDate == null) { - val lessons = attendanceRepository.getAttendance( - student = student, + val lessons = attendanceRepository.getAttendanceFromDatabase( semester = semester, start = now().monday, end = now().sunday, - forceRefresh = false, - ).toFirstResult().dataOrNull.orEmpty() + ).firstOrNull().orEmpty() isWeekendHasLessons = isWeekendHasLessons(lessons) initialDate = getInitialDate(semester) } @@ -316,6 +310,7 @@ class AttendancePresenter @Inject constructor( showContent(false) showExcuseButton(false) } + is Resource.Success -> { Timber.i("Excusing for absence result: Success") analytics.logEvent("excuse_absence", "items" to attendanceToExcuseList.size) @@ -328,6 +323,7 @@ class AttendancePresenter @Inject constructor( } loadData(forceRefresh = true) } + is Resource.Error -> { Timber.i("Excusing for absence result: An exception occurred") errorHandler.dispatch(it.error) 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 1e6f1c198..784ac112f 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 @@ -438,7 +438,7 @@ class DashboardPresenter @Inject constructor( private fun loadLessons(student: Student, forceRefresh: Boolean) { flatResourceFlow { val semester = semesterRepository.getCurrentSemester(student) - val date = when (isStudentHasLessonsOnWeekendUseCase(student, semester)) { + val date = when (isStudentHasLessonsOnWeekendUseCase(semester)) { true -> LocalDate.now() else -> LocalDate.now().nextOrSameSchoolDay } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 7e8c876ef..e83f25176 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.ui.modules.timetable import android.os.Handler import android.os.Looper 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.enums.TimetableGapsMode.BETWEEN_AND_BEFORE_LESSONS import io.github.wulkanowy.data.enums.TimetableGapsMode.NO_GAPS @@ -150,7 +149,7 @@ class TimetablePresenter @Inject constructor( val student = studentRepository.getCurrentStudent() val semester = semesterRepository.getCurrentSemester(student) - checkInitialAndCurrentDate(student, semester) + checkInitialAndCurrentDate(semester) timetableRepository.getTimetable( student = student, semester = semester, @@ -194,9 +193,9 @@ class TimetablePresenter @Inject constructor( .launch() } - private suspend fun checkInitialAndCurrentDate(student: Student, semester: Semester) { + private suspend fun checkInitialAndCurrentDate(semester: Semester) { if (initialDate == null) { - isWeekendHasLessons = isStudentHasLessonsOnWeekendUseCase(student, semester) + isWeekendHasLessons = isStudentHasLessonsOnWeekendUseCase(semester) initialDate = getInitialDate(semester) } From d5c17285c1ce29c87e3f28cf380b8691d7bb468a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 25 Feb 2024 16:37:28 +0100 Subject: [PATCH 1366/1526] Fix error handling in login (#2437) --- app/build.gradle | 2 +- .../main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt | 6 +++++- .../io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt | 6 +++++- .../wulkanowy/ui/modules/login/form/LoginFormPresenter.kt | 4 ++++ .../java/io/github/wulkanowy/utils/ExceptionExtension.kt | 2 ++ app/src/main/res/values/api_hosts.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 7 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 26c2547e5..b81236672 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.4.1' + implementation 'io.github.wulkanowy:sdk:2.4.2-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index e17c0c9ec..7109f1ffd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -34,7 +34,7 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co } protected open fun proceed(error: Throwable) { - showErrorMessage(context.resources.getErrorString(error), error) + showDefaultMessage(error) when (error) { is PasswordChangeRequiredException -> onPasswordChangeRequired(error.redirectUrl) is ScramblerException -> onDecryptionFailed() @@ -45,6 +45,10 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co } } + fun showDefaultMessage(error: Throwable) { + showErrorMessage(context.resources.getErrorString(error), error) + } + open fun clear() { showErrorMessage = { _, _ -> } onExpiredCredentials = {} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt index 8f579712b..3c061f498 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt @@ -62,7 +62,11 @@ class AuthPresenter @Inject constructor( } isSuccess } - .onFailure { errorHandler.dispatch(it) } + .onFailure { + errorHandler.dispatch(it) + view?.showProgress(false) + view?.showContent(true) + } .onSuccess { if (it) { view?.showSuccess(true) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index 69e1d027d..39bc3f02d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.resourceFlow import io.github.wulkanowy.domain.adminmessage.GetAppropriateAdminMessageUseCase +import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.LoginErrorHandler @@ -204,6 +205,9 @@ class LoginFormPresenter @Inject constructor( } .onResourceError { loginErrorHandler.dispatch(it) + if (it is InvalidSymbolException) { + loginErrorHandler.showDefaultMessage(it) + } lastError = it view?.showContact(true) analytics.logEvent( diff --git a/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt index 18fc10bba..1c2290510 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.utils import android.content.res.Resources import io.github.wulkanowy.R import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException +import io.github.wulkanowy.sdk.scrapper.exception.AccountInactiveException import io.github.wulkanowy.sdk.scrapper.exception.CloudflareVerificationException import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import io.github.wulkanowy.sdk.scrapper.exception.ScrapperException @@ -33,6 +34,7 @@ fun Resources.getErrorString(error: Throwable): String = when (error) { is ServiceUnavailableException -> R.string.error_service_unavailable is FeatureDisabledException -> R.string.error_feature_disabled is FeatureNotAvailableException -> R.string.error_feature_not_available + is AccountInactiveException -> R.string.error_account_inactive is VulcanException -> R.string.error_unknown_uonet is ScrapperException -> R.string.error_unknown_app is CloudflareVerificationException -> R.string.error_cloudflare_captcha diff --git a/app/src/main/res/values/api_hosts.xml b/app/src/main/res/values/api_hosts.xml index 6439b462f..9768329d0 100644 --- a/app/src/main/res/values/api_hosts.xml +++ b/app/src/main/res/values/api_hosts.xml @@ -66,7 +66,7 @@ gminaulanmajorat gminaozorkow gminalopiennikgorny - warszawa + saas1 powiatwulkanowy diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0a4dcf7f4..faed4d186 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -852,6 +852,7 @@ No internet connection An error occurred. Check your device clock + This account is inactive. Try logging in again Connection to register failed. Servers can be overloaded. Please try again later Loading data failed. Please try again later Register password change required From 74a20b2f65cb7af7be333fba86990f3961d94643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 27 Feb 2024 09:42:44 +0100 Subject: [PATCH 1367/1526] Add Github Sponsor (#2444) --- .github/FUNDING.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..cdce0759b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +github: wulkanowy +custom: https://www.paypal.com/paypalme/wulkanowy From 1b8c3899842505a4f1616fac8ce7b550afb602ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 08:52:47 +0000 Subject: [PATCH 1368/1526] Bump io.coil-kt:coil from 2.5.0 to 2.6.0 (#2441) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b81236672..e88d9205d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -246,7 +246,7 @@ dependencies { implementation 'com.github.Faierbel:slf4j-timber:2.0' implementation 'com.github.bastienpaulfr:Treessence:1.1.2' implementation "com.mikepenz:aboutlibraries-core:$about_libraries" - implementation 'io.coil-kt:coil:2.5.0' + implementation 'io.coil-kt:coil:2.6.0' implementation "io.github.wulkanowy:AppKillerManager:3.0.1" implementation 'me.xdrop:fuzzywuzzy:1.4.0' implementation 'com.fredporciuncula:flow-preferences:1.9.1' From 1ab300d74f4ea41c395f4db1d7b8f926e363b3c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 08:53:00 +0000 Subject: [PATCH 1369/1526] Bump android_hilt from 1.1.0 to 1.2.0 (#2443) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e88d9205d..07efeb2f2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,7 +187,7 @@ huaweiPublish { ext { work_manager = "2.9.0" - android_hilt = "1.1.0" + android_hilt = "1.2.0" room = "2.6.1" chucker = "4.0.0" mockk = "1.13.9" From 7a4032dda4e3061a09ecffd69712b3598e82e414 Mon Sep 17 00:00:00 2001 From: JestemKamil <84380834+JestemKamil@users.noreply.github.com> Date: Thu, 29 Feb 2024 21:30:02 +0100 Subject: [PATCH 1370/1526] Add mute message senders (#2415) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- .../60.json | 2527 +++++++++++++++++ app/src/main/assets/contributors.json | 4 + .../io/github/wulkanowy/data/DataModule.kt | 4 + .../github/wulkanowy/data/db/AppDatabase.kt | 8 +- .../wulkanowy/data/db/dao/MessagesDao.kt | 10 +- .../data/db/dao/MutedMessageSendersDao.kt | 20 + .../data/db/entities/MessageWithAttachment.kt | 8 +- .../db/entities/MessageWithMutedAuthor.kt | 12 + .../data/db/entities/MutedMessageSender.kt | 15 + .../data/repositories/MessageRepository.kt | 35 +- .../modules/dashboard/DashboardPresenter.kt | 1 + .../message/preview/MessagePreviewAdapter.kt | 6 + .../message/preview/MessagePreviewFragment.kt | 18 +- .../preview/MessagePreviewPresenter.kt | 106 +- .../message/preview/MessagePreviewView.kt | 6 + .../modules/message/tab/MessageTabAdapter.kt | 16 +- .../modules/message/tab/MessageTabDataItem.kt | 1 + .../message/tab/MessageTabPresenter.kt | 38 +- .../res/drawable/ic_circle_notification.xml | 10 + .../res/drawable/ic_notifications_off.xml | 5 + app/src/main/res/layout/item_message.xml | 6 +- .../res/menu/action_menu_message_preview.xml | 7 + app/src/main/res/values/strings.xml | 6 + .../repositories/MessageRepositoryTest.kt | 47 +- 24 files changed, 2827 insertions(+), 89 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/60.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/dao/MutedMessageSendersDao.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/entities/MessageWithMutedAuthor.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/entities/MutedMessageSender.kt create mode 100644 app/src/main/res/drawable/ic_circle_notification.xml create mode 100644 app/src/main/res/drawable/ic_notifications_off.xml diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/60.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/60.json new file mode 100644 index 000000000..20eacad1c --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/60.json @@ -0,0 +1,2527 @@ +{ + "formatVersion": 1, + "database": { + "version": 60, + "identityHash": "3672d3f4d5e6b874e5a22d2bb458dc65", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `scrapper_domain_suffix` TEXT NOT NULL DEFAULT '', `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperDomainSuffix", + "columnName": "scrapper_domain_suffix", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `kindergarten_diary_id` INTEGER NOT NULL DEFAULT 0, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "kindergartenDiaryId", + "columnName": "kindergarten_diary_id", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "kindergarten_diary_id", + "semester_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `kindergarten_diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`email` TEXT NOT NULL, `message_global_key` TEXT NOT NULL, `mailbox_key` TEXT NOT NULL, `message_id` INTEGER NOT NULL, `correspondents` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `read_by` INTEGER, `unread_by` INTEGER, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `content` TEXT NOT NULL, `sender` TEXT, `recipients` TEXT)", + "fields": [ + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mailboxKey", + "columnName": "mailbox_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "correspondents", + "columnName": "correspondents", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "recipients", + "columnName": "recipients", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`message_global_key` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`message_global_key`, `url`, `filename`))", + "fields": [ + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "message_global_key", + "url", + "filename" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Mailboxes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`globalKey` TEXT NOT NULL, `email` TEXT NOT NULL, `symbol` TEXT NOT NULL, `schoolId` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `studentName` TEXT NOT NULL, `schoolNameShort` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`globalKey`))", + "fields": [ + { + "fieldPath": "globalKey", + "columnName": "globalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolId", + "columnName": "schoolId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "studentName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolNameShort", + "columnName": "schoolNameShort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "globalKey" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`mailboxGlobalKey` TEXT NOT NULL, `studentMailboxGlobalKey` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `schoolShortName` TEXT NOT NULL, `type` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "mailboxGlobalKey", + "columnName": "mailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentMailboxGlobalKey", + "columnName": "studentMailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "schoolShortName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `repeat_id` BLOB DEFAULT NULL, `is_added_by_user` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatId", + "columnName": "repeat_id", + "affinity": "BLOB", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `destination` TEXT NOT NULL DEFAULT '{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}', `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "destination", + "columnName": "destination", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}'" + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `types` TEXT NOT NULL DEFAULT '[]', `is_ok_visible` INTEGER NOT NULL DEFAULT 0, `is_x_visible` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "types", + "columnName": "types", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'[]'" + }, + { + "fieldPath": "isOkVisible", + "columnName": "is_ok_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "isXVisible", + "columnName": "is_x_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MutedMessageSenders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`author` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesDescriptive", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `description` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '3672d3f4d5e6b874e5a22d2bb458dc65')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/assets/contributors.json b/app/src/main/assets/contributors.json index a7629c22f..97ac9356f 100644 --- a/app/src/main/assets/contributors.json +++ b/app/src/main/assets/contributors.json @@ -54,5 +54,9 @@ { "displayName": "Antoni Paduch", "githubUsername": "janAte1" + }, + { + "displayName": "Kamil Wąsik", + "githubUsername": "JestemKamil" } ] diff --git a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt index 7c9cf9a3c..6b6c9d329 100644 --- a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt @@ -254,6 +254,10 @@ internal class DataModule { @Provides fun provideAdminMessageDao(database: AppDatabase) = database.adminMessagesDao + @Singleton + @Provides + fun provideMutesDao(database: AppDatabase) = database.mutedMessageSendersDao + @Singleton @Provides fun provideGradeDescriptiveDao(database: AppDatabase) = database.gradeDescriptiveDao diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 8e5841fe7..21a6e3f3e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -25,6 +25,7 @@ import io.github.wulkanowy.data.db.dao.MailboxDao import io.github.wulkanowy.data.db.dao.MessageAttachmentDao import io.github.wulkanowy.data.db.dao.MessagesDao import io.github.wulkanowy.data.db.dao.MobileDeviceDao +import io.github.wulkanowy.data.db.dao.MutedMessageSendersDao import io.github.wulkanowy.data.db.dao.NoteDao import io.github.wulkanowy.data.db.dao.NotificationDao import io.github.wulkanowy.data.db.dao.RecipientDao @@ -56,6 +57,7 @@ import io.github.wulkanowy.data.db.entities.Mailbox import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.db.entities.MobileDevice +import io.github.wulkanowy.data.db.entities.MutedMessageSender import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.db.entities.Notification import io.github.wulkanowy.data.db.entities.Recipient @@ -157,6 +159,7 @@ import javax.inject.Singleton SchoolAnnouncement::class, Notification::class, AdminMessage::class, + MutedMessageSender::class, GradeDescriptive::class, ], autoMigrations = [ @@ -169,6 +172,7 @@ import javax.inject.Singleton AutoMigration(from = 56, to = 57, spec = Migration57::class), AutoMigration(from = 57, to = 58, spec = Migration58::class), AutoMigration(from = 58, to = 59), + AutoMigration(from = 59, to = 60), ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -177,7 +181,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 59 + const val VERSION_SCHEMA = 60 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), @@ -303,5 +307,7 @@ abstract class AppDatabase : RoomDatabase() { abstract val adminMessagesDao: AdminMessageDao + abstract val mutedMessageSendersDao: MutedMessageSendersDao + abstract val gradeDescriptiveDao: GradeDescriptiveDao } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt index 1709f7636..11e6da1e7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt @@ -5,15 +5,23 @@ import androidx.room.Query import androidx.room.Transaction import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment +import io.github.wulkanowy.data.db.entities.MessageWithMutedAuthor import kotlinx.coroutines.flow.Flow @Dao interface MessagesDao : BaseDao { - @Transaction @Query("SELECT * FROM Messages WHERE message_global_key = :messageGlobalKey") fun loadMessageWithAttachment(messageGlobalKey: String): Flow + @Transaction + @Query("SELECT * FROM Messages WHERE mailbox_key = :mailboxKey AND folder_id = :folder ORDER BY date DESC") + fun loadMessagesWithMutedAuthor(mailboxKey: String, folder: Int): Flow> + + @Transaction + @Query("SELECT * FROM Messages WHERE email = :email AND folder_id = :folder ORDER BY date DESC") + fun loadMessagesWithMutedAuthor(folder: Int, email: String): Flow> + @Query("SELECT * FROM Messages WHERE mailbox_key = :mailboxKey AND folder_id = :folder ORDER BY date DESC") fun loadAll(mailboxKey: String, folder: Int): Flow> diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MutedMessageSendersDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MutedMessageSendersDao.kt new file mode 100644 index 000000000..0a8664010 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MutedMessageSendersDao.kt @@ -0,0 +1,20 @@ +package io.github.wulkanowy.data.db.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import io.github.wulkanowy.data.db.entities.MutedMessageSender + +@Dao +interface MutedMessageSendersDao : BaseDao { + + @Query("SELECT COUNT(*) FROM MutedMessageSenders WHERE author = :author") + suspend fun checkMute(author: String): Boolean + + @Insert(onConflict = OnConflictStrategy.IGNORE) + suspend fun insertMute(mute: MutedMessageSender): Long + + @Query("DELETE FROM MutedMessageSenders WHERE author = :author") + suspend fun deleteMute(author: String) +} diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/MessageWithAttachment.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/MessageWithAttachment.kt index cd468215d..fc890e760 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/MessageWithAttachment.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/MessageWithAttachment.kt @@ -2,11 +2,15 @@ package io.github.wulkanowy.data.db.entities import androidx.room.Embedded import androidx.room.Relation +import java.io.Serializable data class MessageWithAttachment( @Embedded val message: Message, @Relation(parentColumn = "message_global_key", entityColumn = "message_global_key") - val attachments: List -) + val attachments: List, + + @Relation(parentColumn = "correspondents", entityColumn = "author") + val mutedMessageSender: MutedMessageSender?, +) : Serializable diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/MessageWithMutedAuthor.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/MessageWithMutedAuthor.kt new file mode 100644 index 000000000..e3cd1ca7d --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/MessageWithMutedAuthor.kt @@ -0,0 +1,12 @@ +package io.github.wulkanowy.data.db.entities + +import androidx.room.Embedded +import androidx.room.Relation + +data class MessageWithMutedAuthor( + @Embedded + val message: Message, + + @Relation(parentColumn = "correspondents", entityColumn = "author") + val mutedMessageSender: MutedMessageSender?, +) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/MutedMessageSender.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/MutedMessageSender.kt new file mode 100644 index 000000000..f1770e64c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/MutedMessageSender.kt @@ -0,0 +1,15 @@ +package io.github.wulkanowy.data.db.entities + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import java.io.Serializable + +@Entity(tableName = "MutedMessageSenders") +data class MutedMessageSender( + @ColumnInfo(name = "author") + val author: String, +) : Serializable { + @PrimaryKey(autoGenerate = true) + var id: Long = 0 +} diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index c8fccb23d..6d591c5bb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -8,9 +8,12 @@ import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.dao.MailboxDao import io.github.wulkanowy.data.db.dao.MessageAttachmentDao import io.github.wulkanowy.data.db.dao.MessagesDao +import io.github.wulkanowy.data.db.dao.MutedMessageSendersDao import io.github.wulkanowy.data.db.entities.Mailbox import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment +import io.github.wulkanowy.data.db.entities.MessageWithMutedAuthor +import io.github.wulkanowy.data.db.entities.MutedMessageSender import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.enums.MessageFolder @@ -42,6 +45,7 @@ import javax.inject.Singleton @Singleton class MessageRepository @Inject constructor( private val messagesDb: MessagesDao, + private val mutedMessageSendersDao: MutedMessageSendersDao, private val messageAttachmentDao: MessageAttachmentDao, private val sdk: Sdk, @ApplicationContext private val context: Context, @@ -51,7 +55,6 @@ class MessageRepository @Inject constructor( private val mailboxDao: MailboxDao, private val getMailboxByStudentUseCase: GetMailboxByStudentUseCase, ) { - private val saveFetchResultMutex = Mutex() private val messagesCacheKey = "message" @@ -63,7 +66,7 @@ class MessageRepository @Inject constructor( folder: MessageFolder, forceRefresh: Boolean, notify: Boolean = false, - ): Flow>> = networkBoundResource( + ): Flow>> = networkBoundResource( mutex = saveFetchResultMutex, isResultEmpty = { it.isEmpty() }, shouldFetch = { @@ -74,8 +77,8 @@ class MessageRepository @Inject constructor( }, query = { if (mailbox == null) { - messagesDb.loadAll(folder.id, student.email) - } else messagesDb.loadAll(mailbox.globalKey, folder.id) + messagesDb.loadMessagesWithMutedAuthor(folder.id, student.email) + } else messagesDb.loadMessagesWithMutedAuthor(mailbox.globalKey, folder.id) }, fetch = { sdk.init(student).getMessages( @@ -83,10 +86,12 @@ class MessageRepository @Inject constructor( mailboxKey = mailbox?.globalKey, ).mapToEntities(student, mailbox, mailboxDao.loadAll(student.email)) }, - saveFetchResult = { old, new -> + saveFetchResult = { oldWithAuthors, new -> + val old = oldWithAuthors.map { it.message } messagesDb.deleteAll(old uniqueSubtract new) messagesDb.insertAll((new uniqueSubtract old).onEach { - it.isNotified = !notify + val muted = isMuted(it.correspondents) + it.isNotified = !notify || muted }) refreshHelper.updateLastRefreshTimestamp( @@ -106,9 +111,7 @@ class MessageRepository @Inject constructor( Timber.d("Message content in db empty: ${it.message.content.isBlank()}") (it.message.unread && markAsRead) || it.message.content.isBlank() }, - query = { - messagesDb.loadMessageWithAttachment(message.messageGlobalKey) - }, + query = { messagesDb.loadMessageWithAttachment(message.messageGlobalKey) }, fetch = { sdk.init(student).getMessageDetails( messageKey = it!!.message.messageGlobalKey, @@ -236,4 +239,18 @@ class MessageRepository @Inject constructor( context.getString(R.string.pref_key_message_draft), value?.let { json.encodeToString(it) } ) + + suspend fun isMuted(author: String): Boolean { + return mutedMessageSendersDao.checkMute(author) + } + + suspend fun muteMessage(author: String) { + if (isMuted(author)) return + mutedMessageSendersDao.insertMute(MutedMessageSender(author)) + } + + suspend fun unmuteMessage(author: String) { + if (!isMuted(author)) return + mutedMessageSendersDao.deleteMute(author) + } } 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 784ac112f..3fec62562 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 @@ -304,6 +304,7 @@ class DashboardPresenter @Inject constructor( forceRefresh = forceRefresh ) } + .mapResourceData { it.map { messageWithAuthor -> messageWithAuthor.message } } .onResourceError { errorHandler.dispatch(it) } .takeIf { DashboardItem.Tile.MESSAGES in selectedTiles } ?: flowSuccess diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt index d3c6b95c7..b83f7e232 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewAdapter.kt @@ -50,12 +50,15 @@ class MessagePreviewAdapter @Inject constructor() : ViewType.MESSAGE.id -> MessageViewHolder( ItemMessagePreviewBinding.inflate(inflater, parent, false) ) + ViewType.DIVIDER.id -> DividerViewHolder( ItemMessageDividerBinding.inflate(inflater, parent, false) ) + ViewType.ATTACHMENT.id -> AttachmentViewHolder( ItemMessageAttachmentBinding.inflate(inflater, parent, false) ) + else -> throw IllegalStateException() } } @@ -66,6 +69,7 @@ class MessagePreviewAdapter @Inject constructor() : holder, requireNotNull(messageWithAttachment).message ) + is AttachmentViewHolder -> bindAttachment( holder, requireNotNull(messageWithAttachment).attachments[position - 2] @@ -82,9 +86,11 @@ class MessagePreviewAdapter @Inject constructor() : recipientCount > 1 -> { context.getString(R.string.message_read_by, message.readBy, recipientCount) } + message.readBy == 1 || (isReceived && !message.unread) -> { context.getString(R.string.message_read, context.getString(R.string.all_yes)) } + else -> context.getString(R.string.message_read, context.getString(R.string.all_no)) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index 3ed685cd7..3b33bb51f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -50,12 +50,20 @@ class MessagePreviewFragment : private var menuPrintButton: MenuItem? = null + private var menuMuteButton: MenuItem? = null + override val titleStringId: Int get() = R.string.message_title override val deleteMessageSuccessString: String get() = getString(R.string.message_delete_success) + override val muteMessageSuccessString: String + get() = getString(R.string.message_mute_success) + + override val unmuteMessageSuccessString: String + get() = getString(R.string.message_unmute_success) + override val messageNoSubjectString: String get() = getString(R.string.message_no_subject) @@ -106,6 +114,7 @@ class MessagePreviewFragment : menuDeleteButton = menu.findItem(R.id.messagePreviewMenuDelete) menuShareButton = menu.findItem(R.id.messagePreviewMenuShare) menuPrintButton = menu.findItem(R.id.messagePreviewMenuPrint) + menuMuteButton = menu.findItem(R.id.messagePreviewMenuMute) presenter.onCreateOptionsMenu() menu.findItem(R.id.mainMenuAccount).isVisible = false @@ -118,6 +127,7 @@ class MessagePreviewFragment : R.id.messagePreviewMenuDelete -> presenter.onMessageDelete() R.id.messagePreviewMenuShare -> presenter.onShare() R.id.messagePreviewMenuPrint -> presenter.onPrint() + R.id.messagePreviewMenuMute -> presenter.onMute() else -> false } } @@ -129,6 +139,11 @@ class MessagePreviewFragment : } } + override fun updateMuteToggleButton(isMuted: Boolean) { + menuMuteButton?.setTitle(if (isMuted) R.string.message_unmute else R.string.message_mute) + + } + override fun showProgress(show: Boolean) { binding.messagePreviewProgress.visibility = if (show) VISIBLE else GONE } @@ -143,6 +158,7 @@ class MessagePreviewFragment : menuDeleteButton?.isVisible = show menuShareButton?.isVisible = show menuPrintButton?.isVisible = show + menuMuteButton?.isVisible = show && isReplayable } override fun setDeletedOptionsLabels() { @@ -213,7 +229,7 @@ class MessagePreviewFragment : } override fun onSaveInstanceState(outState: Bundle) { - outState.putSerializable(MESSAGE_ID_KEY, presenter.message) + outState.putSerializable(MESSAGE_ID_KEY, presenter.messageWithAttachments) super.onSaveInstanceState(outState) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index cd7b72843..2eff245ff 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -5,7 +5,7 @@ import androidx.core.text.parseAsHtml import io.github.wulkanowy.R import io.github.wulkanowy.data.* import io.github.wulkanowy.data.db.entities.Message -import io.github.wulkanowy.data.db.entities.MessageAttachment +import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.enums.MessageFolder import io.github.wulkanowy.data.repositories.MessageRepository import io.github.wulkanowy.data.repositories.PreferencesRepository @@ -26,9 +26,7 @@ class MessagePreviewPresenter @Inject constructor( private val analytics: AnalyticsHelper ) : BasePresenter(errorHandler, studentRepository) { - var message: Message? = null - - var attachments: List? = null + var messageWithAttachments: MessageWithAttachment? = null private lateinit var lastError: Throwable @@ -38,7 +36,6 @@ class MessagePreviewPresenter @Inject constructor( super.onAttachView(view) view.initView() errorHandler.showErrorMessage = ::showErrorViewOnError - this.message = message loadData(requireNotNull(message)) } @@ -66,13 +63,12 @@ class MessagePreviewPresenter @Inject constructor( .logResourceStatus("message ${messageToLoad.messageId} preview") .onResourceData { if (it != null) { - message = it.message - attachments = it.attachments + messageWithAttachments = it view?.apply { setMessageWithAttachment(it) showContent(true) initOptions() - + updateMuteToggleButton(isMuted = it.mutedMessageSender != null) if (preferencesRepository.isIncognitoMode && it.message.unread) { showMessage(R.string.message_incognito_description) } @@ -83,8 +79,7 @@ class MessagePreviewPresenter @Inject constructor( popView() } } - } - .onResourceSuccess { + }.onResourceSuccess { if (it != null) { analytics.logEvent( "load_item", @@ -92,31 +87,28 @@ class MessagePreviewPresenter @Inject constructor( "length" to it.message.content.length ) } - } - .onResourceNotLoading { view?.showProgress(false) } - .onResourceError { + }.onResourceNotLoading { view?.showProgress(false) }.onResourceError { retryCallback = { onMessageLoadRetry(messageToLoad) } errorHandler.dispatch(it) - } - .launch() + }.launch() } fun onReply(): Boolean { - return if (message != null) { - view?.openMessageReply(message) + return if (messageWithAttachments?.message != null) { + view?.openMessageReply(messageWithAttachments?.message) true } else false } fun onForward(): Boolean { - return if (message != null) { - view?.openMessageForward(message) + return if (messageWithAttachments?.message != null) { + view?.openMessageForward(messageWithAttachments?.message) true } else false } fun onShare(): Boolean { - val message = message ?: return false + val message = messageWithAttachments?.message ?: return false val subject = message.subject.ifBlank { view?.messageNoSubjectString.orEmpty() } val text = buildString { @@ -129,13 +121,15 @@ class MessagePreviewPresenter @Inject constructor( appendLine(message.content.parseAsHtml()) - if (!attachments.isNullOrEmpty()) { + if (!messageWithAttachments?.attachments.isNullOrEmpty()) { appendLine() appendLine("Załączniki:") - append(attachments.orEmpty().joinToString(separator = "\n") { attachment -> - "${attachment.filename}: ${attachment.url}" - }) + append( + messageWithAttachments?.attachments.orEmpty() + .joinToString(separator = "\n") { attachment -> + "${attachment.filename}: ${attachment.url}" + }) } } @@ -148,7 +142,7 @@ class MessagePreviewPresenter @Inject constructor( @SuppressLint("NewApi") fun onPrint(): Boolean { - val message = message ?: return false + val message = messageWithAttachments?.message ?: return false val subject = message.subject.ifBlank { view?.messageNoSubjectString.orEmpty() } val dateString = message.date.toFormattedString("yyyy-MM-dd HH:mm:ss") @@ -159,8 +153,7 @@ class MessagePreviewPresenter @Inject constructor( append("

Od

${message.sender}
") append("

DO

${message.recipients}
") } - val messageContent = "

${message.content}

" - .replace(Regex("[\\n\\r]{2,}"), "

") + val messageContent = "

${message.content}

".replace(Regex("[\\n\\r]{2,}"), "

") .replace(Regex("[\\n\\r]"), "
") val jobName = buildString { @@ -171,9 +164,7 @@ class MessagePreviewPresenter @Inject constructor( } view?.apply { - val html = printHTML - .replace("%SUBJECT%", subject) - .replace("%CONTENT%", messageContent) + val html = printHTML.replace("%SUBJECT%", subject).replace("%CONTENT%", messageContent) .replace("%INFO%", infoContent) printDocument(html, jobName) } @@ -182,7 +173,7 @@ class MessagePreviewPresenter @Inject constructor( } private fun deleteMessage() { - message ?: return + messageWithAttachments?.message ?: return view?.run { showContent(false) @@ -191,24 +182,22 @@ class MessagePreviewPresenter @Inject constructor( showErrorView(false) } - Timber.i("Delete message ${message?.messageGlobalKey}") + Timber.i("Delete message ${messageWithAttachments?.message?.messageGlobalKey}") presenterScope.launch { runCatching { val student = studentRepository.getCurrentStudent(decryptPass = true) val mailbox = messageRepository.getMailboxByStudent(student) - messageRepository.deleteMessage(student, mailbox, message!!) + messageRepository.deleteMessage(student, mailbox, messageWithAttachments?.message!!) + }.onFailure { + retryCallback = { onMessageDelete() } + errorHandler.dispatch(it) + }.onSuccess { + view?.run { + showMessage(deleteMessageSuccessString) + popView() + } } - .onFailure { - retryCallback = { onMessageDelete() } - errorHandler.dispatch(it) - } - .onSuccess { - view?.run { - showMessage(deleteMessageSuccessString) - popView() - } - } view?.showProgress(false) } @@ -232,10 +221,10 @@ class MessagePreviewPresenter @Inject constructor( private fun initOptions() { view?.apply { showOptions( - show = message != null, - isReplayable = message?.folderId != MessageFolder.SENT.id, + show = messageWithAttachments?.message != null, + isReplayable = messageWithAttachments?.message?.folderId != MessageFolder.SENT.id, ) - message?.let { + messageWithAttachments?.message?.let { when (it.folderId == MessageFolder.TRASHED.id) { true -> setDeletedOptionsLabels() false -> setNotDeletedOptionsLabels() @@ -248,4 +237,29 @@ class MessagePreviewPresenter @Inject constructor( fun onCreateOptionsMenu() { initOptions() } + + fun onMute(): Boolean { + val message = messageWithAttachments?.message ?: return false + val isMuted = messageWithAttachments?.mutedMessageSender != null + + presenterScope.launch { + runCatching { + when (isMuted) { + true -> { + messageRepository.unmuteMessage(message.correspondents) + view?.run { showMessage(unmuteMessageSuccessString) } + } + + false -> { + messageRepository.muteMessage(message.correspondents) + view?.run { showMessage(muteMessageSuccessString) } + } + } + }.onFailure { + errorHandler.dispatch(it) + } + } + view?.updateMuteToggleButton(isMuted) + return true + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt index 7f5f140b2..cbe1c3cbc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt @@ -9,6 +9,10 @@ interface MessagePreviewView : BaseView { val deleteMessageSuccessString: String + val muteMessageSuccessString: String + + val unmuteMessageSuccessString: String + val messageNoSubjectString: String val printHTML: String @@ -19,6 +23,8 @@ interface MessagePreviewView : BaseView { fun setMessageWithAttachment(item: MessageWithAttachment) + fun updateMuteToggleButton(isMuted: Boolean) + fun showProgress(show: Boolean) fun showContent(show: Boolean) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt index 9792c7085..fadc77e6d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabAdapter.kt @@ -18,8 +18,7 @@ import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.toFormattedString import javax.inject.Inject -class MessageTabAdapter @Inject constructor() : - RecyclerView.Adapter() { +class MessageTabAdapter @Inject constructor() : RecyclerView.Adapter() { lateinit var onItemClickListener: (MessageTabDataItem.MessageItem, position: Int) -> Unit @@ -52,10 +51,11 @@ class MessageTabAdapter @Inject constructor() : override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) - return when (MessageItemViewType.values()[viewType]) { + return when (MessageItemViewType.entries[viewType]) { MessageItemViewType.FILTERS -> HeaderViewHolder( ItemMessageChipsBinding.inflate(inflater, parent, false) ) + MessageItemViewType.MESSAGE -> ItemViewHolder( ItemMessageBinding.inflate(inflater, parent, false) ) @@ -137,7 +137,12 @@ class MessageTabAdapter @Inject constructor() : ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(currentTextColor)) isVisible = message.hasAttachments } - messageItemUnreadIndicator.isVisible = message.unread + messageItemUnreadIndicator.isVisible = message.unread || item.isMuted + + when (item.isMuted) { + true -> messageItemUnreadIndicator.setImageResource(R.drawable.ic_notifications_off) + else -> messageItemUnreadIndicator.setImageResource(R.drawable.ic_circle_notification) + } root.setOnClickListener { holder.bindingAdapterPosition.let { @@ -165,8 +170,7 @@ class MessageTabAdapter @Inject constructor() : RecyclerView.ViewHolder(binding.root) private class MessageTabDiffUtil( - private val old: List, - private val new: List + private val old: List, private val new: List ) : DiffUtil.Callback() { override fun getOldListSize(): Int = old.size diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabDataItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabDataItem.kt index c0bd4170e..ef640e040 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabDataItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabDataItem.kt @@ -6,6 +6,7 @@ sealed class MessageTabDataItem(val viewType: MessageItemViewType) { data class MessageItem( val message: Message, + val isMuted: Boolean, val isSelected: Boolean, val isActionMode: Boolean ) : MessageTabDataItem(MessageItemViewType.MESSAGE) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 90f93b145..f82837214 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -4,6 +4,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.* import io.github.wulkanowy.data.db.entities.Mailbox import io.github.wulkanowy.data.db.entities.Message +import io.github.wulkanowy.data.db.entities.MessageWithMutedAuthor import io.github.wulkanowy.data.enums.MessageFolder import io.github.wulkanowy.data.repositories.MessageRepository import io.github.wulkanowy.data.repositories.StudentRepository @@ -39,7 +40,7 @@ class MessageTabPresenter @Inject constructor( private var mailboxes: List = emptyList() private var selectedMailbox: Mailbox? = null - private var messages = emptyList() + private var messages = emptyList() private val searchChannel = Channel() @@ -141,7 +142,7 @@ class MessageTabPresenter @Inject constructor( } fun onActionModeSelectCheckAll() { - val messagesToSelect = getFilteredData() + val messagesToSelect = getFilteredData().map { it.message } val isAllSelected = messagesToDelete.containsAll(messagesToSelect) if (isAllSelected) { @@ -188,7 +189,7 @@ class MessageTabPresenter @Inject constructor( view?.showActionMode(false) } - val filteredData = getFilteredData() + val filteredData = getFilteredData().map { it.message } view?.run { updateActionModeTitle(messagesToDelete.size) @@ -320,25 +321,31 @@ class MessageTabPresenter @Inject constructor( } } - private fun getFilteredData(): List { + private fun getFilteredData(): List { if (lastSearchQuery.trim().isEmpty()) { - val sortedMessages = messages.sortedByDescending { it.date } + val sortedMessages = messages.sortedByDescending { it.message.date } return when { - (onlyUnread == true) && onlyWithAttachments -> sortedMessages.filter { it.unread == onlyUnread && it.hasAttachments == onlyWithAttachments } - (onlyUnread == true) -> sortedMessages.filter { it.unread == onlyUnread } - onlyWithAttachments -> sortedMessages.filter { it.hasAttachments == onlyWithAttachments } + (onlyUnread == true) && onlyWithAttachments -> sortedMessages.filter { + it.message.unread == onlyUnread && it.message.hasAttachments == onlyWithAttachments + } + + (onlyUnread == true) -> sortedMessages.filter { it.message.unread == onlyUnread } + onlyWithAttachments -> sortedMessages.filter { it.message.hasAttachments == onlyWithAttachments } else -> sortedMessages } } else { val sortedMessages = messages - .map { it to calculateMatchRatio(it, lastSearchQuery) } - .sortedWith(compareBy> { -it.second }.thenByDescending { it.first.date }) + .map { it to calculateMatchRatio(it.message, lastSearchQuery) } + .sortedWith(compareBy> { -it.second }.thenByDescending { it.first.message.date }) .filter { it.second > 6000 } .map { it.first } return when { - (onlyUnread == true) && onlyWithAttachments -> sortedMessages.filter { it.unread == onlyUnread && it.hasAttachments == onlyWithAttachments } - (onlyUnread == true) -> sortedMessages.filter { it.unread == onlyUnread } - onlyWithAttachments -> sortedMessages.filter { it.hasAttachments == onlyWithAttachments } + (onlyUnread == true) && onlyWithAttachments -> sortedMessages.filter { + it.message.unread == onlyUnread && it.message.hasAttachments == onlyWithAttachments + } + + (onlyUnread == true) -> sortedMessages.filter { it.message.unread == onlyUnread } + onlyWithAttachments -> sortedMessages.filter { it.message.hasAttachments == onlyWithAttachments } else -> sortedMessages } } @@ -367,8 +374,9 @@ class MessageTabPresenter @Inject constructor( addAll(data.map { message -> MessageTabDataItem.MessageItem( - message = message, - isSelected = messagesToDelete.any { it.messageGlobalKey == message.messageGlobalKey }, + message = message.message, + isMuted = message.mutedMessageSender != null, + isSelected = messagesToDelete.any { it.messageGlobalKey == message.message.messageGlobalKey }, isActionMode = isActionMode ) }) diff --git a/app/src/main/res/drawable/ic_circle_notification.xml b/app/src/main/res/drawable/ic_circle_notification.xml new file mode 100644 index 000000000..6059212cb --- /dev/null +++ b/app/src/main/res/drawable/ic_circle_notification.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_notifications_off.xml b/app/src/main/res/drawable/ic_notifications_off.xml new file mode 100644 index 000000000..094ed75fa --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications_off.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/item_message.xml b/app/src/main/res/layout/item_message.xml index 39fbaad01..1346c3f05 100644 --- a/app/src/main/res/layout/item_message.xml +++ b/app/src/main/res/layout/item_message.xml @@ -81,9 +81,9 @@ + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index faed4d186..5bb06a419 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -864,4 +864,10 @@ Feature disabled by your school Feature not available. Login in a mode other than Mobile API This field is required + + + Mute + Unmute + You have muted this user + You have unmuted this user diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt index 3a18ee979..58937e776 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt @@ -6,8 +6,10 @@ import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.dao.MailboxDao import io.github.wulkanowy.data.db.dao.MessageAttachmentDao import io.github.wulkanowy.data.db.dao.MessagesDao +import io.github.wulkanowy.data.db.dao.MutedMessageSendersDao import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment +import io.github.wulkanowy.data.db.entities.MutedMessageSender import io.github.wulkanowy.data.enums.MessageFolder import io.github.wulkanowy.data.errorOrNull import io.github.wulkanowy.data.toFirstResult @@ -19,9 +21,16 @@ import io.github.wulkanowy.sdk.pojo.Folder import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.Status import io.github.wulkanowy.utils.status -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.checkEquals +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK +import io.mockk.just +import io.mockk.mockk import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.toList @@ -45,6 +54,9 @@ class MessageRepositoryTest { @MockK private lateinit var messageDb: MessagesDao + @MockK + private lateinit var mutesDb: MutedMessageSendersDao + @MockK private lateinit var messageAttachmentDao: MessageAttachmentDao @@ -73,9 +85,22 @@ class MessageRepositoryTest { fun setUp() { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - + coEvery { mutesDb.checkMute(any()) } returns false + coEvery { + messageDb.loadMessagesWithMutedAuthor( + mailboxKey = any(), + folder = any() + ) + } returns flowOf(emptyList()) + coEvery { + messageDb.loadMessagesWithMutedAuthor( + folder = any(), + email = any() + ) + } returns flowOf(emptyList()) repository = MessageRepository( messagesDb = messageDb, + mutedMessageSendersDao = mutesDb, messageAttachmentDao = messageAttachmentDao, sdk = sdk, context = context, @@ -131,7 +156,11 @@ class MessageRepositoryTest { @Test fun `get message when content already in db`() { val testMessage = getMessageEntity(123, "Test", false) - val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) + val messageWithAttachment = MessageWithAttachment( + testMessage, + emptyList(), + MutedMessageSender("Jan Kowalski - P - (WULKANOWY)") + ) coEvery { messageDb.loadMessageWithAttachment("v4") } returns flowOf( messageWithAttachment @@ -149,8 +178,16 @@ class MessageRepositoryTest { val testMessage = getMessageEntity(123, "", true) val testMessageWithContent = testMessage.copy().apply { content = "Test" } - val mWa = MessageWithAttachment(testMessage, emptyList()) - val mWaWithContent = MessageWithAttachment(testMessageWithContent, emptyList()) + val mWa = MessageWithAttachment( + testMessage, + emptyList(), + MutedMessageSender("Jan Kowalski - P - (WULKANOWY)") + ) + val mWaWithContent = MessageWithAttachment( + testMessageWithContent, + emptyList(), + MutedMessageSender("Jan Kowalski - P - (WULKANOWY)") + ) coEvery { messageDb.loadMessageWithAttachment("v4") From 2c1337bb518893397e04b3ae99384e20c564e6c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 29 Feb 2024 21:36:51 +0100 Subject: [PATCH 1371/1526] New Crowdin updates (#2439) --- app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + 6 files changed, 6 insertions(+) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index e1cafa6ea..2e0104b10 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -854,6 +854,7 @@ Žádné internetové připojení Vyskytla se chyba. Zkontrolujte hodiny svého zařízení + This account is inactive. Try logging in again Nelze se připojit ke deníku. Servery mohou být přetíženy. Prosím zkuste to znovu později Načítání dat se nezdařilo. Prosím zkuste to znovu později Je vyžadována změna hesla pro deník diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5bd71bb29..b04558aa2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -760,6 +760,7 @@ Keine Internetverbindung Es ist ein Fehler aufgetreten. Überprüfen Sie Ihre Geräteuhr + This account is inactive. Try logging in again Registrierungsverbindung fehlgeschlagen. Server können überlastet sein. Bitte versuchen Sie es später noch einmal Das Laden der Daten ist fehlgeschlagen. Bitte versuchen Sie es später noch einmal Passwortänderung für Registrierung erforderlich diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 70d4982b9..9a7ee3f81 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -854,6 +854,7 @@ Brak połączenia z internetem Wystąpił błąd. Sprawdź poprawność daty w urządzeniu + Konto jest nieaktywne. Spróbuj zalogować się ponownie Nie udało się połączyć z dziennikiem. Serwery mogą być przeciążone. Spróbuj ponownie później Ładowanie danych nie powiodło się. Spróbuj ponownie później Wymagana zmiana hasła do dziennika diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 717e02131..b7786546d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -854,6 +854,7 @@ Интернет-соединение отсутствует Произошла ошибка. Проверьте время на вашем устройстве + This account is inactive. Try logging in again Не удалось подключиться к дневнику. Возможно, сервера перегружены, повторите попытку позже Не удалось загрузить данные, повторите попытку позже Необходимо изменить пароль дневника diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 368ead9d5..d34302ec3 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -854,6 +854,7 @@ Žiadne internetové pripojenie Vyskytla sa chyba. Skontrolujte hodiny svojho zariadenia + This account is inactive. Try logging in again Nedá sa pripojiť ku denníku. Servery môžu byť preťažené. Prosím skúste to znova neskôr Načítanie údajov zlyhalo. Skúste neskôr prosím Je vyžadovaná zmena hesla pre denník diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 3d10f1179..228b87d44 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -854,6 +854,7 @@ Немає з\'єднання з інтернетом Сталася помилка. Перевірте годинник пристрою + This account is inactive. Try logging in again Помилка підключення до щоденнику. Сервери можуть бути перевантажені, спробуйте пізніше Помилка завантаження даних, спробуйте пізніше Необхідна зміна пароля щоденника From c198e6a2f7e55910f96142524c1ae03139d1e368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 1 Mar 2024 00:06:54 +0100 Subject: [PATCH 1372/1526] New Crowdin updates (#2445) --- app/src/main/res/values-cs/strings.xml | 5 +++++ app/src/main/res/values-de/strings.xml | 5 +++++ app/src/main/res/values-pl/strings.xml | 5 +++++ app/src/main/res/values-ru/strings.xml | 5 +++++ app/src/main/res/values-sk/strings.xml | 5 +++++ app/src/main/res/values-uk/strings.xml | 5 +++++ 6 files changed, 30 insertions(+) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 2e0104b10..5c4c52da8 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -866,4 +866,9 @@ Funkce je deaktivována přes vaší školou Funkce není k dispozici. Přihlaste se v jiném režimu než Mobile API Toto pole je povinné + + Mute + Unmute + You have muted this user + You have unmuted this user diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b04558aa2..a346bbd2f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -772,4 +772,9 @@ Funktion, die von Ihrer Schule deaktiviert wurde Feature in diesem Modus nicht verfügbar Dieses Feld ist erforderlich + + Mute + Unmute + You have muted this user + You have unmuted this user diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 9a7ee3f81..56a85ea2a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -866,4 +866,9 @@ Funkcja wyłączona przez szkołę Funkcja niedostępna. Zaloguj się w trybie innym niż Mobilne API To pole jest wymagane + + Wycisz + Wyłącz wyciszenie + Wyciszyleś tego użytkownika + Wyłączyłeś wyciszenie tego użytkownika diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b7786546d..f7469675e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -866,4 +866,9 @@ Функция отключена вашей школой Функция недоступна в режиме Mobile API. Воспользуйтесь другим режимом Это поле обязательно + + Mute + Unmute + You have muted this user + You have unmuted this user diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d34302ec3..56238c10a 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -866,4 +866,9 @@ Funkcia je deaktivovaná cez vašou školou Funkcia nie je k dispozícii. Prihláste sa v inom režime než Mobile API Toto pole je povinné + + Mute + Unmute + You have muted this user + You have unmuted this user diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 228b87d44..a82027479 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -866,4 +866,9 @@ Функція вимкнена вашою школою Функція недоступна в режимі Mobile API. Увійдіть в інший режим Це поле обовʼязкове + + Mute + Unmute + You have muted this user + You have unmuted this user From c04752ed39e847009bc4ab1997a4aef43a545ca0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 1 Mar 2024 10:32:55 +0100 Subject: [PATCH 1373/1526] Fix timetable items layout (#2446) --- app/src/main/res/layout/item_timetable.xml | 11 +++++++---- .../main/res/layout/subitem_dashboard_small_grade.xml | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/item_timetable.xml b/app/src/main/res/layout/item_timetable.xml index b9966c121..d13105229 100644 --- a/app/src/main/res/layout/item_timetable.xml +++ b/app/src/main/res/layout/item_timetable.xml @@ -24,6 +24,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0" tools:text="5" /> @@ -179,7 +182,7 @@ android:visibility="gone" app:backgroundTint="?colorPrimary" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" + app:layout_constraintTop_toTopOf="@id/timetableItemTimeStart" tools:text="jeszcze 15 min" tools:visibility="visible" /> diff --git a/app/src/main/res/layout/subitem_dashboard_small_grade.xml b/app/src/main/res/layout/subitem_dashboard_small_grade.xml index 3684c2677..5d48313a3 100644 --- a/app/src/main/res/layout/subitem_dashboard_small_grade.xml +++ b/app/src/main/res/layout/subitem_dashboard_small_grade.xml @@ -11,6 +11,7 @@ android:gravity="center" android:maxLength="5" android:minWidth="20dp" + android:padding="1dp" android:textColor="@android:color/white" android:textSize="12sp" android:textStyle="bold" From ea28fc783cf2c24e25606f5ba13dff120d1101ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 1 Mar 2024 21:14:43 +0100 Subject: [PATCH 1374/1526] Add message from trash restoring (#2438) --- .../wulkanowy/data/enums/MessageFolder.kt | 7 ++- .../data/repositories/MessageRepository.kt | 50 ++++++++++----- .../message/preview/MessagePreviewFragment.kt | 27 ++++---- .../preview/MessagePreviewPresenter.kt | 61 +++++++++++++++---- .../message/preview/MessagePreviewView.kt | 8 +-- .../message/send/SendMessagePresenter.kt | 2 +- .../modules/message/tab/MessageTabFragment.kt | 16 +++-- .../message/tab/MessageTabPresenter.kt | 23 ++++++- .../ic_menu_message_delete_forever.xml | 9 +++ .../res/drawable/ic_menu_message_restore.xml | 9 +++ .../res/menu/action_menu_message_preview.xml | 14 +++++ .../res/menu/context_menu_message_tab.xml | 14 +++++ app/src/main/res/values/strings.xml | 3 + 13 files changed, 192 insertions(+), 51 deletions(-) create mode 100644 app/src/main/res/drawable/ic_menu_message_delete_forever.xml create mode 100644 app/src/main/res/drawable/ic_menu_message_restore.xml diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/MessageFolder.kt b/app/src/main/java/io/github/wulkanowy/data/enums/MessageFolder.kt index 899ba9085..7cb4202a1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/enums/MessageFolder.kt +++ b/app/src/main/java/io/github/wulkanowy/data/enums/MessageFolder.kt @@ -3,5 +3,10 @@ package io.github.wulkanowy.data.enums enum class MessageFolder(val id: Int = 1) { RECEIVED(1), SENT(2), - TRASHED(3) + TRASHED(3), + ; + + companion object { + fun byId(id: Int) = entries.first { it.id == id } + } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index 6d591c5bb..96f048706 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -18,6 +18,7 @@ import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.enums.MessageFolder import io.github.wulkanowy.data.enums.MessageFolder.RECEIVED +import io.github.wulkanowy.data.enums.MessageFolder.SENT import io.github.wulkanowy.data.enums.MessageFolder.TRASHED import io.github.wulkanowy.data.mappers.mapFromEntities import io.github.wulkanowy.data.mappers.mapToEntities @@ -25,6 +26,7 @@ import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.data.onResourceError import io.github.wulkanowy.data.onResourceSuccess import io.github.wulkanowy.data.pojos.MessageDraft +import io.github.wulkanowy.data.toFirstResult import io.github.wulkanowy.data.waitForResult import io.github.wulkanowy.domain.messages.GetMailboxByStudentUseCase import io.github.wulkanowy.sdk.Sdk @@ -34,7 +36,6 @@ import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.first import kotlinx.coroutines.sync.Mutex import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json @@ -155,17 +156,30 @@ class MessageRepository @Inject constructor( subject: String, content: String, recipients: List, - mailboxId: String, + mailbox: Mailbox, ) { sdk.init(student).sendMessage( subject = subject, content = content, recipients = recipients.mapFromEntities(), - mailboxId = mailboxId, + mailboxId = mailbox.globalKey, ) + refreshFolders(student, mailbox, listOf(SENT)) } - suspend fun deleteMessages(student: Student, mailbox: Mailbox?, messages: List) { + suspend fun restoreMessages(student: Student, mailbox: Mailbox?, messages: List) { + sdk.init(student).restoreMessages( + messages = messages.map { it.messageGlobalKey }, + ) + + refreshFolders(student, mailbox) + } + + suspend fun deleteMessage(student: Student, message: Message) { + deleteMessages(student, listOf(message)) + } + + suspend fun deleteMessages(student: Student, messages: List) { val firstMessage = messages.first() sdk.init(student).deleteMessages( messages = messages.map { it.messageGlobalKey }, @@ -184,18 +198,24 @@ class MessageRepository @Inject constructor( } messagesDb.updateAll(deletedMessages) - } else messagesDb.deleteAll(messages) - - getMessages( - student = student, - mailbox = mailbox, - folder = TRASHED, - forceRefresh = true, - ).first() + } else { + messagesDb.deleteAll(messages) + } } - suspend fun deleteMessage(student: Student, mailbox: Mailbox?, message: Message) { - deleteMessages(student, mailbox, listOf(message)) + private suspend fun refreshFolders( + student: Student, + mailbox: Mailbox?, + folders: List = MessageFolder.entries + ) { + folders.forEach { + getMessages( + student = student, + mailbox = mailbox, + folder = it, + forceRefresh = true, + ).toFirstResult() + } } suspend fun getMailboxes(student: Student, forceRefresh: Boolean) = networkBoundResource( @@ -240,7 +260,7 @@ class MessageRepository @Inject constructor( value?.let { json.encodeToString(it) } ) - suspend fun isMuted(author: String): Boolean { + private suspend fun isMuted(author: String): Boolean { return mutedMessageSendersDao.checkMute(author) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index 3b33bb51f..75778bac5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -44,8 +44,12 @@ class MessagePreviewFragment : private var menuForwardButton: MenuItem? = null + private var menuRestoreButton: MenuItem? = null + private var menuDeleteButton: MenuItem? = null + private var menuDeleteForeverButton: MenuItem? = null + private var menuShareButton: MenuItem? = null private var menuPrintButton: MenuItem? = null @@ -64,6 +68,9 @@ class MessagePreviewFragment : override val unmuteMessageSuccessString: String get() = getString(R.string.message_unmute_success) + override val restoreMessageSuccessString: String + get() = getString(R.string.message_restore_success) + override val messageNoSubjectString: String get() = getString(R.string.message_no_subject) @@ -111,7 +118,9 @@ class MessagePreviewFragment : inflater.inflate(R.menu.action_menu_message_preview, menu) menuReplyButton = menu.findItem(R.id.messagePreviewMenuReply) menuForwardButton = menu.findItem(R.id.messagePreviewMenuForward) + menuRestoreButton = menu.findItem(R.id.messagePreviewMenuRestore) menuDeleteButton = menu.findItem(R.id.messagePreviewMenuDelete) + menuDeleteForeverButton = menu.findItem(R.id.messagePreviewMenuDeleteForever) menuShareButton = menu.findItem(R.id.messagePreviewMenuShare) menuPrintButton = menu.findItem(R.id.messagePreviewMenuPrint) menuMuteButton = menu.findItem(R.id.messagePreviewMenuMute) @@ -124,7 +133,9 @@ class MessagePreviewFragment : return when (item.itemId) { R.id.messagePreviewMenuReply -> presenter.onReply() R.id.messagePreviewMenuForward -> presenter.onForward() + R.id.messagePreviewMenuRestore -> presenter.onMessageRestore() R.id.messagePreviewMenuDelete -> presenter.onMessageDelete() + R.id.messagePreviewMenuDeleteForever -> presenter.onMessageDelete() R.id.messagePreviewMenuShare -> presenter.onShare() R.id.messagePreviewMenuPrint -> presenter.onPrint() R.id.messagePreviewMenuMute -> presenter.onMute() @@ -152,23 +163,17 @@ class MessagePreviewFragment : binding.messagePreviewRecycler.visibility = if (show) VISIBLE else GONE } - override fun showOptions(show: Boolean, isReplayable: Boolean) { - menuReplyButton?.isVisible = isReplayable + override fun showOptions(show: Boolean, isReplayable: Boolean, isRestorable: Boolean) { + menuReplyButton?.isVisible = show && isReplayable menuForwardButton?.isVisible = show - menuDeleteButton?.isVisible = show + menuRestoreButton?.isVisible = show && isRestorable + menuDeleteButton?.isVisible = show && !isRestorable + menuDeleteForeverButton?.isVisible = show && isRestorable menuShareButton?.isVisible = show menuPrintButton?.isVisible = show menuMuteButton?.isVisible = show && isReplayable } - override fun setDeletedOptionsLabels() { - menuDeleteButton?.setTitle(R.string.message_delete_forever) - } - - override fun setNotDeletedOptionsLabels() { - menuDeleteButton?.setTitle(R.string.message_move_to_trash) - } - override fun showErrorView(show: Boolean) { binding.messagePreviewError.visibility = if (show) VISIBLE else GONE } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index 2eff245ff..9bb0d32a4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -14,9 +14,11 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject +import kotlin.time.Duration.Companion.seconds class MessagePreviewPresenter @Inject constructor( errorHandler: ErrorHandler, @@ -74,6 +76,7 @@ class MessagePreviewPresenter @Inject constructor( } } } else { + delay(1.seconds) view?.run { showMessage(messageNotExists) popView() @@ -172,13 +175,51 @@ class MessagePreviewPresenter @Inject constructor( return true } + private fun restoreMessage() { + val message = messageWithAttachments?.message ?: return + + view?.run { + showContent(false) + showProgress(true) + showOptions( + show = false, + isReplayable = false, + isRestorable = false, + ) + showErrorView(false) + } + Timber.i("Restore message ${message.messageGlobalKey}") + presenterScope.launch { + runCatching { + val student = studentRepository.getCurrentStudent(decryptPass = true) + val mailbox = messageRepository.getMailboxByStudent(student) + messageRepository.restoreMessages(student, mailbox, listOfNotNull(message)) + } + .onFailure { + retryCallback = { onMessageRestore() } + errorHandler.dispatch(it) + } + .onSuccess { + view?.run { + showMessage(restoreMessageSuccessString) + popView() + } + } + view?.showProgress(false) + } + } + private fun deleteMessage() { messageWithAttachments?.message ?: return view?.run { showContent(false) showProgress(true) - showOptions(show = false, isReplayable = false) + showOptions( + show = false, + isReplayable = false, + isRestorable = false, + ) showErrorView(false) } @@ -187,8 +228,7 @@ class MessagePreviewPresenter @Inject constructor( presenterScope.launch { runCatching { val student = studentRepository.getCurrentStudent(decryptPass = true) - val mailbox = messageRepository.getMailboxByStudent(student) - messageRepository.deleteMessage(student, mailbox, messageWithAttachments?.message!!) + messageRepository.deleteMessage(student, messageWithAttachments?.message!!) }.onFailure { retryCallback = { onMessageDelete() } errorHandler.dispatch(it) @@ -213,6 +253,11 @@ class MessagePreviewPresenter @Inject constructor( } } + fun onMessageRestore(): Boolean { + restoreMessage() + return true + } + fun onMessageDelete(): Boolean { deleteMessage() return true @@ -222,15 +267,9 @@ class MessagePreviewPresenter @Inject constructor( view?.apply { showOptions( show = messageWithAttachments?.message != null, - isReplayable = messageWithAttachments?.message?.folderId != MessageFolder.SENT.id, + isReplayable = messageWithAttachments?.message?.folderId == MessageFolder.RECEIVED.id, + isRestorable = messageWithAttachments?.message?.folderId == MessageFolder.TRASHED.id, ) - messageWithAttachments?.message?.let { - when (it.folderId == MessageFolder.TRASHED.id) { - true -> setDeletedOptionsLabels() - false -> setNotDeletedOptionsLabels() - } - } - } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt index cbe1c3cbc..ee0b6ce0a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt @@ -13,6 +13,8 @@ interface MessagePreviewView : BaseView { val unmuteMessageSuccessString: String + val restoreMessageSuccessString: String + val messageNoSubjectString: String val printHTML: String @@ -35,11 +37,7 @@ interface MessagePreviewView : BaseView { fun setErrorRetryCallback(callback: () -> Unit) - fun showOptions(show: Boolean, isReplayable: Boolean) - - fun setDeletedOptionsLabels() - - fun setNotDeletedOptionsLabels() + fun showOptions(show: Boolean, isReplayable: Boolean, isRestorable: Boolean) fun openMessageReply(message: Message?) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt index e776e9941..6155baea3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt @@ -203,7 +203,7 @@ class SendMessagePresenter @Inject constructor( subject = subject, content = content, recipients = recipients, - mailboxId = mailbox.globalKey, + mailbox = mailbox, ) }.logResourceStatus("sending message").onEach { when (it) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt index 4364e8681..12f9d3234 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt @@ -5,7 +5,9 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import android.view.View.* +import android.view.View.GONE +import android.view.View.INVISIBLE +import android.view.View.VISIBLE import android.widget.CompoundButton import androidx.annotation.StringRes import androidx.appcompat.view.ActionMode @@ -64,10 +66,12 @@ class MessageTabFragment : BaseFragment(R.layout.frag } override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean { - if (presenter.folder == MessageFolder.TRASHED) { - val menuItem = menu.findItem(R.id.messageTabContextMenuDelete) - menuItem.setTitle(R.string.message_delete_forever) - } + val isTrashFolder = presenter.folder == MessageFolder.TRASHED + + menu.findItem(R.id.messageTabContextMenuDelete).setVisible(!isTrashFolder) + menu.findItem(R.id.messageTabContextMenuDeleteForever).setVisible(isTrashFolder) + menu.findItem(R.id.messageTabContextMenuRestore).setVisible(isTrashFolder) + return presenter.onPrepareActionMode() } @@ -79,6 +83,8 @@ class MessageTabFragment : BaseFragment(R.layout.frag override fun onActionItemClicked(mode: ActionMode, menu: MenuItem): Boolean { when (menu.itemId) { R.id.messageTabContextMenuDelete -> presenter.onActionModeSelectDelete() + R.id.messageTabContextMenuRestore -> presenter.onActionModeSelectRestore() + R.id.messageTabContextMenuDeleteForever -> presenter.onActionModeSelectDelete() R.id.messageTabContextMenuSelectAll -> presenter.onActionModeSelectCheckAll() } return true diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index f82837214..cda0b32bd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -121,8 +121,27 @@ class MessageTabPresenter @Inject constructor( return true } + fun onActionModeSelectRestore() { + Timber.i("Restore ${messagesToDelete.size} messages") + val messageList = messagesToDelete.toList() + + presenterScope.launch { + view?.run { + showProgress(true) + showContent(false) + showActionMode(false) + } + runCatching { + val student = studentRepository.getCurrentStudent(true) + messageRepository.restoreMessages(student, selectedMailbox, messageList) + } + .onFailure(errorHandler::dispatch) + .onSuccess { view?.showMessage(R.string.message_messages_restored) } + } + } + fun onActionModeSelectDelete() { - Timber.i("Delete ${messagesToDelete.size} messages)") + Timber.i("Delete ${messagesToDelete.size} messages") val messageList = messagesToDelete.toList() presenterScope.launch { @@ -134,7 +153,7 @@ class MessageTabPresenter @Inject constructor( runCatching { val student = studentRepository.getCurrentStudent(true) - messageRepository.deleteMessages(student, selectedMailbox, messageList) + messageRepository.deleteMessages(student, messageList) } .onFailure(errorHandler::dispatch) .onSuccess { view?.showMessage(R.string.message_messages_deleted) } diff --git a/app/src/main/res/drawable/ic_menu_message_delete_forever.xml b/app/src/main/res/drawable/ic_menu_message_delete_forever.xml new file mode 100644 index 000000000..a7b5ac53b --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_message_delete_forever.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_menu_message_restore.xml b/app/src/main/res/drawable/ic_menu_message_restore.xml new file mode 100644 index 000000000..5c8544f28 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_message_restore.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/menu/action_menu_message_preview.xml b/app/src/main/res/menu/action_menu_message_preview.xml index 224788674..04af86713 100644 --- a/app/src/main/res/menu/action_menu_message_preview.xml +++ b/app/src/main/res/menu/action_menu_message_preview.xml @@ -29,6 +29,13 @@ android:title="@string/message_forward" app:iconTint="@color/material_on_surface_emphasis_medium" app:showAsAction="ifRoom" /> + +

+ + Forward Select all Unselect all + Restore from trash Move to trash Delete permanently + Message restored successfully Message deleted successfully student parent @@ -364,6 +366,7 @@ %1$d selected Messages deleted + Messages restored Choose mailbox Incognito mode is on Thanks to incognito mode sender is not notified when you read the message From a7238e3f23703bdcc0af20b06fc09e904fee4ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 1 Mar 2024 22:16:56 +0100 Subject: [PATCH 1375/1526] New Crowdin updates (#2447) --- app/src/main/res/values-cs/strings.xml | 3 +++ app/src/main/res/values-de/strings.xml | 3 +++ app/src/main/res/values-pl/strings.xml | 3 +++ app/src/main/res/values-ru/strings.xml | 3 +++ app/src/main/res/values-sk/strings.xml | 3 +++ app/src/main/res/values-uk/strings.xml | 3 +++ 6 files changed, 18 insertions(+) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 5c4c52da8..fbc92e46f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -336,8 +336,10 @@ Poslat dále Vybrat vše Odznačit vše + Restore from trash Přesunout do koše Odstranit natrvalo + Message restored successfully Zpráva byla úspěšně odstraněna žák rodič @@ -383,6 +385,7 @@ %1$d vybraných Zprávy odstraněné + Messages restored Vyberte poštovní schránku Anonymní režim je zapnutý Díky anonymnímu režimu není odesílatel upozorněn, když si zprávu přečtete diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a346bbd2f..1f1246004 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -296,8 +296,10 @@ Weiterleiten Alle auswählen Alle abwählen + Restore from trash In Papierkorb verschieben Dauerhaft löschen + Message restored successfully Nachricht erfolgreich gelöscht schüler Eltern @@ -335,6 +337,7 @@ %1$d ausgewählt Nachrichten gelöscht + Messages restored Postfach auswählen Incognito mode is on Thanks to incognito mode sender is not notified when you read the message diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 56a85ea2a..597d843df 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -336,8 +336,10 @@ Prześlij dalej Zaznacz wszystkie Odznacz wszystkie + Przywróć z kosza Przenieś do kosza Usuń trwale + Wiadomość przywrócona pomyślnie Wiadomość usunięta pomyślnie uczeń rodzic @@ -383,6 +385,7 @@ %1$d wybranych Wiadomości zostały usunięte + Wiadomości przywrócone Wybierz skrzynkę Tryb incognito jest włączony Dzięki trybowi incognito nadawca nie zobaczy, że przeczytałeś tę wiadomość diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f7469675e..46a19c71f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -336,8 +336,10 @@ Переслать Выбрать все Отменить выбор + Restore from trash Перенести в корзину Удалить навсегда + Message restored successfully Сообщение успешно удалено ученик родитель @@ -383,6 +385,7 @@ %1$d выбрано Сообщение удалено + Messages restored Выбрать почтовый ящик Incognito mode is on Thanks to incognito mode sender is not notified when you read the message diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 56238c10a..b63c07c6f 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -336,8 +336,10 @@ Poslať ďalej Vybrať všetko Odznačiť všetko + Restore from trash Presunúť do koša Odstrániť natrvalo + Message restored successfully Správa bola úspešne odstránená žiak rodič @@ -383,6 +385,7 @@ %1$d vybraných Správy odstránené + Messages restored Vyberte poštovú schránku Režim inkognito je zapnutý Vďaka inkognito režimu nie je odosielateľ upozornený, keď si správu prečítate diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a82027479..8116c7e48 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -336,8 +336,10 @@ Переслати Вибрати всі Відмінити вибір + Restore from trash Перемістити до кошика Видалити назавжди + Message restored successfully Лист було успішно видалено учень родич @@ -383,6 +385,7 @@ %1$d вибрано Листи видалено + Messages restored Вибрати поштову скриньку Режим анонімності включено Завдяки режиму анонімності, відправник не буде сповіщений коли ви прочитаєте повідомлення From ccba31f2e81d2aa36e3ff64912ad57a5c7a92102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 2 Mar 2024 16:55:54 +0100 Subject: [PATCH 1376/1526] Add last announcements to school announcements (#2452) --- .../61.json | 2533 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 3 +- .../data/db/entities/SchoolAnnouncement.kt | 4 +- .../data/mappers/DirectorInformationMapper.kt | 14 + .../SchoolAnnouncementRepository.kt | 7 +- .../SchoolAnnouncementAdapter.kt | 5 + .../res/layout/item_school_announcement.xml | 33 +- 7 files changed, 2585 insertions(+), 14 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/61.json diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/61.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/61.json new file mode 100644 index 000000000..e36dcc8a6 --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/61.json @@ -0,0 +1,2533 @@ +{ + "formatVersion": 1, + "database": { + "version": 61, + "identityHash": "41fbd2ff00aba10b2ef0a079e6037c87", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `scrapper_domain_suffix` TEXT NOT NULL DEFAULT '', `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperDomainSuffix", + "columnName": "scrapper_domain_suffix", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `kindergarten_diary_id` INTEGER NOT NULL DEFAULT 0, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "kindergartenDiaryId", + "columnName": "kindergarten_diary_id", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "kindergarten_diary_id", + "semester_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `kindergarten_diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`email` TEXT NOT NULL, `message_global_key` TEXT NOT NULL, `mailbox_key` TEXT NOT NULL, `message_id` INTEGER NOT NULL, `correspondents` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `read_by` INTEGER, `unread_by` INTEGER, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `content` TEXT NOT NULL, `sender` TEXT, `recipients` TEXT)", + "fields": [ + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mailboxKey", + "columnName": "mailbox_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "correspondents", + "columnName": "correspondents", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "recipients", + "columnName": "recipients", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`message_global_key` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`message_global_key`, `url`, `filename`))", + "fields": [ + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "message_global_key", + "url", + "filename" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Mailboxes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`globalKey` TEXT NOT NULL, `email` TEXT NOT NULL, `symbol` TEXT NOT NULL, `schoolId` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `studentName` TEXT NOT NULL, `schoolNameShort` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`globalKey`))", + "fields": [ + { + "fieldPath": "globalKey", + "columnName": "globalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolId", + "columnName": "schoolId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "studentName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolNameShort", + "columnName": "schoolNameShort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "globalKey" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`mailboxGlobalKey` TEXT NOT NULL, `studentMailboxGlobalKey` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `schoolShortName` TEXT NOT NULL, `type` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "mailboxGlobalKey", + "columnName": "mailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentMailboxGlobalKey", + "columnName": "studentMailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "schoolShortName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `repeat_id` BLOB DEFAULT NULL, `is_added_by_user` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatId", + "columnName": "repeat_id", + "affinity": "BLOB", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `author` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `destination` TEXT NOT NULL DEFAULT '{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}', `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "destination", + "columnName": "destination", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}'" + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `types` TEXT NOT NULL DEFAULT '[]', `is_ok_visible` INTEGER NOT NULL DEFAULT 0, `is_x_visible` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "types", + "columnName": "types", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'[]'" + }, + { + "fieldPath": "isOkVisible", + "columnName": "is_ok_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "isXVisible", + "columnName": "is_x_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MutedMessageSenders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`author` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesDescriptive", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `description` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '41fbd2ff00aba10b2ef0a079e6037c87')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 21a6e3f3e..208daf75f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -173,6 +173,7 @@ import javax.inject.Singleton AutoMigration(from = 57, to = 58, spec = Migration58::class), AutoMigration(from = 58, to = 59), AutoMigration(from = 59, to = 60), + AutoMigration(from = 60, to = 61), ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -181,7 +182,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 60 + const val VERSION_SCHEMA = 61 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt index 25e27ef18..ac096b02b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt @@ -16,7 +16,9 @@ data class SchoolAnnouncement( val subject: String, - val content: String + val content: String, + + val author: String? = null, ) : Serializable { @PrimaryKey(autoGenerate = true) diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt index 16f1bbac0..85b37afc1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt @@ -3,12 +3,26 @@ package io.github.wulkanowy.data.mappers import io.github.wulkanowy.data.db.entities.SchoolAnnouncement import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.pojo.DirectorInformation as SdkDirectorInformation +import io.github.wulkanowy.sdk.pojo.LastAnnouncement as SdkLastAnnouncement +@JvmName("mapDirectorInformationToEntities") fun List.mapToEntities(student: Student) = map { SchoolAnnouncement( userLoginId = student.userLoginId, date = it.date, subject = it.subject, content = it.content, + author = null, + ) +} + +@JvmName("mapLastAnnouncementsToEntities") +fun List.mapToEntities(student: Student) = map { + SchoolAnnouncement( + userLoginId = student.userLoginId, + date = it.date, + subject = it.subject, + content = it.content, + author = it.author, ) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt index 4c42d092f..8537fbc3e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt @@ -41,9 +41,10 @@ class SchoolAnnouncementRepository @Inject constructor( schoolAnnouncementDb.loadAll(student.userLoginId) }, fetch = { - sdk.init(student) - .getDirectorInformation() - .mapToEntities(student) + val sdk = sdk.init(student) + val lastAnnouncements = sdk.getLastAnnouncements().mapToEntities(student) + val directorInformation = sdk.getDirectorInformation().mapToEntities(student) + lastAnnouncements + directorInformation }, saveFetchResult = { old, new -> val schoolAnnouncementsToSave = (new uniqueSubtract old).onEach { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementAdapter.kt index 46999599b..731488a9c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolannouncement/SchoolAnnouncementAdapter.kt @@ -2,6 +2,7 @@ package io.github.wulkanowy.ui.modules.schoolannouncement import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.data.db.entities.SchoolAnnouncement import io.github.wulkanowy.databinding.ItemSchoolAnnouncementBinding @@ -29,6 +30,10 @@ class SchoolAnnouncementAdapter @Inject constructor() : schoolAnnouncementItemDate.text = item.date.toFormattedString() schoolAnnouncementItemType.text = item.subject schoolAnnouncementItemContent.text = item.content.parseUonetHtml() + with(schoolAnnouncementItemAuthor) { + text = item.author + isVisible = !item.author.isNullOrBlank() + } root.setOnClickListener { onItemClickListener(item) } } diff --git a/app/src/main/res/layout/item_school_announcement.xml b/app/src/main/res/layout/item_school_announcement.xml index bb0cffd16..1197c66c7 100644 --- a/app/src/main/res/layout/item_school_announcement.xml +++ b/app/src/main/res/layout/item_school_announcement.xml @@ -11,27 +11,41 @@ android:id="@+id/schoolAnnouncementItemDate" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="15dp" + android:layout_marginHorizontal="15dp" android:layout_marginTop="10dp" - android:layout_marginEnd="10dp" android:textColor="?android:textColorSecondary" android:textSize="15sp" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@id/schoolAnnouncementItemAuthor" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="@tools:sample/date/ddmmyy" /> + + @@ -40,6 +54,7 @@ android:id="@+id/schoolAnnouncementItemContent" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginHorizontal="15dp" android:layout_marginTop="5dp" android:layout_marginBottom="15dp" android:ellipsize="end" @@ -47,8 +62,8 @@ android:maxLines="2" android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="@+id/schoolAnnouncementItemType" - app:layout_constraintStart_toStartOf="@id/schoolAnnouncementItemDate" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/schoolAnnouncementItemType" tools:text="@tools:sample/lorem/random" /> From f2d26453ed330e49590194ceda5bc3c5f3b8e822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 2 Mar 2024 17:01:12 +0100 Subject: [PATCH 1377/1526] Fix calculating average with optional arithmetic average on and no grade with average in second semester (#2448) --- .../ui/modules/grade/GradeAverageProvider.kt | 27 ++++++--- .../modules/grade/GradeAverageProviderTest.kt | 56 +++++++++++++++++-- 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index e8a5fa254..8da59eaf4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -159,7 +159,7 @@ class GradeAverageProvider @Inject constructor( ?.updateModifiers(student, config).orEmpty() (updatedSecondSemesterGrades + updatedFirstSemesterGrades).calcAverage( - config.isOptionalArithmeticAverage + isOptionalArithmeticAverage = config.isOptionalArithmeticAverage, ) } else { secondSemesterSubject.average @@ -173,13 +173,21 @@ class GradeAverageProvider @Inject constructor( config: AverageCalcParams, ): Double { return if (!isAnyVulcanAverage || config.forceAverageCalc) { - val divider = if (secondSemesterSubject.grades.any { it.weightValue > .0 }) 2 else 1 + val isSecondSemesterHasWeightGrade = secondSemesterSubject.grades + .any { it.weightValue > .0 } + val isSecondSemesterHasArithmeticGrade = secondSemesterSubject.grades + .all { it.weightValue == .0 } && config.isOptionalArithmeticAverage + val isSecondSemesterHaveAverage = + isSecondSemesterHasWeightGrade || isSecondSemesterHasArithmeticGrade + + val divider = if (isSecondSemesterHaveAverage) 2 else 1 val secondSemesterAverage = secondSemesterSubject.grades .updateModifiers(student, config) - .calcAverage(config.isOptionalArithmeticAverage) + .calcAverage(isOptionalArithmeticAverage = config.isOptionalArithmeticAverage) val firstSemesterAverage = firstSemesterSubject?.grades ?.updateModifiers(student, config) - ?.calcAverage(config.isOptionalArithmeticAverage) ?: secondSemesterAverage + ?.calcAverage(isOptionalArithmeticAverage = config.isOptionalArithmeticAverage) + ?: secondSemesterAverage (secondSemesterAverage + firstSemesterAverage) / divider } else { @@ -225,7 +233,7 @@ class GradeAverageProvider @Inject constructor( subject = summary.subject, average = if (!isAnyAverage || params.forceAverageCalc) { grades.updateModifiers(student, params) - .calcAverage(params.isOptionalArithmeticAverage) + .calcAverage(isOptionalArithmeticAverage = params.isOptionalArithmeticAverage) } else summary.average, points = summary.pointsSum, summary = summary, @@ -286,8 +294,13 @@ class GradeAverageProvider @Inject constructor( proposedPoints = "", finalPoints = "", pointsSum = "", - average = if (calcAverage) details.updateModifiers(student, params) - .calcAverage(params.isOptionalArithmeticAverage) else .0 + average = when { + calcAverage -> details + .updateModifiers(student, params) + .calcAverage(isOptionalArithmeticAverage = params.isOptionalArithmeticAverage) + + else -> .0 + } ) } } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index 6a717f6f6..4f0f80fe1 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -25,6 +25,7 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -112,8 +113,8 @@ class GradeAverageProviderTest { private val secondGradeWithModifier = listOf( // avg: 3.375 - getGrade(24, "Język polski", 3.0, -0.50), - getGrade(24, "Język polski", 4.0, 0.25) + getGrade(24, "Język polski", 3.0, -0.50, entry = "3-"), + getGrade(24, "Język polski", 4.0, 0.25, entry = "4+") ) private val secondSummariesWithModifier = listOf( @@ -122,8 +123,8 @@ class GradeAverageProviderTest { private val noWeightGrades = listOf( // standard: 0.0, arithmetic: 4.0 - getGrade(22, "Matematyka", 5.0, 0.0, 0.0), - getGrade(22, "Matematyka", 3.0, 0.0, 0.0), + getGrade(22, "Matematyka", 5.0, 0.0, 0.0, "5"), + getGrade(22, "Matematyka", 3.0, 0.0, 0.0, "3"), getGrade(22, "Matematyka", 1.0, 0.0, 0.0, "np.") ) @@ -132,7 +133,7 @@ class GradeAverageProviderTest { ) private val noWeightGradesArithmeticSummary = listOf( - getSummary(23, "Matematyka", 4.0) + getSummary(23, "Matematyka", .0) ) @Before @@ -211,6 +212,51 @@ class GradeAverageProviderTest { ) // from summary: 4,0 } + @Test + fun `calc current semester arithmetic average with no weights in second semester`() = runTest { + every { preferencesRepository.gradeAverageForceCalcFlow } returns flowOf(false) + every { preferencesRepository.isOptionalArithmeticAverageFlow } returns flowOf(true) + every { preferencesRepository.gradeAverageModeFlow } returns flowOf(GradeAverageMode.BOTH_SEMESTERS) + coEvery { + gradeRepository.getGrades( + student = student, + semester = semesters[1], + forceRefresh = true, + ) + } returns resourceFlow { + Triple( + first = noWeightGrades, + second = noWeightGradesArithmeticSummary, + third = emptyList(), + ) + } + coEvery { + gradeRepository.getGrades( + student = student, + semester = semesters[2], + forceRefresh = true, + ) + } returns resourceFlow { + Triple( + first = noWeightGrades, + second = noWeightGradesArithmeticSummary, + third = emptyList(), + ) + } + + val items = gradeAverageProvider.getGradesDetailsWithAverage( + student = student, + semesterId = semesters[2].semesterId, + forceRefresh = true + ).getResult() + + assertEquals( + 4.0, + items.single { it.subject == "Matematyka" }.average, + .0 + ) // from summary: 4,0 + } + @Test fun `calc current semester average with load from cache sequence`() { every { preferencesRepository.gradeAverageForceCalcFlow } returns flowOf(true) From 3564366a8f04aafc5ba1a91b875ba39f62eda798 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Mar 2024 16:08:32 +0000 Subject: [PATCH 1378/1526] Bump com.google.firebase:firebase-bom from 32.7.2 to 32.7.3 (#2453) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 07efeb2f2..f4ead9436 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -252,7 +252,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.11.0' - playImplementation platform('com.google.firebase:firebase-bom:32.7.2') + playImplementation platform('com.google.firebase:firebase-bom:32.7.3') playImplementation 'com.google.firebase:firebase-analytics' playImplementation 'com.google.firebase:firebase-messaging' playImplementation 'com.google.firebase:firebase-crashlytics:' From 05bda598fc5e60ff1c9ea88efda13f27a5007fbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Mar 2024 16:10:19 +0000 Subject: [PATCH 1379/1526] Bump mockk from 1.13.9 to 1.13.10 (#2455) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f4ead9436..f01b9917c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -190,7 +190,7 @@ ext { android_hilt = "1.2.0" room = "2.6.1" chucker = "4.0.0" - mockk = "1.13.9" + mockk = "1.13.10" coroutines = "1.8.0" } From e9d64de0cbe88fec1a228a00a934d0b9b300dc81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 2 Mar 2024 17:10:38 +0100 Subject: [PATCH 1380/1526] Improve invalid password message (#2451) --- .../github/wulkanowy/ui/base/BaseActivity.kt | 25 +++++++++++++++++++ .../wulkanowy/utils/ExceptionExtension.kt | 2 ++ app/src/main/res/values/strings.xml | 5 ++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index 29996db7c..10735dab3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -17,6 +17,8 @@ import io.github.wulkanowy.utils.FragmentLifecycleLogger import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.lifecycleAwareVariable import io.github.wulkanowy.utils.openInternetBrowser +import timber.log.Timber +import java.time.Instant import javax.inject.Inject abstract class BaseActivity, VB : ViewBinding> : @@ -36,6 +38,8 @@ abstract class BaseActivity, VB : ViewBinding> : abstract var presenter: T + private var lastDialogOpenTime = mutableMapOf() + override fun onCreate(savedInstanceState: Bundle?) { inject() themeManager.applyActivityTheme(this) @@ -70,6 +74,8 @@ abstract class BaseActivity, VB : ViewBinding> : } override fun showExpiredCredentialsDialog() { + if (!shouldShowDialog(DIALOG_ERROR_BAD_CREDENTIALS)) return + MaterialAlertDialogBuilder(this) .setTitle(R.string.main_expired_credentials_title) .setMessage(R.string.main_expired_credentials_description) @@ -83,6 +89,8 @@ abstract class BaseActivity, VB : ViewBinding> : } override fun showDecryptionFailedDialog() { + if (!shouldShowDialog(DIALOG_ERROR_DECRYPTION_FAILED)) return + MaterialAlertDialogBuilder(this) .setTitle(R.string.main_session_expired) .setMessage(R.string.main_session_relogin) @@ -119,4 +127,21 @@ abstract class BaseActivity, VB : ViewBinding> : protected open fun inject() { throw UnsupportedOperationException() } + + private fun shouldShowDialog(name: String): Boolean { + val lastOpenTime = lastDialogOpenTime[name] + val now = Instant.now() + + if (lastOpenTime != null && now.isBefore(lastOpenTime.plusSeconds(1))) { + Timber.i("Dialog $name was shown less than a second ago. Skip") + return false + } + lastDialogOpenTime[name] = Instant.now() + return true + } + + companion object { + private const val DIALOG_ERROR_BAD_CREDENTIALS = "dialog_error_bad_credentials" + private const val DIALOG_ERROR_DECRYPTION_FAILED = "dialog_error_decryption_failed" + } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt index 1c2290510..d541c0a7e 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ExceptionExtension.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import io.github.wulkanowy.sdk.scrapper.exception.ScrapperException import io.github.wulkanowy.sdk.scrapper.exception.ServiceUnavailableException import io.github.wulkanowy.sdk.scrapper.exception.VulcanException +import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.sdk.scrapper.login.NotLoggedInException import io.github.wulkanowy.sdk.scrapper.login.PasswordChangeRequiredException import okhttp3.internal.http2.StreamResetException @@ -34,6 +35,7 @@ fun Resources.getErrorString(error: Throwable): String = when (error) { is ServiceUnavailableException -> R.string.error_service_unavailable is FeatureDisabledException -> R.string.error_feature_disabled is FeatureNotAvailableException -> R.string.error_feature_not_available + is BadCredentialsException -> R.string.error_password_invalid is AccountInactiveException -> R.string.error_account_inactive is VulcanException -> R.string.error_unknown_uonet is ScrapperException -> R.string.error_unknown_app diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6843f1aa0..266c3522c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -109,8 +109,8 @@ Log in Session expired Session expired, log in again - Your account password has been changed. You need to log in to Wulkanowy again - Password changed + Password has expired or been changed + Your account password has expired or been changed. You will need to log in to Wulkanowy again Application support Do you like this app? Support its development by enabling non-invasive ads that you can disable at any time Enable ads @@ -858,6 +858,7 @@ This account is inactive. Try logging in again Connection to register failed. Servers can be overloaded. Please try again later Loading data failed. Please try again later + Your password has expired or been changed. Please log in again Register password change required Maintenance underway UONET + register. Try again later Unknown UONET + register error. Try again later From dc9af29a441991610e79e25bd8de529d14b3f019 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Mar 2024 16:11:13 +0000 Subject: [PATCH 1381/1526] Bump hilt_version from 2.50 to 2.51 (#2456) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f7f3d209e..a23f2191b 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.9.22' about_libraries = '10.10.0' - hilt_version = '2.50' + hilt_version = '2.51' } repositories { mavenCentral() From fb240938ed69801da29040a16245079c5989ac1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Mar 2024 16:21:55 +0000 Subject: [PATCH 1382/1526] Bump about_libraries from 10.10.0 to 11.1.0 (#2454) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a23f2191b..ec19ee49a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.9.22' - about_libraries = '10.10.0' + about_libraries = '11.1.0' hilt_version = '2.51' } repositories { From 333306e7ba57c278bafe33e0310cc7e88eb5574b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 2 Mar 2024 17:25:27 +0100 Subject: [PATCH 1383/1526] Wrap delete and save operations in database transactions (#2450) --- .../wulkanowy/data/db/dao/AdminMessageDao.kt | 14 +-- .../github/wulkanowy/data/db/dao/BaseDao.kt | 7 ++ .../data/repositories/AttendanceRepository.kt | 7 +- .../AttendanceSummaryRepository.kt | 9 +- .../CompletedLessonsRepository.kt | 14 ++- .../data/repositories/ConferenceRepository.kt | 12 +- .../data/repositories/ExamRepository.kt | 12 +- .../data/repositories/GradeRepository.kt | 87 +++++++------ .../repositories/GradeStatisticsRepository.kt | 22 ++-- .../data/repositories/HomeworkRepository.kt | 12 +- .../repositories/LuckyNumberRepository.kt | 11 +- .../data/repositories/MessageRepository.kt | 13 +- .../repositories/MobileDeviceRepository.kt | 7 +- .../data/repositories/NoteRepository.kt | 17 ++- .../data/repositories/RecipientRepository.kt | 12 +- .../SchoolAnnouncementRepository.kt | 12 +- .../data/repositories/SchoolRepository.kt | 8 +- .../data/repositories/SemesterRepository.kt | 15 ++- .../repositories/StudentInfoRepository.kt | 10 +- .../data/repositories/SubjectRepository.kt | 7 +- .../data/repositories/TeacherRepository.kt | 7 +- .../data/repositories/TimetableRepository.kt | 18 ++- .../repositories/AttendanceRepositoryTest.kt | 87 +++++++++---- .../CompletedLessonsRepositoryTest.kt | 117 +++++++++++------- .../data/repositories/ExamRemoteTest.kt | 66 ++++++---- .../data/repositories/GradeRepositoryTest.kt | 81 +++++++----- .../GradeStatisticsRepositoryTest.kt | 12 +- .../repositories/LuckyNumberRemoteTest.kt | 51 +++++--- .../repositories/MessageRepositoryTest.kt | 17 +-- .../MobileDeviceRepositoryTest.kt | 101 +++++++++------ .../data/repositories/RecipientLocalTest.kt | 20 ++- .../repositories/SemesterRepositoryTest.kt | 51 +++++--- .../repositories/TimetableRepositoryTest.kt | 17 +-- 33 files changed, 587 insertions(+), 366 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt index 2b4cb5975..6c8d7e471 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/AdminMessageDao.kt @@ -2,24 +2,14 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query -import androidx.room.Transaction import io.github.wulkanowy.data.db.entities.AdminMessage import kotlinx.coroutines.flow.Flow import javax.inject.Singleton @Singleton @Dao -abstract class AdminMessageDao : BaseDao { +interface AdminMessageDao : BaseDao { @Query("SELECT * FROM AdminMessages") - abstract fun loadAll(): Flow> - - @Transaction - open suspend fun removeOldAndSaveNew( - oldMessages: List, - newMessages: List - ) { - deleteAll(oldMessages) - insertAll(newMessages) - } + fun loadAll(): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt index 056a5cbd1..937e98248 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy +import androidx.room.Transaction import androidx.room.Update interface BaseDao { @@ -15,4 +16,10 @@ interface BaseDao { @Delete suspend fun deleteAll(items: List) + + @Transaction + suspend fun removeOldAndSaveNew(oldItems: List, newItems: List) { + deleteAll(oldItems) + insertAll(newItems) + } } 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 bbf627de0..46ea29f83 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 @@ -65,12 +65,13 @@ class AttendanceRepository @Inject constructor( .mapToEntities(semester, lessons) }, saveFetchResult = { old, new -> - attendanceDb.deleteAll(old uniqueSubtract new) val attendanceToAdd = (new uniqueSubtract old).map { newAttendance -> newAttendance.apply { if (notify) isNotified = false } } - attendanceDb.insertAll(attendanceToAdd) - + attendanceDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = attendanceToAdd, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester, start, end)) }, filterResult = { it.filter { item -> item.date in start..end } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt index 6bdcf9d7f..c6cfc2f6b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt @@ -1,5 +1,7 @@ package io.github.wulkanowy.data.repositories +import androidx.room.withTransaction +import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student @@ -20,6 +22,7 @@ class AttendanceSummaryRepository @Inject constructor( private val attendanceDb: AttendanceSummaryDao, private val sdk: Sdk, private val refreshHelper: AutoRefreshHelper, + private val appDatabase: AppDatabase, ) { private val saveFetchResultMutex = Mutex() @@ -46,8 +49,10 @@ class AttendanceSummaryRepository @Inject constructor( .mapToEntities(semester, subjectId) }, saveFetchResult = { old, new -> - attendanceDb.deleteAll(old uniqueSubtract new) - attendanceDb.insertAll(new uniqueSubtract old) + appDatabase.withTransaction { + attendanceDb.deleteAll(old uniqueSubtract new) + attendanceDb.insertAll(new uniqueSubtract old) + } refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester)) } ) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt index 1579ae62b..f7f86b23d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt @@ -6,7 +6,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.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.sync.Mutex import java.time.LocalDate import javax.inject.Inject @@ -53,8 +59,10 @@ class CompletedLessonsRepository @Inject constructor( .mapToEntities(semester) }, saveFetchResult = { old, new -> - completedLessonsDb.deleteAll(old uniqueSubtract new) - completedLessonsDb.insertAll(new uniqueSubtract old) + completedLessonsDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = new uniqueSubtract old, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester, start, end)) }, filterResult = { it.filter { item -> item.date in start..end } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt index 7eb37f0b7..fbe578604 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt @@ -53,12 +53,12 @@ class ConferenceRepository @Inject constructor( .filter { it.date >= startDate } }, saveFetchResult = { old, new -> - val conferencesToSave = (new uniqueSubtract old).onEach { - if (notify) it.isNotified = false - } - - conferenceDb.deleteAll(old uniqueSubtract new) - conferenceDb.insertAll(conferencesToSave) + conferenceDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = (new uniqueSubtract old).onEach { + if (notify) it.isNotified = false + }, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester)) } ) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt index 96026a55b..9b8dd02e3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt @@ -62,12 +62,12 @@ class ExamRepository @Inject constructor( .mapToEntities(semester) }, saveFetchResult = { old, new -> - val examsToSave = (new uniqueSubtract old).onEach { - if (notify) it.isNotified = false - } - - examDb.deleteAll(old uniqueSubtract new) - examDb.insertAll(examsToSave) + examDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = (new uniqueSubtract old).onEach { + if (notify) it.isNotified = false + }, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester, start, end)) }, filterResult = { it.filter { item -> item.date in start..end } } 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 1e2ea9354..ac1ef541b 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 @@ -87,10 +87,12 @@ class GradeRepository @Inject constructor( new: List, notify: Boolean ) { - gradeDescriptiveDb.deleteAll(old uniqueSubtract new) - gradeDescriptiveDb.insertAll((new uniqueSubtract old).onEach { - if (notify) it.isNotified = false - }) + gradeDescriptiveDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = (new uniqueSubtract old).onEach { + if (notify) it.isNotified = false + }, + ) } private suspend fun refreshGradeDetails( @@ -101,13 +103,16 @@ class GradeRepository @Inject constructor( ) { val notifyBreakDate = oldGrades.maxByOrNull { it.date }?.date ?: student.registrationDate.toLocalDate() - gradeDb.deleteAll(oldGrades uniqueSubtract newDetails) - gradeDb.insertAll((newDetails uniqueSubtract oldGrades).onEach { - if (it.date >= notifyBreakDate) it.apply { - isRead = false - if (notify) isNotified = false - } - }) + + gradeDb.removeOldAndSaveNew( + oldItems = oldGrades uniqueSubtract newDetails, + newItems = (newDetails uniqueSubtract oldGrades).onEach { + if (it.date >= notifyBreakDate) it.apply { + isRead = false + if (notify) isNotified = false + } + }, + ) } private suspend fun refreshGradeSummaries( @@ -115,31 +120,43 @@ class GradeRepository @Inject constructor( newSummary: List, notify: Boolean ) { - gradeSummaryDb.deleteAll(oldSummaries uniqueSubtract newSummary) - gradeSummaryDb.insertAll((newSummary uniqueSubtract oldSummaries).onEach { summary -> - val oldSummary = oldSummaries.find { old -> old.subject == summary.subject } - summary.isPredictedGradeNotified = when { - summary.predictedGrade.isEmpty() -> true - notify && oldSummary?.predictedGrade != summary.predictedGrade -> false - else -> true - } - summary.isFinalGradeNotified = when { - summary.finalGrade.isEmpty() -> true - notify && oldSummary?.finalGrade != summary.finalGrade -> false - else -> true - } + gradeSummaryDb.removeOldAndSaveNew( + oldItems = oldSummaries uniqueSubtract newSummary, + newItems = (newSummary uniqueSubtract oldSummaries).onEach { summary -> + getGradeSummaryWithUpdatedNotificationState( + summary = summary, + oldSummary = oldSummaries.find { it.subject == summary.subject }, + notify = notify, + ) + }, + ) + } - summary.predictedGradeLastChange = when { - oldSummary == null -> Instant.now() - summary.predictedGrade != oldSummary.predictedGrade -> Instant.now() - else -> oldSummary.predictedGradeLastChange - } - summary.finalGradeLastChange = when { - oldSummary == null -> Instant.now() - summary.finalGrade != oldSummary.finalGrade -> Instant.now() - else -> oldSummary.finalGradeLastChange - } - }) + private fun getGradeSummaryWithUpdatedNotificationState( + summary: GradeSummary, + oldSummary: GradeSummary?, + notify: Boolean, + ) { + summary.isPredictedGradeNotified = when { + summary.predictedGrade.isEmpty() -> true + notify && oldSummary?.predictedGrade != summary.predictedGrade -> false + else -> true + } + summary.isFinalGradeNotified = when { + summary.finalGrade.isEmpty() -> true + notify && oldSummary?.finalGrade != summary.finalGrade -> false + else -> true + } + summary.predictedGradeLastChange = when { + oldSummary == null -> Instant.now() + summary.predictedGrade != oldSummary.predictedGrade -> Instant.now() + else -> oldSummary.predictedGradeLastChange + } + summary.finalGradeLastChange = when { + oldSummary == null -> Instant.now() + summary.finalGrade != oldSummary.finalGrade -> Instant.now() + else -> oldSummary.finalGradeLastChange + } } fun getUnreadGrades(semester: Semester): Flow> { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt index 23d7b8582..809f92d3e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt @@ -19,7 +19,7 @@ import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex -import java.util.* +import java.util.Locale import javax.inject.Inject import javax.inject.Singleton @@ -62,8 +62,10 @@ class GradeStatisticsRepository @Inject constructor( .mapToEntities(semester) }, saveFetchResult = { old, new -> - gradePartialStatisticsDb.deleteAll(old uniqueSubtract new) - gradePartialStatisticsDb.insertAll(new uniqueSubtract old) + gradePartialStatisticsDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = new uniqueSubtract old, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(partialCacheKey, semester)) }, mapResult = { items -> @@ -80,6 +82,7 @@ class GradeStatisticsRepository @Inject constructor( ) listOf(summaryItem) + items } + else -> items.filter { it.subject == subjectName } }.mapPartialToStatisticItems() } @@ -107,8 +110,10 @@ class GradeStatisticsRepository @Inject constructor( .mapToEntities(semester) }, saveFetchResult = { old, new -> - gradeSemesterStatisticsDb.deleteAll(old uniqueSubtract new) - gradeSemesterStatisticsDb.insertAll(new uniqueSubtract old) + gradeSemesterStatisticsDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = new uniqueSubtract old, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(semesterCacheKey, semester)) }, mapResult = { items -> @@ -138,6 +143,7 @@ class GradeStatisticsRepository @Inject constructor( } listOf(summaryItem) + itemsWithAverage } + else -> itemsWithAverage.filter { it.subject == subjectName } }.mapSemesterToStatisticItems() } @@ -163,8 +169,10 @@ class GradeStatisticsRepository @Inject constructor( .mapToEntities(semester) }, saveFetchResult = { old, new -> - gradePointsStatisticsDb.deleteAll(old uniqueSubtract new) - gradePointsStatisticsDb.insertAll(new uniqueSubtract old) + gradePointsStatisticsDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = new uniqueSubtract old, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(pointsCacheKey, semester)) }, mapResult = { items -> diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt index 010cf8458..1a9c7ffaf 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt @@ -61,14 +61,14 @@ class HomeworkRepository @Inject constructor( .mapToEntities(semester) }, saveFetchResult = { old, new -> - val homeWorkToSave = (new uniqueSubtract old).onEach { - if (notify) it.isNotified = false - } val filteredOld = old.filterNot { it.isAddedByUser } - homeworkDb.deleteAll(filteredOld uniqueSubtract new) - homeworkDb.insertAll(homeWorkToSave) - + homeworkDb.removeOldAndSaveNew( + oldItems = filteredOld uniqueSubtract new, + newItems = (new uniqueSubtract old).onEach { + if (notify) it.isNotified = false + }, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester, start, end)) } ) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt index 4ff4517d0..45b7f6e29 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt @@ -18,7 +18,7 @@ import javax.inject.Singleton @Singleton class LuckyNumberRepository @Inject constructor( private val luckyNumberDb: LuckyNumberDao, - private val sdk: Sdk + private val sdk: Sdk, ) { private val saveFetchResultMutex = Mutex() @@ -39,11 +39,10 @@ class LuckyNumberRepository @Inject constructor( newLuckyNumber ?: return@networkBoundResource if (newLuckyNumber != oldLuckyNumber) { - val updatedLuckNumberList = - listOf(newLuckyNumber.apply { if (notify) isNotified = false }) - - oldLuckyNumber?.let { luckyNumberDb.deleteAll(listOfNotNull(it)) } - luckyNumberDb.insertAll(updatedLuckNumberList) + luckyNumberDb.removeOldAndSaveNew( + oldItems = listOfNotNull(oldLuckyNumber), + newItems = listOf(newLuckyNumber.apply { if (notify) isNotified = false }), + ) } } ) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index 96f048706..a4517760b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -89,12 +89,13 @@ class MessageRepository @Inject constructor( }, saveFetchResult = { oldWithAuthors, new -> val old = oldWithAuthors.map { it.message } - messagesDb.deleteAll(old uniqueSubtract new) - messagesDb.insertAll((new uniqueSubtract old).onEach { - val muted = isMuted(it.correspondents) - it.isNotified = !notify || muted - }) - + messagesDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = (new uniqueSubtract old).onEach { + val muted = isMuted(it.correspondents) + it.isNotified = !notify || muted + }, + ) refreshHelper.updateLastRefreshTimestamp( getRefreshKey(messagesCacheKey, mailbox, folder) ) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt index 412f9e7f0..48b4fc287 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt @@ -48,9 +48,10 @@ class MobileDeviceRepository @Inject constructor( .mapToEntities(student) }, saveFetchResult = { old, new -> - mobileDb.deleteAll(old uniqueSubtract new) - mobileDb.insertAll(new uniqueSubtract old) - + mobileDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = new uniqueSubtract old, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, student)) } ) 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 eeb1d53ef..feb92c154 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 @@ -7,7 +7,12 @@ 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.utils.* +import io.github.wulkanowy.utils.AutoRefreshHelper +import io.github.wulkanowy.utils.getRefreshKey +import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.switchSemester +import io.github.wulkanowy.utils.toLocalDate +import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -46,14 +51,16 @@ class NoteRepository @Inject constructor( .mapToEntities(semester) }, saveFetchResult = { old, new -> - noteDb.deleteAll(old uniqueSubtract new) - noteDb.insertAll((new uniqueSubtract old).onEach { + val notesToAdd = (new uniqueSubtract old).onEach { if (it.date >= student.registrationDate.toLocalDate()) it.apply { isRead = false if (notify) isNotified = false } - }) - + } + noteDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = notesToAdd, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester)) } ) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt index 79984ce6d..4a1474ced 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt @@ -1,7 +1,11 @@ package io.github.wulkanowy.data.repositories import io.github.wulkanowy.data.db.dao.RecipientDao -import io.github.wulkanowy.data.db.entities.* +import io.github.wulkanowy.data.db.entities.Mailbox +import io.github.wulkanowy.data.db.entities.MailboxType +import io.github.wulkanowy.data.db.entities.Message +import io.github.wulkanowy.data.db.entities.Recipient +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper @@ -25,8 +29,10 @@ class RecipientRepository @Inject constructor( .mapToEntities(mailbox.globalKey) val old = recipientDb.loadAll(type, mailbox.globalKey) - recipientDb.deleteAll(old uniqueSubtract new) - recipientDb.insertAll(new uniqueSubtract old) + recipientDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = new uniqueSubtract old, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, student)) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt index 8537fbc3e..f09a46aa1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt @@ -47,12 +47,12 @@ class SchoolAnnouncementRepository @Inject constructor( lastAnnouncements + directorInformation }, saveFetchResult = { old, new -> - val schoolAnnouncementsToSave = (new uniqueSubtract old).onEach { - if (notify) it.isNotified = false - } - - schoolAnnouncementDb.deleteAll(old uniqueSubtract new) - schoolAnnouncementDb.insertAll(schoolAnnouncementsToSave) + schoolAnnouncementDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = (new uniqueSubtract old).onEach { + if (notify) it.isNotified = false + }, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, student)) } ) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt index f757ef047..b42b4d577 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt @@ -47,10 +47,10 @@ class SchoolRepository @Inject constructor( }, saveFetchResult = { old, new -> if (old != null && new != old) { - with(schoolDb) { - deleteAll(listOf(old)) - insertAll(listOf(new)) - } + schoolDb.removeOldAndSaveNew( + oldItems = listOf(old), + newItems = listOf(new) + ) } else if (old == null) { schoolDb.insertAll(listOf(new)) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt index dd44df70f..9ae22babc 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt @@ -5,7 +5,11 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.utils.* +import io.github.wulkanowy.utils.DispatchersProvider +import io.github.wulkanowy.utils.getCurrentOrLast +import io.github.wulkanowy.utils.init +import io.github.wulkanowy.utils.isCurrent +import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.withContext import timber.log.Timber import javax.inject.Inject @@ -15,7 +19,7 @@ import javax.inject.Singleton class SemesterRepository @Inject constructor( private val semesterDb: SemesterDao, private val sdk: Sdk, - private val dispatchers: DispatchersProvider + private val dispatchers: DispatchersProvider, ) { suspend fun getSemesters( @@ -45,6 +49,7 @@ class SemesterRepository @Inject constructor( 0 == it.diaryId && 0 == it.kindergartenDiaryId } == true } + else -> false } @@ -59,8 +64,10 @@ class SemesterRepository @Inject constructor( if (new.isEmpty()) return Timber.i("Empty semester list!") val old = semesterDb.loadAll(student.studentId, student.classId) - semesterDb.deleteAll(old.uniqueSubtract(new)) - semesterDb.insertSemesters(new.uniqueSubtract(old)) + semesterDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = new uniqueSubtract old, + ) } suspend fun getCurrentSemester(student: Student, forceRefresh: Boolean = false) = diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt index d6cd25c82..d42be180d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt @@ -15,7 +15,7 @@ import javax.inject.Singleton @Singleton class StudentInfoRepository @Inject constructor( private val studentInfoDao: StudentInfoDao, - private val sdk: Sdk + private val sdk: Sdk, ) { private val saveFetchResultMutex = Mutex() @@ -36,10 +36,10 @@ class StudentInfoRepository @Inject constructor( }, saveFetchResult = { old, new -> if (old != null && new != old) { - with(studentInfoDao) { - deleteAll(listOf(old)) - insertAll(listOf(new)) - } + studentInfoDao.removeOldAndSaveNew( + oldItems = listOf(old), + newItems = listOf(new), + ) } else if (old == null) { studentInfoDao.insertAll(listOf(new)) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt index 98cb181af..cf7f86c22 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt @@ -45,9 +45,10 @@ class SubjectRepository @Inject constructor( .mapToEntities(semester) }, saveFetchResult = { old, new -> - subjectDao.deleteAll(old uniqueSubtract new) - subjectDao.insertAll(new uniqueSubtract old) - + subjectDao.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = new uniqueSubtract old + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester)) } ) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt index 42698f922..5a488b27c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt @@ -45,9 +45,10 @@ class TeacherRepository @Inject constructor( .mapToEntities(semester) }, saveFetchResult = { old, new -> - teacherDb.deleteAll(old uniqueSubtract new) - teacherDb.insertAll(new uniqueSubtract old) - + teacherDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = new uniqueSubtract old, + ) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester)) } ) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index acbd02d18..0d208c1fc 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -154,8 +154,10 @@ class TimetableRepository @Inject constructor( new.apply { if (notify) isNotified = false } } - timetableDb.deleteAll(lessonsToRemove) - timetableDb.insertAll(lessonsToAdd) + timetableDb.removeOldAndSaveNew( + oldItems = lessonsToRemove, + newItems = lessonsToAdd, + ) schedulerHelper.cancelScheduled(lessonsToRemove, student) schedulerHelper.scheduleNotifications(lessonsToAdd, student) @@ -166,13 +168,17 @@ class TimetableRepository @Inject constructor( new: List ) { val oldFiltered = old.filter { !it.isAddedByUser } - timetableAdditionalDb.deleteAll(oldFiltered uniqueSubtract new) - timetableAdditionalDb.insertAll(new uniqueSubtract old) + timetableAdditionalDb.removeOldAndSaveNew( + oldItems = oldFiltered uniqueSubtract new, + newItems = new uniqueSubtract old, + ) } private suspend fun refreshDayHeaders(old: List, new: List) { - timetableHeaderDb.deleteAll(old uniqueSubtract new) - timetableHeaderDb.insertAll(new uniqueSubtract old) + timetableHeaderDb.removeOldAndSaveNew( + oldItems = old uniqueSubtract new, + newItems = new uniqueSubtract old, + ) } fun getLastRefreshTimestamp(semester: Semester, start: LocalDate, end: LocalDate): Instant { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt index d0e500f19..e64144c2f 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt @@ -10,11 +10,17 @@ import io.github.wulkanowy.getSemesterEntity import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK +import io.mockk.just import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -61,26 +67,36 @@ class AttendanceRepositoryTest { } @Test - fun `force refresh without difference`() { + fun `force refresh without difference`() = runTest { // prepare coEvery { sdk.getAttendance(startDate, endDate) } returns remoteList coEvery { attendanceDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester, emptyList())), flowOf(remoteList.mapToEntities(semester, emptyList())) ) - coEvery { attendanceDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { attendanceDb.deleteAll(any()) } just Runs + coEvery { attendanceDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { attendanceRepository.getAttendance(student, semester, startDate, endDate, true).toFirstResult() } + val res = attendanceRepository.getAttendance( + student = student, + semester = semester, + start = startDate, + end = endDate, + forceRefresh = true, + ).toFirstResult() + // verify assertEquals(null, res.errorOrNull) assertEquals(2, res.dataOrNull?.size) coVerify { sdk.getAttendance(startDate, endDate) } coVerify { attendanceDb.loadAll(1, 1, startDate, endDate) } - coVerify { attendanceDb.insertAll(match { it.isEmpty() }) } - coVerify { attendanceDb.deleteAll(match { it.isEmpty() }) } + coVerify { + attendanceDb.removeOldAndSaveNew( + oldItems = match { it.isEmpty() }, + newItems = match { it.isEmpty() }, + ) + } } @Test @@ -89,14 +105,23 @@ class AttendanceRepositoryTest { coEvery { sdk.getAttendance(startDate, endDate) } returns remoteList coEvery { attendanceDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.dropLast(1).mapToEntities(semester, emptyList())), - flowOf(remoteList.dropLast(1).mapToEntities(semester, emptyList())), // after fetch end before save result + flowOf( + remoteList.dropLast(1).mapToEntities(semester, emptyList()) + ), // after fetch end before save result flowOf(remoteList.mapToEntities(semester, emptyList())) ) - coEvery { attendanceDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { attendanceDb.deleteAll(any()) } just Runs + coEvery { attendanceDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { attendanceRepository.getAttendance(student, semester, startDate, endDate, true).toFirstResult() } + val res = runBlocking { + attendanceRepository.getAttendance( + student, + semester, + startDate, + endDate, + true + ).toFirstResult() + } // verify assertEquals(null, res.errorOrNull) @@ -104,11 +129,13 @@ class AttendanceRepositoryTest { coVerify { sdk.getAttendance(startDate, endDate) } coVerify { attendanceDb.loadAll(1, 1, startDate, endDate) } coVerify { - attendanceDb.insertAll(match { - it.size == 1 && it[0] == remoteList.mapToEntities(semester, emptyList())[1] - }) + attendanceDb.removeOldAndSaveNew( + oldItems = match { it.isEmpty() }, + newItems = match { + it.size == 1 && it[0] == remoteList.mapToEntities(semester, emptyList())[1] + }, + ) } - coVerify { attendanceDb.deleteAll(match { it.isEmpty() }) } } @Test @@ -117,25 +144,39 @@ class AttendanceRepositoryTest { coEvery { sdk.getAttendance(startDate, endDate) } returns remoteList.dropLast(1) coEvery { attendanceDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester, emptyList())), - flowOf(remoteList.mapToEntities(semester, emptyList())), // after fetch end before save result + flowOf( + remoteList.mapToEntities( + semester, + emptyList() + ) + ), // after fetch end before save result flowOf(remoteList.dropLast(1).mapToEntities(semester, emptyList())) ) - coEvery { attendanceDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { attendanceDb.deleteAll(any()) } just Runs + coEvery { attendanceDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { attendanceRepository.getAttendance(student, semester, startDate, endDate, true).toFirstResult() } + val res = runBlocking { + attendanceRepository.getAttendance( + student, + semester, + startDate, + endDate, + true + ).toFirstResult() + } // verify assertEquals(null, res.errorOrNull) assertEquals(1, res.dataOrNull?.size) coVerify { sdk.getAttendance(startDate, endDate) } coVerify { attendanceDb.loadAll(1, 1, startDate, endDate) } - coVerify { attendanceDb.insertAll(match { it.isEmpty() }) } coVerify { - attendanceDb.deleteAll(match { - it.size == 1 && it[0] == remoteList.mapToEntities(semester, emptyList())[1] - }) + attendanceDb.removeOldAndSaveNew( + oldItems = match { + it.size == 1 && it[0] == remoteList.mapToEntities(semester, emptyList())[1] + }, + newItems = emptyList(), + ) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt index c28ea304b..f8f688501 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt @@ -9,11 +9,16 @@ import io.github.wulkanowy.getSemesterEntity import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK +import io.mockk.just import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -52,46 +57,28 @@ class CompletedLessonsRepositoryTest { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - completedLessonRepository = CompletedLessonsRepository(completedLessonDb, sdk, refreshHelper) + completedLessonRepository = + CompletedLessonsRepository(completedLessonDb, sdk, refreshHelper) } @Test - fun `force refresh without difference`() { + fun `force refresh without difference`() = runTest { // prepare coEvery { sdk.getCompletedLessons(startDate, endDate) } returns remoteList coEvery { completedLessonDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( flowOf(remoteList.mapToEntities(semester)), flowOf(remoteList.mapToEntities(semester)) ) - coEvery { completedLessonDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { completedLessonDb.deleteAll(any()) } just Runs + coEvery { completedLessonDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { completedLessonRepository.getCompletedLessons(student, semester, startDate, endDate, true).toFirstResult() } - - // verify - assertEquals(null, res.errorOrNull) - assertEquals(2, res.dataOrNull?.size) - coVerify { sdk.getCompletedLessons(startDate, endDate) } - coVerify { completedLessonDb.loadAll(1, 1, startDate, endDate) } - coVerify { completedLessonDb.insertAll(match { it.isEmpty() }) } - coVerify { completedLessonDb.deleteAll(match { it.isEmpty() }) } - } - - @Test - fun `force refresh with more items in remote`() { - // prepare - coEvery { sdk.getCompletedLessons(startDate, endDate) } returns remoteList - coEvery { completedLessonDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( - flowOf(remoteList.dropLast(1).mapToEntities(semester)), - flowOf(remoteList.dropLast(1).mapToEntities(semester)), // after fetch end before save result - flowOf(remoteList.mapToEntities(semester)) - ) - coEvery { completedLessonDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { completedLessonDb.deleteAll(any()) } just Runs - - // execute - val res = runBlocking { completedLessonRepository.getCompletedLessons(student, semester, startDate, endDate, true).toFirstResult() } + val res = completedLessonRepository.getCompletedLessons( + student = student, + semester = semester, + start = startDate, + end = endDate, + forceRefresh = true, + ).toFirstResult() // verify assertEquals(null, res.errorOrNull) @@ -99,15 +86,52 @@ class CompletedLessonsRepositoryTest { coVerify { sdk.getCompletedLessons(startDate, endDate) } coVerify { completedLessonDb.loadAll(1, 1, startDate, endDate) } coVerify { - completedLessonDb.insertAll(match { - it.size == 1 && it[0] == remoteList.mapToEntities(semester)[1] - }) + completedLessonDb.removeOldAndSaveNew( + oldItems = match { it.isEmpty() }, + newItems = match { it.isEmpty() }, + ) } - coVerify { completedLessonDb.deleteAll(match { it.isEmpty() }) } } @Test - fun `force refresh with more items in local`() { + fun `force refresh with more items in remote`() = runTest { + // prepare + coEvery { sdk.getCompletedLessons(startDate, endDate) } returns remoteList + coEvery { completedLessonDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( + flowOf(remoteList.dropLast(1).mapToEntities(semester)), + flowOf( + remoteList.dropLast(1).mapToEntities(semester) + ), // after fetch end before save result + flowOf(remoteList.mapToEntities(semester)) + ) + coEvery { completedLessonDb.removeOldAndSaveNew(any(), any()) } just Runs + + // execute + val res = completedLessonRepository.getCompletedLessons( + student = student, + semester = semester, + start = startDate, + end = endDate, + forceRefresh = true + ).toFirstResult() + + // verify + assertEquals(null, res.errorOrNull) + assertEquals(2, res.dataOrNull?.size) + coVerify { sdk.getCompletedLessons(startDate, endDate) } + coVerify { completedLessonDb.loadAll(1, 1, startDate, endDate) } + coVerify { + completedLessonDb.removeOldAndSaveNew( + oldItems = match { it.isEmpty() }, + newItems = match { + it.size == 1 && it[0] == remoteList.mapToEntities(semester)[1] + } + ) + } + } + + @Test + fun `force refresh with more items in local`() = runTest { // prepare coEvery { sdk.getCompletedLessons(startDate, endDate) } returns remoteList.dropLast(1) coEvery { completedLessonDb.loadAll(1, 1, startDate, endDate) } returnsMany listOf( @@ -115,22 +139,29 @@ class CompletedLessonsRepositoryTest { flowOf(remoteList.mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.dropLast(1).mapToEntities(semester)) ) - coEvery { completedLessonDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { completedLessonDb.deleteAll(any()) } just Runs + coEvery { completedLessonDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { completedLessonRepository.getCompletedLessons(student, semester, startDate, endDate, true).toFirstResult() } + val res = completedLessonRepository.getCompletedLessons( + student = student, + semester = semester, + start = startDate, + end = endDate, + forceRefresh = true, + ).toFirstResult() // verify assertEquals(null, res.errorOrNull) assertEquals(1, res.dataOrNull?.size) coVerify { sdk.getCompletedLessons(startDate, endDate) } coVerify { completedLessonDb.loadAll(1, 1, startDate, endDate) } - coVerify { completedLessonDb.insertAll(match { it.isEmpty() }) } coVerify { - completedLessonDb.deleteAll(match { - it.size == 1 && it[0] == remoteList.mapToEntities(semester)[1] - }) + completedLessonDb.removeOldAndSaveNew( + oldItems = match { + it.size == 1 && it[0] == remoteList.mapToEntities(semester)[1] + }, + newItems = match { it.isEmpty() }, + ) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt index fb037a87e..d1ed9ca32 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt @@ -9,11 +9,17 @@ import io.github.wulkanowy.getSemesterEntity import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK +import io.mockk.just import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -64,35 +70,42 @@ class ExamRemoteTest { flowOf(remoteList.mapToEntities(semester)), flowOf(remoteList.mapToEntities(semester)) ) - coEvery { examDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { examDb.deleteAll(any()) } just Runs + coEvery { examDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { examRepository.getExams(student, semester, startDate, endDate, true).toFirstResult() } + val res = runBlocking { + examRepository.getExams(student, semester, startDate, endDate, true).toFirstResult() + } // verify assertEquals(null, res.errorOrNull) assertEquals(2, res.dataOrNull?.size) coVerify { sdk.getExams(startDate, realEndDate) } coVerify { examDb.loadAll(1, 1, startDate, realEndDate) } - coVerify { examDb.insertAll(match { it.isEmpty() }) } - coVerify { examDb.deleteAll(match { it.isEmpty() }) } + coVerify { examDb.removeOldAndSaveNew(emptyList(), emptyList()) } } @Test - fun `force refresh with more items in remote`() { + fun `force refresh with more items in remote`() = runTest { // prepare coEvery { sdk.getExams(startDate, realEndDate) } returns remoteList coEvery { examDb.loadAll(1, 1, startDate, realEndDate) } returnsMany listOf( flowOf(remoteList.dropLast(1).mapToEntities(semester)), - flowOf(remoteList.dropLast(1).mapToEntities(semester)), // after fetch end before save result + flowOf( + remoteList.dropLast(1).mapToEntities(semester) + ), // after fetch end before save result flowOf(remoteList.mapToEntities(semester)) ) - coEvery { examDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { examDb.deleteAll(any()) } just Runs + coEvery { examDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { examRepository.getExams(student, semester, startDate, endDate, true).toFirstResult() } + val res = examRepository.getExams( + student = student, + semester = semester, + start = startDate, + end = endDate, + forceRefresh = true, + ).toFirstResult() // verify assertEquals(null, res.errorOrNull) @@ -100,15 +113,17 @@ class ExamRemoteTest { coVerify { sdk.getExams(startDate, realEndDate) } coVerify { examDb.loadAll(1, 1, startDate, realEndDate) } coVerify { - examDb.insertAll(match { - it.size == 1 && it[0] == remoteList.mapToEntities(semester)[1] - }) + examDb.removeOldAndSaveNew( + oldItems = emptyList(), + newItems = match { + it.size == 1 && it[0] == remoteList.mapToEntities(semester)[1] + }, + ) } - coVerify { examDb.deleteAll(match { it.isEmpty() }) } } @Test - fun `force refresh with more items in local`() { + fun `force refresh with more items in local`() = runTest { // prepare coEvery { sdk.getExams(startDate, realEndDate) } returns remoteList.dropLast(1) coEvery { examDb.loadAll(1, 1, startDate, realEndDate) } returnsMany listOf( @@ -116,22 +131,27 @@ class ExamRemoteTest { flowOf(remoteList.mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.dropLast(1).mapToEntities(semester)) ) - coEvery { examDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { examDb.deleteAll(any()) } just Runs + coEvery { examDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { examRepository.getExams(student, semester, startDate, endDate, true).toFirstResult() } + val res = examRepository.getExams( + student = student, + semester = semester, + start = startDate, + end = endDate, + forceRefresh = true, + ).toFirstResult() // verify assertEquals(null, res.errorOrNull) assertEquals(1, res.dataOrNull?.size) coVerify { sdk.getExams(startDate, realEndDate) } coVerify { examDb.loadAll(1, 1, startDate, realEndDate) } - coVerify { examDb.insertAll(match { it.isEmpty() }) } coVerify { - examDb.deleteAll(match { - it.size == 1 && it[0] == remoteList.mapToEntities(semester)[1] - }) + examDb.removeOldAndSaveNew( + oldItems = match { it.size == 1 && it[0] == remoteList.mapToEntities(semester)[1] }, + newItems = emptyList() + ) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt index 515b0d66d..0ea5d3fa4 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt @@ -22,6 +22,7 @@ import io.mockk.impl.annotations.SpyK import io.mockk.just import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue @@ -60,26 +61,27 @@ class GradeRepositoryTest { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - gradeRepository = - GradeRepository(gradeDb, gradeSummaryDb, gradeDescriptiveDb, sdk, refreshHelper) + gradeRepository = GradeRepository( + gradeDb = gradeDb, + gradeSummaryDb = gradeSummaryDb, + gradeDescriptiveDb = gradeDescriptiveDb, + sdk = sdk, + refreshHelper = refreshHelper, + ) - coEvery { gradeDb.deleteAll(any()) } just Runs - coEvery { gradeDb.insertAll(any()) } returns listOf() + coEvery { gradeDb.removeOldAndSaveNew(any(), any()) } just Runs + coEvery { gradeSummaryDb.removeOldAndSaveNew(any(), any()) } just Runs coEvery { gradeSummaryDb.loadAll(1, 1) } returnsMany listOf( flowOf(listOf()), flowOf(listOf()), flowOf(listOf()) ) - coEvery { gradeSummaryDb.deleteAll(any()) } just Runs - coEvery { gradeSummaryDb.insertAll(any()) } returns listOf() + coEvery { gradeDescriptiveDb.removeOldAndSaveNew(any(), any()) } just Runs coEvery { gradeDescriptiveDb.loadAll(any(), any()) } returnsMany listOf( flowOf(listOf()), ) - - coEvery { gradeDescriptiveDb.deleteAll(any()) } just Runs - coEvery { gradeDescriptiveDb.insertAll(any()) } returns listOf() } @Test @@ -113,13 +115,16 @@ class GradeRepositoryTest { assertEquals(null, res.errorOrNull) assertEquals(4, res.dataOrNull?.first?.size) coVerify { - gradeDb.insertAll(withArg { - assertEquals(4, it.size) - assertTrue(it[0].isRead) - assertTrue(it[1].isRead) - assertFalse(it[2].isRead) - assertFalse(it[3].isRead) - }) + gradeDb.removeOldAndSaveNew( + oldItems = emptyList(), + newItems = withArg { + assertEquals(4, it.size) + assertTrue(it[0].isRead) + assertTrue(it[1].isRead) + assertFalse(it[2].isRead) + assertFalse(it[3].isRead) + }, + ) } } @@ -167,23 +172,23 @@ class GradeRepositoryTest { assertEquals(null, res.errorOrNull) assertEquals(4, res.dataOrNull?.first?.size) coVerify { - gradeDb.insertAll(withArg { - assertEquals(3, it.size) - assertTrue(it[0].isRead) - assertTrue(it[1].isRead) - assertFalse(it[2].isRead) - assertEquals(remoteList.mapToEntities(semester).last(), it[2]) - }) - } - coVerify { - gradeDb.deleteAll(withArg { - assertEquals(2, it.size) - }) + gradeDb.removeOldAndSaveNew( + oldItems = withArg { + assertEquals(2, it.size) + }, + newItems = withArg { + assertEquals(3, it.size) + assertTrue(it[0].isRead) + assertTrue(it[1].isRead) + assertFalse(it[2].isRead) + assertEquals(remoteList.mapToEntities(semester).last(), it[2]) + } + ) } } @Test - fun `force refresh when local contains duplicated grades`() { + fun `force refresh when local contains duplicated grades`() = runTest { // prepare val remoteList = listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), @@ -203,13 +208,17 @@ class GradeRepositoryTest { ) // execute - val res = runBlocking { gradeRepository.getGrades(student, semester, true).toFirstResult() } + val res = gradeRepository.getGrades(student, semester, true).toFirstResult() // verify assertEquals(null, res.errorOrNull) assertEquals(2, res.dataOrNull?.first?.size) - coVerify { gradeDb.insertAll(match { it.isEmpty() }) } - coVerify { gradeDb.deleteAll(match { it.size == 1 }) } // ... here + coVerify { + gradeDb.removeOldAndSaveNew( + oldItems = match { it.size == 1 }, // ... here + newItems = emptyList() + ) + } } @Test @@ -238,8 +247,12 @@ class GradeRepositoryTest { // verify assertEquals(null, res.errorOrNull) assertEquals(3, res.dataOrNull?.first?.size) - coVerify { gradeDb.insertAll(match { it.size == 1 }) } // ... here - coVerify { gradeDb.deleteAll(match { it.isEmpty() }) } + coVerify { + gradeDb.removeOldAndSaveNew( + oldItems = emptyList(), + newItems = match { it.size == 1 }, // ... here + ) + } } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt index 8e2f7c6ef..dfd36ee1a 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt @@ -71,8 +71,7 @@ class GradeStatisticsRepositoryTest { flowOf(remotePartialList.mapToEntities(semester)), flowOf(remotePartialList.mapToEntities(semester)) ) - coEvery { gradePartialStatisticsDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { gradePartialStatisticsDb.deleteAll(any()) } just Runs + coEvery { gradePartialStatisticsDb.removeOldAndSaveNew(any(), any()) } just Runs // execute val res = runBlocking { @@ -93,8 +92,7 @@ class GradeStatisticsRepositoryTest { assertEquals("", items[2].partial?.studentAverage) coVerify { sdk.getGradesPartialStatistics(1) } coVerify { gradePartialStatisticsDb.loadAll(1, 1) } - coVerify { gradePartialStatisticsDb.insertAll(match { it.isEmpty() }) } - coVerify { gradePartialStatisticsDb.deleteAll(match { it.isEmpty() }) } + coVerify { gradePartialStatisticsDb.removeOldAndSaveNew(emptyList(), emptyList()) } } @Test @@ -109,8 +107,7 @@ class GradeStatisticsRepositoryTest { flowOf(remotePartialList.mapToEntities(semester)), flowOf(remotePartialList.mapToEntities(semester)) ) - coEvery { gradePartialStatisticsDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { gradePartialStatisticsDb.deleteAll(any()) } just Runs + coEvery { gradePartialStatisticsDb.removeOldAndSaveNew(any(), any()) } just Runs // execute val res = runBlocking { @@ -131,8 +128,7 @@ class GradeStatisticsRepositoryTest { assertEquals("5.0", items[2].partial?.studentAverage) coVerify { sdk.getGradesPartialStatistics(1) } coVerify { gradePartialStatisticsDb.loadAll(1, 1) } - coVerify { gradePartialStatisticsDb.insertAll(match { it.isEmpty() }) } - coVerify { gradePartialStatisticsDb.deleteAll(match { it.isEmpty() }) } + coVerify { gradePartialStatisticsDb.removeOldAndSaveNew(emptyList(), emptyList()) } } private fun getGradeStatisticsPartialSubject( diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt index 3225c3bd2..fa78b1bd3 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt @@ -7,11 +7,16 @@ import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.data.toFirstResult import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK +import io.mockk.just import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -53,7 +58,8 @@ class LuckyNumberRemoteTest { coEvery { luckyNumberDb.deleteAll(any()) } just Runs // execute - val res = runBlocking { luckyNumberRepository.getLuckyNumber(student, true).toFirstResult() } + val res = + runBlocking { luckyNumberRepository.getLuckyNumber(student, true).toFirstResult() } // verify assertEquals(null, res.errorOrNull) @@ -65,19 +71,19 @@ class LuckyNumberRemoteTest { } @Test - fun `force refresh with different item on remote`() { + fun `force refresh with different item on remote`() = runTest { // prepare coEvery { sdk.getLuckyNumber(student.schoolShortName) } returns luckyNumber coEvery { luckyNumberDb.load(1, date) } returnsMany listOf( flowOf(luckyNumber.mapToEntity(student).copy(luckyNumber = 6666)), - flowOf(luckyNumber.mapToEntity(student).copy(luckyNumber = 6666)), // after fetch end before save result + // after fetch end before save result + flowOf(luckyNumber.mapToEntity(student).copy(luckyNumber = 6666)), flowOf(luckyNumber.mapToEntity(student)) ) - coEvery { luckyNumberDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { luckyNumberDb.deleteAll(any()) } just Runs + coEvery { luckyNumberDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { luckyNumberRepository.getLuckyNumber(student, true).toFirstResult() } + val res = luckyNumberRepository.getLuckyNumber(student, true).toFirstResult() // verify assertEquals(null, res.errorOrNull) @@ -85,13 +91,16 @@ class LuckyNumberRemoteTest { coVerify { sdk.getLuckyNumber(student.schoolShortName) } coVerify { luckyNumberDb.load(1, date) } coVerify { - luckyNumberDb.insertAll(match { - it.size == 1 && it[0] == luckyNumber.mapToEntity(student) - }) + luckyNumberDb.removeOldAndSaveNew( + oldItems = match { + it.size == 1 && it[0] == luckyNumber.mapToEntity(student) + .copy(luckyNumber = 6666) + }, + newItems = match { + it.size == 1 && it[0] == luckyNumber.mapToEntity(student) + } + ) } - coVerify { luckyNumberDb.deleteAll(match { - it.size == 1 && it[0] == luckyNumber.mapToEntity(student).copy(luckyNumber = 6666) - }) } } @Test @@ -103,11 +112,11 @@ class LuckyNumberRemoteTest { flowOf(null), // after fetch end before save result flowOf(luckyNumber.mapToEntity(student)) ) - coEvery { luckyNumberDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { luckyNumberDb.deleteAll(any()) } just Runs + coEvery { luckyNumberDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { luckyNumberRepository.getLuckyNumber(student, true).toFirstResult() } + val res = + runBlocking { luckyNumberRepository.getLuckyNumber(student, true).toFirstResult() } // verify assertEquals(null, res.errorOrNull) @@ -115,10 +124,12 @@ class LuckyNumberRemoteTest { coVerify { sdk.getLuckyNumber(student.schoolShortName) } coVerify { luckyNumberDb.load(1, date) } coVerify { - luckyNumberDb.insertAll(match { - it.size == 1 && it[0] == luckyNumber.mapToEntity(student) - }) + luckyNumberDb.removeOldAndSaveNew( + oldItems = emptyList(), + newItems = match { + it.size == 1 && it[0] == luckyNumber.mapToEntity(student) + } + ) } - coVerify(exactly = 0) { luckyNumberDb.deleteAll(any()) } } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt index 58937e776..fbbe49345 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt @@ -113,7 +113,7 @@ class MessageRepositoryTest { } @Test - fun `get messages when fetched completely new message without notify`() = runBlocking { + fun `get messages when fetched completely new message without notify`() = runTest { coEvery { mailboxDao.loadAll(any()) } returns listOf(mailbox) every { messageDb.loadAll(mailbox.globalKey, any()) } returns flowOf(emptyList()) coEvery { sdk.getMessages(Folder.RECEIVED, any()) } returns listOf( @@ -122,8 +122,7 @@ class MessageRepositoryTest { readBy = 10, ) ) - coEvery { messageDb.deleteAll(any()) } just Runs - coEvery { messageDb.insertAll(any()) } returns listOf() + coEvery { messageDb.removeOldAndSaveNew(any(), any()) } just Runs val res = repository.getMessages( student = student, @@ -134,12 +133,14 @@ class MessageRepositoryTest { ).toFirstResult() assertEquals(null, res.errorOrNull) - coVerify(exactly = 1) { messageDb.deleteAll(withArg { checkEquals(emptyList()) }) } coVerify { - messageDb.insertAll(withArg { - assertEquals(4, it.single().messageId) - assertTrue(it.single().isNotified) - }) + messageDb.removeOldAndSaveNew( + oldItems = withArg { checkEquals(emptyList()) }, + newItems = withArg { + assertEquals(4, it.single().messageId) + assertTrue(it.single().isNotified) + }, + ) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt index 1a3f96795..aa93a5e6f 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt @@ -19,7 +19,7 @@ import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK import io.mockk.just import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest import org.junit.Assert import org.junit.Before import org.junit.Test @@ -57,42 +57,21 @@ class MobileDeviceRepositoryTest { } @Test - fun `force refresh without difference`() { + fun `force refresh without difference`() = runTest { // prepare coEvery { sdk.getRegisteredDevices() } returns remoteList coEvery { mobileDeviceDb.loadAll(student.studentId) } returnsMany listOf( flowOf(remoteList.mapToEntities(student)), flowOf(remoteList.mapToEntities(student)) ) - coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { mobileDeviceDb.deleteAll(any()) } just Runs + coEvery { mobileDeviceDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { mobileDeviceRepository.getDevices(student, semester, true).toFirstResult() } - - // verify - Assert.assertEquals(null, res.errorOrNull) - Assert.assertEquals(2, res.dataOrNull?.size) - coVerify { sdk.getRegisteredDevices() } - coVerify { mobileDeviceDb.loadAll(1) } - coVerify { mobileDeviceDb.insertAll(match { it.isEmpty() }) } - coVerify { mobileDeviceDb.deleteAll(match { it.isEmpty() }) } - } - - @Test - fun `force refresh with more items in remote`() { - // prepare - coEvery { sdk.getRegisteredDevices() } returns remoteList - coEvery { mobileDeviceDb.loadAll(1) } returnsMany listOf( - flowOf(remoteList.dropLast(1).mapToEntities(student)), - flowOf(remoteList.dropLast(1).mapToEntities(student)), // after fetch end before save result - flowOf(remoteList.mapToEntities(student)) - ) - coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { mobileDeviceDb.deleteAll(any()) } just Runs - - // execute - val res = runBlocking { mobileDeviceRepository.getDevices(student, semester, true).toFirstResult() } + val res = mobileDeviceRepository.getDevices( + student = student, + semester = semester, + forceRefresh = true, + ).toFirstResult() // verify Assert.assertEquals(null, res.errorOrNull) @@ -100,15 +79,50 @@ class MobileDeviceRepositoryTest { coVerify { sdk.getRegisteredDevices() } coVerify { mobileDeviceDb.loadAll(1) } coVerify { - mobileDeviceDb.insertAll(match { - it.size == 1 && it[0] == remoteList.mapToEntities(student)[1] - }) + mobileDeviceDb.removeOldAndSaveNew( + oldItems = match { it.isEmpty() }, + newItems = match { it.isEmpty() }, + ) } - coVerify { mobileDeviceDb.deleteAll(match { it.isEmpty() }) } } @Test - fun `force refresh with more items in local`() { + fun `force refresh with more items in remote`() = runTest { + // prepare + coEvery { sdk.getRegisteredDevices() } returns remoteList + coEvery { mobileDeviceDb.loadAll(1) } returnsMany listOf( + flowOf(remoteList.dropLast(1).mapToEntities(student)), + flowOf( + remoteList.dropLast(1).mapToEntities(student) + ), // after fetch end before save result + flowOf(remoteList.mapToEntities(student)) + ) + coEvery { mobileDeviceDb.removeOldAndSaveNew(any(), any()) } just Runs + + // execute + val res = mobileDeviceRepository.getDevices( + student = student, + semester = semester, + forceRefresh = true, + ).toFirstResult() + + // verify + Assert.assertEquals(null, res.errorOrNull) + Assert.assertEquals(2, res.dataOrNull?.size) + coVerify { sdk.getRegisteredDevices() } + coVerify { mobileDeviceDb.loadAll(1) } + coVerify { + mobileDeviceDb.removeOldAndSaveNew( + oldItems = match { it.isEmpty() }, + newItems = match { + it.size == 1 && it[0] == remoteList.mapToEntities(student)[1] + }, + ) + } + } + + @Test + fun `force refresh with more items in local`() = runTest { // prepare coEvery { sdk.getRegisteredDevices() } returns remoteList.dropLast(1) coEvery { mobileDeviceDb.loadAll(1) } returnsMany listOf( @@ -116,22 +130,27 @@ class MobileDeviceRepositoryTest { flowOf(remoteList.mapToEntities(student)), // after fetch end before save result flowOf(remoteList.dropLast(1).mapToEntities(student)) ) - coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { mobileDeviceDb.deleteAll(any()) } just Runs + coEvery { mobileDeviceDb.removeOldAndSaveNew(any(), any()) } just Runs // execute - val res = runBlocking { mobileDeviceRepository.getDevices(student, semester, true).toFirstResult() } + val res = mobileDeviceRepository.getDevices( + student = student, + semester = semester, + forceRefresh = true, + ).toFirstResult() // verify Assert.assertEquals(null, res.errorOrNull) Assert.assertEquals(1, res.dataOrNull?.size) coVerify { sdk.getRegisteredDevices() } coVerify { mobileDeviceDb.loadAll(1) } - coVerify { mobileDeviceDb.insertAll(match { it.isEmpty() }) } coVerify { - mobileDeviceDb.deleteAll(match { - it.size == 1 && it[0] == remoteList.mapToEntities(student)[1] - }) + mobileDeviceDb.removeOldAndSaveNew( + oldItems = match { + it.size == 1 && it[0] == remoteList.mapToEntities(student)[1] + }, + newItems = match { it.isEmpty() }, + ) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt index ae73a7958..e608cafb1 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt @@ -69,7 +69,12 @@ class RecipientLocalTest { @Test fun `load recipients when items already in database`() { // prepare - coEvery { recipientDb.loadAll(io.github.wulkanowy.data.db.entities.MailboxType.UNKNOWN, "v4") } returnsMany listOf( + coEvery { + recipientDb.loadAll( + io.github.wulkanowy.data.db.entities.MailboxType.UNKNOWN, + "v4" + ) + } returnsMany listOf( remoteList.mapToEntities("v4"), remoteList.mapToEntities("v4") ) @@ -108,8 +113,7 @@ class RecipientLocalTest { emptyList(), remoteList.mapToEntities("v4") ) - coEvery { recipientDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { recipientDb.deleteAll(any()) } just Runs + coEvery { recipientDb.removeOldAndSaveNew(any(), any()) } just Runs // execute val res = runBlocking { @@ -123,8 +127,12 @@ class RecipientLocalTest { // verify assertEquals(3, res.size) coVerify { sdk.getRecipients("v4") } - coVerify { recipientDb.loadAll(io.github.wulkanowy.data.db.entities.MailboxType.UNKNOWN, "v4") } - coVerify { recipientDb.insertAll(match { it.isEmpty() }) } - coVerify { recipientDb.deleteAll(match { it.isEmpty() }) } + coVerify { + recipientDb.loadAll( + io.github.wulkanowy.data.db.entities.MailboxType.UNKNOWN, + "v4" + ) + } + coVerify { recipientDb.removeOldAndSaveNew(match { it.isEmpty() }, match { it.isEmpty() }) } } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt index 31098d2ef..96db8a794 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt @@ -50,13 +50,16 @@ class SemesterRepositoryTest { coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns emptyList() coEvery { sdk.getSemesters() } returns semesters - coEvery { semesterDb.deleteAll(any()) } just Runs - coEvery { semesterDb.insertSemesters(any()) } returns emptyList() + coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs runBlocking { semesterRepository.getSemesters(student) } - coVerify { semesterDb.insertSemesters(semesters.mapToEntities(student.studentId)) } - coVerify { semesterDb.deleteAll(emptyList()) } + coVerify { + semesterDb.removeOldAndSaveNew( + oldItems = emptyList(), + newItems = semesters.mapToEntities(student.studentId), + ) + } } @Test @@ -71,12 +74,17 @@ class SemesterRepositoryTest { getSemesterPojo(123, 2, now().minusMonths(3), now()) ) - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns badSemesters.mapToEntities(student.studentId) + coEvery { + semesterDb.loadAll( + student.studentId, + student.classId + ) + } returns badSemesters.mapToEntities(student.studentId) coEvery { sdk.getSemesters() } returns goodSemesters - coEvery { semesterDb.deleteAll(any()) } just Runs - coEvery { semesterDb.insertSemesters(any()) } returns listOf() + coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs - val items = runBlocking { semesterRepository.getSemesters(student.copy(loginMode = Sdk.Mode.HEBE.name)) } + val items = + runBlocking { semesterRepository.getSemesters(student.copy(loginMode = Sdk.Mode.HEBE.name)) } assertEquals(2, items.size) assertEquals(0, items[0].diaryId) } @@ -99,8 +107,7 @@ class SemesterRepositoryTest { goodSemesters.mapToEntities(student.studentId) ) coEvery { sdk.getSemesters() } returns goodSemesters - coEvery { semesterDb.deleteAll(any()) } just Runs - coEvery { semesterDb.insertSemesters(any()) } returns listOf() + coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs val items = semesterRepository.getSemesters( student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) @@ -157,13 +164,16 @@ class SemesterRepositoryTest { coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns emptyList() coEvery { sdk.getSemesters() } returns semesters - coEvery { semesterDb.deleteAll(any()) } just Runs - coEvery { semesterDb.insertSemesters(any()) } returns listOf() + coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } - coVerify { semesterDb.deleteAll(emptyList()) } - coVerify { semesterDb.insertSemesters(semesters.mapToEntities(student.studentId)) } + coVerify { + semesterDb.removeOldAndSaveNew( + oldItems = emptyList(), + newItems = semesters.mapToEntities(student.studentId), + ) + } } @Test @@ -181,12 +191,17 @@ class SemesterRepositoryTest { getSemesterPojo(2, 2, now().plusMonths(5), now().plusMonths(11)), ) - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semestersWithNoCurrent + coEvery { + semesterDb.loadAll( + student.studentId, + student.classId + ) + } returns semestersWithNoCurrent coEvery { sdk.getSemesters() } returns newSemesters - coEvery { semesterDb.deleteAll(any()) } just Runs - coEvery { semesterDb.insertSemesters(any()) } returns listOf() + coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs - val items = runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } + val items = + runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } assertEquals(2, items.size) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt index 92ad01b18..2a61f99ce 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt @@ -108,8 +108,7 @@ class TimetableRepositoryTest { flowOf(remoteList.mapToEntities(semester)), flowOf(remoteList.mapToEntities(semester)) ) - coEvery { timetableDb.insertAll(any()) } returns listOf(1, 2, 3) - coEvery { timetableDb.deleteAll(any()) } just Runs + coEvery { timetableDb.removeOldAndSaveNew(any(), any()) } just Runs coEvery { timetableAdditionalDao.loadAll( @@ -119,12 +118,10 @@ class TimetableRepositoryTest { end = endDate ) } returns flowOf(listOf()) - coEvery { timetableAdditionalDao.deleteAll(emptyList()) } just Runs - coEvery { timetableAdditionalDao.insertAll(emptyList()) } returns listOf(1, 2, 3) + coEvery { timetableAdditionalDao.removeOldAndSaveNew(any(), any()) } just Runs coEvery { timetableHeaderDao.loadAll(1, 1, startDate, endDate) } returns flowOf(listOf()) - coEvery { timetableHeaderDao.insertAll(emptyList()) } returns listOf(1, 2, 3) - coEvery { timetableHeaderDao.deleteAll(emptyList()) } just Runs + coEvery { timetableHeaderDao.removeOldAndSaveNew(any(), any()) } just Runs // execute val res = runBlocking { @@ -142,8 +139,12 @@ class TimetableRepositoryTest { assertEquals(2, res.dataOrNull!!.lessons.size) coVerify { sdk.getTimetable(startDate, endDate) } coVerify { timetableDb.loadAll(1, 1, startDate, endDate) } - coVerify { timetableDb.insertAll(match { it.isEmpty() }) } - coVerify { timetableDb.deleteAll(match { it.isEmpty() }) } + coVerify { + timetableDb.removeOldAndSaveNew( + oldItems = match { it.isEmpty() }, + newItems = match { it.isEmpty() }, + ) + } } private fun createTimetableRemote( From b319bb03cd722dedd68682d9d7fae04784358bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 2 Mar 2024 17:31:44 +0100 Subject: [PATCH 1384/1526] New Crowdin updates (#2458) --- app/src/main/res/values-cs/strings.xml | 5 +++-- app/src/main/res/values-de/strings.xml | 5 +++-- app/src/main/res/values-pl/strings.xml | 5 +++-- app/src/main/res/values-ru/strings.xml | 5 +++-- app/src/main/res/values-sk/strings.xml | 5 +++-- app/src/main/res/values-uk/strings.xml | 5 +++-- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index fbc92e46f..48b43ae40 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -98,8 +98,8 @@ Přihlásit se Relace vypršela Relace vypršela. Přihlaste se prosím znovu - Heslo k vašemu účtu bylo změněno. Musíte se znovu přihlásit do Wulkanového - Heslo bylo změněno + Password has expired or been changed + Your account password has expired or been changed. You will need to log in to Wulkanowy again Podpora aplikace Líbí se Vám tato aplikace? Podpořte její vývoj tím, že povolíte neinvazivní reklamy, které můžete kdykoliv vypnout Zapnout reklamy @@ -860,6 +860,7 @@ This account is inactive. Try logging in again Nelze se připojit ke deníku. Servery mohou být přetíženy. Prosím zkuste to znovu později Načítání dat se nezdařilo. Prosím zkuste to znovu později + Your password has expired or been changed. Please log in again Je vyžadována změna hesla pro deník Probíhá údržba deníku UONET+. Zkuste to později znovu Neznámá chyba deniku UONET+. Prosím zkuste to znovu později diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1f1246004..ce3ab0d9b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -98,8 +98,8 @@ Anmelden Die Sitzung ist abgelaufen Die Sitzung ist abgelaufen, bitte loggen Sie sich erneut ein - Your account password has been changed. You need to log in to Wulkanowy again - Password changed + Password has expired or been changed + Your account password has expired or been changed. You will need to log in to Wulkanowy again Anwendungsunterstützung Gefällt Ihnen diese App? Unterstützen Sie ihre Entwicklung, indem Sie nicht-invasive Werbung aktivieren, die Sie jederzeit deaktivieren können Werbung aktivieren @@ -766,6 +766,7 @@ This account is inactive. Try logging in again Registrierungsverbindung fehlgeschlagen. Server können überlastet sein. Bitte versuchen Sie es später noch einmal Das Laden der Daten ist fehlgeschlagen. Bitte versuchen Sie es später noch einmal + Your password has expired or been changed. Please log in again Passwortänderung für Registrierung erforderlich Wartung im Gange UONET + Klassenbuch. Versuchen Sie es später noch einmal Unbekannter UONET + Registerfehler. Versuchen Sie es später erneut diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 597d843df..a193da1be 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -98,8 +98,8 @@ Zaloguj się Sesja wygasła Sesja wygasła, zaloguj się ponownie - Hasło do Twojego konta zostało zmienione. Musisz zalogować się ponownie do Wulkanowego - Hasło zostało zmienione + Hasło wygasło lub zostało zmienione + Hasło do twojego konta wygasło lub zostało zmienione. Musisz zalogować się ponownie do Wulkanowego Wparcie aplikacji Podoba Ci się ta aplikacja? Wspieraj jej rozwój poprzez włączenie nieinwazyjnych reklam, które możesz wyłączyć w dowolnym momencie Włącz reklamy @@ -860,6 +860,7 @@ Konto jest nieaktywne. Spróbuj zalogować się ponownie Nie udało się połączyć z dziennikiem. Serwery mogą być przeciążone. Spróbuj ponownie później Ładowanie danych nie powiodło się. Spróbuj ponownie później + Twoje hasło wygasło lub zostało zmienione. Zaloguj się ponownie Wymagana zmiana hasła do dziennika Trwa przerwa techniczna dziennika UONET+. Spróbuj ponownie później Nieznany błąd dziennika UONET+. Spróbuj ponownie później diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 46a19c71f..590dc13db 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -98,8 +98,8 @@ Войти Сеанс истёк Сеанс истёк, авторизуйтесь снова - Your account password has been changed. You need to log in to Wulkanowy again - Password changed + Password has expired or been changed + Your account password has expired or been changed. You will need to log in to Wulkanowy again Поддержка приложения Вам нравится это приложение? Поддержите его разработку, включив неинвазивную рекламу, которую можно отключить в любое время Включить рекламу @@ -860,6 +860,7 @@ This account is inactive. Try logging in again Не удалось подключиться к дневнику. Возможно, сервера перегружены, повторите попытку позже Не удалось загрузить данные, повторите попытку позже + Your password has expired or been changed. Please log in again Необходимо изменить пароль дневника UONET+ проводит техническое обслуживание, повторите попытку позже Неизвестная ошибка дневника UONET+, повторите попытку позже diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index b63c07c6f..93d7559af 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -98,8 +98,8 @@ Prihlásiť sa Relácia vypršala Relácia vypršala. Prihláste sa prosím znovu - Heslo k vášmu účtu bolo zmenené. Musíte sa znovu prihlásiť do Wulkanového - Heslo bolo zmenené + Password has expired or been changed + Your account password has expired or been changed. You will need to log in to Wulkanowy again Podpora aplikácie Páči sa Vám táto aplikácia? Podporte jej vývoj tým, že povolíte neinvazívne reklamy, ktoré môžete kedykoľvek vypnúť Zapnúť reklamy @@ -860,6 +860,7 @@ This account is inactive. Try logging in again Nedá sa pripojiť ku denníku. Servery môžu byť preťažené. Prosím skúste to znova neskôr Načítanie údajov zlyhalo. Skúste neskôr prosím + Your password has expired or been changed. Please log in again Je vyžadovaná zmena hesla pre denník Prebieha údržba denníka UONET+. Skúste to neskôr znova Neznáma chyba dennika UONET+. Prosím skúste to znova neskôr diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8116c7e48..40fc96c1e 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -98,8 +98,8 @@ Увійти Минув термін дії сесії Минув термін дії сесії, авторизуйтеся знову - Пароль вашого облікового запису був змінений. Ви повинні увійти в Wulkanowy знову - Пароль змінено + Password has expired or been changed + Your account password has expired or been changed. You will need to log in to Wulkanowy again Підтримка додатку Вам подобається цей додаток? Підтримайте його розвиток, увімкнувши неінвазивну рекламу, яку ви можете відключити в будь-який час Увімкнути рекламу @@ -860,6 +860,7 @@ This account is inactive. Try logging in again Помилка підключення до щоденнику. Сервери можуть бути перевантажені, спробуйте пізніше Помилка завантаження даних, спробуйте пізніше + Your password has expired or been changed. Please log in again Необхідна зміна пароля щоденника UONET+ проводить технічне осблуговування, спробуйте пізніше Невідома помилка щоденника UONET+, спробуйте пізніше From 3bab883a5692539e27d6addc45f3630a5b6f5770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 2 Mar 2024 19:49:08 +0100 Subject: [PATCH 1385/1526] Add a message explaining the reason for the captcha to the captcha dialog (#2459) --- .../io/github/wulkanowy/data/DataModule.kt | 23 +++++++++------- .../ui/modules/captcha/CaptchaDialog.kt | 5 ++++ .../utils/WebkitCookieManagerProxy.kt | 10 ++++--- app/src/main/res/layout/dialog_captcha.xml | 27 ++++++++++++++++--- app/src/main/res/values/strings.xml | 3 ++- 5 files changed, 51 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt index 6b6c9d329..50d6c8f9f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt @@ -38,17 +38,20 @@ internal class DataModule { @Singleton @Provides - fun provideSdk(chuckerInterceptor: ChuckerInterceptor, remoteConfig: RemoteConfigHelper) = - Sdk().apply { - androidVersion = android.os.Build.VERSION.RELEASE - buildTag = android.os.Build.MODEL - userAgentTemplate = remoteConfig.userAgentTemplate - setSimpleHttpLogger { Timber.d(it) } - setAdditionalCookieManager(WebkitCookieManagerProxy()) + fun provideSdk( + chuckerInterceptor: ChuckerInterceptor, + remoteConfig: RemoteConfigHelper, + webkitCookieManagerProxy: WebkitCookieManagerProxy, + ) = Sdk().apply { + androidVersion = android.os.Build.VERSION.RELEASE + buildTag = android.os.Build.MODEL + userAgentTemplate = remoteConfig.userAgentTemplate + setSimpleHttpLogger { Timber.d(it) } + setAdditionalCookieManager(webkitCookieManagerProxy) - // for debug only - addInterceptor(chuckerInterceptor, network = true) - } + // for debug only + addInterceptor(chuckerInterceptor, network = true) + } @Singleton @Provides diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt index ed8293a9f..98b4fda71 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt @@ -13,6 +13,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.databinding.DialogCaptchaBinding import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.ui.base.BaseDialogFragment +import io.github.wulkanowy.utils.WebkitCookieManagerProxy import timber.log.Timber import javax.inject.Inject @@ -22,6 +23,9 @@ class CaptchaDialog : BaseDialogFragment() { @Inject lateinit var sdk: Sdk + @Inject + lateinit var webkitCookieManagerProxy: WebkitCookieManagerProxy + private var webView: WebView? = null companion object { @@ -80,6 +84,7 @@ class CaptchaDialog : BaseDialogFragment() { } override fun onDestroy() { + webkitCookieManagerProxy.webkitCookieManager?.flush() webView?.destroy() super.onDestroy() } diff --git a/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt b/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt index 3d41c711c..4d2dde788 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/WebkitCookieManagerProxy.kt @@ -5,17 +5,21 @@ import java.net.CookiePolicy import java.net.CookieStore import java.net.HttpCookie import java.net.URI +import javax.inject.Inject +import javax.inject.Singleton import android.webkit.CookieManager as WebkitCookieManager import java.net.CookieManager as JavaCookieManager -class WebkitCookieManagerProxy : JavaCookieManager(null, CookiePolicy.ACCEPT_ALL) { +@Singleton +class WebkitCookieManagerProxy @Inject constructor() : + JavaCookieManager(null, CookiePolicy.ACCEPT_ALL) { - private val webkitCookieManager: WebkitCookieManager? = getWebkitCookieManager() + val webkitCookieManager: WebkitCookieManager? = getCookieManager() /** * @see [https://stackoverflow.com/a/70354583/6695449] */ - private fun getWebkitCookieManager(): WebkitCookieManager? { + private fun getCookieManager(): WebkitCookieManager? { return try { WebkitCookieManager.getInstance() } catch (e: AndroidRuntimeException) { diff --git a/app/src/main/res/layout/dialog_captcha.xml b/app/src/main/res/layout/dialog_captcha.xml index 539aa0cc9..019d89327 100644 --- a/app/src/main/res/layout/dialog_captcha.xml +++ b/app/src/main/res/layout/dialog_captcha.xml @@ -7,15 +7,18 @@ tools:context=".ui.modules.captcha.CaptchaDialog"> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0" /> + + + + + app:layout_constraintTop_toBottomOf="@id/captcha_webview" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 266c3522c..2775365d5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -848,7 +848,8 @@ - Verification is in progress. Wait… + VULCAN\'s website requires verification + Why am I seeing this?\nThe register website from which Wulkanowy downloads data displays the same screen as above, so Wulkanowy must also show it to be able to download data from this website. There\'s no way around it Verified successfully From a0a0b8dea6e70b32e310158caeee317026326bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 2 Mar 2024 20:37:36 +0100 Subject: [PATCH 1386/1526] New Crowdin updates (#2460) --- app/src/main/res/values-cs/strings.xml | 27 +++++++++++++------------- app/src/main/res/values-de/strings.xml | 3 ++- app/src/main/res/values-pl/strings.xml | 3 ++- app/src/main/res/values-ru/strings.xml | 3 ++- app/src/main/res/values-sk/strings.xml | 27 +++++++++++++------------- app/src/main/res/values-uk/strings.xml | 27 +++++++++++++------------- 6 files changed, 48 insertions(+), 42 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 48b43ae40..c3c691c7f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -56,7 +56,7 @@ Neplatný e-mail Místo e-mailu použijte přiřazené přihlašovací údaje Použijte přiřazené přihlašovací nebo e-mail v @%1$s - Invalid domain suffix + Neplatná přípona domény Neplatný symbol. Pokud jej nemůžete najít, kontaktujte školu Nevymýšlejte si! Pokud symbol nemůžete najít, kontaktujte školu Žák nebyl nalezen. Zkontrolujte správnost symbolu a vybrané varianty deníku UONET+ @@ -98,8 +98,8 @@ Přihlásit se Relace vypršela Relace vypršela. Přihlaste se prosím znovu - Password has expired or been changed - Your account password has expired or been changed. You will need to log in to Wulkanowy again + Heslo vypršelo nebo bylo změněno + Platnost hesla k vašemu účtu vypršela nebo bylo změněno. Budete se muset znovu přihlásit do Wulkanového Podpora aplikace Líbí se Vám tato aplikace? Podpořte její vývoj tím, že povolíte neinvazivní reklamy, které můžete kdykoliv vypnout Zapnout reklamy @@ -336,10 +336,10 @@ Poslat dále Vybrat vše Odznačit vše - Restore from trash + Obnovit z koše Přesunout do koše Odstranit natrvalo - Message restored successfully + Zpráva úspěšně obnovena Zpráva byla úspěšně odstraněna žák rodič @@ -385,7 +385,7 @@ %1$d vybraných Zprávy odstraněné - Messages restored + Obnovené zprávy Vyberte poštovní schránku Anonymní režim je zapnutý Díky anonymnímu režimu není odesílatel upozorněn, když si zprávu přečtete @@ -852,15 +852,16 @@ Pro provoz aplikace potřebujeme potvrdit vaši identitu. Zadejte PESEL žáka <b>%1$s</b> v níže uvedeném poli Zatím přeskočit - Probíhá ověřování. Počkejte… + VULCAN\'s website requires verification + Why am I seeing this?\nThe register website from which Wulkanowy downloads data displays the same screen as above, so Wulkanowy must also show it to be able to download data from this website. There\'s no way around it Úspěšně ověřeno Žádné internetové připojení Vyskytla se chyba. Zkontrolujte hodiny svého zařízení - This account is inactive. Try logging in again + Tento účet je neaktivní. Zkuste se znovu přihlásit Nelze se připojit ke deníku. Servery mohou být přetíženy. Prosím zkuste to znovu později Načítání dat se nezdařilo. Prosím zkuste to znovu později - Your password has expired or been changed. Please log in again + Vaše heslo vypršelo nebo bylo změněno. Přihlaste se znovu Je vyžadována změna hesla pro deník Probíhá údržba deníku UONET+. Zkuste to později znovu Neznámá chyba deniku UONET+. Prosím zkuste to znovu později @@ -871,8 +872,8 @@ Funkce není k dispozici. Přihlaste se v jiném režimu než Mobile API Toto pole je povinné - Mute - Unmute - You have muted this user - You have unmuted this user + Ztlumit + Zrušit ztlumení + Ztlumili jste tohoto uživatele + Zrušili jste ztlumení tohoto uživatele diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ce3ab0d9b..daabc7d8f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -758,7 +758,8 @@ To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below Skip for now - Verification is in progress. Wait… + VULCAN\'s website requires verification + Why am I seeing this?\nThe register website from which Wulkanowy downloads data displays the same screen as above, so Wulkanowy must also show it to be able to download data from this website. There\'s no way around it Verified successfully Keine Internetverbindung diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a193da1be..33b715d75 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -852,7 +852,8 @@ Rodzicu, musimy mieć pewność, że Twój adres e-mail został powiązany z prawidłowym kontem ucznia. W celu autoryzacji konta podaj numer PESEL ucznia <b>%1$s</b> w polu poniżej Na razie pomiń - Trwa weryfikacja. Czekaj… + Strona dziennika VULCAN wymaga weryfikacji + Dlaczego to widzę?\nStrona internetowa dziennika, z której Wulkanowy pobiera dane, wyświetla ten sam ekran jak powyżej, więc Wulkanowy musi również ją pokazać, aby móc pobrać dane z tej witryny. Nie da się tego obejść Pomyślnie zweryfikowano Brak połączenia z internetem diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 590dc13db..8a5fcc40d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -852,7 +852,8 @@ Для работы приложения нам необходимо подтвердить вашу личность. Введите PESEL учащегося <b>%1$s</b> в поле ниже Пропустить сейчас - Verification is in progress. Wait… + VULCAN\'s website requires verification + Why am I seeing this?\nThe register website from which Wulkanowy downloads data displays the same screen as above, so Wulkanowy must also show it to be able to download data from this website. There\'s no way around it Verified successfully Интернет-соединение отсутствует diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 93d7559af..829475d60 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -56,7 +56,7 @@ Neplatný e-mail Namiesto e-mailu použite priradené prihlasovacie údaje Použite priradené prihlasovacie alebo e-mail v @%1$s - Invalid domain suffix + Neplatná prípona domény Neplatný symbol. Pokiaľ ho nemôžete nájsť, kontaktujte školu Nevymýšľajte si! Pokiaľ symbol nemôžete nájsť, kontaktujte školu Žiak nebol nájdený. Skontrolujte správnosť symbolu a vybrané varianty denníka UONET+ @@ -98,8 +98,8 @@ Prihlásiť sa Relácia vypršala Relácia vypršala. Prihláste sa prosím znovu - Password has expired or been changed - Your account password has expired or been changed. You will need to log in to Wulkanowy again + Heslo vypršalo alebo bolo zmenené + Platnosť hesla k vášmu účtu vypršala alebo bolo zmenené. Budete sa musieť znova prihlásiť do Wulkanového Podpora aplikácie Páči sa Vám táto aplikácia? Podporte jej vývoj tým, že povolíte neinvazívne reklamy, ktoré môžete kedykoľvek vypnúť Zapnúť reklamy @@ -336,10 +336,10 @@ Poslať ďalej Vybrať všetko Odznačiť všetko - Restore from trash + Obnoviť z koša Presunúť do koša Odstrániť natrvalo - Message restored successfully + Správa úspešne obnovená Správa bola úspešne odstránená žiak rodič @@ -385,7 +385,7 @@ %1$d vybraných Správy odstránené - Messages restored + Obnovené správy Vyberte poštovú schránku Režim inkognito je zapnutý Vďaka inkognito režimu nie je odosielateľ upozornený, keď si správu prečítate @@ -852,15 +852,16 @@ Na prevádzku aplikácie potrebujeme potvrdiť vašu identitu. Zadajte PESEL žiaka <b>%1$s</b> v nižšie uvedenom poli Zatiaľ preskočiť - Overovanie prebieha. Počkajte… + VULCAN\'s website requires verification + Why am I seeing this?\nThe register website from which Wulkanowy downloads data displays the same screen as above, so Wulkanowy must also show it to be able to download data from this website. There\'s no way around it Úspešne overené Žiadne internetové pripojenie Vyskytla sa chyba. Skontrolujte hodiny svojho zariadenia - This account is inactive. Try logging in again + Tento účet je neaktívny. Skúste sa znova prihlásiť Nedá sa pripojiť ku denníku. Servery môžu byť preťažené. Prosím skúste to znova neskôr Načítanie údajov zlyhalo. Skúste neskôr prosím - Your password has expired or been changed. Please log in again + Vaše heslo vypršalo alebo bolo zmenené. Prihláste sa znova Je vyžadovaná zmena hesla pre denník Prebieha údržba denníka UONET+. Skúste to neskôr znova Neznáma chyba dennika UONET+. Prosím skúste to znova neskôr @@ -871,8 +872,8 @@ Funkcia nie je k dispozícii. Prihláste sa v inom režime než Mobile API Toto pole je povinné - Mute - Unmute - You have muted this user - You have unmuted this user + Stlmiť + Zrušiť stlmenie + Stlmili ste tohto používateľa + Zrušili ste stlmenie tohto používateľa diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 40fc96c1e..a0d4b6c0b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -56,7 +56,7 @@ Недійсна адреса e-mail Використовуйте призначений логін замість адреси e-mail Використовуйте призначений логін або адресу e-mail в @%1$s - Invalid domain suffix + Невірний суфікс домену Некоректний символ. Якщо ви не можете знайти його, будь ласка, зв\'яжіться зі школою Не вигадуйте! Якщо ви не можете знайти його, будь ласка, зв\'яжіться зі школою Студента не знайдено. Перевірте symbol та обраний тип щоденника UONET+ @@ -98,8 +98,8 @@ Увійти Минув термін дії сесії Минув термін дії сесії, авторизуйтеся знову - Password has expired or been changed - Your account password has expired or been changed. You will need to log in to Wulkanowy again + Термін дії пароля закінчився або його було змінено + Термін дії пароля для вашого облікового запису закінчився або було змінено. Необхідно зайти в Wulkanowy знову Підтримка додатку Вам подобається цей додаток? Підтримайте його розвиток, увімкнувши неінвазивну рекламу, яку ви можете відключити в будь-який час Увімкнути рекламу @@ -336,10 +336,10 @@ Переслати Вибрати всі Відмінити вибір - Restore from trash + Відновити зі смітника Перемістити до кошика Видалити назавжди - Message restored successfully + Повідомлення успішно відновлено Лист було успішно видалено учень родич @@ -385,7 +385,7 @@ %1$d вибрано Листи видалено - Messages restored + Повідомлення відновлені Вибрати поштову скриньку Режим анонімності включено Завдяки режиму анонімності, відправник не буде сповіщений коли ви прочитаєте повідомлення @@ -852,15 +852,16 @@ Для роботи програми нам потрібно підтвердити вашу особу. Будь ласка, введіть число PESEL <b>%1$s</b> студента в поле нижче Поки що пропустити - Верифікація в процесі. Чекайте… + Веб-сайт VULCAN потребує підтвердження + Чому я це бачу?\nСайт реєстру, з якого Wulkanowy завантажує дані, відображає той самий екран, що й вище, тому Wulkanowy також повинен показувати його, щоб мати змогу завантажувати дані з цього сайту. Це неможливо обійти Верифікація завершена Немає з\'єднання з інтернетом Сталася помилка. Перевірте годинник пристрою - This account is inactive. Try logging in again + Цей обліковий запис неактивний. Спробуйте увійти ще раз Помилка підключення до щоденнику. Сервери можуть бути перевантажені, спробуйте пізніше Помилка завантаження даних, спробуйте пізніше - Your password has expired or been changed. Please log in again + Термін дії вашого пароля минув або був змінений. Будь ласка увійдіть знову Необхідна зміна пароля щоденника UONET+ проводить технічне осблуговування, спробуйте пізніше Невідома помилка щоденника UONET+, спробуйте пізніше @@ -871,8 +872,8 @@ Функція недоступна в режимі Mobile API. Увійдіть в інший режим Це поле обовʼязкове - Mute - Unmute - You have muted this user - You have unmuted this user + Вимкнути сповіщення + Ввімкнути сповіщення + Ви ігноруєте цього користувача + Ви не ігноруєте цього користувача From 2bbc157d0361b0f23c1d37b174e7e60f0e3b3c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 2 Mar 2024 20:45:23 +0100 Subject: [PATCH 1387/1526] Add some new symbols to symbol autocomplete field (#2461) --- app/src/main/res/values/api_symbols.xml | 276 ++++++++++++++++++++++++ 1 file changed, 276 insertions(+) diff --git a/app/src/main/res/values/api_symbols.xml b/app/src/main/res/values/api_symbols.xml index 4b61db48d..510995b9d 100644 --- a/app/src/main/res/values/api_symbols.xml +++ b/app/src/main/res/values/api_symbols.xml @@ -1,6 +1,8 @@ + Adamów, powiat łukowski + Aleksandrów, powiat biłgorajski Andrychów Augustów Baranów Sandomierski @@ -8,6 +10,8 @@ Bełchatów Bełżyce Biała Podlaska + Biała, powiat prudnicki + Biała, powiat wielunski Biała Rawska Biały Bór Białystok @@ -23,11 +27,17 @@ Boguchwała Boguty-Pianki Bolesławiec + Bolesław, powiat dąbrowski Braniewo Brodnica + Brodnica, powiat śremski + Brody, powiat starachowicki + Brójce, powiat łódzki wschodni Brwinów Brzeg Brzeski + Powiat brzeski + Brzeźnica, powiat wadowicki Buk Bukowno Busko-Zdrój @@ -36,6 +46,7 @@ Bystrzyca Kłodzka Bytom Bytom Odrzański + CECH bialski Chełm Chełmno Chełmża @@ -44,18 +55,28 @@ Chojnice Chojnów Chorzów + Chrzanów, powiat janowski Ciechanów Cieszyn + Czarna, powiat bieszczadzki + Czarna, powiat dębicki Czarnków Czeladź + Czermin, powiat mielecki + Czermin, powiat pleszewski Czersk Częstochowa Człuchów + Dąbie, powiat krośnieński Dąbrowa Białostocka Dąbrowa Górnicza + Dabrowa, powiat opolski Dąbrowa Tarnowska Dębica Dębno + Dębowiec, powiat jasielski + Dobra, powiat lobeski + Dobre, powiat radziejowski Dobrzeń Wielki Dobrzeń Wielki 2 Dobrzyń Nad Wisłą @@ -67,6 +88,8 @@ Elbląg Ełk Frampol + Fundacja Elementarz + Fundacja Mozaika Garwolin Gdańsk Gdynia @@ -124,6 +147,7 @@ Gmina Brańszczyk Gmina Brąszewice Gmina Brenna + Gmina Brochów Gmina Brok Gmina Brzeg Dolny Gmina Brzeziny @@ -221,6 +245,7 @@ Gmina Działoszyce Gmina Dziemiany Gmina Dzierżoniów + Gmina Dziwnów Gmina Dzwola Gmina Elbląg Gmina Ełk @@ -296,6 +321,7 @@ Gmina Hrubieszów Gmina Huszlew Gmina Hyżne + Gmina Igołomia-Wawrzeńczyce Gmina Imielno Gmina Inowrocław Gmina Irządze @@ -339,6 +365,7 @@ Gmina Kamienica Gmina Kamiennik Gmina Kamionka + Gmina Kampinos Gmina Karczmiska Gmina Kargowa Gmina Karlino @@ -410,6 +437,7 @@ Gmina Krasocin Gmina Krempna Gmina Krokowa + Gmina Krościenko Gmina Krośnice Gmina Krupski Młyn Gmina Kruszwica @@ -477,6 +505,7 @@ Gmina Łopiennik Górny Gmina Łopuszno Gmina Łosice + Gmina Łososina Dolna Gmina Lubań Gmina Lubartów Gmina Lubasz @@ -524,6 +553,7 @@ Gmina Miejsce Piastowe Gmina Miękinia Gmina Mielec + Gmina Mieleszyn Gmina Mielno Gmina Mieszkowice Gmina Milanów @@ -575,6 +605,7 @@ Gmina Nowy Kawęczyn Gmina Nowy Korczyn Gmina Nowy Staw + Gmina Nowy Wiśnicz Gmina Nowy Targ Gmina Nowy Tomyśl Gmina Nozdrzec @@ -587,6 +618,7 @@ Gmina Olszyna Gmina Opatowiec Gmina Orneta + Gmina Orchowo Gmina Osieczna Gmina Osiek Gmina Osiek Jasielski @@ -629,9 +661,12 @@ Gmina Piątnica Gmina Piekoszów Gmina Pieniężno + Gmina Pietrowice Wielkie Gmina Pilchowice + Gmina Pielgrzymka Gmina Pińczów Gmina Pionki + Gmina Piszczac Gmina Płaska Gmina Platerówka Gmina Pleśna @@ -655,6 +690,7 @@ Gmina Popów Gmina Potęgowo Gmina Potok Wielki + Gmina Paradyż Gmina Praszka Gmina Prochowice Gmina Promna @@ -733,6 +769,7 @@ Gmina Sanok Gmina Sawin Gmina Ścinawa + Gmina Secemin Gmina Sędziejowice Gmina Sejny Gmina Sękowa @@ -758,6 +795,7 @@ Gmina Sitno Gmina Skarżysko Kościelne Gmina Skępe + Gmina Skierbieszów Gmina Skierniewice Gmina Skoczów Gmina Skoki @@ -779,6 +817,7 @@ Gmina Sobótka Gmina Sokółka Gmina Solina + Gmina Somonino Gmina Sośnicowice Gmina Sośnie Gmina Sośno @@ -800,11 +839,13 @@ Gmina Stoczek Łukowski Gmina Stopnica Gmina Strawczyn + Gmina Stromiec Gmina Stryków Gmina Stryszawa Gmina Stryszów Gmina Strzałkowo Gmina Strzelce Opolskie + Gmina Strzelce Opolskie 2 Gmina Strzelin Gmina Strzelno Gmina Strzyżewice @@ -846,6 +887,7 @@ Gmina Tarnów Gmina Tarnowiec Gmina Tarnów Opolski + Gmina Tarnów Opolski 2 Gmina Teresin Gmina Tereszpol Gmina Tłuchowo @@ -870,6 +912,7 @@ Gmina Tyrawa Wołoska Gmina Uchanie Gmina Ujazd + Gmina PSP Ujazd Gmina Ulan-Majorat Gmina Ulanów Gmina Ułęż @@ -898,6 +941,7 @@ Gmina Wielgomłyny Gmina Wieliszew Gmina Wielka Nieszawka + Gmina Gmina Wielopole Skrzyńskie Gmina Wieniawa Gmina Wieprz Gmina Wieruszów @@ -937,6 +981,7 @@ Gmina Wolsztyn Gmina Wręczyca Wielka Gmina Wronki + Gmina Wyryki Gmina Wyrzysk Gmina Wysokie Gmina Żabno @@ -980,6 +1025,7 @@ Gmina Żołynia Gmina Żukowice Gmina Żurawica + Gmina Żychlin Gmina Żyraków Gmina Żyrzyn Gmina Żytno @@ -992,9 +1038,11 @@ Górzno Gorzów Śląski Gorzów Wielkopolski + Gorzyce powiat tarnobrzeski Gostynin Grajewo Grodzisk Mazowiecki + Grodzisk Wielkopolski Grudziądz Grybów Gryfino @@ -1002,10 +1050,14 @@ Hel Hrubieszów Inowrocław + IR Tarnów Izbica Kujawska + Jabłonna, powiat legionowski + Jabłonna, powiat lubelski Jabłonowo Pomorskie Janowiec Wielkopolski Janów Lubelski + Janów, powiat sokolski Jarocin Jarosław Jasło @@ -1040,6 +1092,7 @@ Kołobrzeg Koniecpol Konin + Konopnica powiat lubelski Konstancin-Jeziorna Konstantynów Łódzki Koronowo @@ -1060,6 +1113,7 @@ Krosno Krotoszyce Krotoszyn + Krynica Krzeszowice Krzyż Wielkopolski Książ Wielkopolski @@ -1079,12 +1133,14 @@ Lędziny Legionowo Legnica + Leśnica opolska Leszno Lewin Brzeski Lewin Brzeski 2 Leżajsk Limanowa Lipno + Lipno, powiat lipnowski Łódź Łódzkie Łowicz @@ -1095,6 +1151,7 @@ Lubin Lublin Lubliniec + Lubnice, powiat staszowski Lubuskie Łuków Lwówecki @@ -1102,18 +1159,30 @@ Malbork Małopolskie Marki + Maszewo, powiat goleniowski Mazowieckie + MEN + Miasto Toruń Michałowice Miechów Międzyrzec Podlaski Miejska Górka Mielec Milanówek + Ministerstwo Rolnictwa Mińsk Mazowiecki + Ministerstwo Kultury i Dziedzictwa Narodowego Mniszków + Ministerstwo Nauki i Szkolnictwa + Ministerstwo Obrony Narodowej + Ministerstwo Środowiska Mosina + Moszczenica powiat gorlicki + Moszczenica powiat piotrkowski Mrągowo Mrągowski + Ministerstwo Sprawiedliwości + Ministerstwo Spraw Wewnętrznych Mszana Dolna Mszczonów Muszyna @@ -1137,9 +1206,17 @@ Nowy Żmigród Nysa Oborniki Śląskie + Oborniki Wielkopolskie Obrzycko + Oleśnica, powiat olesnicki + Oleśnica, powiat staszowski + Olesno powiat dąbrowski + Olesno powiat oleski Olkusz + Olszanka, powiat brzeski Olsztyn + Opatów, powiat kłobucki + Opatów, powiat opatowski Opinogóra Górna Opoczno Opole @@ -1148,8 +1225,10 @@ Orzesze Osieczna Osiecznica + Osiek, powiat starogardzki Ostróda Ostrołęka + Ostrowiec Świętokrzyski Ostrów Wielkopolski Oświęcim Otwock @@ -1166,6 +1245,7 @@ Pilzno Piotrków Trybunalski Pisz + Piwniczna Płock Płońsk Pniewy @@ -1177,6 +1257,8 @@ Pomorskie Poniec Poręba + Poświętne, powiat opoczyński + Poświętne, powiat wołomiński Powiat aleksandrowski Powiat augustowski Powiat będziński @@ -1217,6 +1299,7 @@ Powiat giżycki Powiat gliwicki Powiat głogowski + Powiat głubczycki Powiat gnieźnieński Powiat gołdapski Powiat goleniowski @@ -1226,6 +1309,8 @@ Powiat gorzowski Powiat gostyński Powiat grajewski + Powiat grodziski, mazowieckie + Powiat grodziski, wielkopolskie Powiat grójecki Powiat gryficki Powiat gryfiński @@ -1293,6 +1378,7 @@ Powiat makowski Powiat malborski Powiat miechowski + Powiat międzyrzecki Powiat mielecki Powiat mikołowski Powiat milicki @@ -1321,17 +1407,21 @@ Powiat olsztyński Powiat opatowski Powiat opoczyński + Powiat opole lubelskie Powiat opolski + Powiat opolski 2 Powiat ostródzki Powiat ostrowiecki Powiat ostrzeszowski Powiat oświęcimski + Powiat ostrowski, mazowieckie Powiat otwocki Powiat pabianicki Powiat piaseczyński Powiat pilski Powiat pińczowski Powiat piotrkowski + Powiat piski, warmińsko-mazurskie Powiat pleszewski Powiat płocki Powiat płoński @@ -1391,6 +1481,7 @@ Powiat suski Powiat świdnicki Powiat świdwiński + Powiat świdnicki w Świdniku Powiat świebodziński Powiat świecki Powiat szamotulski @@ -1403,6 +1494,7 @@ Powiat tatrzański Powiat tczewski Powiat tomaszowski + Powiat tomaszowski, lubelskie Powiat toruński Powiat trzebnicki Powiat tucholski @@ -1444,6 +1536,7 @@ Powiat żyrardowski Powiat żywiecki Poznań + prfrawamaz Proszowice Prudnik Pruszcz Gdański @@ -1461,6 +1554,7 @@ Rabka-Zdrój Raciąż Racibórz + Radków Kłodzki Radom Radomsko Radomyśl Wielki @@ -1468,12 +1562,17 @@ Radziejów Radzionków Radzyń Podlaski + Rakoniewice Rawa Mazowiecka Rawicz Reda + Rejowiec, powiat chełmski + Rogowo, powiat rypiński + Rogowo, powiat żniński Rogóźno Ropczyce Ruda Śląska + Rudnik, powiat raciborski Rumia Rybnik Rychwał @@ -1482,6 +1581,7 @@ Rypin Rzeszów Rzeszów projekt + Rzgów, powiat koniński Sandomierz Sanok Sędziszów Małopolski @@ -1503,14 +1603,19 @@ Sokołów Podlaski Sopot Sosnowiec + spmajkowskarzysko + spteodory Śrem Środa Śląska Środa Wielkopolska Starachowice Stargard Starogard Gdański + starostwokrosnienskie Stary Sącz Staszów + stezycapowiatrycki + stowarzyszenieintegracja Stronie Śląskie Strzyżów Sulejówek @@ -1518,9 +1623,12 @@ Sulmierzyce Swarzędz Świdnica + swidnicapowiatswidnicki + swidnicapowiatzielonogorski Świdnik Świdwin Świeradów-Zdrój + swietajnopowiatszczycienski Świętochłowice Świnoujście Syców @@ -1532,6 +1640,7 @@ Szprotawa Sztum Szubin + szydlowopowiatpilski Tarnobrzeg Tarnów Tarnowskie Góry @@ -1548,6 +1657,7 @@ Turawa Tuszyn Tychy + UG Gołcza Ujazd Ustka Ustroń @@ -1557,6 +1667,20 @@ Wałcz Warmińsko-Mazurskie Warszawa + Warszawa Bemowo + Warszawa Białołęka + Warszawa Bielany + Warszawa Mokotów + Warszawa Praga Południe + Warszawa Śródmiśscie + Warszawa Targówek + Warszawa Ursus + Warszawa Ursynow + Warszawa Wawer + Warszawa Wesoła + Warszawa Włochy + Warszawa Wola + Warszawa Żoliborz Wąsosz Węgrów Wejherowo @@ -1564,6 +1688,10 @@ Wieliczka Wielkopolskie Wieluń + Wierzbica, powiat chełmski + Wierzbica, powiat radomski + Wilków, powiat namysłowski + Wiśniowa, powiat myślenicki Władysławowo Włocławek Włodawa @@ -1580,24 +1708,36 @@ Żagań Zakliczyn Zakopane + Zakrzewo, powiat aleksandrowski Zambrów Zamość Żary Zawidów Zduńska Wola Zduny + ZDZ Warszawa Żelechów + Zespół Szkół PPC Kumarszew Zgierz Zgorzelec Zielona Góra Zielonka + ZKSO 1 Katowice Złotoryja Złotów Żory + ZS2 Lubin + ZSK Sieradz + ZSKZ Kwidzyn + ZSKZ Sochaczew + ZSP Stare Koźle + ZST powiat opoczyński Zwoleń Żyrardów + adamowpowiatlukowski + aleksandrowpowiatbilgorajski andrychow augustow baranowsandomierski @@ -1605,6 +1745,8 @@ belchatow belzyce bialapodlaska + bialapowiatprudnicki + bialapowiatwielunski bialarawska bialybor bialystok @@ -1620,11 +1762,17 @@ boguchwala bogutypianki boleslawiec + boleslawpowiatdabrowski braniewo brodnica + brodnicapowiatsremski + brodypowiatstarachowicki + brojcepowiatlodzkiwsch brwinow brzeg brzeski + brzeskipowiat + brzeznicapowiatwadowicki buk bukowno buskozdroj @@ -1633,6 +1781,7 @@ bystrzycaklodzka bytom bytomodrzanski + cechbialski chelm chelmno chelmza @@ -1641,18 +1790,28 @@ chojnice chojnow chorzow + chrzanowpowiatjanowski ciechanow cieszyn + czarnapowiatbieszczadzki + czarnapowiatdebicki czarnkow czeladz + czerminpowiatmielecki + czerminpowiatpleszewski czersk czestochowa czluchow + dabiepowiatkrosnienski dabrowabialostocka dabrowagornicza + dabrowapowiatopolski dabrowatarnowska debica debno + debowiecpowiatjasielski + dobrapowiatlobeski + dobrepowiatradziejowski dobrzenwielki dobrzenwielki2 dobrzynnadwisla @@ -1664,6 +1823,8 @@ elblag elk frampol + fundacjaelementarz + fundacjamozaika garwolin gdansk gdynia @@ -1721,6 +1882,7 @@ gminabranszczyk gminabraszewice gminabrenna + gminabrochow gminabrok gminabrzegdolny gminabrzeziny @@ -1818,6 +1980,7 @@ gminadzialoszyce gminadziemiany gminadzierzoniow + gminadziwnow gminadzwola gminaelblag gminaelk @@ -1893,6 +2056,7 @@ gminahrubieszow gminahuszlew gminahyzne + gminaiglomniawawrzenczyce gminaimielno gminainowroclaw gminairzadze @@ -1936,6 +2100,7 @@ gminakamienica gminakamiennik gminakamionka + gminakampinos gminakarczmiska gminakargowa gminakarlino @@ -2007,6 +2172,7 @@ gminakrasocin gminakrempna gminakrokowa + gminakroscienko gminakrosnice gminakrupskimlyn gminakruszwica @@ -2074,6 +2240,7 @@ gminalopiennikgorny gminalopuszno gminalosice + gminalososinadolna gminaluban gminalubartow gminalubasz @@ -2121,6 +2288,7 @@ gminamiejscepiastowe gminamiekinia gminamielec + gminamieleszyn gminamielno gminamieszkowice gminamilanow @@ -2172,6 +2340,7 @@ gminanowykaweczyn gminanowykorczyn gminanowystaw + gminanowyswisnicz gminanowytarg gminanowytomysl gminanozdrzec @@ -2184,6 +2353,7 @@ gminaolszyna gminaopatowiec gminaorneta + gminaorochowo gminaosieczna gminaosiek gminaosiekjasielski @@ -2226,9 +2396,12 @@ gminapiatnica gminapiekoszow gminapieniezno + gminapietrowicewlk gminapilchowice + gminapilelgrzymka gminapinczow gminapionki + gminapiszac gminaplaska gminaplaterowka gminaplesna @@ -2252,6 +2425,7 @@ gminapopow gminapotegowo gminapotokwielki + gminapradyz gminapraszka gminaprochowice gminapromna @@ -2330,6 +2504,7 @@ gminasanok gminasawin gminascinawa + gminasecemin gminasedziejowice gminasejny gminasekowa @@ -2355,6 +2530,7 @@ gminasitno gminaskarzyskokoscielne gminaskepe + gminaskierbieszow gminaskierniewice gminaskoczow gminaskoki @@ -2376,6 +2552,7 @@ gminasobotka gminasokolka gminasolina + gminasomonino gminasosnicowice gminasosnie gminasosno @@ -2397,11 +2574,13 @@ gminastoczeklukowski gminastopnica gminastrawczyn + gminastromiec gminastrykow gminastryszawa gminastryszow gminastrzalkowo gminastrzelceopolskie + gminastrzelceopolskie2 gminastrzelin gminastrzelno gminastrzyzewice @@ -2443,6 +2622,7 @@ gminatarnow gminatarnowiec gminatarnowopolski + gminatarnowopolski2 gminateresin gminatereszpol gminatluchowo @@ -2467,6 +2647,7 @@ gminatyrawawoloska gminauchanie gminaujazd + gminaujazdpsp gminaulanmajorat gminaulanow gminaulez @@ -2495,6 +2676,7 @@ gminawielgomlyny gminawieliszew gminawielkanieszawka + gminawielopoleskrzynskie gminawieniawa gminawieprz gminawieruszow @@ -2534,6 +2716,7 @@ gminawolsztyn gminawreczycawielka gminawronki + gminawyrki gminawyrzysk gminawysokie gminazabno @@ -2577,6 +2760,7 @@ gminazolynia gminazukowice gminazurawica + gminazychlin gminazyrakow gminazyrzyn gminazytno @@ -2589,9 +2773,11 @@ gorzno gorzowslaski gorzowwielkopolski + gorzycepowiattarnobrzeski gostynin grajewo grodziskmazowiecki + grodziskwielkopolski grudziadz grybow gryfino @@ -2599,10 +2785,14 @@ hel hrubieszow inowroclaw + irtarnow izbicakujawska + jablonnapowiatlegionowski + jablonnapowiatlubelski jablonowopomorskie janowiecwielkopolski janowlubelski + janowpowiatsokolski jarocin jaroslaw jaslo @@ -2637,6 +2827,7 @@ kolobrzeg koniecpol konin + konopnicapowiatlubelski konstancinjeziorna konstantynowlodzki koronowo @@ -2657,6 +2848,7 @@ krosno krotoszyce krotoszyn + krynica krzeszowice krzyzwielkopolski ksiazwielkopolski @@ -2676,12 +2868,14 @@ ledziny legionowo legnica + lesnicaopolska leszno lewinbrzeski lewinbrzeski2 lezajsk limanowa lipno + lipnopowiatlipnowski lodz lodzkie lowicz @@ -2692,6 +2886,7 @@ lubin lublin lubliniec + lubnicepowiatstaszowski lubuskie lukow lwowecki @@ -2699,18 +2894,30 @@ malbork malopolskie marki + maszewopowiatgoleniowski mazowieckie + men + miastotorun michalowice miechow miedzyrzecpodlaski miejskagorka mielec milanowek + minrol minskmazowiecki + mkdn mniszkow + mnsw + mon + mos mosina + moszczenicapowiatgorlicki + moszczenicapowiatpiotrkowski mragowo mragowski + ms + msw mszanadolna mszczonow muszyna @@ -2734,9 +2941,17 @@ nowyzmigrod nysa obornikislaskie + obornikiwielkopolskie obrzycko + olesnicapowiatolesnicki + olesnicapowiatstaszowski + olesnopowiatdabrowski + olesnopowiatoleski olkusz + olszankapowiatbrzeski olsztyn + opatowpowiatklobucki + opatowpowiatopatowski opinogoragorna opoczno opole @@ -2745,8 +2960,10 @@ orzesze osieczna osiecznica + osiekpowiatstarogardzki ostroda ostroleka + ostrowiecsw ostrowwielkopolski oswiecim otwock @@ -2763,6 +2980,7 @@ pilzno piotrkowtrybunalski pisz + piwniczna plock plonsk pniewy @@ -2774,6 +2992,8 @@ pomorskie poniec poreba + poswietnepowiatopoczynski + poswietnepowiatwolominski powiataleksandrowski powiataugustowski powiatbedzinski @@ -2814,6 +3034,7 @@ powiatgizycki powiatgliwicki powiatglogowski + powiatglubczycki powiatgnieznienski powiatgoldapski powiatgoleniowski @@ -2823,6 +3044,8 @@ powiatgorzowski powiatgostynski powiatgrajewski + powiatgrodziskimazowieckie + powiatgrodziskiwielkopolskie powiatgrojecki powiatgryficki powiatgryfinski @@ -2890,6 +3113,7 @@ powiatmakowski powiatmalborski powiatmiechowski + powiatmiedzyrzecki powiatmielecki powiatmikolowski powiatmilicki @@ -2918,17 +3142,21 @@ powiatolsztynski powiatopatowski powiatopoczynski + powiatopolelubelskie powiatopolski + powiatopolski2 powiatostrodzki powiatostrowiecki powiatostrzeszowski powiatoswiecimski + powiatostrowskimazowieckie powiatotwocki powiatpabianicki powiatpiaseczynski powiatpilski powiatpinczowski powiatpiotrkowski + powiatpiskiwarminskomazurskie powiatpleszewski powiatplocki powiatplonski @@ -2988,6 +3216,7 @@ powiatsuski powiatswidnicki powiatswidwinski + powiatswidnickiwswidniku powiatswiebodzinski powiatswiecki powiatszamotulski @@ -3000,6 +3229,7 @@ powiattatrzanski powiattczewski powiattomaszowski + powiattomaszowskilubelskie powiattorunski powiattrzebnicki powiattucholski @@ -3041,6 +3271,7 @@ powiatzyrardowski powiatzywiecki poznan + prfrawamaz proszowice prudnik pruszczgdanski @@ -3058,6 +3289,7 @@ rabkazdroj raciaz raciborz + radkowklodzki radom radomsko radomyslwielki @@ -3065,12 +3297,17 @@ radziejow radzionkow radzynpodlaski + rakoniewice rawamazowiecka rawicz reda + rejowiecpowiatchelmski + rogowopowiatrypinski + rogowopowiatzninski rogozno ropczyce rudaslaska + rudnikpowiatraciborski rumia rybnik rychwal @@ -3079,6 +3316,7 @@ rypin rzeszow rzeszowprojekt + rzgowpowiatkoninski sandomierz sanok sedziszowmalopolski @@ -3100,14 +3338,19 @@ sokolowpodlaski sopot sosnowiec + spmajkowskarzysko + spteodory srem srodaslaska srodawielkopolska starachowice stargard starogardgdanski + starostwokrosnienskie starysacz staszow + stezycapowiatrycki + stowarzyszenieintegracja stronieslaskie strzyzow sulejowek @@ -3115,9 +3358,12 @@ sulmierzyce swarzedz swidnica + swidnicapowiatswidnicki + swidnicapowiatzielonogorski swidnik swidwin swieradowzdroj + swietajnopowiatszczycienski swietochlowice swinoujscie sycow @@ -3129,6 +3375,7 @@ szprotawa sztum szubin + szydlowopowiatpilski tarnobrzeg tarnow tarnowskiegory @@ -3145,6 +3392,7 @@ turawa tuszyn tychy + uggolcza ujazd ustka ustron @@ -3154,6 +3402,20 @@ walcz warminskomazurskie warszawa + warszawabemowo + warszawabialoleka + warszawabielany + warszawamokotow + warszawapragapoludnie + warszawasrodmiescie + warszawatargowek + warszawaursus + warszawaursynow + warszawawawer + warszawawesola + warszawawlochy + warszawawola + warszawazoliborz wasosz wegrow wejherowo @@ -3161,6 +3423,10 @@ wieliczka wielkopolskie wielun + wierzbicapowiatchelmski + wierzbicapowiatradomski + wilkowpowiatnamyslowski + wisniowapowiatmyslenicki wladyslawowo wloclawek wlodawa @@ -3177,20 +3443,30 @@ zagan zakliczyn zakopane + zakrzewopowiataleksandrowski zambrow zamosc zary zawidow zdunskawola zduny + zdzwarszawa zelechow + zespolszkolppckumarszew zgierz zgorzelec zielonagora zielonka + zkso1katowice zlotoryja zlotow zory + zs2lubin + zsksieradz + zskzkwidzyn + zskzsochaczew + zspstarekozle + zstpowiatopoczynski zwolen zyrardow From f455064b9d4e2b219033b2500e02dedd08955040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 2 Mar 2024 21:18:02 +0100 Subject: [PATCH 1388/1526] Version 2.5.0 --- app/build.gradle | 10 +++++----- app/src/main/play/release-notes/pl-PL/default.txt | 12 ++++++++---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f01b9917c..6f63715ba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 148 - versionName "2.4.2" + versionCode 149 + versionName "2.5.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -164,8 +164,8 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.99d - updatePriority = 2 + userFraction = 0.20d + updatePriority = 1 enabled.set(false) } @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.4.2-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.5.0' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index ef6308b6c..98c48e15d 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,7 +1,11 @@ -Wersja 2.4.2 +Wersja 2.5.0 -- naprawiliśmy crash przy przełączaniu uczniów, motywów i języków -- naprawiliśmy crash przy dodawaniu dodatkowych lekcji -- naprawiliśmy obsługę błędów widżetach +— dodaliśmy wyświetlanie ogłoszeń +— dodaliśmy opcję przywracania wiadomości z kosza +— dodaliśmy opcję wyciszania nadawców wiadomości +— naprawiliśmy opcjonalne liczenie średniej arytmetycznej, kiedy brak ocen z wagą w drugim semestrze +— usprawniliśmy ładowanie frekwencji i planu lekcji +— naprawiliśmy usprawiedliwianie nieobecności i autoryzację u użytkowników eduOne +— zmieniliśmy komunikat o zmienionym haśle Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 47d8513a7766da92013943a74cdecba65c202956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 3 Mar 2024 10:35:17 +0100 Subject: [PATCH 1389/1526] New Crowdin updates (#2464) --- app/src/main/res/values-cs/strings.xml | 4 ++-- app/src/main/res/values-sk/strings.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c3c691c7f..58c1d7d3f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -852,8 +852,8 @@ Pro provoz aplikace potřebujeme potvrdit vaši identitu. Zadejte PESEL žáka <b>%1$s</b> v níže uvedeném poli Zatím přeskočit - VULCAN\'s website requires verification - Why am I seeing this?\nThe register website from which Wulkanowy downloads data displays the same screen as above, so Wulkanowy must also show it to be able to download data from this website. There\'s no way around it + Webová stránka deníku VULCAN vyžaduje ověření + Proč se mi to zobrazuje?\nWebová stránka deníku, ze které Wulkanowy stahuje data, zobrazuje stejnou obrazovku jako výše, takže Wulkanowy ji musí také zobrazit, aby bylo možné získávat data z této stránky. Nedá se to obejít Úspěšně ověřeno Žádné internetové připojení diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 829475d60..0f5215665 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -852,8 +852,8 @@ Na prevádzku aplikácie potrebujeme potvrdiť vašu identitu. Zadajte PESEL žiaka <b>%1$s</b> v nižšie uvedenom poli Zatiaľ preskočiť - VULCAN\'s website requires verification - Why am I seeing this?\nThe register website from which Wulkanowy downloads data displays the same screen as above, so Wulkanowy must also show it to be able to download data from this website. There\'s no way around it + Webová stránka denníka VULCAN vyžaduje overenie + Prečo sa mi to zobrazuje?\nWebová stránka denníka, z ktorej Wulkanowy sťahuje dáta, zobrazuje rovnakú obrazovku ako vyššie, takže Wulkanowy ju musí tiež zobraziť, aby bolo možné získavať dáta z tejto stránky. Nedá sa to obísť Úspešne overené Žiadne internetové pripojenie From 0a1f7270b4009244cf8d7e346594ae719c7448db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 3 Mar 2024 11:15:11 +0100 Subject: [PATCH 1390/1526] Version 2.5.1 --- app/build.gradle | 8 ++++---- .../ui/modules/message/preview/MessagePreviewFragment.kt | 2 +- app/src/main/play/release-notes/pl-PL/default.txt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6f63715ba..31de5104a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 149 - versionName "2.5.0" + versionCode 150 + versionName "2.5.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -164,7 +164,7 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.20d + userFraction = 0.50d updatePriority = 1 enabled.set(false) } @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.0' + implementation 'io.github.wulkanowy:sdk:2.5.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index 75778bac5..ebdb96a40 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -234,7 +234,7 @@ class MessagePreviewFragment : } override fun onSaveInstanceState(outState: Bundle) { - outState.putSerializable(MESSAGE_ID_KEY, presenter.messageWithAttachments) + outState.putSerializable(MESSAGE_ID_KEY, presenter.messageWithAttachments?.message) super.onSaveInstanceState(outState) } diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 98c48e15d..2a57977f1 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,4 +1,4 @@ -Wersja 2.5.0 +Wersja 2.5.1 — dodaliśmy wyświetlanie ogłoszeń — dodaliśmy opcję przywracania wiadomości z kosza From 8f5a210ec752d353328a187b3ebb6541d5e3ec2d Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Fri, 8 Mar 2024 20:36:43 +0100 Subject: [PATCH 1391/1526] Add attendance calculator (#1597) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --------- Co-authored-by: Mikołaj Pich Co-authored-by: Faierbel --- .../java/io/github/wulkanowy/data/Resource.kt | 100 ++++++++++++- .../enums/AttendanceCalculatorSortingMode.kt | 13 ++ .../wulkanowy/data/pojos/AttendanceData.kt | 14 ++ .../AttendanceSummaryRepository.kt | 2 +- .../repositories/PreferencesRepository.kt | 13 ++ .../GetAttendanceCalculatorDataUseCase.kt | 103 +++++++++++++ .../modules/attendance/AttendanceFragment.kt | 6 + .../modules/attendance/AttendancePresenter.kt | 29 +++- .../ui/modules/attendance/AttendanceView.kt | 2 + .../calculator/AttendanceCalculatorAdapter.kt | 63 ++++++++ .../AttendanceCalculatorFragment.kt | 105 +++++++++++++ .../AttendanceCalculatorPresenter.kt | 84 +++++++++++ .../calculator/AttendanceCalculatorView.kt | 29 ++++ .../settings/appearance/AppearanceFragment.kt | 10 ++ .../wulkanowy/utils/AttendanceExtension.kt | 12 +- .../ic_menu_attendance_calculator.xml | 5 + .../layout/fragment_attendance_calculator.xml | 103 +++++++++++++ .../item_attendance_calculator_header.xml | 111 ++++++++++++++ .../res/layout/pref_target_attendance.xml | 140 ++++++++++++++++++ .../main/res/menu/action_menu_attendance.xml | 7 + app/src/main/res/values-pl/strings.xml | 3 + .../main/res/values/preferences_defaults.xml | 2 + app/src/main/res/values/preferences_keys.xml | 2 + .../main/res/values/preferences_values.xml | 11 ++ app/src/main/res/values/strings.xml | 7 + .../res/xml/scheme_preferences_appearance.xml | 19 +++ 26 files changed, 981 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/data/enums/AttendanceCalculatorSortingMode.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/pojos/AttendanceData.kt create mode 100644 app/src/main/java/io/github/wulkanowy/domain/attendance/GetAttendanceCalculatorDataUseCase.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorAdapter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorFragment.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorPresenter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorView.kt create mode 100644 app/src/main/res/drawable/ic_menu_attendance_calculator.xml create mode 100644 app/src/main/res/layout/fragment_attendance_calculator.xml create mode 100644 app/src/main/res/layout/item_attendance_calculator_header.xml create mode 100644 app/src/main/res/layout/pref_target_attendance.xml diff --git a/app/src/main/java/io/github/wulkanowy/data/Resource.kt b/app/src/main/java/io/github/wulkanowy/data/Resource.kt index 108b0d58e..c698c42d5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/Resource.kt +++ b/app/src/main/java/io/github/wulkanowy/data/Resource.kt @@ -1,11 +1,16 @@ package io.github.wulkanowy.data +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map @@ -14,8 +19,10 @@ import kotlinx.coroutines.flow.takeWhile import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import timber.log.Timber +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds -sealed class Resource { +sealed class Resource { open class Loading : Resource() @@ -64,6 +71,19 @@ fun Resource.mapData(block: (T) -> U) = when (this) { is Resource.Error -> Resource.Error(this.error) } +inline fun Flow>.combineWithResourceData( + flow: Flow, + crossinline block: suspend (T1, T2) -> R +): Flow> = + combine(flow) { resource, inject -> + when (resource) { + is Resource.Success -> Resource.Success(block(resource.data, inject)) + is Resource.Intermediate -> Resource.Intermediate(block(resource.data, inject)) + is Resource.Loading -> Resource.Loading() + is Resource.Error -> Resource.Error(resource.error) + } + } + fun Flow>.logResourceStatus(name: String, showData: Boolean = false) = onEach { val description = when (it) { is Resource.Intermediate -> "intermediate data received" + if (showData) " (data: `${it.data}`)" else "" @@ -74,8 +94,29 @@ fun Flow>.logResourceStatus(name: String, showData: Boolean = fa Timber.i("$name: $description") } -fun Flow>.mapResourceData(block: (T) -> U) = map { - it.mapData(block) +fun Flow>.mapResourceData(block: suspend (T) -> U) = map { + when (it) { + is Resource.Success -> Resource.Success(block(it.data)) + is Resource.Intermediate -> Resource.Intermediate(block(it.data)) + is Resource.Loading -> Resource.Loading() + is Resource.Error -> Resource.Error(it.error) + } +} + +@OptIn(ExperimentalCoroutinesApi::class) +fun Flow>.flatMapResourceData( + inheritIntermediate: Boolean = true, block: suspend (T) -> Flow> +) = flatMapLatest { + when (it) { + is Resource.Success -> block(it.data) + is Resource.Intermediate -> block(it.data).map { newRes -> + if (inheritIntermediate && newRes is Resource.Success) Resource.Intermediate(newRes.data) + else newRes + } + + is Resource.Loading -> flowOf(Resource.Loading()) + is Resource.Error -> flowOf(Resource.Error(it.error)) + } } fun Flow>.onResourceData(block: suspend (T) -> Unit) = onEach { @@ -105,13 +146,13 @@ fun Flow>.onResourceSuccess(block: suspend (T) -> Unit) = onEach } } -fun Flow>.onResourceError(block: (Throwable) -> Unit) = onEach { +fun Flow>.onResourceError(block: suspend (Throwable) -> Unit) = onEach { if (it is Resource.Error) { block(it.error) } } -fun Flow>.onResourceNotLoading(block: () -> Unit) = onEach { +fun Flow>.onResourceNotLoading(block: suspend () -> Unit) = onEach { if (it !is Resource.Loading) { block() } @@ -121,6 +162,55 @@ suspend fun Flow>.toFirstResult() = filter { it !is Resource.Loa suspend fun Flow>.waitForResult() = takeWhile { it is Resource.Loading }.collect() +// Can cause excessive amounts of `Resource.Intermediate` to be emitted. Unless that is desired, +// use `debounceIntermediates` to alleviate this behavior. +inline fun combineResourceFlows( + flows: Iterable>>, +): Flow>> = combine(flows) { items -> + var isIntermediate = false + val data = mutableListOf() + for (item in items) { + when (item) { + is Resource.Success -> data.add(item.data) + is Resource.Intermediate -> { + isIntermediate = true + data.add(item.data) + } + + is Resource.Loading -> return@combine Resource.Loading() + is Resource.Error -> continue + } + } + if (data.isEmpty()) { + // All items have to be errors for this to happen, so just return the first one. + // mapData is functionally useless and exists only to satisfy the type checker + items.first().mapData { listOf(it) } + } else if (isIntermediate) { + Resource.Intermediate(data) + } else { + Resource.Success(data) + } +} + +@OptIn(FlowPreview::class) +fun Flow>.debounceIntermediates(timeout: Duration = 5.seconds) = flow { + var wasIntermediate = false + + emitAll(this@debounceIntermediates.debounce { + if (it is Resource.Intermediate) { + if (!wasIntermediate) { + wasIntermediate = true + Duration.ZERO + } else { + timeout + } + } else { + wasIntermediate = false + Duration.ZERO + } + }) +} + inline fun networkBoundResource( mutex: Mutex = Mutex(), showSavedOnLoading: Boolean = true, diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/AttendanceCalculatorSortingMode.kt b/app/src/main/java/io/github/wulkanowy/data/enums/AttendanceCalculatorSortingMode.kt new file mode 100644 index 000000000..77dd5fc4b --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/enums/AttendanceCalculatorSortingMode.kt @@ -0,0 +1,13 @@ +package io.github.wulkanowy.data.enums + +enum class AttendanceCalculatorSortingMode(private val value: String) { + ALPHABETIC("alphabetic"), + ATTENDANCE("attendance_percentage"), + LESSON_BALANCE("lesson_balance"); + + companion object { + fun getByValue(value: String) = + AttendanceCalculatorSortingMode.values() + .find { it.value == value } ?: ALPHABETIC + } +} diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/AttendanceData.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/AttendanceData.kt new file mode 100644 index 000000000..5810363c6 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/AttendanceData.kt @@ -0,0 +1,14 @@ +package io.github.wulkanowy.data.pojos + +data class AttendanceData( + val subjectName: String, + val lessonBalance: Int, + val presences: Int, + val absences: Int, +) { + val total: Int + get() = presences + absences + + val presencePercentage: Double + get() = if (total == 0) 0.0 else (presences.toDouble() / total) * 100 +} diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt index c6cfc2f6b..1129598ac 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt @@ -1,12 +1,12 @@ package io.github.wulkanowy.data.repositories import androidx.room.withTransaction +import io.github.wulkanowy.data.* import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey 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 64e60a60b..4735293c0 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 @@ -10,6 +10,7 @@ import com.fredporciuncula.flow.preferences.Serializer import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.enums.AppTheme +import io.github.wulkanowy.data.enums.AttendanceCalculatorSortingMode import io.github.wulkanowy.data.enums.GradeColorTheme import io.github.wulkanowy.data.enums.GradeExpandMode import io.github.wulkanowy.data.enums.GradeSortingMode @@ -41,6 +42,18 @@ class PreferencesRepository @Inject constructor( R.bool.pref_default_attendance_present ) + val targetAttendanceFlow: Flow + get() = flowSharedPref.getInt( + context.getString(R.string.pref_key_attendance_target), + context.resources.getInteger(R.integer.pref_default_attendance_target) + ).asFlow() + + val attendanceCalculatorSortingModeFlow: Flow + get() = flowSharedPref.getString( + context.getString(R.string.pref_key_attendance_calculator_sorting_mode), + context.resources.getString(R.string.pref_default_attendance_calculator_sorting_mode) + ).asFlow().map(AttendanceCalculatorSortingMode::getByValue) + private val gradeAverageModePref: Preference get() = getObjectFlow( R.string.pref_key_grade_average_mode, diff --git a/app/src/main/java/io/github/wulkanowy/domain/attendance/GetAttendanceCalculatorDataUseCase.kt b/app/src/main/java/io/github/wulkanowy/domain/attendance/GetAttendanceCalculatorDataUseCase.kt new file mode 100644 index 000000000..ea68050d5 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/domain/attendance/GetAttendanceCalculatorDataUseCase.kt @@ -0,0 +1,103 @@ +package io.github.wulkanowy.domain.attendance + +import io.github.wulkanowy.data.* +import io.github.wulkanowy.data.db.entities.AttendanceSummary +import io.github.wulkanowy.data.db.entities.Semester +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.Subject +import io.github.wulkanowy.data.enums.AttendanceCalculatorSortingMode +import io.github.wulkanowy.data.enums.AttendanceCalculatorSortingMode.* +import io.github.wulkanowy.data.pojos.AttendanceData +import io.github.wulkanowy.data.repositories.AttendanceSummaryRepository +import io.github.wulkanowy.data.repositories.PreferencesRepository +import io.github.wulkanowy.data.repositories.SubjectRepository +import io.github.wulkanowy.utils.allAbsences +import io.github.wulkanowy.utils.allPresences +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject +import kotlin.math.ceil +import kotlin.math.floor + +class GetAttendanceCalculatorDataUseCase @Inject constructor( + private val subjectRepository: SubjectRepository, + private val attendanceSummaryRepository: AttendanceSummaryRepository, + private val preferencesRepository: PreferencesRepository, +) { + + operator fun invoke( + student: Student, + semester: Semester, + forceRefresh: Boolean, + ): Flow>> = + subjectRepository.getSubjects(student, semester, forceRefresh) + .mapResourceData { subjects -> subjects.sortedBy(Subject::name) } + .combineWithResourceData(preferencesRepository.targetAttendanceFlow, ::Pair) + .flatMapResourceData { (subjects, targetFreq) -> + combineResourceFlows(subjects.map { subject -> + attendanceSummaryRepository.getAttendanceSummary( + student = student, + semester = semester, + subjectId = subject.realId, + forceRefresh = forceRefresh + ).mapResourceData { summaries -> + summaries.toAttendanceData(subject.name, targetFreq) + } + }) + // Every individual combined flow causes separate network requests to update data. + // When there is N child flows, they can cause up to N-1 items to be emitted. Since all + // requests are usually completed in less than 5s, there is no need to emit multiple + // intermediates that will be visible for barely any time. + .debounceIntermediates() + } + .combineWithResourceData(preferencesRepository.attendanceCalculatorSortingModeFlow, List::sortedBy) +} + +private fun List.toAttendanceData(subjectName: String, targetFreq: Int): AttendanceData { + val presences = sumOf { it.allPresences } + val absences = sumOf { it.allAbsences } + return AttendanceData( + subjectName = subjectName, + lessonBalance = calcLessonBalance( + targetFreq.toDouble() / 100, presences, absences + ), + presences = presences, + absences = absences, + ) +} + +private fun calcLessonBalance(targetFreq: Double, presences: Int, absences: Int): Int { + val total = presences + absences + // The `+ 1` is to avoid false positives in close cases. Eg.: + // target frequency 99%, 1 presence. Without the `+ 1` this would be reported shown as + // a positive balance of +1, however that is not actually true as skipping one class + // would make it so that the balance would actually be negative (-98). The `+ 1` + // fixes this and makes sure that in situations like these, it's not reporting incorrect + // balances + return when { + presences / (total + 1f) >= targetFreq -> calcMissingAbsences( + targetFreq, absences, presences + ) + presences / (total + 0f) < targetFreq -> -calcMissingPresences( + targetFreq, absences, presences + ) + else -> 0 + } +} + +private fun calcMissingPresences(targetFreq: Double, absences: Int, presences: Int) = + calcMinRequiredPresencesFor(targetFreq, absences) - presences + +private fun calcMinRequiredPresencesFor(targetFreq: Double, absences: Int) = + ceil((targetFreq / (1 - targetFreq)) * absences).toInt() + +private fun calcMissingAbsences(targetFreq: Double, absences: Int, presences: Int) = + calcMinRequiredAbsencesFor(targetFreq, presences) - absences + +private fun calcMinRequiredAbsencesFor(targetFreq: Double, presences: Int) = + floor((presences * (1 - targetFreq)) / targetFreq).toInt() + +private fun List.sortedBy(mode: AttendanceCalculatorSortingMode) = when (mode) { + ALPHABETIC -> sortedBy(AttendanceData::subjectName) + ATTENDANCE -> sortedByDescending(AttendanceData::presencePercentage) + LESSON_BALANCE -> sortedBy(AttendanceData::lessonBalance) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 6e842b4d7..07649e436 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.databinding.DialogExcuseBinding import io.github.wulkanowy.databinding.FragmentAttendanceBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.attendance.calculator.AttendanceCalculatorFragment import io.github.wulkanowy.ui.modules.attendance.summary.AttendanceSummaryFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView @@ -134,6 +135,7 @@ class AttendanceFragment : BaseFragment(R.layout.frag override fun onOptionsItemSelected(item: MenuItem): Boolean { return if (item.itemId == R.id.attendanceMenuSummary) presenter.onSummarySwitchSelected() + else if (item.itemId == R.id.attendanceMenuCalculator) presenter.onCalculatorSwitchSelected() else false } @@ -253,6 +255,10 @@ class AttendanceFragment : BaseFragment(R.layout.frag (activity as? MainActivity)?.pushView(AttendanceSummaryFragment.newInstance()) } + override fun openCalculatorView() { + (activity as? MainActivity)?.pushView(AttendanceCalculatorFragment.newInstance()) + } + override fun startActionMode() { actionMode = (activity as MainActivity?)?.startSupportActionMode(actionModeCallback) } 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 82fe69cb7..586a41ad0 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 @@ -1,16 +1,36 @@ package io.github.wulkanowy.ui.modules.attendance import android.annotation.SuppressLint -import io.github.wulkanowy.data.* +import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.Semester +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.mapResourceData +import io.github.wulkanowy.data.onResourceData +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceIntermediate +import io.github.wulkanowy.data.onResourceLoading +import io.github.wulkanowy.data.onResourceNotLoading +import io.github.wulkanowy.data.onResourceSuccess 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.resourceFlow import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.* +import io.github.wulkanowy.utils.AnalyticsHelper +import io.github.wulkanowy.utils.capitalise +import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday +import io.github.wulkanowy.utils.isExcusableOrNotExcused +import io.github.wulkanowy.utils.isHolidays +import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.nextSchoolDay +import io.github.wulkanowy.utils.previousOrSameSchoolDay +import io.github.wulkanowy.utils.previousSchoolDay +import io.github.wulkanowy.utils.sunday +import io.github.wulkanowy.utils.toFormattedString import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.onEach import timber.log.Timber @@ -195,6 +215,11 @@ class AttendancePresenter @Inject constructor( return true } + fun onCalculatorSwitchSelected(): Boolean { + view?.openCalculatorView() + return true + } + private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading attendance data started") diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt index 2629c217e..f51ce7c7e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt @@ -56,6 +56,8 @@ interface AttendanceView : BaseView { fun openSummaryView() + fun openCalculatorView() + fun startSendMessageIntent(date: LocalDate, numbers: String, reason: String) fun startActionMode() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorAdapter.kt new file mode 100644 index 000000000..73c08fd32 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorAdapter.kt @@ -0,0 +1,63 @@ +package io.github.wulkanowy.ui.modules.attendance.calculator + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.view.isVisible +import androidx.recyclerview.widget.RecyclerView +import io.github.wulkanowy.R +import io.github.wulkanowy.data.pojos.AttendanceData +import io.github.wulkanowy.databinding.ItemAttendanceCalculatorHeaderBinding +import javax.inject.Inject +import kotlin.math.abs +import kotlin.math.roundToInt + +class AttendanceCalculatorAdapter @Inject constructor() : + RecyclerView.Adapter() { + + var items = emptyList() + + override fun getItemCount() = items.size + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ) = ViewHolder( + ItemAttendanceCalculatorHeaderBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ) + ) + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(parent: ViewHolder, position: Int) { + with(parent.binding) { + val item = items[position] + attendanceCalculatorPercentage.text = "${item.presencePercentage.roundToInt()}" + + if (item.lessonBalance > 0) { + attendanceCalculatorSummaryBalance.text = root.context.getString( + R.string.attendance_calculator_summary_balance_positive, + item.lessonBalance + ) + } else if (item.lessonBalance < 0) { + attendanceCalculatorSummaryBalance.text = root.context.getString( + R.string.attendance_calculator_summary_balance_negative, + abs(item.lessonBalance) + ) + } else { + attendanceCalculatorSummaryBalance.text = root.context.getString( + R.string.attendance_calculator_summary_balance_neutral, + ) + } + attendanceCalculatorWarning.isVisible = item.lessonBalance < 0 + attendanceCalculatorTitle.text = item.subjectName + attendanceCalculatorSummaryValues.text = root.context.getString( + R.string.attendance_calculator_summary_values, + item.presences, + item.total + ) + } + } + + class ViewHolder(val binding: ItemAttendanceCalculatorHeaderBinding) : + RecyclerView.ViewHolder(binding.root) +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorFragment.kt new file mode 100644 index 000000000..2d5667015 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorFragment.kt @@ -0,0 +1,105 @@ +package io.github.wulkanowy.ui.modules.attendance.calculator + +import android.os.Bundle +import android.view.View +import androidx.core.view.isVisible +import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R +import io.github.wulkanowy.data.pojos.AttendanceData +import io.github.wulkanowy.databinding.FragmentAttendanceCalculatorBinding +import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.widgets.DividerItemDecoration +import io.github.wulkanowy.utils.getThemeAttrColor +import javax.inject.Inject + +@AndroidEntryPoint +class AttendanceCalculatorFragment : + BaseFragment(R.layout.fragment_attendance_calculator), + AttendanceCalculatorView, MainView.TitledView { + + @Inject + lateinit var presenter: AttendanceCalculatorPresenter + + @Inject + lateinit var attendanceCalculatorAdapter: AttendanceCalculatorAdapter + + override val titleStringId get() = R.string.attendance_title + + companion object { + fun newInstance() = AttendanceCalculatorFragment() + } + + override val isViewEmpty get() = attendanceCalculatorAdapter.items.isEmpty() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentAttendanceCalculatorBinding.bind(view) + messageContainer = binding.attendanceCalculatorRecycler + presenter.onAttachView(this) + } + + override fun initView() { + with(binding.attendanceCalculatorRecycler) { + layoutManager = LinearLayoutManager(context) + adapter = attendanceCalculatorAdapter + addItemDecoration(DividerItemDecoration(context)) + } + + with(binding) { + attendanceCalculatorSwipe.setOnRefreshListener(presenter::onSwipeRefresh) + attendanceCalculatorSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) + attendanceCalculatorSwipe.setProgressBackgroundColorSchemeColor(requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh)) + attendanceCalculatorErrorRetry.setOnClickListener { presenter.onRetry() } + attendanceCalculatorErrorDetails.setOnClickListener { presenter.onDetailsClick() } + } + } + + override fun updateData(data: List) { + with(attendanceCalculatorAdapter) { + items = data + notifyDataSetChanged() + } + } + + override fun clearView() { + with(attendanceCalculatorAdapter) { + items = emptyList() + notifyDataSetChanged() + } + } + + override fun showEmpty(show: Boolean) { + binding.attendanceCalculatorEmpty.isVisible = show + } + + override fun showErrorView(show: Boolean) { + binding.attendanceCalculatorError.isVisible = show + } + + override fun setErrorDetails(message: String) { + binding.attendanceCalculatorErrorMessage.text = message + } + + override fun showProgress(show: Boolean) { + binding.attendanceCalculatorProgress.isVisible = show + } + + override fun enableSwipe(enable: Boolean) { + binding.attendanceCalculatorSwipe.isEnabled = enable + } + + override fun showContent(show: Boolean) { + binding.attendanceCalculatorRecycler.isVisible = show + } + + override fun showRefresh(show: Boolean) { + binding.attendanceCalculatorSwipe.isRefreshing = show + } + + override fun onDestroyView() { + presenter.onDetachView() + super.onDestroyView() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorPresenter.kt new file mode 100644 index 000000000..d292e5650 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorPresenter.kt @@ -0,0 +1,84 @@ +package io.github.wulkanowy.ui.modules.attendance.calculator + +import io.github.wulkanowy.data.* +import io.github.wulkanowy.data.repositories.SemesterRepository +import io.github.wulkanowy.data.repositories.StudentRepository +import io.github.wulkanowy.domain.attendance.GetAttendanceCalculatorDataUseCase +import io.github.wulkanowy.ui.base.BasePresenter +import io.github.wulkanowy.ui.base.ErrorHandler +import timber.log.Timber +import javax.inject.Inject + +class AttendanceCalculatorPresenter @Inject constructor( + errorHandler: ErrorHandler, + studentRepository: StudentRepository, + private val semesterRepository: SemesterRepository, + private val getAttendanceCalculatorData: GetAttendanceCalculatorDataUseCase, +) : BasePresenter(errorHandler, studentRepository) { + + private lateinit var lastError: Throwable + + override fun onAttachView(view: AttendanceCalculatorView) { + super.onAttachView(view) + view.initView() + Timber.i("Attendance calculator view was initialized") + errorHandler.showErrorMessage = ::showErrorViewOnError + loadData() + } + + fun onSwipeRefresh() { + Timber.i("Force refreshing the attendance calculator") + loadData(forceRefresh = true) + } + + fun onRetry() { + view?.run { + showErrorView(false) + showProgress(true) + } + loadData() + } + + fun onDetailsClick() { + view?.showErrorDetailsDialog(lastError) + } + + private fun loadData(forceRefresh: Boolean = false) { + flatResourceFlow { + val student = studentRepository.getCurrentStudent() + val semester = semesterRepository.getCurrentSemester(student) + getAttendanceCalculatorData(student, semester, forceRefresh) + } + .logResourceStatus("load attendance calculator") + .onResourceData { + view?.run { + showProgress(false) + showErrorView(false) + showContent(it.isNotEmpty()) + showEmpty(it.isEmpty()) + updateData(it) + } + } + .onResourceIntermediate { view?.showRefresh(true) } + .onResourceNotLoading { + view?.run { + enableSwipe(true) + showRefresh(false) + showProgress(false) + } + } + .onResourceError(errorHandler::dispatch) + .launch() + } + + private fun showErrorViewOnError(message: String, error: Throwable) { + view?.run { + if (isViewEmpty) { + lastError = error + setErrorDetails(message) + showErrorView(true) + showEmpty(false) + } else showError(message, error) + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorView.kt new file mode 100644 index 000000000..94e661212 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorView.kt @@ -0,0 +1,29 @@ +package io.github.wulkanowy.ui.modules.attendance.calculator + +import io.github.wulkanowy.data.pojos.AttendanceData +import io.github.wulkanowy.ui.base.BaseView + +interface AttendanceCalculatorView : BaseView { + + val isViewEmpty: Boolean + + fun initView() + + fun showRefresh(show: Boolean) + + fun showContent(show: Boolean) + + fun showProgress(show: Boolean) + + fun enableSwipe(enable: Boolean) + + fun showEmpty(show: Boolean) + + fun showErrorView(show: Boolean) + + fun setErrorDetails(message: String) + + fun updateData(data: List) + + fun clearView() +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt index 3d0c8052b..ba234aae2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt @@ -4,6 +4,7 @@ import android.content.SharedPreferences import android.os.Bundle import android.view.View import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SeekBarPreference import com.yariksoffice.lingver.Lingver import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R @@ -36,6 +37,15 @@ class AppearanceFragment : PreferenceFragmentCompat(), override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.scheme_preferences_appearance, rootKey) + val attendanceTargetPref = + findPreference(requireContext().getString(R.string.pref_key_attendance_target))!! + attendanceTargetPref.setOnPreferenceChangeListener { _, newValueObj -> + val newValue = (((newValueObj as Int).toDouble() + 2.5) / 5).toInt() * 5 + attendanceTargetPref.value = + newValue.coerceIn(attendanceTargetPref.min, attendanceTargetPref.max) + + false + } } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { 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 397c95953..3cac0b48e 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AttendanceExtension.kt @@ -10,19 +10,19 @@ import io.github.wulkanowy.sdk.scrapper.attendance.AttendanceCategory * (https://www.vulcan.edu.pl/vulcang_files/user/AABW/AABW-PDF/uonetplus/uonetplus_Frekwencja-liczby-obecnych-nieobecnych.pdf) */ -private inline val AttendanceSummary.allPresences: Double - get() = presence.toDouble() + absenceForSchoolReasons + lateness + latenessExcused +inline val AttendanceSummary.allPresences: Int + get() = presence + absenceForSchoolReasons + lateness + latenessExcused -private inline val AttendanceSummary.allAbsences: Double - get() = absence.toDouble() + absenceExcused +inline val AttendanceSummary.allAbsences: Int + get() = absence + absenceExcused inline val Attendance.isExcusableOrNotExcused: Boolean get() = (excusable || ((absence || lateness) && !excused)) && excuseStatus == null -fun AttendanceSummary.calculatePercentage() = calculatePercentage(allPresences, allAbsences) +fun AttendanceSummary.calculatePercentage() = calculatePercentage(allPresences.toDouble(), allAbsences.toDouble()) fun List.calculatePercentage(): Double { - return calculatePercentage(sumOf { it.allPresences }, sumOf { it.allAbsences }) + return calculatePercentage(sumOf { it.allPresences.toDouble() }, sumOf { it.allAbsences.toDouble() }) } private fun calculatePercentage(presence: Double, absence: Double): Double { diff --git a/app/src/main/res/drawable/ic_menu_attendance_calculator.xml b/app/src/main/res/drawable/ic_menu_attendance_calculator.xml new file mode 100644 index 000000000..8a7d209a7 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_attendance_calculator.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_attendance_calculator.xml b/app/src/main/res/layout/fragment_attendance_calculator.xml new file mode 100644 index 000000000..346c6aecd --- /dev/null +++ b/app/src/main/res/layout/fragment_attendance_calculator.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_attendance_calculator_header.xml b/app/src/main/res/layout/item_attendance_calculator_header.xml new file mode 100644 index 000000000..debc79979 --- /dev/null +++ b/app/src/main/res/layout/item_attendance_calculator_header.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/pref_target_attendance.xml b/app/src/main/res/layout/pref_target_attendance.xml new file mode 100644 index 000000000..558b0d36f --- /dev/null +++ b/app/src/main/res/layout/pref_target_attendance.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/action_menu_attendance.xml b/app/src/main/res/menu/action_menu_attendance.xml index bb20c8ec2..5c59d2391 100644 --- a/app/src/main/res/menu/action_menu_attendance.xml +++ b/app/src/main/res/menu/action_menu_attendance.xml @@ -1,6 +1,13 @@ + Wyłącz wyciszenie Wyciszyleś tego użytkownika Wyłączyłeś wyciszenie tego użytkownika + + Docelowa frekwencja (w %) + Kalkulator frekwencji diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 8e6fc7d66..109418893 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -2,6 +2,8 @@ 0 true + 50 + alphabetic only_one_semester false one diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 74af9262c..e95c59405 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -2,6 +2,8 @@ default_menu_index attendance_present + attendance_target + attendance_calculator_sorting_mode app_theme dashboard_tiles grade_color_scheme diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index f56707c89..2475e4914 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -79,6 +79,17 @@ 0.75 + + Alphabetically + By attendance percentage + By lesson balance + + + alphabetic + attendance_percentage + lesson_balance + + Alphabetically By date diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2775365d5..ae6d91408 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -258,6 +258,11 @@ Attendance summary + Attendance calculator + %1$d over target + right on target + %1$d under target + %1$d/%2$d presences Absent for school reasons Excused absence Unexcused absence @@ -715,6 +720,8 @@ Calculated average options Force average calculation by app Show presence + Attendance target + Attendance calculator sorting Theme Grades expanding Show groups next to subjects diff --git a/app/src/main/res/xml/scheme_preferences_appearance.xml b/app/src/main/res/xml/scheme_preferences_appearance.xml index 9c02a4910..46a0e6a92 100644 --- a/app/src/main/res/xml/scheme_preferences_appearance.xml +++ b/app/src/main/res/xml/scheme_preferences_appearance.xml @@ -85,6 +85,25 @@ app:iconSpaceReserved="false" app:key="@string/pref_key_attendance_present" app:title="@string/pref_view_present" /> + + Date: Fri, 8 Mar 2024 20:57:26 +0100 Subject: [PATCH 1392/1526] Update gradle wrapper to 8.6 (#2468) --- .gitignore | 1 + gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 43462 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 980085e38..c014204d0 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,7 @@ captures/ .idea/discord.xml .idea/migrations.xml .idea/androidTestResultsUserPreferences.xml +.idea/copilot # Keystore files *.jks diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..d64cd4917707c1f8861d8cb53dd15194d4248596 100644 GIT binary patch literal 43462 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

l-wUqma}v2c(1Oi^~*7`Q^d3B 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 literal 63721 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"gpYvgVMVsULOY3=lDL#2r|Jj~bidD9% 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 z Date: Fri, 8 Mar 2024 20:13:58 +0000 Subject: [PATCH 1393/1526] Bump kotlin_version from 1.9.22 to 1.9.23 (#2466) --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index ec19ee49a..f245e71b1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlin_version = '1.9.22' + kotlin_version = '1.9.23' about_libraries = '11.1.0' hilt_version = '2.51' } @@ -13,7 +13,7 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.16" + classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.19" classpath 'com.android.tools.build:gradle:8.2.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.4.1' From a71ef4a4b24a7c6dbcfca28415debd727757b7bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 20:14:33 +0000 Subject: [PATCH 1394/1526] Bump com.google.firebase:firebase-bom from 32.7.3 to 32.7.4 (#2467) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 31de5104a..ef3476611 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -252,7 +252,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.11.0' - playImplementation platform('com.google.firebase:firebase-bom:32.7.3') + playImplementation platform('com.google.firebase:firebase-bom:32.7.4') playImplementation 'com.google.firebase:firebase-analytics' playImplementation 'com.google.firebase:firebase-messaging' playImplementation 'com.google.firebase:firebase-crashlytics:' From a7c2009e4971891f8e756ccca504cddee727c689 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 20:16:03 +0000 Subject: [PATCH 1395/1526] Bump com.google.android.gms:play-services-ads from 22.6.0 to 23.0.0 (#2469) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ef3476611..3afd068be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -258,7 +258,7 @@ dependencies { playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.firebase:firebase-config' - playImplementation 'com.google.android.gms:play-services-ads:22.6.0' + playImplementation 'com.google.android.gms:play-services-ads:23.0.0' playImplementation "com.google.android.play:integrity:1.3.0" playImplementation 'com.google.android.play:app-update-ktx:2.1.0' playImplementation 'com.google.android.play:review-ktx:2.0.1' From 5dd5697f650ac6e2fd44103692bfe499e5c64437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 9 Mar 2024 10:03:36 +0100 Subject: [PATCH 1396/1526] Remove firebase disable flag (#2471) --- .circleci/config.yml | 2 +- .github/workflows/deploy-store.yml | 2 +- .github/workflows/deploy-test.yml | 5 +- .gitignore | 13 ++-- .travis.yml | 2 +- app/build.gradle | 6 +- app/{src/debug => }/google-services.json | 0 app/src/debug/agconnect-services.json | 92 ------------------------ app/src/main/AndroidManifest.xml | 24 ------- app/src/release/google-services.json | 42 ----------- 10 files changed, 14 insertions(+), 174 deletions(-) rename app/{src/debug => }/google-services.json (100%) delete mode 100644 app/src/debug/agconnect-services.json delete mode 100644 app/src/release/google-services.json diff --git a/.circleci/config.yml b/.circleci/config.yml index ce2922ba3..2cb2e1473 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -162,7 +162,7 @@ jobs: openssl aes-256-cbc -d -in ./app/upload-key-encrypted.jks -k $ENCRYPT_KEY >> ./app/upload-key.jks - run: name: Publish release - command: ./gradlew publishPlayRelease --no-daemon --stacktrace --console=plain -PenableCrashlytics -PdisablePreDex + command: ./gradlew publishPlayRelease --no-daemon --stacktrace --console=plain -PdisablePreDex workflows: version: 2 diff --git a/.github/workflows/deploy-store.yml b/.github/workflows/deploy-store.yml index e8237a381..0195f3e56 100644 --- a/.github/workflows/deploy-store.yml +++ b/.github/workflows/deploy-store.yml @@ -40,7 +40,7 @@ jobs: SINGLE_SUPPORT_AD_ID: ${{ secrets.SINGLE_SUPPORT_AD_ID }} DASHBOARD_TILE_AD_ID: ${{ secrets.DASHBOARD_TILE_AD_ID }} SET_BUILD_TIMESTAMP: ${{ secrets.SET_BUILD_TIMESTAMP }} - run: ./gradlew publishPlayReleaseApps -PenableFirebase --stacktrace; + run: ./gradlew publishPlayReleaseApps --stacktrace; deploy-app-gallery: name: AppGallery diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index c4f55e6af..42c1f8e7a 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -36,8 +36,7 @@ jobs: - name: Prepare build configuration run: | sed -i -e "s#applicationIdSuffix \".dev\"#applicationIdSuffix \".${GITHUB_HEAD_REF//[-.\/]/_}\"#" app/build.gradle - sed -i -e "s#.dev\"#.${GITHUB_HEAD_REF//[-.\/]/_}\"#" app/src/debug/google-services.json - sed -i -e "s#.dev\"#.${GITHUB_HEAD_REF//[-.\/]/_}\"#" app/src/debug/agconnect-services.json + sed -i -e "s#.dev\"#.${GITHUB_HEAD_REF//[-.\/]/_}\"#" app/google-services.json sed -i -e '/versionNameSuffix/d' app/build.gradle - name: Add signing config run: | @@ -131,7 +130,7 @@ jobs: BITRISE_KEYSTORE_PASSWORD: ${{ secrets.BITRISE_KEYSTORE_PASSWORD }} BITRISE_KEY_ALIAS: ${{ secrets.BITRISE_KEY_ALIAS }} BITRISE_KEY_PASSWORD: ${{ secrets.BITRISE_KEY_PASSWORD }} - run: ./gradlew assemblePlayDebug -PenableFirebase --stacktrace + run: ./gradlew assemblePlayDebug --stacktrace - name: Upload apk to github artifacts uses: actions/upload-artifact@v3 with: diff --git a/.gitignore b/.gitignore index c014204d0..ee435baa3 100644 --- a/.gitignore +++ b/.gitignore @@ -68,6 +68,8 @@ captures/ .idea/migrations.xml .idea/androidTestResultsUserPreferences.xml .idea/copilot +.idea/deploymentTargetDropDown.xml +.idea/kotlinc.xml # Keystore files *.jks @@ -114,12 +116,13 @@ Thumbs.db *.ear ### AndroidStudio Patch ### - !/gradle/wrapper/gradle-wrapper.jar .idea/jarRepositories.xml +### Services config files +agconnect-services.json +agconnect-credentials.json +google-services.json +!app/google-services.json + -app/src/release/agconnect-services.json -app/src/release/agconnect-credentials.json -.idea/deploymentTargetDropDown.xml -.idea/kotlinc.xml diff --git a/.travis.yml b/.travis.yml index 04db3a616..e0b0be978 100644 --- a/.travis.yml +++ b/.travis.yml @@ -61,7 +61,7 @@ script: gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/agconnect-services.json.gpg; gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg; gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg; - ./gradlew publishPlayRelease -PenableFirebase --stacktrace; + ./gradlew publishPlayRelease --stacktrace; fi after_success: diff --git a/app/build.gradle b/app/build.gradle index 3afd068be..d1c67ab0a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,10 +32,7 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" - manifestPlaceholders = [ - firebase_enabled: project.hasProperty("enableFirebase"), - admob_project_id: "" - ] + manifestPlaceholders = [admob_project_id: ""] buildConfigField "String", "SINGLE_SUPPORT_AD_ID", "null" buildConfigField "String", "DASHBOARD_TILE_AD_ID", "null" @@ -76,7 +73,6 @@ android { resValue "string", "app_name", "Wulkanowy DEV" applicationIdSuffix ".dev" versionNameSuffix "-dev" - ext.enableCrashlytics = project.hasProperty("enableFirebase") buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\"" buildConfigField "String", "SCHOOLS_BASE_URL", '"https://schools.wulkanowy.net.pl"' } diff --git a/app/src/debug/google-services.json b/app/google-services.json similarity index 100% rename from app/src/debug/google-services.json rename to app/google-services.json diff --git a/app/src/debug/agconnect-services.json b/app/src/debug/agconnect-services.json deleted file mode 100644 index 52426f54e..000000000 --- a/app/src/debug/agconnect-services.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "agcgw": { - "backurl": "connect-dre.hispace.hicloud.com", - "url": "connect-dre.dbankcloud.cn", - "websocketbackurl": "connect-ws-dre.hispace.dbankcloud.com", - "websocketurl": "connect-ws-dre.hispace.dbankcloud.cn" - }, - "agcgw_all": { - "CN": "connect-drcn.dbankcloud.cn", - "CN_back": "connect-drcn.hispace.hicloud.com", - "DE": "connect-dre.dbankcloud.cn", - "DE_back": "connect-dre.hispace.hicloud.com", - "RU": "connect-drru.hispace.dbankcloud.ru", - "RU_back": "connect-drru.hispace.dbankcloud.cn", - "SG": "connect-dra.dbankcloud.cn", - "SG_back": "connect-dra.hispace.hicloud.com" - }, - "websocketgw_all": { - "CN": "connect-ws-drcn.hispace.dbankcloud.cn", - "CN_back": "connect-ws-drcn.hispace.dbankcloud.com", - "DE": "connect-ws-dre.hispace.dbankcloud.cn", - "DE_back": "connect-ws-dre.hispace.dbankcloud.com", - "RU": "connect-ws-drru.hispace.dbankcloud.ru", - "RU_back": "connect-ws-drru.hispace.dbankcloud.cn", - "SG": "connect-ws-dra.hispace.dbankcloud.cn", - "SG_back": "connect-ws-dra.hispace.dbankcloud.com" - }, - "client": { - "cp_id": "890048000024105546", - "product_id": "736430079244736562", - "client_id": "514530959291319360", - "client_secret": "C42522DBF17D3D4BBE9D9C1783A54484B7E6844B388B7A67502D36A633A4186B", - "project_id": "736430079244736562", - "app_id": "106552551", - "api_key": "CgB6e3x9BUNiq+r8ebCHNojjjYsMT4pJSjjNDOkm9owtBb6rVI6LjnASoZBRxbjjhObcrV5gANo99fI/eKZDTbWS", - "package_name": "io.github.wulkanowy.dev" - }, - "oauth_client": { - "client_id": "106552551", - "client_type": 1 - }, - "app_info": { - "app_id": "106552551", - "package_name": "io.github.wulkanowy.dev" - }, - "service": { - "analytics": { - "collector_url": "datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn", - "collector_url_ru": "datacollector-drru.dt.dbankcloud.ru,datacollector-drru.dt.hicloud.com", - "collector_url_sg": "datacollector-dra.dt.hicloud.com,datacollector-dra.dt.dbankcloud.cn", - "collector_url_de": "datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn", - "collector_url_cn": "datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn", - "resource_id": "p1", - "channel_id": "" - }, - "search":{ - "url":"https://search-dre.cloud.huawei.com" - }, - "cloudstorage": { - "storage_url_sg_back": "https://agc-storage-dra.cloud.huawei.asia", - "storage_url_ru_back": "https://agc-storage-drru.cloud.huawei.ru", - "storage_url_ru": "https://agc-storage-drru.cloud.huawei.ru", - "storage_url_de_back": "https://agc-storage-dre.cloud.huawei.eu", - "storage_url_de": "https://ops-dre.agcstorage.link", - "storage_url": "https://agc-storage-drcn.platform.dbankcloud.cn", - "storage_url_sg": "https://ops-dra.agcstorage.link", - "storage_url_cn_back": "https://agc-storage-drcn.cloud.huawei.com.cn", - "storage_url_cn": "https://agc-storage-drcn.platform.dbankcloud.cn" - }, - "ml": { - "mlservice_url": "ml-api-dre.ai.dbankcloud.com,ml-api-dre.ai.dbankcloud.cn" - } - }, - "region": "DE", - "configuration_version": "3.0", - "appInfos": [ - { - "package_name": "io.github.wulkanowy.dev", - "client": { - "app_id": "106552551" - }, - "app_info": { - "package_name": "io.github.wulkanowy.dev", - "app_id": "106552551" - }, - "oauth_client": { - "client_type": 1, - "client_id": "106552551" - } - } - ] -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f43dfdd2c..4e617c931 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -155,33 +155,9 @@ android:resource="@xml/provider_paths" /> - - - - - - - - - diff --git a/app/src/release/google-services.json b/app/src/release/google-services.json deleted file mode 100644 index ebd157e1d..000000000 --- a/app/src/release/google-services.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "project_info": { - "project_number": "", - "firebase_url": "", - "project_id": "", - "storage_bucket": "" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:1091101852179:android:b558a25f65d088b1", - "android_client_info": { - "package_name": "io.github.wulkanowy" - } - }, - "oauth_client": [ - { - "client_id": "", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} From 4ef9fb1f2866247007f0181726814be71ac820cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 9 Mar 2024 10:05:12 +0100 Subject: [PATCH 1397/1526] Update preferences strings (#2472) --- app/src/main/res/values/preferences_values.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index 2475e4914..920482020 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -1,5 +1,8 @@ + + Alphabetically + @string/dashboard_title @string/grade_title @@ -80,9 +83,9 @@ - Alphabetically + @string/general_alphabetically By attendance percentage - By lesson balance + By subject attendance balance alphabetic @@ -91,7 +94,7 @@ - Alphabetically + @string/general_alphabetically By date By average From c72cc39920226bca53c0114fdd9e69673bde90a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 9 Mar 2024 21:01:58 +0100 Subject: [PATCH 1398/1526] Separate strings from array to avoid duplications (#2473) --- .../main/res/values-cs/preferences_values.xml | 5 -- .../res/values-da-rDK/preferences_values.xml | 70 ------------------- .../main/res/values-de/preferences_values.xml | 5 -- .../res/values-es-rES/preferences_values.xml | 70 ------------------- .../res/values-it-rIT/preferences_values.xml | 70 ------------------- .../main/res/values-pl/preferences_values.xml | 5 -- .../main/res/values-ru/preferences_values.xml | 5 -- .../main/res/values-sk/preferences_values.xml | 5 -- .../main/res/values-uk/preferences_values.xml | 5 -- .../main/res/values/preferences_values.xml | 22 +++--- 10 files changed, 13 insertions(+), 249 deletions(-) delete mode 100644 app/src/main/res/values-da-rDK/preferences_values.xml delete mode 100644 app/src/main/res/values-es-rES/preferences_values.xml delete mode 100644 app/src/main/res/values-it-rIT/preferences_values.xml diff --git a/app/src/main/res/values-cs/preferences_values.xml b/app/src/main/res/values-cs/preferences_values.xml index 1590c47ab..5d6c5e8c5 100644 --- a/app/src/main/res/values-cs/preferences_values.xml +++ b/app/src/main/res/values-cs/preferences_values.xml @@ -31,11 +31,6 @@ 0,5 0,75 - - Abecedně - Podle data - Podle průměru - Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values-da-rDK/preferences_values.xml b/app/src/main/res/values-da-rDK/preferences_values.xml deleted file mode 100644 index 5aff12dec..000000000 --- a/app/src/main/res/values-da-rDK/preferences_values.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - Light - Dark - Black (AMOLED) - - - System language - Polski - English - Pусский - Українська - Deutsch - Čeština - Slovenčina - - - 15 minutes - 30 minutes - 1 hour - 2 hours - 6 hours - 12 hours - 24 hours - - - 0,00 - 0,25 - 0,33 - 0,5 - 0,75 - - - Alphabetically - By date - By average - - - Dzienniczek+ - Wulkanowy - Grade colors in register - - - Up to 1 at once - Always expanded - Unlimited expansions - - - Average of grades only from selected semester - Average of averages from both semesters - Average of grades from the whole year - - - Don\'t show - Only between lessons - Before and between lessons - - - Lucky number - Unread messages - Attendance - Lessons - Grades - Homework - School announcements - Exams - Conferences - - diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index d1001c74b..17c19e7d1 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -31,11 +31,6 @@ 0,5 0,75 - - Alphabetisch - Nach Datum - Nach Durchschnitt - Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values-es-rES/preferences_values.xml b/app/src/main/res/values-es-rES/preferences_values.xml deleted file mode 100644 index 5aff12dec..000000000 --- a/app/src/main/res/values-es-rES/preferences_values.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - Light - Dark - Black (AMOLED) - - - System language - Polski - English - Pусский - Українська - Deutsch - Čeština - Slovenčina - - - 15 minutes - 30 minutes - 1 hour - 2 hours - 6 hours - 12 hours - 24 hours - - - 0,00 - 0,25 - 0,33 - 0,5 - 0,75 - - - Alphabetically - By date - By average - - - Dzienniczek+ - Wulkanowy - Grade colors in register - - - Up to 1 at once - Always expanded - Unlimited expansions - - - Average of grades only from selected semester - Average of averages from both semesters - Average of grades from the whole year - - - Don\'t show - Only between lessons - Before and between lessons - - - Lucky number - Unread messages - Attendance - Lessons - Grades - Homework - School announcements - Exams - Conferences - - diff --git a/app/src/main/res/values-it-rIT/preferences_values.xml b/app/src/main/res/values-it-rIT/preferences_values.xml deleted file mode 100644 index 5aff12dec..000000000 --- a/app/src/main/res/values-it-rIT/preferences_values.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - Light - Dark - Black (AMOLED) - - - System language - Polski - English - Pусский - Українська - Deutsch - Čeština - Slovenčina - - - 15 minutes - 30 minutes - 1 hour - 2 hours - 6 hours - 12 hours - 24 hours - - - 0,00 - 0,25 - 0,33 - 0,5 - 0,75 - - - Alphabetically - By date - By average - - - Dzienniczek+ - Wulkanowy - Grade colors in register - - - Up to 1 at once - Always expanded - Unlimited expansions - - - Average of grades only from selected semester - Average of averages from both semesters - Average of grades from the whole year - - - Don\'t show - Only between lessons - Before and between lessons - - - Lucky number - Unread messages - Attendance - Lessons - Grades - Homework - School announcements - Exams - Conferences - - diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 2f2432e98..70b812944 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -31,11 +31,6 @@ 0,5 0,75 - - Alfabetycznie - Według daty - Według średniej - Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index df3629c02..16b337a76 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -31,11 +31,6 @@ 0,5 0,75 - - В алфавитном порядке - По дате - По средней - Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values-sk/preferences_values.xml b/app/src/main/res/values-sk/preferences_values.xml index 6cd221540..c9862751e 100644 --- a/app/src/main/res/values-sk/preferences_values.xml +++ b/app/src/main/res/values-sk/preferences_values.xml @@ -31,11 +31,6 @@ 0,5 0,75 - - Abecedne - Podľa dátumu - Podľa priemeru - Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index c02efb54a..f0cfdd122 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -31,11 +31,6 @@ 0,5 0,75 - - За алфавітом - За датою - За середньою - Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index 920482020..b588ea5e1 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -1,7 +1,11 @@ - Alphabetically + Alphabetically + By date + By average + By attendance percentage + By subject attendance balance @string/dashboard_title @@ -82,10 +86,10 @@ 0.75 - - @string/general_alphabetically - By attendance percentage - By subject attendance balance + + @string/sort_alphabetically + @string/sort_by_attendance_percentage + @string/sort_by_subject_attendance_balance alphabetic @@ -93,10 +97,10 @@ lesson_balance - - @string/general_alphabetically - By date - By average + + @string/sort_alphabetically + @string/sort_by_date + @string/sort_by_average alphabetic From 38c00ddab5815c3e430260c8c2bc6124cbd4c6e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Mar 2024 11:44:59 +0100 Subject: [PATCH 1399/1526] Fix task description color crash (#2475) --- .gitignore | 1 + .../io/github/wulkanowy/ui/base/BaseActivity.kt | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index ee435baa3..ad83ced8d 100644 --- a/.gitignore +++ b/.gitignore @@ -69,6 +69,7 @@ captures/ .idea/androidTestResultsUserPreferences.xml .idea/copilot .idea/deploymentTargetDropDown.xml +.idea/deploymentTargetSelector.xml .idea/kotlinc.xml # Keystore files diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index 10735dab3..922c35365 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.base import android.app.ActivityManager +import android.os.Build import android.os.Bundle import android.view.View import android.widget.Toast @@ -45,11 +46,19 @@ abstract class BaseActivity, VB : ViewBinding> : themeManager.applyActivityTheme(this) super.onCreate(savedInstanceState) supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true) + applyCustomTaskDescription() + } - @Suppress("DEPRECATION") - setTaskDescription( - ActivityManager.TaskDescription(null, null, getThemeAttrColor(R.attr.colorSurface)) - ) + @Suppress("DEPRECATION") + private fun applyCustomTaskDescription() { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) return + try { + val newColor = getThemeAttrColor(R.attr.colorSurface) + val taskDescription = ActivityManager.TaskDescription(null, null, newColor) + setTaskDescription(taskDescription) + } catch (e: Exception) { + Timber.e(e) + } } override fun showError(text: String, error: Throwable) { From 0e99c81eb8c58ffe62ff0460103737c615a04059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Mar 2024 11:45:15 +0100 Subject: [PATCH 1400/1526] Add missing onDetachView in AutDialog (#2476) --- .../java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt index fa29df473..0f7c4234e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt @@ -78,4 +78,9 @@ class AuthDialog : BaseDialogFragment(), AuthView { override fun showDescriptionWithName(name: String) { binding.authDescription.text = getString(R.string.auth_description, name).parseAsHtml() } + + override fun onDestroyView() { + presenter.onDetachView() + super.onDestroyView() + } } From 88def5eff8ccc2a5575e070e755c448bfb4b3277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Mar 2024 11:45:28 +0100 Subject: [PATCH 1401/1526] Remove savedInstance in MessagePreviewFragment (#2477) --- .../mailboxchooser/MailboxChooserDialog.kt | 1 - .../message/preview/MessagePreviewFragment.kt | 11 +++-------- .../message/preview/MessagePreviewPresenter.kt | 13 +++++++++---- .../github/wulkanowy/utils/BundleExtension.kt | 17 +++++++++-------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/mailboxchooser/MailboxChooserDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/mailboxchooser/MailboxChooserDialog.kt index 8bd84f2bf..11d3c6c12 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/mailboxchooser/MailboxChooserDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/mailboxchooser/MailboxChooserDialog.kt @@ -47,7 +47,6 @@ class MailboxChooserDialog : BaseDialogFragment(), } - @Suppress("UNCHECKED_CAST") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) presenter.onAttachView( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index ebdb96a40..8e7c72765 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -82,10 +82,10 @@ class MessagePreviewFragment : get() = getString(R.string.message_not_exists) companion object { - const val MESSAGE_ID_KEY = "message_id" + private const val MESSAGE_ARG_KEY = "message" fun newInstance(message: Message) = MessagePreviewFragment().apply { - arguments = bundleOf(MESSAGE_ID_KEY to message) + arguments = bundleOf(MESSAGE_ARG_KEY to message) } } @@ -101,7 +101,7 @@ class MessagePreviewFragment : messageContainer = binding.messagePreviewContainer presenter.onAttachView( view = this, - message = (savedInstanceState ?: arguments)?.serializable(MESSAGE_ID_KEY), + message = requireArguments().serializable(MESSAGE_ARG_KEY), ) } @@ -233,11 +233,6 @@ class MessagePreviewFragment : (activity as MainActivity).popView() } - override fun onSaveInstanceState(outState: Bundle) { - outState.putSerializable(MESSAGE_ID_KEY, presenter.messageWithAttachments?.message) - super.onSaveInstanceState(outState) - } - override fun onDestroyView() { presenter.onDetachView() super.onDestroyView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index 9bb0d32a4..3b3b2b420 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -3,10 +3,15 @@ package io.github.wulkanowy.ui.modules.message.preview import android.annotation.SuppressLint import androidx.core.text.parseAsHtml import io.github.wulkanowy.R -import io.github.wulkanowy.data.* import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.enums.MessageFolder +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.onResourceData +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceNotLoading +import io.github.wulkanowy.data.onResourceSuccess import io.github.wulkanowy.data.repositories.MessageRepository import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository @@ -28,17 +33,17 @@ class MessagePreviewPresenter @Inject constructor( private val analytics: AnalyticsHelper ) : BasePresenter(errorHandler, studentRepository) { - var messageWithAttachments: MessageWithAttachment? = null + private var messageWithAttachments: MessageWithAttachment? = null private lateinit var lastError: Throwable private var retryCallback: () -> Unit = {} - fun onAttachView(view: MessagePreviewView, message: Message?) { + fun onAttachView(view: MessagePreviewView, message: Message) { super.onAttachView(view) view.initView() errorHandler.showErrorMessage = ::showErrorViewOnError - loadData(requireNotNull(message)) + loadData(message) } private fun onMessageLoadRetry(message: Message) { diff --git a/app/src/main/java/io/github/wulkanowy/utils/BundleExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/BundleExtension.kt index d3c9f8006..b1742b4fa 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/BundleExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/BundleExtension.kt @@ -4,30 +4,31 @@ import android.content.Intent import android.os.Build import android.os.Bundle import android.os.Parcelable +import androidx.core.os.BundleCompat import java.io.Serializable +// Even though API was introduced in 33, we use 34 as 33 is bugged in some scenarios. + inline fun Bundle.serializable(key: String): T = when { - Build.VERSION.SDK_INT >= 33 -> getSerializable(key, T::class.java)!! + Build.VERSION.SDK_INT >= 34 -> getSerializable(key, T::class.java)!! else -> @Suppress("DEPRECATION") getSerializable(key) as T } inline fun Bundle.nullableSerializable(key: String): T? = when { - Build.VERSION.SDK_INT >= 33 -> getSerializable(key, T::class.java) + Build.VERSION.SDK_INT >= 34 -> getSerializable(key, T::class.java) else -> @Suppress("DEPRECATION") getSerializable(key) as T? } @Suppress("UNCHECKED_CAST") -inline fun Bundle.parcelableArray(key: String): Array? = when { - Build.VERSION.SDK_INT >= 33 -> getParcelableArray(key, T::class.java) - else -> @Suppress("DEPRECATION") getParcelableArray(key) as Array? -} +inline fun Bundle.parcelableArray(key: String): Array? = + BundleCompat.getParcelableArray(this, key, T::class.java) as Array? inline fun Intent.serializable(key: String): T = when { - Build.VERSION.SDK_INT >= 33 -> getSerializableExtra(key, T::class.java)!! + Build.VERSION.SDK_INT >= 34 -> getSerializableExtra(key, T::class.java)!! else -> @Suppress("DEPRECATION") getSerializableExtra(key) as T } inline fun Intent.nullableSerializable(key: String): T? = when { - Build.VERSION.SDK_INT >= 33 -> getSerializableExtra(key, T::class.java) + Build.VERSION.SDK_INT >= 34 -> getSerializableExtra(key, T::class.java) else -> @Suppress("DEPRECATION") getSerializableExtra(key) as T? } From eb6fdd900e9ba393b1fe3fd00439a0b1f2f4468a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Mar 2024 11:47:13 +0100 Subject: [PATCH 1402/1526] New Crowdin updates (#2470) --- .../main/res/values-cs/preferences_values.xml | 7 +++- app/src/main/res/values-cs/strings.xml | 41 +++++++++++-------- .../main/res/values-de/preferences_values.xml | 5 +++ app/src/main/res/values-de/strings.xml | 7 ++++ .../main/res/values-pl/preferences_values.xml | 5 +++ app/src/main/res/values-pl/strings.xml | 10 +++-- .../main/res/values-ru/preferences_values.xml | 5 +++ app/src/main/res/values-ru/strings.xml | 7 ++++ .../main/res/values-sk/preferences_values.xml | 7 +++- app/src/main/res/values-sk/strings.xml | 41 +++++++++++-------- .../main/res/values-uk/preferences_values.xml | 5 +++ app/src/main/res/values-uk/strings.xml | 7 ++++ 12 files changed, 108 insertions(+), 39 deletions(-) diff --git a/app/src/main/res/values-cs/preferences_values.xml b/app/src/main/res/values-cs/preferences_values.xml index 5d6c5e8c5..5e488e40c 100644 --- a/app/src/main/res/values-cs/preferences_values.xml +++ b/app/src/main/res/values-cs/preferences_values.xml @@ -1,5 +1,10 @@ + Abecedně + Podle data + Podle průměru + Podle procenta docházky + Podle rovnováhy docházky předmětu Světlý Tmavý @@ -54,7 +59,7 @@ Šťastné číslo Nepřečtené zprávy - Frekvence + Docházka Lekce Známky Domácí úkoly diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 58c1d7d3f..780d9351c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -4,7 +4,7 @@ Přihlášení Wulkanowy Známky - Frekvence + Docházka Zkoušky Plán lekce Nastavení @@ -64,7 +64,7 @@ Symbol najdete na stránce deníku v  Uczeń→ Dostęp Mobilny → Wygeneruj kod dostępu.\n\nUjistěte se, že jste nastavili správnou variantu deníku v poli Variace deníku UONET+ na první přihlašovací obrazovce Vyberte žáky, kteří se mají do aplikace přihlásit Jiné možnosti - V tomto režimu nefungují následující: šťastné číslo, statistiky třídy, shrnutí frekvencí, ospravedlnění nepřítomnosti, dokončené lekce, informace o škole a prohlížení seznamu registrovaných zařízení + V tomto režimu nefungují následující: šťastné číslo, statistiky třídy, shrnutí docházky, ospravedlnění nepřítomnosti, dokončené lekce, informace o škole a prohlížení seznamu registrovaných zařízení Tento režim zobrazuje stejná data, která se zobrazují na webových stránkách deníka Kombinace nejlepších vlastností ostatních dvou režimů. Funguje rychleji než scraper a poskytuje funkce, které nejsou k dispozici v režimu Mobile API. Je to v experimentální fázi Ochrana osobních údajů @@ -264,7 +264,12 @@ Čas ukončení Čas ukončení musí být pozdější než čas zahájení - Shrnutí frekvencí + Shrnutí docházky + Kalkulačka docházky + %1$d nad cílem + přesně v cíli + %1$d pod cílem + %1$d/%2$d přítomnosti Nepřítomnost ze školních důvodů Omluvená nepřítomnost Neomluvená nepřítomnost @@ -282,22 +287,22 @@ Musíte vybrat alespoň jednu nepřítomnost! Ospravedlnit - Nové frekvence - Nové frekvence - Nové frekvence - Nové frekvence + Nová docházka + Nové docházky + Nové docházky + Nové docházky - %1$d nové frekvence - %1$d nové frekvence - %1$d nových frekvencí - %1$d nových frekvencí + %1$d nová docházka + %1$d nové docházky + %1$d nových docházek + %1$d nových docházek - %d frekvence - %d frekvence - %d frekvencí - %d frekvencí + %d docházka + %d docházky + %d docházek + %d docházek Společně @@ -731,6 +736,8 @@ Možnosti vypočítaného průměru Vynutit průměrný výpočet podle aplikace Zobrazit přítomnost + Cílová docházka + Třídění kalkulačky docházky Motiv Rozvíjení známek Zobrazit skupiny vedle předmětů @@ -797,7 +804,7 @@ Známky Domů Viditelnost dlaždic - Frekvence + Docházka Plán lekce Známky Vypočítaný průměr @@ -825,7 +832,7 @@ Nadcházející lekce Ladění Změny plánu lekcí - Nové frekvence + Nové docházky Černá Červená diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 17c19e7d1..0170acfa3 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -1,5 +1,10 @@ + Alphabetically + By date + By average + By attendance percentage + By subject attendance balance Licht Dunkel diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index daabc7d8f..7bc5aa990 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -237,6 +237,11 @@ Endzeit muss grösser sein als Startzeit Übersicht über die Schulbesuch + Attendance calculator + %1$d over target + right on target + %1$d under target + %1$d/%2$d presences Aus schulischen Gründen abwesend Entschuldigte Abwesenheit Unentschuldigtes Abwesenheit @@ -637,6 +642,8 @@ Berechnete Durchschnittsoptionen Mittelwertberechnung durch App erzwingen Anwesendheit zeigen + Attendance target + Attendance calculator sorting Thema Steigende Sorten Gruppen neben Schulfächen anzeigen diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 70b812944..4df60b51f 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -1,5 +1,10 @@ + Alfabetycznie + Według daty + Według średniej + Według procentu obecności + Według balansu frekwencji przedmiotu Jasny Ciemny diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 91a00e512..d1d603b60 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -265,6 +265,11 @@ Godzina zakończenia musi być późniejsza niż godzina rozpoczęcia Podsumowanie frekwencji + Kalkulator obecności + %1$d powyżej celu + dokładnie u celu + %1$d poniżej celu + %1$d/%2$d obecności Nieobecność z przyczyn szkolnych Nieobecność usprawiedliwiona Nieobecność nieusprawiedliwiona @@ -731,6 +736,8 @@ Opcje obliczonej średniej Wymuś obliczanie średniej przez aplikację Pokazuj obecność + Docelowa obecność + Sortowanie kalkulatora obecności Motyw Rozwijanie ocen Pokazuj grupę obok przedmiotu @@ -876,7 +883,4 @@ Wyłącz wyciszenie Wyciszyleś tego użytkownika Wyłączyłeś wyciszenie tego użytkownika - - Docelowa frekwencja (w %) - Kalkulator frekwencji diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index 16b337a76..8d4bd8d7b 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -1,5 +1,10 @@ + Alphabetically + By date + By average + By attendance percentage + By subject attendance balance Светлая Тёмная diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8a5fcc40d..0e7e0e1d2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -265,6 +265,11 @@ Время окончания должно быть больше, чем время начала Итоговая посещаемость + Attendance calculator + %1$d over target + right on target + %1$d under target + %1$d/%2$d presences Отсутствие по школьным причинам Отсутствие по уважительной причине Отсутствие по неуважительной причине @@ -731,6 +736,8 @@ Параметры расчёта средних оценок Принудительно высчитать среднюю оценку через приложение Показывать присутствия + Attendance target + Attendance calculator sorting Тема Разворачивание оценок Показать группы рядом с темами diff --git a/app/src/main/res/values-sk/preferences_values.xml b/app/src/main/res/values-sk/preferences_values.xml index c9862751e..d78dd92da 100644 --- a/app/src/main/res/values-sk/preferences_values.xml +++ b/app/src/main/res/values-sk/preferences_values.xml @@ -1,5 +1,10 @@ + Abecedne + Podľa dátumu + Podľa priemeru + Podľa percenta dochádzky + Podľa rovnováhy dochádzky predmetu Svetlý Tmavý @@ -54,7 +59,7 @@ Šťastné číslo Neprečítané správy - Frekvencia + Dochádzka Lekcie Známky Domáce úlohy diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 0f5215665..9dbf72820 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -4,7 +4,7 @@ Prihlásenie Wulkanowy Známky - Frekvencia + Dochádzka Skúšky Plán lekcie Nastavenia @@ -64,7 +64,7 @@ Symbol nájdete na stránke denníka v  Uczeń→ Dostęp Mobilny → Wygeneruj kod dostępu.\n\nUistite sa, že ste nastavili správny variant denníka v poli Variácia denníka UONET+ na prvej prihlasovacej obrazovke Vyberte žiakov, ktorí sa majú do aplikácie prihlásiť Iné možnosti - V tomto režime nefungujú nasledovné: šťastné číslo, štatistiky triedy, zhrnutie frekvencií, ospravedlnenie neprítomnosti, dokončené lekcie, informácie o škole a prezeranie zoznamu registrovaných zariadení + V tomto režime nefungujú nasledovné: šťastné číslo, štatistiky triedy, zhrnutie dochádzky, ospravedlnenie neprítomnosti, dokončené lekcie, informácie o škole a prezeranie zoznamu registrovaných zariadení Tento režim zobrazuje rovnaké dáta, ktoré sa zobrazujú na webových stránkach denníka Kombinácia najlepších vlastností ostatných dvoch režimov. Funguje rýchlejšie ako scraper a poskytuje funkcie, ktoré nie sú k dispozícii v režime Mobilne API. Je to v experimentálnej fáze Ochrana osobných údajov @@ -264,7 +264,12 @@ Čas ukončenia Čas ukončenia musí byť neskorší ako čas začatia - Zhrnutie frekvencií + Zhrnutie dochádzky + Kalkulačka dochádzky + %1$d nad cieľom + presne v cieli + %1$d pod cieľom + %1$d/%2$d prítomnosti Neprítomnosť zo školských dôvodov Ospravedlnená neprítomnosť Neospravedlnená neprítomnosť @@ -282,22 +287,22 @@ Musíte vybrať aspoň jednu neprítomnosť! Ospravedlniť - Nová frekvencia - Nové frekvencie - Nové frekvencie - Nové frekvencie + Nová dochádzka + Nové dochádzky + Nové dochádzky + Nové dochádzky - %1$d nová frekvencia - %1$d nové frekvencie - %1$d nových frekvencií - %1$d nových frekvencií + %1$d nová dochádzka + %1$d nové dochádzky + %1$d nových dochádzok + %1$d nových dochádzok - %d frekvencia - %d frekvencie - %d frekvencií - %d frekvencií + %d dochádzka + %d dochádzky + %d dochádzok + %d dochádzok Spoločne @@ -731,6 +736,8 @@ Možnosti vypočítaného priemeru Vynútiť priemerný výpočet podľa aplikácie Zobraziť prítomnosť + Cieľová dochádzka + Triedenie kalkulačky dochádzky Motív Rozvijanie známok Zobraziť skupiny vedľa predmetov @@ -797,7 +804,7 @@ Známky Domov Viditeľnosť dlaždíc - Frekvencia + Dochádzka Plán lekcie Známky Vypočítaný priemer @@ -825,7 +832,7 @@ Nadchádzajúce lekcie Ladenie Zmeny plánu lekcií - Nové frekvencie + Nové dochádzky Čierna Červená diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index f0cfdd122..c32eedb96 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -1,5 +1,10 @@ + За алфавітом + За датою + За середньою + За відсотком відвідуваності + За балансом відвідування теми Світла Темна diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a0d4b6c0b..2d8ac1f4d 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -265,6 +265,11 @@ Час завершення має бути пізніше часу початку Підсумок відвідуваності + Калькулятор відвідуваності + %1$d понад ціль + точно у цілі + %1$d під ціллю + %1$d/%2$d відвідуваності Відсутність зі шкільних причин Відсутність з поважних причин Відсутність без поважних причин @@ -731,6 +736,8 @@ Параметри розраховування середніх оцінок Примусово розраховувати середню оцінку через додаток Показувати присутність + Цільова відвідуваність + Сортування калькулятора відвідування Тема Розгортання оцінок Показувати групи поруч з темами From 95e41b5570a0c143ab81e576222a625b77eac90c Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Mon, 11 Mar 2024 20:19:24 +0100 Subject: [PATCH 1403/1526] Handle subjects with no attendances in attendance calculator better (#2478) --------- Co-authored-by: Faierbel --- .../java/io/github/wulkanowy/data/Resource.kt | 3 ++ .../repositories/PreferencesRepository.kt | 9 ++++ .../GetAttendanceCalculatorDataUseCase.kt | 3 ++ .../calculator/AttendanceCalculatorAdapter.kt | 54 ++++++++++--------- .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 + .../res/xml/scheme_preferences_appearance.xml | 5 ++ 8 files changed, 53 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/Resource.kt b/app/src/main/java/io/github/wulkanowy/data/Resource.kt index c698c42d5..b4982b9a0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/Resource.kt +++ b/app/src/main/java/io/github/wulkanowy/data/Resource.kt @@ -71,6 +71,9 @@ fun Resource.mapData(block: (T) -> U) = when (this) { is Resource.Error -> Resource.Error(this.error) } +/** + * Injects another flow into this flow's resource data. + */ inline fun Flow>.combineWithResourceData( flow: Flow, crossinline block: suspend (T1, T2) -> R 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 4735293c0..2bb1538cb 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 @@ -54,6 +54,15 @@ class PreferencesRepository @Inject constructor( context.resources.getString(R.string.pref_default_attendance_calculator_sorting_mode) ).asFlow().map(AttendanceCalculatorSortingMode::getByValue) + /** + * Subjects are empty when they don't have any attendances (total = 0, attendances = 0, absences = 0). + */ + val attendanceCalculatorShowEmptySubjects: Flow + get() = flowSharedPref.getBoolean( + context.getString(R.string.pref_key_attendance_calculator_show_empty_subjects), + context.resources.getBoolean(R.bool.pref_default_attendance_calculator_show_empty_subjects) + ).asFlow() + private val gradeAverageModePref: Preference get() = getObjectFlow( R.string.pref_key_grade_average_mode, diff --git a/app/src/main/java/io/github/wulkanowy/domain/attendance/GetAttendanceCalculatorDataUseCase.kt b/app/src/main/java/io/github/wulkanowy/domain/attendance/GetAttendanceCalculatorDataUseCase.kt index ea68050d5..294abd1be 100644 --- a/app/src/main/java/io/github/wulkanowy/domain/attendance/GetAttendanceCalculatorDataUseCase.kt +++ b/app/src/main/java/io/github/wulkanowy/domain/attendance/GetAttendanceCalculatorDataUseCase.kt @@ -49,6 +49,9 @@ class GetAttendanceCalculatorDataUseCase @Inject constructor( // intermediates that will be visible for barely any time. .debounceIntermediates() } + .combineWithResourceData(preferencesRepository.attendanceCalculatorShowEmptySubjects) { attendanceDataList, showEmptySubjects -> + attendanceDataList.filter { it.total != 0 || showEmptySubjects } + } .combineWithResourceData(preferencesRepository.attendanceCalculatorSortingModeFlow, List::sortedBy) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorAdapter.kt index 73c08fd32..4b908bba8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorAdapter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.attendance.calculator -import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.view.isVisible @@ -19,42 +18,47 @@ class AttendanceCalculatorAdapter @Inject constructor() : override fun getItemCount() = items.size - override fun onCreateViewHolder( - parent: ViewGroup, viewType: Int - ) = ViewHolder( + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( ItemAttendanceCalculatorHeaderBinding.inflate( LayoutInflater.from(parent.context), parent, false ) ) - @SuppressLint("SetTextI18n") override fun onBindViewHolder(parent: ViewHolder, position: Int) { + val context = parent.binding.root.context + val item = items[position] + with(parent.binding) { - val item = items[position] attendanceCalculatorPercentage.text = "${item.presencePercentage.roundToInt()}" - if (item.lessonBalance > 0) { - attendanceCalculatorSummaryBalance.text = root.context.getString( - R.string.attendance_calculator_summary_balance_positive, - item.lessonBalance - ) - } else if (item.lessonBalance < 0) { - attendanceCalculatorSummaryBalance.text = root.context.getString( - R.string.attendance_calculator_summary_balance_negative, - abs(item.lessonBalance) - ) - } else { - attendanceCalculatorSummaryBalance.text = root.context.getString( - R.string.attendance_calculator_summary_balance_neutral, - ) + attendanceCalculatorSummaryBalance.text = when { + item.lessonBalance > 0 -> { + context.getString( + R.string.attendance_calculator_summary_balance_positive, + item.lessonBalance + ) + } + + item.lessonBalance < 0 -> { + context.getString( + R.string.attendance_calculator_summary_balance_negative, + abs(item.lessonBalance) + ) + } + + else -> context.getString(R.string.attendance_calculator_summary_balance_neutral) } attendanceCalculatorWarning.isVisible = item.lessonBalance < 0 attendanceCalculatorTitle.text = item.subjectName - attendanceCalculatorSummaryValues.text = root.context.getString( - R.string.attendance_calculator_summary_values, - item.presences, - item.total - ) + attendanceCalculatorSummaryValues.text = if (item.total == 0) { + context.getString(R.string.attendance_calculator_summary_values_empty) + } else { + context.getString( + R.string.attendance_calculator_summary_values, + item.presences, + item.total + ) + } } } diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 109418893..2981e1845 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -4,6 +4,7 @@ true 50 alphabetic + false only_one_semester false one diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index e95c59405..080456ef9 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -4,6 +4,7 @@ attendance_present attendance_target attendance_calculator_sorting_mode + attendance_calculator_show_empty_subjects app_theme dashboard_tiles grade_color_scheme diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ae6d91408..56cf94f04 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -263,6 +263,7 @@ right on target %1$d under target %1$d/%2$d presences + No attendances recorded Absent for school reasons Excused absence Unexcused absence @@ -721,6 +722,7 @@ Force average calculation by app Show presence Attendance target + Show subjects without any attendances Attendance calculator sorting Theme Grades expanding diff --git a/app/src/main/res/xml/scheme_preferences_appearance.xml b/app/src/main/res/xml/scheme_preferences_appearance.xml index 46a0e6a92..a05d95c04 100644 --- a/app/src/main/res/xml/scheme_preferences_appearance.xml +++ b/app/src/main/res/xml/scheme_preferences_appearance.xml @@ -104,6 +104,11 @@ app:key="@string/pref_key_attendance_calculator_sorting_mode" app:title="@string/pref_view_attendance_calculator_sorting_mode" app:useSimpleSummaryProvider="true" /> + Date: Mon, 11 Mar 2024 23:38:17 +0100 Subject: [PATCH 1404/1526] Fix lateness color in attendance (#2481) --- .../modules/attendance/AttendanceAdapter.kt | 25 +++++++++++-------- app/src/main/res/values/colors.xml | 5 ++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt index 4e9baac3a..f5689ec8d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.attendance +import android.content.res.ColorStateList import android.graphics.Typeface import android.view.LayoutInflater import android.view.View @@ -33,17 +34,17 @@ class AttendanceAdapter @Inject constructor() : ) override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val context = holder.binding.root.context val item = items[position] with(holder.binding) { attendanceItemNumber.text = item.number.toString() - attendanceItemSubject.text = item.subject.ifBlank { - root.context.getString(R.string.all_no_data) - } + attendanceItemSubject.text = item.subject + .ifBlank { context.getString(R.string.all_no_data) } attendanceItemDescription.setText(item.descriptionRes) attendanceItemDescription.setTextColor( - root.context.getThemeAttrColor( + context.getThemeAttrColor( when { item.absence && !item.excused -> R.attr.colorAttendanceAbsence item.lateness && !item.excused -> R.attr.colorAttendanceLateness @@ -61,13 +62,15 @@ class AttendanceAdapter @Inject constructor() : attendanceItemAlert.isVisible = item.let { (it.absence && !it.excused) || (it.lateness && !it.excused) } - attendanceItemAlert.setColorFilter(root.context.getThemeAttrColor( - when{ - item.absence && !item.excused -> R.attr.colorAttendanceAbsence - item.lateness && !item.excused -> R.attr.colorAttendanceLateness - else -> android.R.attr.colorPrimary - } - )) + attendanceItemAlert.imageTintList = ColorStateList.valueOf( + context.getThemeAttrColor( + when { + item.absence && !item.excused -> R.attr.colorAttendanceAbsence + item.lateness && !item.excused -> R.attr.colorAttendanceLateness + else -> android.R.attr.colorPrimary + } + ) + ) attendanceItemNumber.visibility = View.GONE attendanceItemExcuseInfo.visibility = View.GONE attendanceItemExcuseCheckbox.visibility = View.GONE diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8ad27ad88..f31a5f947 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -46,14 +46,15 @@ #d32f2f #e57373 + #ff8f00 #ffd54f #d32f2f #e57373 - #cd2a01 - #f05d0e + #ff8f00 + #ffd54f #1f000000 #1fffffff From 6a8f6f9496fdd29337b8f1352390beffb3600ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Mar 2024 23:38:39 +0100 Subject: [PATCH 1405/1526] Add WulkanowySdkFactory (#2479) --- .../io/github/wulkanowy/data/DataModule.kt | 21 ------ .../wulkanowy/data/WulkanowySdkFactory.kt | 64 +++++++++++++++++++ .../data/repositories/AttendanceRepository.kt | 18 +++--- .../AttendanceSummaryRepository.kt | 11 ++-- .../CompletedLessonsRepository.kt | 9 +-- .../data/repositories/ConferenceRepository.kt | 9 +-- .../data/repositories/ExamRepository.kt | 9 +-- .../data/repositories/GradeRepository.kt | 9 +-- .../repositories/GradeStatisticsRepository.kt | 15 ++--- .../data/repositories/HomeworkRepository.kt | 9 +-- .../repositories/LuckyNumberRepository.kt | 9 +-- .../data/repositories/MessageRepository.kt | 59 +++++++++-------- .../repositories/MobileDeviceRepository.kt | 15 ++--- .../data/repositories/NoteRepository.kt | 9 +-- .../data/repositories/RecipientRepository.kt | 10 +-- .../data/repositories/RecoverRepository.kt | 20 ++++-- .../SchoolAnnouncementRepository.kt | 7 +- .../data/repositories/SchoolRepository.kt | 9 +-- .../data/repositories/SchoolsRepository.kt | 11 ++-- .../data/repositories/SemesterRepository.kt | 9 ++- .../repositories/StudentInfoRepository.kt | 12 ++-- .../data/repositories/StudentRepository.kt | 17 ++--- .../data/repositories/SubjectRepository.kt | 9 +-- .../data/repositories/TeacherRepository.kt | 9 +-- .../data/repositories/TimetableRepository.kt | 9 +-- .../ui/modules/captcha/CaptchaDialog.kt | 6 +- .../io/github/wulkanowy/utils/SdkExtension.kt | 42 ------------ .../wulkanowy/WulkanowySdkFactoryCreator.kt | 12 ++++ .../repositories/AttendanceRepositoryTest.kt | 10 +-- .../CompletedLessonsRepositoryTest.kt | 9 +-- .../data/repositories/ExamRemoteTest.kt | 9 +-- .../data/repositories/GradeRepositoryTest.kt | 9 +-- .../GradeStatisticsRepositoryTest.kt | 16 +++-- .../repositories/LuckyNumberRemoteTest.kt | 9 +-- .../repositories/MessageRepositoryTest.kt | 11 ++-- .../MobileDeviceRepositoryTest.kt | 10 +-- .../data/repositories/RecipientLocalTest.kt | 16 +++-- .../repositories/SemesterRepositoryTest.kt | 10 +-- .../repositories/TimetableRepositoryTest.kt | 9 +-- 39 files changed, 283 insertions(+), 283 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt create mode 100644 app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt diff --git a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt index 50d6c8f9f..a492c08db 100644 --- a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt @@ -18,17 +18,13 @@ import io.github.wulkanowy.data.api.SchoolsService import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.repositories.PreferencesRepository -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AppInfo -import io.github.wulkanowy.utils.RemoteConfigHelper -import io.github.wulkanowy.utils.WebkitCookieManagerProxy import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.create -import timber.log.Timber import java.util.concurrent.TimeUnit import javax.inject.Singleton @@ -36,23 +32,6 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) internal class DataModule { - @Singleton - @Provides - fun provideSdk( - chuckerInterceptor: ChuckerInterceptor, - remoteConfig: RemoteConfigHelper, - webkitCookieManagerProxy: WebkitCookieManagerProxy, - ) = Sdk().apply { - androidVersion = android.os.Build.VERSION.RELEASE - buildTag = android.os.Build.MODEL - userAgentTemplate = remoteConfig.userAgentTemplate - setSimpleHttpLogger { Timber.d(it) } - setAdditionalCookieManager(webkitCookieManagerProxy) - - // for debug only - addInterceptor(chuckerInterceptor, network = true) - } - @Singleton @Provides fun provideChuckerCollector( diff --git a/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt new file mode 100644 index 000000000..6d4f9edad --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt @@ -0,0 +1,64 @@ +package io.github.wulkanowy.data + +import com.chuckerteam.chucker.api.ChuckerInterceptor +import io.github.wulkanowy.data.db.entities.Semester +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.RemoteConfigHelper +import io.github.wulkanowy.utils.WebkitCookieManagerProxy +import timber.log.Timber +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class WulkanowySdkFactory @Inject constructor( + private val chuckerInterceptor: ChuckerInterceptor, + private val remoteConfig: RemoteConfigHelper, + private val webkitCookieManagerProxy: WebkitCookieManagerProxy +) { + + private val sdk = Sdk().apply { + androidVersion = android.os.Build.VERSION.RELEASE + buildTag = android.os.Build.MODEL + userAgentTemplate = remoteConfig.userAgentTemplate + setSimpleHttpLogger { Timber.d(it) } + setAdditionalCookieManager(webkitCookieManagerProxy) + + // for debug only + addInterceptor(chuckerInterceptor, network = true) + } + + fun create() = sdk + + fun create(student: Student, semester: Semester? = null): Sdk { + return create().apply { + email = student.email + password = student.password + symbol = student.symbol + schoolSymbol = student.schoolSymbol + studentId = student.studentId + classId = student.classId + emptyCookieJarInterceptor = true + + if (Sdk.Mode.valueOf(student.loginMode) == Sdk.Mode.HEBE) { + mobileBaseUrl = student.mobileBaseUrl + } else { + scrapperBaseUrl = student.scrapperBaseUrl + domainSuffix = student.scrapperDomainSuffix + loginType = Sdk.ScrapperLoginType.valueOf(student.loginType) + } + + mode = Sdk.Mode.valueOf(student.loginMode) + mobileBaseUrl = student.mobileBaseUrl + keyId = student.certificateKey + privatePem = student.privateKey + + if (semester != null) { + diaryId = semester.diaryId + kindergartenDiaryId = semester.kindergartenDiaryId + schoolYear = semester.schoolYear + unitId = semester.unitId + } + } + } +} 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 46ea29f83..9b94cc103 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 @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.AttendanceDao import io.github.wulkanowy.data.db.dao.TimetableDao import io.github.wulkanowy.data.db.entities.Attendance @@ -7,14 +8,11 @@ import io.github.wulkanowy.data.db.entities.Semester 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.sdk.pojo.Absent 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.sync.Mutex @@ -28,7 +26,7 @@ import javax.inject.Singleton class AttendanceRepository @Inject constructor( private val attendanceDb: AttendanceDao, private val timetableDb: TimetableDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -59,8 +57,7 @@ class AttendanceRepository @Inject constructor( val lessons = timetableDb.load( semester.diaryId, semester.studentId, start.monday, end.sunday ) - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getAttendance(start.monday, end.sunday) .mapToEntities(semester, lessons) }, @@ -90,8 +87,10 @@ class AttendanceRepository @Inject constructor( } suspend fun excuseForAbsence( - student: Student, semester: Semester, - absenceList: List, reason: String? = null + student: Student, + semester: Semester, + absenceList: List, + reason: String? = null ) { val items = absenceList.map { attendance -> Absent( @@ -99,8 +98,7 @@ class AttendanceRepository @Inject constructor( timeId = attendance.timeId ) } - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .excuseForAbsence(items, reason) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt index 1129598ac..78c98169b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt @@ -1,17 +1,15 @@ package io.github.wulkanowy.data.repositories import androidx.room.withTransaction -import io.github.wulkanowy.data.* +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities -import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -20,9 +18,9 @@ import javax.inject.Singleton @Singleton class AttendanceSummaryRepository @Inject constructor( private val attendanceDb: AttendanceSummaryDao, - private val sdk: Sdk, private val refreshHelper: AutoRefreshHelper, private val appDatabase: AppDatabase, + private val wulkanowySdkFactory: WulkanowySdkFactory, ) { private val saveFetchResultMutex = Mutex() @@ -43,8 +41,7 @@ class AttendanceSummaryRepository @Inject constructor( }, query = { attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getAttendanceSummary(subjectId) .mapToEntities(semester, subjectId) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt index f7f86b23d..45a36f55c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt @@ -1,17 +1,15 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.CompletedLessonsDao import io.github.wulkanowy.data.db.entities.Semester 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.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.sync.Mutex import java.time.LocalDate @@ -21,7 +19,7 @@ import javax.inject.Singleton @Singleton class CompletedLessonsRepository @Inject constructor( private val completedLessonsDb: CompletedLessonsDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -53,8 +51,7 @@ class CompletedLessonsRepository @Inject constructor( ) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getCompletedLessons(start.monday, end.sunday) .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt index fbe578604..58ce0091a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt @@ -1,16 +1,14 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.ConferenceDao import io.github.wulkanowy.data.db.entities.Conference import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -21,7 +19,7 @@ import javax.inject.Singleton @Singleton class ConferenceRepository @Inject constructor( private val conferenceDb: ConferenceDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -46,8 +44,7 @@ class ConferenceRepository @Inject constructor( conferenceDb.loadAll(semester.diaryId, student.studentId, startDate) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getConferences() .mapToEntities(semester) .filter { it.date >= startDate } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt index 9b8dd02e3..89dbcd5ce 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt @@ -1,18 +1,16 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.ExamDao import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.endExamsDay import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.startExamsDay -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -23,7 +21,7 @@ import javax.inject.Singleton @Singleton class ExamRepository @Inject constructor( private val examDb: ExamDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -56,8 +54,7 @@ class ExamRepository @Inject constructor( ) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getExams(start.startExamsDay, start.endExamsDay) .mapToEntities(semester) }, 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 ac1ef541b..e899f900d 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 @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.GradeDao import io.github.wulkanowy.data.db.dao.GradeDescriptiveDao import io.github.wulkanowy.data.db.dao.GradeSummaryDao @@ -10,11 +11,8 @@ import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.toLocalDate import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow @@ -30,7 +28,7 @@ class GradeRepository @Inject constructor( private val gradeDb: GradeDao, private val gradeSummaryDb: GradeSummaryDao, private val gradeDescriptiveDb: GradeDescriptiveDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -63,8 +61,7 @@ class GradeRepository @Inject constructor( } }, fetch = { - val (details, summary, descriptive) = sdk.init(student) - .switchSemester(semester) + val (details, summary, descriptive) = wulkanowySdkFactory.create(student, semester) .getGrades(semester.semesterId) Triple( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt index 809f92d3e..f120d34f3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.GradePartialStatisticsDao import io.github.wulkanowy.data.db.dao.GradePointsStatisticsDao import io.github.wulkanowy.data.db.dao.GradeSemesterStatisticsDao @@ -12,11 +13,8 @@ import io.github.wulkanowy.data.mappers.mapPointsToStatisticsItems import io.github.wulkanowy.data.mappers.mapSemesterToStatisticItems import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.networkBoundResource -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import java.util.Locale @@ -28,7 +26,7 @@ class GradeStatisticsRepository @Inject constructor( private val gradePartialStatisticsDb: GradePartialStatisticsDao, private val gradePointsStatisticsDb: GradePointsStatisticsDao, private val gradeSemesterStatisticsDb: GradeSemesterStatisticsDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -56,8 +54,7 @@ class GradeStatisticsRepository @Inject constructor( }, query = { gradePartialStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getGradesPartialStatistics(semester.semesterId) .mapToEntities(semester) }, @@ -104,8 +101,7 @@ class GradeStatisticsRepository @Inject constructor( }, query = { gradeSemesterStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getGradesSemesterStatistics(semester.semesterId) .mapToEntities(semester) }, @@ -163,8 +159,7 @@ class GradeStatisticsRepository @Inject constructor( }, query = { gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getGradesPointsStatistics(semester.semesterId) .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt index 1a9c7ffaf..7893ef631 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt @@ -1,18 +1,16 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.HomeworkDao import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Semester 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.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.sync.Mutex import java.time.LocalDate @@ -22,7 +20,7 @@ import javax.inject.Singleton @Singleton class HomeworkRepository @Inject constructor( private val homeworkDb: HomeworkDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -55,8 +53,7 @@ class HomeworkRepository @Inject constructor( ) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getHomework(start.monday, end.sunday) .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt index 45b7f6e29..3636cb51e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt @@ -1,12 +1,11 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.LuckyNumberDao import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.data.networkBoundResource -import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.utils.init import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.sync.Mutex @@ -18,7 +17,7 @@ import javax.inject.Singleton @Singleton class LuckyNumberRepository @Inject constructor( private val luckyNumberDb: LuckyNumberDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, ) { private val saveFetchResultMutex = Mutex() @@ -33,7 +32,9 @@ class LuckyNumberRepository @Inject constructor( shouldFetch = { it == null || forceRefresh }, query = { luckyNumberDb.load(student.studentId, now()) }, fetch = { - sdk.init(student).getLuckyNumber(student.schoolShortName)?.mapToEntity(student) + wulkanowySdkFactory.create(student) + .getLuckyNumber(student.schoolShortName) + ?.mapToEntity(student) }, saveFetchResult = { oldLuckyNumber, newLuckyNumber -> newLuckyNumber ?: return@networkBoundResource diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index a4517760b..ede2a0fde 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -4,6 +4,7 @@ import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.Resource +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.dao.MailboxDao import io.github.wulkanowy.data.db.dao.MessageAttachmentDao @@ -29,11 +30,9 @@ import io.github.wulkanowy.data.pojos.MessageDraft import io.github.wulkanowy.data.toFirstResult import io.github.wulkanowy.data.waitForResult import io.github.wulkanowy.domain.messages.GetMailboxByStudentUseCase -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Folder import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -48,7 +47,7 @@ class MessageRepository @Inject constructor( private val messagesDb: MessagesDao, private val mutedMessageSendersDao: MutedMessageSendersDao, private val messageAttachmentDao: MessageAttachmentDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, @ApplicationContext private val context: Context, private val refreshHelper: AutoRefreshHelper, private val sharedPrefProvider: SharedPrefProvider, @@ -82,10 +81,16 @@ class MessageRepository @Inject constructor( } else messagesDb.loadMessagesWithMutedAuthor(mailbox.globalKey, folder.id) }, fetch = { - sdk.init(student).getMessages( - folder = Folder.valueOf(folder.name), - mailboxKey = mailbox?.globalKey, - ).mapToEntities(student, mailbox, mailboxDao.loadAll(student.email)) + wulkanowySdkFactory.create(student) + .getMessages( + folder = Folder.valueOf(folder.name), + mailboxKey = mailbox?.globalKey, + ) + .mapToEntities( + student = student, + mailbox = mailbox, + allMailboxes = mailboxDao.loadAll(student.email) + ) }, saveFetchResult = { oldWithAuthors, new -> val old = oldWithAuthors.map { it.message } @@ -115,10 +120,11 @@ class MessageRepository @Inject constructor( }, query = { messagesDb.loadMessageWithAttachment(message.messageGlobalKey) }, fetch = { - sdk.init(student).getMessageDetails( - messageKey = it!!.message.messageGlobalKey, - markAsRead = message.unread && markAsRead, - ) + wulkanowySdkFactory.create(student) + .getMessageDetails( + messageKey = it!!.message.messageGlobalKey, + markAsRead = message.unread && markAsRead, + ) }, saveFetchResult = { old, new -> checkNotNull(old) { "Fetched message no longer exist!" } @@ -159,19 +165,19 @@ class MessageRepository @Inject constructor( recipients: List, mailbox: Mailbox, ) { - sdk.init(student).sendMessage( - subject = subject, - content = content, - recipients = recipients.mapFromEntities(), - mailboxId = mailbox.globalKey, - ) + wulkanowySdkFactory.create(student) + .sendMessage( + subject = subject, + content = content, + recipients = recipients.mapFromEntities(), + mailboxId = mailbox.globalKey, + ) refreshFolders(student, mailbox, listOf(SENT)) } suspend fun restoreMessages(student: Student, mailbox: Mailbox?, messages: List) { - sdk.init(student).restoreMessages( - messages = messages.map { it.messageGlobalKey }, - ) + wulkanowySdkFactory.create(student) + .restoreMessages(messages = messages.map { it.messageGlobalKey }) refreshFolders(student, mailbox) } @@ -182,10 +188,11 @@ class MessageRepository @Inject constructor( suspend fun deleteMessages(student: Student, messages: List) { val firstMessage = messages.first() - sdk.init(student).deleteMessages( - messages = messages.map { it.messageGlobalKey }, - removeForever = firstMessage.folderId == TRASHED.id, - ) + wulkanowySdkFactory.create(student) + .deleteMessages( + messages = messages.map { it.messageGlobalKey }, + removeForever = firstMessage.folderId == TRASHED.id, + ) if (firstMessage.folderId != TRASHED.id) { val deletedMessages = messages.map { @@ -230,7 +237,9 @@ class MessageRepository @Inject constructor( }, query = { mailboxDao.loadAll(student.email, student.symbol, student.schoolSymbol) }, fetch = { - sdk.init(student).getMailboxes().mapToEntities(student) + wulkanowySdkFactory.create(student) + .getMailboxes() + .mapToEntities(student) }, saveFetchResult = { old, new -> mailboxDao.deleteAll(old uniqueSubtract new) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt index 48b4fc287..19466554a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.MobileDeviceDao import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Semester @@ -8,11 +9,8 @@ import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.mappers.mapToMobileDeviceToken import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.data.pojos.MobileDeviceToken -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -21,7 +19,7 @@ import javax.inject.Singleton @Singleton class MobileDeviceRepository @Inject constructor( private val mobileDb: MobileDeviceDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -42,8 +40,7 @@ class MobileDeviceRepository @Inject constructor( }, query = { mobileDb.loadAll(student.userLoginId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getRegisteredDevices() .mapToEntities(student) }, @@ -57,16 +54,14 @@ class MobileDeviceRepository @Inject constructor( ) suspend fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice) { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .unregisterDevice(device.deviceId) mobileDb.deleteAll(listOf(device)) } suspend fun getToken(student: Student, semester: Semester): MobileDeviceToken { - return sdk.init(student) - .switchSemester(semester) + return wulkanowySdkFactory.create(student, semester) .getToken() .mapToMobileDeviceToken() } 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 feb92c154..9551e01eb 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 @@ -1,16 +1,14 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.NoteDao import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.toLocalDate import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow @@ -21,7 +19,7 @@ import javax.inject.Singleton @Singleton class NoteRepository @Inject constructor( private val noteDb: NoteDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -45,8 +43,7 @@ class NoteRepository @Inject constructor( }, query = { noteDb.loadAll(student.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getNotes() .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt index 4a1474ced..8233d932e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.RecipientDao import io.github.wulkanowy.data.db.entities.Mailbox import io.github.wulkanowy.data.db.entities.MailboxType @@ -7,10 +8,8 @@ import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.uniqueSubtract import javax.inject.Inject import javax.inject.Singleton @@ -18,14 +17,15 @@ import javax.inject.Singleton @Singleton class RecipientRepository @Inject constructor( private val recipientDb: RecipientDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { private val cacheKey = "recipient" suspend fun refreshRecipients(student: Student, mailbox: Mailbox, type: MailboxType) { - val new = sdk.init(student).getRecipients(mailbox.globalKey) + val new = wulkanowySdkFactory.create(student) + .getRecipients(mailbox.globalKey) .mapToEntities(mailbox.globalKey) val old = recipientDb.loadAll(type, mailbox.globalKey) @@ -60,7 +60,7 @@ class RecipientRepository @Inject constructor( ): List { mailbox ?: return emptyList() - return sdk.init(student) + return wulkanowySdkFactory.create(student) .getMessageReplayDetails(message.messageGlobalKey) .sender .let(::listOf) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt index 5940f477b..b554bda0f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt @@ -1,17 +1,23 @@ package io.github.wulkanowy.data.repositories -import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.data.WulkanowySdkFactory import javax.inject.Inject import javax.inject.Singleton @Singleton -class RecoverRepository @Inject constructor(private val sdk: Sdk) { +class RecoverRepository @Inject constructor( + private val wulkanowySdkFactory: WulkanowySdkFactory +) { - suspend fun getReCaptchaSiteKey(host: String, symbol: String): Pair { - return sdk.getPasswordResetCaptchaCode(host, symbol) - } + suspend fun getReCaptchaSiteKey(host: String, symbol: String): Pair = + wulkanowySdkFactory.create() + .getPasswordResetCaptchaCode(host, symbol) suspend fun sendRecoverRequest( - url: String, symbol: String, email: String, reCaptchaResponse: String - ): String = sdk.sendPasswordResetRequest(url, symbol, email, reCaptchaResponse) + url: String, + symbol: String, + email: String, + reCaptchaResponse: String + ): String = wulkanowySdkFactory.create() + .sendPasswordResetRequest(url, symbol, email, reCaptchaResponse) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt index f09a46aa1..6a04ce75f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt @@ -1,14 +1,13 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.SchoolAnnouncementDao import io.github.wulkanowy.data.db.entities.SchoolAnnouncement 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -18,7 +17,7 @@ import javax.inject.Singleton @Singleton class SchoolAnnouncementRepository @Inject constructor( private val schoolAnnouncementDb: SchoolAnnouncementDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -41,7 +40,7 @@ class SchoolAnnouncementRepository @Inject constructor( schoolAnnouncementDb.loadAll(student.userLoginId) }, fetch = { - val sdk = sdk.init(student) + val sdk = wulkanowySdkFactory.create(student) val lastAnnouncements = sdk.getLastAnnouncements().mapToEntities(student) val directorInformation = sdk.getDirectorInformation().mapToEntities(student) lastAnnouncements + directorInformation diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt index b42b4d577..c48abb6f8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt @@ -1,15 +1,13 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.SchoolDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.data.networkBoundResource -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -17,7 +15,7 @@ import javax.inject.Singleton @Singleton class SchoolRepository @Inject constructor( private val schoolDb: SchoolDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -40,8 +38,7 @@ class SchoolRepository @Inject constructor( }, query = { schoolDb.load(semester.studentId, semester.classId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getSchool() .mapToEntity(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt index 216a8c112..4a16d6f13 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt @@ -1,17 +1,15 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.api.SchoolsService import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.pojos.IntegrityRequest import io.github.wulkanowy.data.pojos.LoginEvent -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.utils.IntegrityHelper import io.github.wulkanowy.utils.getCurrentOrLast -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.withTimeout import timber.log.Timber import java.util.UUID @@ -23,7 +21,7 @@ import kotlin.time.Duration.Companion.seconds class SchoolsRepository @Inject constructor( private val integrityHelper: IntegrityHelper, private val schoolsService: SchoolsService, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, ) { suspend fun logSchoolLogin(loginData: LoginData, students: List) { @@ -40,10 +38,9 @@ class SchoolsRepository @Inject constructor( private suspend fun logLogin(loginData: LoginData, student: Student, semester: Semester) { val requestId = UUID.randomUUID().toString() val token = integrityHelper.getIntegrityToken(requestId) ?: return + val updatedStudent = student.copy(password = loginData.password) - val schoolInfo = sdk - .init(student.copy(password = loginData.password)) - .switchSemester(semester) + val schoolInfo = wulkanowySdkFactory.create(updatedStudent, semester) .getSchool() schoolsService.logLoginEvent( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt index 9ae22babc..da21f59ac 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student @@ -7,7 +8,6 @@ import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.getCurrentOrLast -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.isCurrent import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.withContext @@ -18,7 +18,7 @@ import javax.inject.Singleton @Singleton class SemesterRepository @Inject constructor( private val semesterDb: SemesterDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val dispatchers: DispatchersProvider, ) { @@ -60,7 +60,10 @@ class SemesterRepository @Inject constructor( } private suspend fun refreshSemesters(student: Student) { - val new = sdk.init(student).getSemesters().mapToEntities(student.studentId) + val new = wulkanowySdkFactory.create(student) + .getSemesters() + .mapToEntities(student.studentId) + if (new.isEmpty()) return Timber.i("Empty semester list!") val old = semesterDb.loadAll(student.studentId, student.classId) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt index d42be180d..db4c0aebb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt @@ -1,13 +1,11 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.StudentInfoDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.data.networkBoundResource -import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -15,7 +13,7 @@ import javax.inject.Singleton @Singleton class StudentInfoRepository @Inject constructor( private val studentInfoDao: StudentInfoDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, ) { private val saveFetchResultMutex = Mutex() @@ -30,9 +28,9 @@ class StudentInfoRepository @Inject constructor( shouldFetch = { it == null || forceRefresh }, query = { studentInfoDao.loadStudentInfo(student.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) - .getStudentInfo().mapToEntity(semester) + wulkanowySdkFactory.create(student, semester) + .getStudentInfo() + .mapToEntity(semester) }, saveFetchResult = { old, new -> if (old != null && new != old) { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index e063840cb..9a5ecd538 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.repositories import androidx.room.withTransaction +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.dao.StudentDao @@ -14,9 +15,7 @@ import io.github.wulkanowy.data.mappers.mapToPojo import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.DispatchersProvider -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.security.Scrambler -import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @@ -26,7 +25,7 @@ class StudentRepository @Inject constructor( private val dispatchers: DispatchersProvider, private val studentDb: StudentDao, private val semesterDb: SemesterDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val appDatabase: AppDatabase, private val scrambler: Scrambler, ) { @@ -37,7 +36,7 @@ class StudentRepository @Inject constructor( pin: String, symbol: String, token: String - ): RegisterUser = sdk + ): RegisterUser = wulkanowySdkFactory.create() .getStudentsFromHebe(token, pin, symbol, "") .mapToPojo(null) @@ -47,7 +46,7 @@ class StudentRepository @Inject constructor( scrapperBaseUrl: String, domainSuffix: String, symbol: String - ): RegisterUser = sdk + ): RegisterUser = wulkanowySdkFactory.create() .getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, domainSuffix, symbol) .mapToPojo(password) @@ -56,7 +55,7 @@ class StudentRepository @Inject constructor( password: String, scrapperBaseUrl: String, symbol: String - ): RegisterUser = sdk + ): RegisterUser = wulkanowySdkFactory.create() .getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol) .mapToPojo(password) @@ -149,13 +148,11 @@ class StudentRepository @Inject constructor( .distinctBy { it.student.studentName }.size == 1 suspend fun authorizePermission(student: Student, semester: Semester, pesel: String) = - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .authorizePermission(pesel) suspend fun refreshStudentName(student: Student, semester: Semester) { - val newCurrentApiStudent = sdk.init(student) - .switchSemester(semester) + val newCurrentApiStudent = wulkanowySdkFactory.create(student, semester) .getCurrentStudent() ?: return val studentName = StudentName( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt index cf7f86c22..573c7c149 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt @@ -1,15 +1,13 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.SubjectDao import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -18,7 +16,7 @@ import javax.inject.Singleton @Singleton class SubjectRepository @Inject constructor( private val subjectDao: SubjectDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -39,8 +37,7 @@ class SubjectRepository @Inject constructor( }, query = { subjectDao.loadAll(semester.diaryId, semester.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getSubjects() .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt index 5a488b27c..a5a6e3f9c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt @@ -1,15 +1,13 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.TeacherDao import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -18,7 +16,7 @@ import javax.inject.Singleton @Singleton class TeacherRepository @Inject constructor( private val teacherDb: TeacherDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -39,8 +37,7 @@ class TeacherRepository @Inject constructor( }, query = { teacherDb.loadAll(semester.studentId, semester.classId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getTeachers() .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index 0d208c1fc..335789991 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.TimetableAdditionalDao import io.github.wulkanowy.data.db.dao.TimetableDao import io.github.wulkanowy.data.db.dao.TimetableHeaderDao @@ -11,14 +12,11 @@ import io.github.wulkanowy.data.db.entities.TimetableHeader import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.data.pojos.TimetableFull -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper 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.combine @@ -33,7 +31,7 @@ class TimetableRepository @Inject constructor( private val timetableDb: TimetableDao, private val timetableAdditionalDb: TimetableAdditionalDao, private val timetableHeaderDb: TimetableHeaderDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val schedulerHelper: TimetableNotificationSchedulerHelper, private val refreshHelper: AutoRefreshHelper, ) { @@ -74,8 +72,7 @@ class TimetableRepository @Inject constructor( }, query = { getFullTimetableFromDatabase(student, semester, start, end) }, fetch = { - val timetableFull = sdk.init(student) - .switchSemester(semester) + val timetableFull = wulkanowySdkFactory.create(student, semester) .getTimetable(start.monday, end.sunday) timetableFull.mapToEntities(semester) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt index 98b4fda71..ce2173d28 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt @@ -10,8 +10,8 @@ import android.webkit.WebViewClient import androidx.core.os.bundleOf import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.databinding.DialogCaptchaBinding -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.ui.base.BaseDialogFragment import io.github.wulkanowy.utils.WebkitCookieManagerProxy import timber.log.Timber @@ -21,7 +21,7 @@ import javax.inject.Inject class CaptchaDialog : BaseDialogFragment() { @Inject - lateinit var sdk: Sdk + lateinit var wulkanowySdkFactory: WulkanowySdkFactory @Inject lateinit var webkitCookieManagerProxy: WebkitCookieManagerProxy @@ -59,7 +59,7 @@ class CaptchaDialog : BaseDialogFragment() { webView = this with(settings) { javaScriptEnabled = true - userAgentString = sdk.userAgent + userAgentString = wulkanowySdkFactory.create().userAgent } webViewClient = object : WebViewClient() { diff --git a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt deleted file mode 100644 index 9b6ca7060..000000000 --- a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt +++ /dev/null @@ -1,42 +0,0 @@ -package io.github.wulkanowy.utils - -import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.sdk.Sdk -import timber.log.Timber - -fun Sdk.init(student: Student): Sdk { - email = student.email - password = student.password - symbol = student.symbol - schoolSymbol = student.schoolSymbol - studentId = student.studentId - classId = student.classId - emptyCookieJarInterceptor = true - - if (Sdk.Mode.valueOf(student.loginMode) == Sdk.Mode.HEBE) { - mobileBaseUrl = student.mobileBaseUrl - } else { - scrapperBaseUrl = student.scrapperBaseUrl - domainSuffix = student.scrapperDomainSuffix - loginType = Sdk.ScrapperLoginType.valueOf(student.loginType) - } - - mode = Sdk.Mode.valueOf(student.loginMode) - mobileBaseUrl = student.mobileBaseUrl - keyId = student.certificateKey - privatePem = student.privateKey - - Timber.d("Sdk in ${student.loginMode} mode reinitialized") - - return this -} - -fun Sdk.switchSemester(semester: Semester): Sdk { - return switchDiary( - diaryId = semester.diaryId, - kindergartenDiaryId = semester.kindergartenDiaryId, - schoolYear = semester.schoolYear, - unitId = semester.unitId, - ) -} diff --git a/app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt b/app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt new file mode 100644 index 000000000..dd1ce0569 --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt @@ -0,0 +1,12 @@ +package io.github.wulkanowy + +import io.github.wulkanowy.data.WulkanowySdkFactory +import io.github.wulkanowy.sdk.Sdk +import io.mockk.every +import io.mockk.mockk + +fun createWulkanowySdkFactoryMock(sdk: Sdk) = mockk() + .apply { + every { create() } returns sdk + every { create(any(), any()) } answers { callOriginal() } + } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt index e64144c2f..b34902363 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.AttendanceDao import io.github.wulkanowy.data.db.dao.TimetableDao @@ -16,8 +17,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest @@ -30,8 +31,8 @@ import io.github.wulkanowy.sdk.pojo.Attendance as SdkAttendance class AttendanceRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var attendanceDb: AttendanceDao @@ -63,7 +64,8 @@ class AttendanceRepositoryTest { every { refreshHelper.shouldBeRefreshed(any()) } returns false coEvery { timetableDb.load(any(), any(), any(), any()) } returns emptyList() - attendanceRepository = AttendanceRepository(attendanceDb, timetableDb, sdk, refreshHelper) + attendanceRepository = + AttendanceRepository(attendanceDb, timetableDb, wulkanowySdkFactory, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt index f8f688501..e20603d22 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.CompletedLessonsDao import io.github.wulkanowy.data.errorOrNull @@ -15,8 +16,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals @@ -28,8 +29,8 @@ import io.github.wulkanowy.sdk.pojo.CompletedLesson as SdkCompletedLesson class CompletedLessonsRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var completedLessonDb: CompletedLessonsDao @@ -58,7 +59,7 @@ class CompletedLessonsRepositoryTest { every { refreshHelper.shouldBeRefreshed(any()) } returns false completedLessonRepository = - CompletedLessonsRepository(completedLessonDb, sdk, refreshHelper) + CompletedLessonsRepository(completedLessonDb, wulkanowySdkFactory, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt index d1ed9ca32..671c66f95 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.ExamDao import io.github.wulkanowy.data.errorOrNull @@ -15,8 +16,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest @@ -28,8 +29,8 @@ import io.github.wulkanowy.sdk.pojo.Exam as SdkExam class ExamRemoteTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var examDb: ExamDao @@ -59,7 +60,7 @@ class ExamRemoteTest { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - examRepository = ExamRepository(examDb, sdk, refreshHelper) + examRepository = ExamRepository(examDb, wulkanowySdkFactory, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt index 0ea5d3fa4..0045badf1 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.GradeDao import io.github.wulkanowy.data.db.dao.GradeDescriptiveDao @@ -18,8 +19,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest @@ -35,8 +36,8 @@ import io.github.wulkanowy.sdk.pojo.Grade as SdkGrade class GradeRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var gradeDb: GradeDao @@ -65,7 +66,7 @@ class GradeRepositoryTest { gradeDb = gradeDb, gradeSummaryDb = gradeSummaryDb, gradeDescriptiveDb = gradeDescriptiveDb, - sdk = sdk, + wulkanowySdkFactory = wulkanowySdkFactory, refreshHelper = refreshHelper, ) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt index dfd36ee1a..6733190b7 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.GradePartialStatisticsDao import io.github.wulkanowy.data.db.dao.GradePointsStatisticsDao @@ -13,9 +14,14 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.GradeStatisticsItem import io.github.wulkanowy.sdk.pojo.GradeStatisticsSubject import io.github.wulkanowy.utils.AutoRefreshHelper -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK +import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals @@ -24,8 +30,8 @@ import org.junit.Test class GradeStatisticsRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var gradePartialStatisticsDb: GradePartialStatisticsDao @@ -54,7 +60,7 @@ class GradeStatisticsRepositoryTest { gradePartialStatisticsDb = gradePartialStatisticsDb, gradePointsStatisticsDb = gradePointsStatisticsDb, gradeSemesterStatisticsDb = gradeSemesterStatisticsDb, - sdk = sdk, + wulkanowySdkFactory = wulkanowySdkFactory, refreshHelper = refreshHelper, ) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt index fa78b1bd3..854d5d548 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.LuckyNumberDao import io.github.wulkanowy.data.errorOrNull @@ -12,8 +13,8 @@ import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerify import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest @@ -25,8 +26,8 @@ import io.github.wulkanowy.sdk.pojo.LuckyNumber as SdkLuckyNumber class LuckyNumberRemoteTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var luckyNumberDb: LuckyNumberDao @@ -43,7 +44,7 @@ class LuckyNumberRemoteTest { fun setUp() { MockKAnnotations.init(this) - luckyNumberRepository = LuckyNumberRepository(luckyNumberDb, sdk) + luckyNumberRepository = LuckyNumberRepository(luckyNumberDb, wulkanowySdkFactory) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt index fbbe49345..9819fb1f7 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.repositories import android.content.Context +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.dao.MailboxDao @@ -28,10 +29,9 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just import io.mockk.mockk -import kotlinx.coroutines.ExperimentalCoroutinesApi +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking @@ -45,11 +45,10 @@ import java.time.Instant import java.time.ZoneOffset import kotlin.test.assertTrue -@OptIn(ExperimentalCoroutinesApi::class) class MessageRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var messageDb: MessagesDao @@ -102,7 +101,7 @@ class MessageRepositoryTest { messagesDb = messageDb, mutedMessageSendersDao = mutesDb, messageAttachmentDao = messageAttachmentDao, - sdk = sdk, + wulkanowySdkFactory = wulkanowySdkFactory, context = context, refreshHelper = refreshHelper, sharedPrefProvider = sharedPrefProvider, diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt index aa93a5e6f..5513a95fe 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.MobileDeviceDao import io.github.wulkanowy.data.errorOrNull @@ -16,8 +17,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.Assert @@ -28,8 +29,8 @@ import java.time.ZonedDateTime.of class MobileDeviceRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var mobileDeviceDb: MobileDeviceDao @@ -53,7 +54,8 @@ class MobileDeviceRepositoryTest { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - mobileDeviceRepository = MobileDeviceRepository(mobileDeviceDb, sdk, refreshHelper) + mobileDeviceRepository = + MobileDeviceRepository(mobileDeviceDb, wulkanowySdkFactory, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt index e608cafb1..0ecaad9ea 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.db.dao.RecipientDao import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.getMailboxEntity @@ -7,9 +8,14 @@ import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.MailboxType import io.github.wulkanowy.utils.AutoRefreshHelper -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK +import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before @@ -18,8 +24,8 @@ import io.github.wulkanowy.sdk.pojo.Recipient as SdkRecipient class RecipientLocalTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var recipientDb: RecipientDao @@ -63,7 +69,7 @@ class RecipientLocalTest { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - recipientRepository = RecipientRepository(recipientDb, sdk, refreshHelper) + recipientRepository = RecipientRepository(recipientDb, wulkanowySdkFactory, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt index 96db8a794..3a18ac48a 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.repositories import io.github.wulkanowy.TestDispatchersProvider +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.getSemesterEntity @@ -12,8 +13,8 @@ import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerify import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals @@ -24,8 +25,8 @@ import java.time.LocalDate.now class SemesterRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var semesterDb: SemesterDao @@ -38,7 +39,8 @@ class SemesterRepositoryTest { fun initTest() { MockKAnnotations.init(this) - semesterRepository = SemesterRepository(semesterDb, sdk, TestDispatchersProvider()) + semesterRepository = + SemesterRepository(semesterDb, wulkanowySdkFactory, TestDispatchersProvider()) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt index 2a61f99ce..a14605435 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.TimetableAdditionalDao import io.github.wulkanowy.data.db.dao.TimetableDao @@ -18,9 +19,9 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just import io.mockk.mockk +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals @@ -37,8 +38,8 @@ class TimetableRepositoryTest { @MockK(relaxed = true) private lateinit var timetableNotificationSchedulerHelper: TimetableNotificationSchedulerHelper - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var timetableDb: TimetableDao @@ -71,7 +72,7 @@ class TimetableRepositoryTest { timetableDb, timetableAdditionalDao, timetableHeaderDao, - sdk, + wulkanowySdkFactory, timetableNotificationSchedulerHelper, refreshHelper ) From 8a90b61b97bd4ed663d1d3b64543d26b0da8446a Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Wed, 13 Mar 2024 13:01:00 +0100 Subject: [PATCH 1406/1526] Refactor networkBoundResource (#2482) --------- Co-authored-by: Faierbel --- .../java/io/github/wulkanowy/data/Resource.kt | 127 ++++++++---------- .../repositories/AdminMessageRepository.kt | 3 +- .../data/repositories/MessageRepository.kt | 2 +- .../io/github/wulkanowy/data/ResourceTest.kt | 10 +- 4 files changed, 62 insertions(+), 80 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/Resource.kt b/app/src/main/java/io/github/wulkanowy/data/Resource.kt index b4982b9a0..7c6c2a9ff 100644 --- a/app/src/main/java/io/github/wulkanowy/data/Resource.kt +++ b/app/src/main/java/io/github/wulkanowy/data/Resource.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow @@ -22,15 +23,15 @@ import timber.log.Timber import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds -sealed class Resource { +sealed interface Resource { - open class Loading : Resource() + open class Loading : Resource data class Intermediate(val data: T) : Loading() - data class Success(val data: T) : Resource() + data class Success(val data: T) : Resource - data class Error(val error: Throwable) : Resource() + data class Error(val error: Throwable) : Resource } val Resource.dataOrNull: T? @@ -97,7 +98,7 @@ fun Flow>.logResourceStatus(name: String, showData: Boolean = fa Timber.i("$name: $description") } -fun Flow>.mapResourceData(block: suspend (T) -> U) = map { +inline fun Flow>.mapResourceData(crossinline block: suspend (T) -> U) = map { when (it) { is Resource.Success -> Resource.Success(block(it.data)) is Resource.Intermediate -> Resource.Intermediate(block(it.data)) @@ -167,33 +168,32 @@ suspend fun Flow>.waitForResult() = takeWhile { it is Resource.L // Can cause excessive amounts of `Resource.Intermediate` to be emitted. Unless that is desired, // use `debounceIntermediates` to alleviate this behavior. -inline fun combineResourceFlows( - flows: Iterable>>, -): Flow>> = combine(flows) { items -> - var isIntermediate = false - val data = mutableListOf() - for (item in items) { - when (item) { - is Resource.Success -> data.add(item.data) - is Resource.Intermediate -> { - isIntermediate = true - data.add(item.data) - } +inline fun combineResourceFlows(flows: Iterable>>): Flow>> = + combine(flows) { items -> + var isIntermediate = false + val data = mutableListOf() + for (item in items) { + when (item) { + is Resource.Success -> data.add(item.data) + is Resource.Intermediate -> { + isIntermediate = true + data.add(item.data) + } - is Resource.Loading -> return@combine Resource.Loading() - is Resource.Error -> continue + is Resource.Loading -> return@combine Resource.Loading() + is Resource.Error -> continue + } + } + if (data.isEmpty()) { + // All items have to be errors for this to happen, so just return the first one. + // mapData is functionally useless and exists only to satisfy the type checker + items.first().mapData { listOf(it) } + } else if (isIntermediate) { + Resource.Intermediate(data) + } else { + Resource.Success(data) } } - if (data.isEmpty()) { - // All items have to be errors for this to happen, so just return the first one. - // mapData is functionally useless and exists only to satisfy the type checker - items.first().mapData { listOf(it) } - } else if (isIntermediate) { - Resource.Intermediate(data) - } else { - Resource.Success(data) - } -} @OptIn(FlowPreview::class) fun Flow>.debounceIntermediates(timeout: Duration = 5.seconds) = flow { @@ -214,70 +214,51 @@ fun Flow>.debounceIntermediates(timeout: Duration = 5.seconds) = }) } + inline fun networkBoundResource( mutex: Mutex = Mutex(), - showSavedOnLoading: Boolean = true, crossinline isResultEmpty: (ResultType) -> Boolean, crossinline query: () -> Flow, - crossinline fetch: suspend (ResultType) -> RequestType, + crossinline fetch: suspend () -> RequestType, crossinline saveFetchResult: suspend (old: ResultType, new: RequestType) -> Unit, - crossinline onFetchFailed: (Throwable) -> Unit = { }, crossinline shouldFetch: (ResultType) -> Boolean = { true }, crossinline filterResult: (ResultType) -> ResultType = { it } -) = flow { - emit(Resource.Loading()) - - val data = query().first() - emitAll(if (shouldFetch(data)) { - val filteredResult = filterResult(data) - - if (showSavedOnLoading && !isResultEmpty(filteredResult)) { - emit(Resource.Intermediate(filteredResult)) - } - - try { - val newData = fetch(data) - mutex.withLock { saveFetchResult(query().first(), newData) } - query().map { Resource.Success(filterResult(it)) } - } catch (throwable: Throwable) { - onFetchFailed(throwable) - flowOf(Resource.Error(throwable)) - } - } else { - query().map { Resource.Success(filterResult(it)) } - }) -} +) = networkBoundResource( + mutex = mutex, + isResultEmpty = isResultEmpty, + query = query, + fetch = fetch, + saveFetchResult = saveFetchResult, + shouldFetch = shouldFetch, + mapResult = filterResult +) @JvmName("networkBoundResourceWithMap") -inline fun networkBoundResource( +inline fun networkBoundResource( mutex: Mutex = Mutex(), - showSavedOnLoading: Boolean = true, - crossinline isResultEmpty: (T) -> Boolean, + crossinline isResultEmpty: (MappedResultType) -> Boolean, crossinline query: () -> Flow, - crossinline fetch: suspend (ResultType) -> RequestType, + crossinline fetch: suspend () -> RequestType, crossinline saveFetchResult: suspend (old: ResultType, new: RequestType) -> Unit, - crossinline onFetchFailed: (Throwable) -> Unit = { }, crossinline shouldFetch: (ResultType) -> Boolean = { true }, - crossinline mapResult: (ResultType) -> T, + crossinline mapResult: (ResultType) -> MappedResultType, ) = flow { emit(Resource.Loading()) val data = query().first() - emitAll(if (shouldFetch(data)) { - val mappedResult = mapResult(data) + if (shouldFetch(data)) { + emit(Resource.Intermediate(data)) - if (showSavedOnLoading && !isResultEmpty(mappedResult)) { - emit(Resource.Intermediate(mappedResult)) - } try { - val newData = fetch(data) + val newData = fetch() mutex.withLock { saveFetchResult(query().first(), newData) } - query().map { Resource.Success(mapResult(it)) } } catch (throwable: Throwable) { - onFetchFailed(throwable) - flowOf(Resource.Error(throwable)) + emit(Resource.Error(throwable)) + return@flow } - } else { - query().map { Resource.Success(mapResult(it)) } - }) + } + + emitAll(query().map { Resource.Success(it) }) } + .mapResourceData { mapResult(it) } + .filterNot { it is Resource.Intermediate && isResultEmpty(it.data) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt index b831ee755..aa0022b08 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AdminMessageRepository.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.data.db.dao.AdminMessageDao import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.networkBoundResource import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -28,6 +29,6 @@ class AdminMessageRepository @Inject constructor( saveFetchResult = { oldItems, newItems -> adminMessageDao.removeOldAndSaveNew(oldItems, newItems) }, - showSavedOnLoading = false, ) + .filterNot { it is Resource.Intermediate } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index ede2a0fde..f91dc63e3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -122,7 +122,7 @@ class MessageRepository @Inject constructor( fetch = { wulkanowySdkFactory.create(student) .getMessageDetails( - messageKey = it!!.message.messageGlobalKey, + messageKey = message.messageGlobalKey, markAsRead = message.unread && markAsRead, ) }, diff --git a/app/src/test/java/io/github/wulkanowy/data/ResourceTest.kt b/app/src/test/java/io/github/wulkanowy/data/ResourceTest.kt index ea846a57b..aa79a637b 100644 --- a/app/src/test/java/io/github/wulkanowy/data/ResourceTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/ResourceTest.kt @@ -1,6 +1,10 @@ package io.github.wulkanowy.data -import io.mockk.* +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerifyOrder +import io.mockk.just +import io.mockk.mockk import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.flowOf @@ -42,7 +46,6 @@ class ResourceTest { // first networkBoundResource( isResultEmpty = { false }, - showSavedOnLoading = false, query = { repo.query() }, fetch = { val data = repo.fetch() @@ -57,7 +60,6 @@ class ResourceTest { // second networkBoundResource( isResultEmpty = { false }, - showSavedOnLoading = false, query = { repo.query() }, fetch = { val data = repo.fetch() @@ -124,7 +126,6 @@ class ResourceTest { networkBoundResource( isResultEmpty = { false }, mutex = saveResultMutex, - showSavedOnLoading = false, query = { repo.query() }, fetch = { val data = repo.fetch() @@ -143,7 +144,6 @@ class ResourceTest { networkBoundResource( isResultEmpty = { false }, mutex = saveResultMutex, - showSavedOnLoading = false, query = { repo.query() }, fetch = { val data = repo.fetch() From 961bc24f2799355638ab839cbd72b31b3db2bdb4 Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Wed, 13 Mar 2024 19:13:56 +0100 Subject: [PATCH 1407/1526] Add docs to Resource, changing networkBoundResource generics naming (#2483) --- app/play-publish-lint.sh | 3 +- .../java/io/github/wulkanowy/data/Resource.kt | 51 +++++++++++++------ 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/app/play-publish-lint.sh b/app/play-publish-lint.sh index d3354b1ad..5f0391de3 100755 --- a/app/play-publish-lint.sh +++ b/app/play-publish-lint.sh @@ -1,7 +1,8 @@ #!/bin/bash - content=$(cat < "app/src/main/play/release-notes/pl-PL/default.txt") || exit -if [[ "${#content}" -gt 500 ]]; then +content2=echo "$content" | dos2unix +if [[ "${#content2}" -gt 500 ]]; then echo >&2 "Release notes content has reached the limit of 500 characters" exit 1 fi diff --git a/app/src/main/java/io/github/wulkanowy/data/Resource.kt b/app/src/main/java/io/github/wulkanowy/data/Resource.kt index 7c6c2a9ff..712a946f3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/Resource.kt +++ b/app/src/main/java/io/github/wulkanowy/data/Resource.kt @@ -24,13 +24,34 @@ import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds sealed interface Resource { - + /** + * The initial value of a resource flow. Indicates no data that is currently available to be shown, + * however with the expectation that the state will transition to another one soon. + */ open class Loading : Resource + /** + * A semi-loading state with some data available to be displayed (usually cached data loaded from + * the database). Still not the target state and it's expected to transition into another one soon. + */ data class Intermediate(val data: T) : Loading() + /** + * The happy-path target state. Data can either be: + * - loaded from the database - while it may seem like this case is already handled by the + * Intermediate state, the difference here is semantic. Cached data is returned as Intermediate + * when there's a API request in progress (or soon expected to be), however when there is no + * intention of immediately querying the API, the cached data is returned as a Success. + * - fetched from the API. + */ data class Success(val data: T) : Resource + /** + * Something bad happened and we were unable to get the requested data. This can be caused by + * a database error, a network error, or really just any other error. Upon receiving this state + * the UI can either: display a full screen error, or, when it has received any data previously, + * display a snack bar informing of the problem. + */ data class Error(val error: Throwable) : Resource } @@ -215,14 +236,14 @@ fun Flow>.debounceIntermediates(timeout: Duration = 5.seconds) = } -inline fun networkBoundResource( +inline fun networkBoundResource( mutex: Mutex = Mutex(), - crossinline isResultEmpty: (ResultType) -> Boolean, - crossinline query: () -> Flow, - crossinline fetch: suspend () -> RequestType, - crossinline saveFetchResult: suspend (old: ResultType, new: RequestType) -> Unit, - crossinline shouldFetch: (ResultType) -> Boolean = { true }, - crossinline filterResult: (ResultType) -> ResultType = { it } + crossinline isResultEmpty: (OutputType) -> Boolean, + crossinline query: () -> Flow, + crossinline fetch: suspend () -> ApiType, + crossinline saveFetchResult: suspend (old: OutputType, new: ApiType) -> Unit, + crossinline shouldFetch: (OutputType) -> Boolean = { true }, + crossinline filterResult: (OutputType) -> OutputType = { it } ) = networkBoundResource( mutex = mutex, isResultEmpty = isResultEmpty, @@ -234,14 +255,14 @@ inline fun networkBoundResource( ) @JvmName("networkBoundResourceWithMap") -inline fun networkBoundResource( +inline fun networkBoundResource( mutex: Mutex = Mutex(), - crossinline isResultEmpty: (MappedResultType) -> Boolean, - crossinline query: () -> Flow, - crossinline fetch: suspend () -> RequestType, - crossinline saveFetchResult: suspend (old: ResultType, new: RequestType) -> Unit, - crossinline shouldFetch: (ResultType) -> Boolean = { true }, - crossinline mapResult: (ResultType) -> MappedResultType, + crossinline isResultEmpty: (OutputType) -> Boolean, + crossinline query: () -> Flow, + crossinline fetch: suspend () -> ApiType, + crossinline saveFetchResult: suspend (old: DatabaseType, new: ApiType) -> Unit, + crossinline shouldFetch: (DatabaseType) -> Boolean = { true }, + crossinline mapResult: (DatabaseType) -> OutputType, ) = flow { emit(Resource.Loading()) From 34d34a050afc1ce81ef465c8ef47e04368484695 Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Sun, 17 Mar 2024 21:06:40 +0100 Subject: [PATCH 1408/1526] Add widget updating on data sync (#2487) --------- Co-authored-by: Faierbel --- .../repositories/LuckyNumberRepository.kt | 7 ++++ .../data/repositories/TimetableRepository.kt | 10 +++++- .../LuckyNumberWidgetProvider.kt | 6 +++- .../timetablewidget/TimetableWidgetFactory.kt | 9 ++++- .../wulkanowy/utils/AppWidgetUpdater.kt | 34 +++++++++++++++++++ .../repositories/LuckyNumberRemoteTest.kt | 7 +++- .../repositories/TimetableRepositoryTest.kt | 7 +++- 7 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/utils/AppWidgetUpdater.kt diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt index 3636cb51e..dfafe6c8a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt @@ -6,6 +6,8 @@ import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.data.networkBoundResource +import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider +import io.github.wulkanowy.utils.AppWidgetUpdater import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.sync.Mutex @@ -18,6 +20,7 @@ import javax.inject.Singleton class LuckyNumberRepository @Inject constructor( private val luckyNumberDb: LuckyNumberDao, private val wulkanowySdkFactory: WulkanowySdkFactory, + private val appWidgetUpdater: AppWidgetUpdater, ) { private val saveFetchResultMutex = Mutex() @@ -26,6 +29,7 @@ class LuckyNumberRepository @Inject constructor( student: Student, forceRefresh: Boolean, notify: Boolean = false, + isFromAppWidget: Boolean = false ) = networkBoundResource( mutex = saveFetchResultMutex, isResultEmpty = { it == null }, @@ -44,6 +48,9 @@ class LuckyNumberRepository @Inject constructor( oldItems = listOfNotNull(oldLuckyNumber), newItems = listOf(newLuckyNumber.apply { if (notify) isNotified = false }), ) + if (!isFromAppWidget) { + appWidgetUpdater.updateAllAppWidgetsByProvider(LuckyNumberWidgetProvider::class) + } } } ) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index 335789991..60c562e12 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -13,6 +13,8 @@ import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.data.pojos.TimetableFull import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper +import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider +import io.github.wulkanowy.utils.AppWidgetUpdater import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey import io.github.wulkanowy.utils.monday @@ -26,6 +28,7 @@ import java.time.LocalDate import javax.inject.Inject import javax.inject.Singleton + @Singleton class TimetableRepository @Inject constructor( private val timetableDb: TimetableDao, @@ -34,6 +37,7 @@ class TimetableRepository @Inject constructor( private val wulkanowySdkFactory: WulkanowySdkFactory, private val schedulerHelper: TimetableNotificationSchedulerHelper, private val refreshHelper: AutoRefreshHelper, + private val appWidgetUpdater: AppWidgetUpdater, ) { private val saveFetchResultMutex = Mutex() @@ -52,7 +56,8 @@ class TimetableRepository @Inject constructor( forceRefresh: Boolean, refreshAdditional: Boolean = false, notify: Boolean = false, - timetableType: TimetableType = TimetableType.NORMAL + timetableType: TimetableType = TimetableType.NORMAL, + isFromAppWidget: Boolean = false ) = networkBoundResource( mutex = saveFetchResultMutex, isResultEmpty = { @@ -83,6 +88,9 @@ class TimetableRepository @Inject constructor( refreshDayHeaders(timetableOld.headers, timetableNew.headers) refreshHelper.updateLastRefreshTimestamp(getRefreshKey(cacheKey, semester, start, end)) + if (!isFromAppWidget) { + appWidgetUpdater.updateAllAppWidgetsByProvider(TimetableWidgetProvider::class) + } }, filterResult = { (timetable, additional, headers) -> TimetableFull( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index 1ab079a3a..e6de17818 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -145,7 +145,11 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { } if (currentStudent != null) { - luckyNumberRepository.getLuckyNumber(currentStudent, forceRefresh = false) + luckyNumberRepository.getLuckyNumber( + student = currentStudent, + forceRefresh = false, + isFromAppWidget = true + ) .toFirstResult() .dataOrThrow } else null diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index 4cfc03229..1eb33dbcd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -104,7 +104,14 @@ class TimetableWidgetFactory( private suspend fun getLessons( student: Student, semester: Semester, date: LocalDate ): List { - val timetable = timetableRepository.getTimetable(student, semester, date, date, false) + val timetable = timetableRepository.getTimetable( + student = student, + semester = semester, + start = date, + end = date, + forceRefresh = false, + isFromAppWidget = true + ) val lessons = timetable.toFirstResult().dataOrThrow.lessons return lessons.sortedBy { it.number } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/AppWidgetUpdater.kt b/app/src/main/java/io/github/wulkanowy/utils/AppWidgetUpdater.kt new file mode 100644 index 000000000..1b54f40c1 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/AppWidgetUpdater.kt @@ -0,0 +1,34 @@ +package io.github.wulkanowy.utils + +import android.appwidget.AppWidgetManager +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import dagger.hilt.android.qualifiers.ApplicationContext +import timber.log.Timber +import javax.inject.Inject +import kotlin.reflect.KClass + +class AppWidgetUpdater @Inject constructor( + @ApplicationContext private val context: Context, + private val appWidgetManager: AppWidgetManager +) { + + fun updateAllAppWidgetsByProvider(providerClass: KClass) { + try { + val ids = appWidgetManager.getAppWidgetIds(ComponentName(context, providerClass.java)) + if (ids.isEmpty()) return + + val intent = Intent(context, providerClass.java) + .apply { + action = AppWidgetManager.ACTION_APPWIDGET_UPDATE + putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) + } + + context.sendBroadcast(intent) + } catch (e: Exception) { + Timber.e(e, "Failed to update all widgets for provider $providerClass") + } + } +} diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt index 854d5d548..560eb3e7b 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.data.toFirstResult import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.AppWidgetUpdater import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.coEvery @@ -32,6 +33,9 @@ class LuckyNumberRemoteTest { @MockK private lateinit var luckyNumberDb: LuckyNumberDao + @MockK(relaxed = true) + private lateinit var appWidgetUpdater: AppWidgetUpdater + private val student = getStudentEntity() private lateinit var luckyNumberRepository: LuckyNumberRepository @@ -44,7 +48,8 @@ class LuckyNumberRemoteTest { fun setUp() { MockKAnnotations.init(this) - luckyNumberRepository = LuckyNumberRepository(luckyNumberDb, wulkanowySdkFactory) + luckyNumberRepository = + LuckyNumberRepository(luckyNumberDb, wulkanowySdkFactory, appWidgetUpdater) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt index a14605435..2a45f1755 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt @@ -12,6 +12,7 @@ import io.github.wulkanowy.getSemesterEntity import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper +import io.github.wulkanowy.utils.AppWidgetUpdater import io.github.wulkanowy.utils.AutoRefreshHelper import io.mockk.MockKAnnotations import io.mockk.Runs @@ -53,6 +54,9 @@ class TimetableRepositoryTest { @MockK(relaxUnitFun = true) private lateinit var refreshHelper: AutoRefreshHelper + @MockK(relaxed = true) + private lateinit var appWidgetUpdater: AppWidgetUpdater + private val student = getStudentEntity() private val semester = getSemesterEntity() @@ -74,7 +78,8 @@ class TimetableRepositoryTest { timetableHeaderDao, wulkanowySdkFactory, timetableNotificationSchedulerHelper, - refreshHelper + refreshHelper, + appWidgetUpdater ) } From d01fe9c370720f3baba52701b3e467d603d81cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 19 Mar 2024 22:11:02 +0100 Subject: [PATCH 1409/1526] Bump sdk to 2.5.2-SNAPSHOT --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 31de5104a..7ecfc818b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.1' + implementation 'io.github.wulkanowy:sdk:2.5.2-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' From b31c7e1720552c340fca3cf58b5073a9f82926ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Mar 2024 11:44:59 +0100 Subject: [PATCH 1410/1526] Fix task description color crash (#2475) --- .gitignore | 4 ++++ .../io/github/wulkanowy/ui/base/BaseActivity.kt | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 980085e38..69d3ad5d2 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,10 @@ captures/ .idea/discord.xml .idea/migrations.xml .idea/androidTestResultsUserPreferences.xml +.idea/copilot +.idea/deploymentTargetDropDown.xml +.idea/deploymentTargetSelector.xml +.idea/kotlinc.xml # Keystore files *.jks diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index 10735dab3..922c35365 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.base import android.app.ActivityManager +import android.os.Build import android.os.Bundle import android.view.View import android.widget.Toast @@ -45,11 +46,19 @@ abstract class BaseActivity, VB : ViewBinding> : themeManager.applyActivityTheme(this) super.onCreate(savedInstanceState) supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true) + applyCustomTaskDescription() + } - @Suppress("DEPRECATION") - setTaskDescription( - ActivityManager.TaskDescription(null, null, getThemeAttrColor(R.attr.colorSurface)) - ) + @Suppress("DEPRECATION") + private fun applyCustomTaskDescription() { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) return + try { + val newColor = getThemeAttrColor(R.attr.colorSurface) + val taskDescription = ActivityManager.TaskDescription(null, null, newColor) + setTaskDescription(taskDescription) + } catch (e: Exception) { + Timber.e(e) + } } override fun showError(text: String, error: Throwable) { From 377c288e9ef7a4ea956318161c5641b65b79c358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Mar 2024 11:45:15 +0100 Subject: [PATCH 1411/1526] Add missing onDetachView in AutDialog (#2476) --- .../java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt index fa29df473..0f7c4234e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthDialog.kt @@ -78,4 +78,9 @@ class AuthDialog : BaseDialogFragment(), AuthView { override fun showDescriptionWithName(name: String) { binding.authDescription.text = getString(R.string.auth_description, name).parseAsHtml() } + + override fun onDestroyView() { + presenter.onDetachView() + super.onDestroyView() + } } From 78e28ad791b7aa23234362f931f5d7577d6f6e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Mar 2024 11:45:28 +0100 Subject: [PATCH 1412/1526] Remove savedInstance in MessagePreviewFragment (#2477) --- .../mailboxchooser/MailboxChooserDialog.kt | 1 - .../message/preview/MessagePreviewFragment.kt | 11 +++-------- .../message/preview/MessagePreviewPresenter.kt | 13 +++++++++---- .../github/wulkanowy/utils/BundleExtension.kt | 17 +++++++++-------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/mailboxchooser/MailboxChooserDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/mailboxchooser/MailboxChooserDialog.kt index 8bd84f2bf..11d3c6c12 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/mailboxchooser/MailboxChooserDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/mailboxchooser/MailboxChooserDialog.kt @@ -47,7 +47,6 @@ class MailboxChooserDialog : BaseDialogFragment(), } - @Suppress("UNCHECKED_CAST") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) presenter.onAttachView( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index ebdb96a40..8e7c72765 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -82,10 +82,10 @@ class MessagePreviewFragment : get() = getString(R.string.message_not_exists) companion object { - const val MESSAGE_ID_KEY = "message_id" + private const val MESSAGE_ARG_KEY = "message" fun newInstance(message: Message) = MessagePreviewFragment().apply { - arguments = bundleOf(MESSAGE_ID_KEY to message) + arguments = bundleOf(MESSAGE_ARG_KEY to message) } } @@ -101,7 +101,7 @@ class MessagePreviewFragment : messageContainer = binding.messagePreviewContainer presenter.onAttachView( view = this, - message = (savedInstanceState ?: arguments)?.serializable(MESSAGE_ID_KEY), + message = requireArguments().serializable(MESSAGE_ARG_KEY), ) } @@ -233,11 +233,6 @@ class MessagePreviewFragment : (activity as MainActivity).popView() } - override fun onSaveInstanceState(outState: Bundle) { - outState.putSerializable(MESSAGE_ID_KEY, presenter.messageWithAttachments?.message) - super.onSaveInstanceState(outState) - } - override fun onDestroyView() { presenter.onDetachView() super.onDestroyView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index 9bb0d32a4..3b3b2b420 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -3,10 +3,15 @@ package io.github.wulkanowy.ui.modules.message.preview import android.annotation.SuppressLint import androidx.core.text.parseAsHtml import io.github.wulkanowy.R -import io.github.wulkanowy.data.* import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.enums.MessageFolder +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.onResourceData +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceNotLoading +import io.github.wulkanowy.data.onResourceSuccess import io.github.wulkanowy.data.repositories.MessageRepository import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository @@ -28,17 +33,17 @@ class MessagePreviewPresenter @Inject constructor( private val analytics: AnalyticsHelper ) : BasePresenter(errorHandler, studentRepository) { - var messageWithAttachments: MessageWithAttachment? = null + private var messageWithAttachments: MessageWithAttachment? = null private lateinit var lastError: Throwable private var retryCallback: () -> Unit = {} - fun onAttachView(view: MessagePreviewView, message: Message?) { + fun onAttachView(view: MessagePreviewView, message: Message) { super.onAttachView(view) view.initView() errorHandler.showErrorMessage = ::showErrorViewOnError - loadData(requireNotNull(message)) + loadData(message) } private fun onMessageLoadRetry(message: Message) { diff --git a/app/src/main/java/io/github/wulkanowy/utils/BundleExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/BundleExtension.kt index d3c9f8006..b1742b4fa 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/BundleExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/BundleExtension.kt @@ -4,30 +4,31 @@ import android.content.Intent import android.os.Build import android.os.Bundle import android.os.Parcelable +import androidx.core.os.BundleCompat import java.io.Serializable +// Even though API was introduced in 33, we use 34 as 33 is bugged in some scenarios. + inline fun Bundle.serializable(key: String): T = when { - Build.VERSION.SDK_INT >= 33 -> getSerializable(key, T::class.java)!! + Build.VERSION.SDK_INT >= 34 -> getSerializable(key, T::class.java)!! else -> @Suppress("DEPRECATION") getSerializable(key) as T } inline fun Bundle.nullableSerializable(key: String): T? = when { - Build.VERSION.SDK_INT >= 33 -> getSerializable(key, T::class.java) + Build.VERSION.SDK_INT >= 34 -> getSerializable(key, T::class.java) else -> @Suppress("DEPRECATION") getSerializable(key) as T? } @Suppress("UNCHECKED_CAST") -inline fun Bundle.parcelableArray(key: String): Array? = when { - Build.VERSION.SDK_INT >= 33 -> getParcelableArray(key, T::class.java) - else -> @Suppress("DEPRECATION") getParcelableArray(key) as Array? -} +inline fun Bundle.parcelableArray(key: String): Array? = + BundleCompat.getParcelableArray(this, key, T::class.java) as Array? inline fun Intent.serializable(key: String): T = when { - Build.VERSION.SDK_INT >= 33 -> getSerializableExtra(key, T::class.java)!! + Build.VERSION.SDK_INT >= 34 -> getSerializableExtra(key, T::class.java)!! else -> @Suppress("DEPRECATION") getSerializableExtra(key) as T } inline fun Intent.nullableSerializable(key: String): T? = when { - Build.VERSION.SDK_INT >= 33 -> getSerializableExtra(key, T::class.java) + Build.VERSION.SDK_INT >= 34 -> getSerializableExtra(key, T::class.java) else -> @Suppress("DEPRECATION") getSerializableExtra(key) as T? } From 8623b53357be1dff37ce77f6fa3b672cb24bff1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Mar 2024 23:38:17 +0100 Subject: [PATCH 1413/1526] Fix lateness color in attendance (#2481) --- .../modules/attendance/AttendanceAdapter.kt | 25 +++++++++++-------- app/src/main/res/values/colors.xml | 5 ++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt index 4e9baac3a..f5689ec8d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceAdapter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.attendance +import android.content.res.ColorStateList import android.graphics.Typeface import android.view.LayoutInflater import android.view.View @@ -33,17 +34,17 @@ class AttendanceAdapter @Inject constructor() : ) override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val context = holder.binding.root.context val item = items[position] with(holder.binding) { attendanceItemNumber.text = item.number.toString() - attendanceItemSubject.text = item.subject.ifBlank { - root.context.getString(R.string.all_no_data) - } + attendanceItemSubject.text = item.subject + .ifBlank { context.getString(R.string.all_no_data) } attendanceItemDescription.setText(item.descriptionRes) attendanceItemDescription.setTextColor( - root.context.getThemeAttrColor( + context.getThemeAttrColor( when { item.absence && !item.excused -> R.attr.colorAttendanceAbsence item.lateness && !item.excused -> R.attr.colorAttendanceLateness @@ -61,13 +62,15 @@ class AttendanceAdapter @Inject constructor() : attendanceItemAlert.isVisible = item.let { (it.absence && !it.excused) || (it.lateness && !it.excused) } - attendanceItemAlert.setColorFilter(root.context.getThemeAttrColor( - when{ - item.absence && !item.excused -> R.attr.colorAttendanceAbsence - item.lateness && !item.excused -> R.attr.colorAttendanceLateness - else -> android.R.attr.colorPrimary - } - )) + attendanceItemAlert.imageTintList = ColorStateList.valueOf( + context.getThemeAttrColor( + when { + item.absence && !item.excused -> R.attr.colorAttendanceAbsence + item.lateness && !item.excused -> R.attr.colorAttendanceLateness + else -> android.R.attr.colorPrimary + } + ) + ) attendanceItemNumber.visibility = View.GONE attendanceItemExcuseInfo.visibility = View.GONE attendanceItemExcuseCheckbox.visibility = View.GONE diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8ad27ad88..f31a5f947 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -46,14 +46,15 @@ #d32f2f #e57373 + #ff8f00 #ffd54f #d32f2f #e57373 - #cd2a01 - #f05d0e + #ff8f00 + #ffd54f #1f000000 #1fffffff From d789aa718e8fda3bec328334812f456dacd15bd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 20 Mar 2024 01:49:55 +0100 Subject: [PATCH 1414/1526] Change AuthDialog condition to isAuth flag (#2495) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- .../62.json | 2547 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 5 +- .../wulkanowy/data/db/dao/StudentDao.kt | 4 + .../wulkanowy/data/db/entities/Student.kt | 7 + .../data/db/entities/StudentIsAuthorized.kt | 16 + .../data/mappers/RegisterUserMapper.kt | 24 +- .../wulkanowy/data/pojos/RegisterUser.kt | 2 + .../data/repositories/StudentRepository.kt | 24 + .../github/wulkanowy/ui/base/ErrorHandler.kt | 4 +- .../ui/modules/main/MainPresenter.kt | 10 + .../io/github/wulkanowy/utils/SdkExtension.kt | 1 + .../io/github/wulkanowy/TestEnityCreator.kt | 4 +- .../domain/GetMailboxByStudentUseCaseTest.kt | 2 + .../modules/grade/GradeAverageProviderTest.kt | 4 +- .../LoginStudentSelectPresenterTest.kt | 2 + .../ui/modules/main/MainPresenterTest.kt | 12 +- 16 files changed, 2651 insertions(+), 17 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/62.json create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/entities/StudentIsAuthorized.kt diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/62.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/62.json new file mode 100644 index 000000000..ab63c679f --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/62.json @@ -0,0 +1,2547 @@ +{ + "formatVersion": 1, + "database": { + "version": 62, + "identityHash": "ee2464d218b254ca868667c0fc756c0b", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `scrapper_domain_suffix` TEXT NOT NULL DEFAULT '', `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `is_authorized` INTEGER NOT NULL DEFAULT 0, `is_edu_one` INTEGER NOT NULL DEFAULT 0, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperDomainSuffix", + "columnName": "scrapper_domain_suffix", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAuthorized", + "columnName": "is_authorized", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "isEduOne", + "columnName": "is_edu_one", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `kindergarten_diary_id` INTEGER NOT NULL DEFAULT 0, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "kindergartenDiaryId", + "columnName": "kindergarten_diary_id", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "kindergarten_diary_id", + "semester_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `kindergarten_diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`email` TEXT NOT NULL, `message_global_key` TEXT NOT NULL, `mailbox_key` TEXT NOT NULL, `message_id` INTEGER NOT NULL, `correspondents` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `read_by` INTEGER, `unread_by` INTEGER, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `content` TEXT NOT NULL, `sender` TEXT, `recipients` TEXT)", + "fields": [ + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mailboxKey", + "columnName": "mailbox_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "correspondents", + "columnName": "correspondents", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "recipients", + "columnName": "recipients", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`message_global_key` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`message_global_key`, `url`, `filename`))", + "fields": [ + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "message_global_key", + "url", + "filename" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Mailboxes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`globalKey` TEXT NOT NULL, `email` TEXT NOT NULL, `symbol` TEXT NOT NULL, `schoolId` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `studentName` TEXT NOT NULL, `schoolNameShort` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`globalKey`))", + "fields": [ + { + "fieldPath": "globalKey", + "columnName": "globalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolId", + "columnName": "schoolId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "studentName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolNameShort", + "columnName": "schoolNameShort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "globalKey" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`mailboxGlobalKey` TEXT NOT NULL, `studentMailboxGlobalKey` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `schoolShortName` TEXT NOT NULL, `type` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "mailboxGlobalKey", + "columnName": "mailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentMailboxGlobalKey", + "columnName": "studentMailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "schoolShortName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `repeat_id` BLOB DEFAULT NULL, `is_added_by_user` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatId", + "columnName": "repeat_id", + "affinity": "BLOB", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `author` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `destination` TEXT NOT NULL DEFAULT '{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}', `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "destination", + "columnName": "destination", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}'" + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `types` TEXT NOT NULL DEFAULT '[]', `is_ok_visible` INTEGER NOT NULL DEFAULT 0, `is_x_visible` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "types", + "columnName": "types", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'[]'" + }, + { + "fieldPath": "isOkVisible", + "columnName": "is_ok_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "isXVisible", + "columnName": "is_x_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MutedMessageSenders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`author` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesDescriptive", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `description` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ee2464d218b254ca868667c0fc756c0b')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 208daf75f..3189fc312 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -174,6 +174,7 @@ import javax.inject.Singleton AutoMigration(from = 58, to = 59), AutoMigration(from = 59, to = 60), AutoMigration(from = 60, to = 61), + AutoMigration(from = 61, to = 62), ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -182,7 +183,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 61 + const val VERSION_SCHEMA = 62 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), @@ -309,6 +310,6 @@ abstract class AppDatabase : RoomDatabase() { abstract val adminMessagesDao: AdminMessageDao abstract val mutedMessageSendersDao: MutedMessageSendersDao - + abstract val gradeDescriptiveDao: GradeDescriptiveDao } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt index d9326ff6c..95abb399b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt @@ -9,6 +9,7 @@ import androidx.room.Transaction import androidx.room.Update import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentIsAuthorized import io.github.wulkanowy.data.db.entities.StudentName import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar import javax.inject.Singleton @@ -23,6 +24,9 @@ abstract class StudentDao { @Delete abstract suspend fun delete(student: Student) + @Update(entity = Student::class) + abstract suspend fun update(studentIsAuthorized: StudentIsAuthorized) + @Update(entity = Student::class) abstract suspend fun update(studentNickAndAvatar: StudentNickAndAvatar) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt index e1116733c..23e4439aa 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt @@ -78,6 +78,13 @@ data class Student( @ColumnInfo(name = "registration_date") val registrationDate: Instant, + + @ColumnInfo(name = "is_authorized", defaultValue = "0") + val isAuthorized: Boolean, + + @ColumnInfo(name = "is_edu_one", defaultValue = "0") + val isEduOne: Boolean, + ) : Serializable { @PrimaryKey(autoGenerate = true) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentIsAuthorized.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentIsAuthorized.kt new file mode 100644 index 000000000..a1290177c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentIsAuthorized.kt @@ -0,0 +1,16 @@ +package io.github.wulkanowy.data.db.entities + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import java.io.Serializable + +@Entity +data class StudentIsAuthorized( + @ColumnInfo(name = "is_authorized", defaultValue = "0") + val isAuthorized: Boolean, +) : Serializable { + + @PrimaryKey + var id: Long = 0 +} diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt index 72c4861c9..7e6a8166d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/RegisterUserMapper.kt @@ -34,17 +34,19 @@ fun SdkRegisterUser.mapToPojo(password: String?) = RegisterUser( error = it.error, students = it.subjects .filterIsInstance() - .map { registerSubject -> + .map { registerStudent -> RegisterStudent( - studentId = registerSubject.studentId, - studentName = registerSubject.studentName, - studentSecondName = registerSubject.studentSecondName, - studentSurname = registerSubject.studentSurname, - className = registerSubject.className, - classId = registerSubject.classId, - isParent = registerSubject.isParent, - semesters = registerSubject.semesters - .mapToEntities(registerSubject.studentId), + studentId = registerStudent.studentId, + studentName = registerStudent.studentName, + studentSecondName = registerStudent.studentSecondName, + studentSurname = registerStudent.studentSurname, + className = registerStudent.className, + classId = registerStudent.classId, + isParent = registerStudent.isParent, + isAuthorized = registerStudent.isAuthorized, + isEduOne = registerStudent.isEduOne, + semesters = registerStudent.semesters + .mapToEntities(registerStudent.studentId), ) }, ) @@ -84,6 +86,8 @@ fun RegisterStudent.mapToStudentWithSemesters( password = user.password.orEmpty(), isCurrent = false, registrationDate = Instant.now(), + isAuthorized = this.isAuthorized, + isEduOne = this.isEduOne, ).apply { avatarColor = colors.random() }, diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/RegisterUser.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/RegisterUser.kt index 98bf1402b..dec6ebec1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/pojos/RegisterUser.kt +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/RegisterUser.kt @@ -45,4 +45,6 @@ data class RegisterStudent( val classId: Int, val isParent: Boolean, val semesters: List, + val isAuthorized: Boolean, + val isEduOne: Boolean ) : java.io.Serializable diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index e063840cb..353e7ddd2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.dao.StudentDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentIsAuthorized import io.github.wulkanowy.data.db.entities.StudentName import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar import io.github.wulkanowy.data.db.entities.StudentWithSemesters @@ -14,6 +15,7 @@ import io.github.wulkanowy.data.mappers.mapToPojo import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.DispatchersProvider +import io.github.wulkanowy.utils.getCurrentOrLast import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.security.Scrambler import io.github.wulkanowy.utils.switchSemester @@ -100,6 +102,25 @@ class StudentRepository @Inject constructor( return student } + suspend fun checkCurrentStudentAuthorizationStatus() { + val student = getCurrentStudent() + + if (!student.isAuthorized) { + val currentSemester = semesterDb.loadAll( + studentId = student.studentId, + classId = student.classId, + ).getCurrentOrLast() + val initializedSdk = sdk.init(student).switchSemester(currentSemester) + val isAuthorized = initializedSdk.getCurrentStudent()?.isAuthorized ?: false + + if (isAuthorized) { + studentDb.update(StudentIsAuthorized(isAuthorized = true).apply { + id = student.id + }) + } else throw NoAuthorizationException() + } + } + suspend fun getCurrentStudent(decryptPass: Boolean = true): Student { val student = studentDb.loadCurrent() ?: throw NoCurrentStudentException() @@ -176,3 +197,6 @@ class StudentRepository @Inject constructor( } } } + +class NoAuthorizationException : Exception() + diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index 7109f1ffd..00a2ab225 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.ui.base import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.data.exceptions.NoCurrentStudentException -import io.github.wulkanowy.sdk.scrapper.exception.AuthorizationRequiredException +import io.github.wulkanowy.data.repositories.NoAuthorizationException import io.github.wulkanowy.sdk.scrapper.exception.CloudflareVerificationException import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.sdk.scrapper.login.PasswordChangeRequiredException @@ -40,7 +40,7 @@ open class ErrorHandler @Inject constructor(@ApplicationContext protected val co is ScramblerException -> onDecryptionFailed() is BadCredentialsException -> onExpiredCredentials() is NoCurrentStudentException -> onNoCurrentStudent() - is AuthorizationRequiredException -> onAuthorizationRequired() + is NoAuthorizationException -> onAuthorizationRequired() is CloudflareVerificationException -> onCaptchaVerificationRequired(error.originalUrl) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index 5469fcad3..67f729afb 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -73,6 +73,7 @@ class MainPresenter @Inject constructor( syncManager.startPeriodicSyncWorker() checkAppSupport() + checkCurrentStudentAuthorizationStatus() analytics.logEvent("app_open", "destination" to initDestination.toString()) Timber.i("Main view was initialized with $initDestination") @@ -191,4 +192,13 @@ class MainPresenter @Inject constructor( view?.showStudentAvatar(currentStudent) } + + private fun checkCurrentStudentAuthorizationStatus() { + presenterScope.launch { + runCatching { studentRepository.checkCurrentStudentAuthorizationStatus() } + .onFailure { errorHandler.dispatch(it) } + + Timber.i("Current student authorization status checked") + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt index 9b6ca7060..77f03fb88 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt @@ -12,6 +12,7 @@ fun Sdk.init(student: Student): Sdk { schoolSymbol = student.schoolSymbol studentId = student.studentId classId = student.classId + isEduOne = student.isEduOne emptyCookieJarInterceptor = true if (Sdk.Mode.valueOf(student.loginMode) == Sdk.Mode.HEBE) { diff --git a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt index 9f5d731b6..96b75c35d 100644 --- a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt +++ b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt @@ -5,8 +5,8 @@ import io.github.wulkanowy.data.db.entities.MailboxType import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk -import java.time.LocalDate import java.time.Instant.now +import java.time.LocalDate import io.github.wulkanowy.sdk.pojo.Semester as SdkSemester fun getSemesterEntity(diaryId: Int = 1, semesterId: Int = 1, start: LocalDate = LocalDate.now(), end: LocalDate = LocalDate.now(), semesterName: Int = 1) = Semester( @@ -72,6 +72,8 @@ fun getStudentEntity(mode: Sdk.Mode = Sdk.Mode.HEBE) = Student( symbol = "", userLoginId = 1, userName = "", + isEduOne = false, + isAuthorized = false ).apply { id = 1 } diff --git a/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt b/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt index 34a8fe991..2a63c6b80 100644 --- a/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt +++ b/app/src/test/java/io/github/wulkanowy/domain/GetMailboxByStudentUseCaseTest.kt @@ -222,5 +222,7 @@ class GetMailboxByStudentUseCaseTest { symbol = "", userLoginId = 1, userName = userName, + isAuthorized = false, + isEduOne = false ) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index 4f0f80fe1..ad7bbe15f 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -72,7 +72,9 @@ class GradeAverageProviderTest { className = "", classId = 1, isCurrent = true, - registrationDate = Instant.now() + registrationDate = Instant.now(), + isAuthorized = false, + isEduOne = false ) private val semesters = mutableListOf( diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index 34965f00d..d03337dc3 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -71,6 +71,8 @@ class LoginStudentSelectPresenterTest { classId = 0, isParent = false, semesters = listOf(), + isEduOne = false, + isAuthorized = false, ) private val school = RegisterUnit( diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt index 460c8385f..3e95774dd 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.main +import io.github.wulkanowy.MainCoroutineRule import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.services.sync.SyncManager @@ -7,14 +8,23 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.AdsHelper import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AppInfo -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.clearMocks +import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.verify import kotlinx.serialization.json.Json import org.junit.Before +import org.junit.Rule import org.junit.Test class MainPresenterTest { + @get:Rule + val coroutineRule = MainCoroutineRule() + @MockK(relaxed = true) lateinit var errorHandler: ErrorHandler From 6047af9ff0c18b7e291cf2fe9ff551ae0d5eefea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 20 Mar 2024 02:18:00 +0100 Subject: [PATCH 1415/1526] Version 2.5.2 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 12 ++++-------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7ecfc818b..e73784a55 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 150 - versionName "2.5.1" + versionCode 151 + versionName "2.5.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -165,7 +165,7 @@ play { track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS userFraction = 0.50d - updatePriority = 1 + updatePriority = 3 enabled.set(false) } @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.2-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.5.2' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 2a57977f1..6eafb6a99 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,11 +1,7 @@ -Wersja 2.5.1 +Wersja 2.5.2 -— dodaliśmy wyświetlanie ogłoszeń -— dodaliśmy opcję przywracania wiadomości z kosza -— dodaliśmy opcję wyciszania nadawców wiadomości -— naprawiliśmy opcjonalne liczenie średniej arytmetycznej, kiedy brak ocen z wagą w drugim semestrze -— usprawniliśmy ładowanie frekwencji i planu lekcji -— naprawiliśmy usprawiedliwianie nieobecności i autoryzację u użytkowników eduOne -— zmieniliśmy komunikat o zmienionym haśle +— naprawiliśmy omyłkowe wyświetlanie ekranu z wymaganą autoryzacją numerem PESEL +— naprawiliśmy kilka problemów ze stabilnością +— poprawiliśmy wyświetlanie kolorów we frekwencji Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From c9a42a6cf634c1225a922fb8a50cbc8c776e8943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 21 Mar 2024 11:03:08 +0100 Subject: [PATCH 1416/1526] Add try catch to initialize MobileAds SDK (#2497) --- app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt b/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt index bd17d52c1..a873c99ef 100644 --- a/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/AdsHelper.kt @@ -93,8 +93,12 @@ class AdsHelper @Inject constructor( private fun initializeMobileAds() { if (isMobileAdsInitializeCalled.getAndSet(true)) return - MobileAds.initialize(context) { - isMobileAdsSdkInitialized.value = true + try { + MobileAds.initialize(context) { + isMobileAdsSdkInitialized.value = true + } + } catch (e: Exception) { + Timber.e(e) } } From 5a77d1e94066457e65028ac4a807606e67b1d80e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 21 Mar 2024 21:19:49 +0100 Subject: [PATCH 1417/1526] Hide lesson number when is eduOne (#2498) --- .../ui/modules/timetable/TimetableAdapter.kt | 4 +++- .../wulkanowy/ui/modules/timetable/TimetableItem.kt | 2 ++ .../ui/modules/timetable/TimetablePresenter.kt | 13 ++++++++----- .../timetablewidget/TimetableWidgetFactory.kt | 12 ++++++------ .../modules/timetablewidget/TimetableWidgetItem.kt | 1 + 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index a957ef798..a4221a2a2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -27,7 +27,7 @@ class TimetableAdapter @Inject constructor() : override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) - return when (TimetableItemType.values()[viewType]) { + return when (TimetableItemType.entries[viewType]) { TimetableItemType.SMALL -> SmallViewHolder( ItemTimetableSmallBinding.inflate(inflater, parent, false) ) @@ -79,6 +79,7 @@ class TimetableAdapter @Inject constructor() : with(binding) { timetableSmallItemNumber.text = lesson.number.toString() + timetableSmallItemNumber.isVisible = item.isLessonNumberVisible timetableSmallItemSubject.text = lesson.subject timetableSmallItemTimeStart.text = lesson.start.toFormattedString("HH:mm") timetableSmallItemRoom.text = lesson.room @@ -97,6 +98,7 @@ class TimetableAdapter @Inject constructor() : with(binding) { timetableItemNumber.text = lesson.number.toString() + timetableItemNumber.isVisible = item.isLessonNumberVisible timetableItemSubject.text = lesson.subject timetableItemGroup.text = lesson.group timetableItemRoom.text = lesson.room diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt index 105ece38c..402b03dd9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt @@ -7,12 +7,14 @@ sealed class TimetableItem(val type: TimetableItemType) { data class Small( val lesson: Timetable, + val isLessonNumberVisible: Boolean, val onClick: (Timetable) -> Unit, ) : TimetableItem(TimetableItemType.SMALL) data class Normal( val lesson: Timetable, val showGroupsInPlan: Boolean, + val isLessonNumberVisible: Boolean, val timeLeft: TimeLeft?, val onClick: (Timetable) -> Unit, ) : TimetableItem(TimetableItemType.NORMAL) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index e83f25176..abaf7d86b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -57,6 +57,7 @@ class TimetablePresenter @Inject constructor( private var initialDate: LocalDate? = null private var isWeekendHasLessons: Boolean = false + private var isEduOne: Boolean = false var currentDate: LocalDate? = null private set @@ -149,6 +150,7 @@ class TimetablePresenter @Inject constructor( val student = studentRepository.getCurrentStudent() val semester = semesterRepository.getCurrentSemester(student) + isEduOne = student.isEduOne checkInitialAndCurrentDate(semester) timetableRepository.getTimetable( student = student, @@ -234,9 +236,8 @@ class TimetablePresenter @Inject constructor( if (prefRepository.showWholeClassPlan == TimetableMode.ONLY_CURRENT_GROUP) { it.isStudentPlan } else true - }.sortedWith( - compareBy({ item -> item.number }, { item -> !item.isStudentPlan }) - ) + } + .sortedWith(compareBy({ item -> item.start }, { item -> !item.isStudentPlan })) var prevNum = when (prefRepository.showTimetableGaps) { BETWEEN_AND_BEFORE_LESSONS -> 0 @@ -257,13 +258,15 @@ class TimetablePresenter @Inject constructor( lesson = it, showGroupsInPlan = prefRepository.showGroupsInPlan, timeLeft = filteredItems.getTimeLeftForLesson(it, i), - onClick = ::onTimetableItemSelected + onClick = ::onTimetableItemSelected, + isLessonNumberVisible = !isEduOne ) add(normalLesson) } else { val smallLesson = TimetableItem.Small( lesson = it, - onClick = ::onTimetableItemSelected + onClick = ::onTimetableItemSelected, + isLessonNumberVisible = !isEduOne ) add(smallLesson) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index 4cfc03229..5fb44a5e7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -46,11 +46,8 @@ class TimetableWidgetFactory( ) : RemoteViewsService.RemoteViewsFactory { private var items = emptyList() - private var timetableCanceledColor: Int? = null - private var textColor: Int? = null - private var timetableChangeColor: Int? = null override fun getLoadingView() = null @@ -81,7 +78,7 @@ class TimetableWidgetFactory( val lessons = getLessons(student, semester, date) val lastSync = timetableRepository.getLastRefreshTimestamp(semester, date, date) - createItems(lessons, lastSync) + createItems(lessons, lastSync, !student.isEduOne) } .onFailure { items = listOf(TimetableWidgetItem.Error(it)) @@ -106,12 +103,13 @@ class TimetableWidgetFactory( ): List { val timetable = timetableRepository.getTimetable(student, semester, date, date, false) val lessons = timetable.toFirstResult().dataOrThrow.lessons - return lessons.sortedBy { it.number } + return lessons.sortedBy { it.start } } private fun createItems( lessons: List, lastSync: Instant?, + isEduOne: Boolean ): List { var prevNum = when (prefRepository.showTimetableGaps) { BETWEEN_AND_BEFORE_LESSONS -> 0 @@ -127,7 +125,7 @@ class TimetableWidgetFactory( ) add(emptyItem) } - add(TimetableWidgetItem.Normal(it)) + add(TimetableWidgetItem.Normal(it, isEduOne)) prevNum = it.number } add(TimetableWidgetItem.Synchronized(lastSync ?: Instant.MIN)) @@ -155,9 +153,11 @@ class TimetableWidgetFactory( val lessonStartTime = lesson.start.toFormattedString(TIME_FORMAT_STYLE) val lessonEndTime = lesson.end.toFormattedString(TIME_FORMAT_STYLE) + val lessonNumberVisibility = if (item.isLessonNumberVisible) VISIBLE else GONE val remoteViews = RemoteViews(context.packageName, R.layout.item_widget_timetable).apply { setTextViewText(R.id.timetableWidgetItemNumber, lesson.number.toString()) + setViewVisibility(R.id.timetableWidgetItemNumber, lessonNumberVisibility) setTextViewText(R.id.timetableWidgetItemTimeStart, lessonStartTime) setTextViewText(R.id.timetableWidgetItemTimeFinish, lessonEndTime) setTextViewText(R.id.timetableWidgetItemSubject, lesson.subject) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt index fb02f8919..d4c2cfc00 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetItem.kt @@ -7,6 +7,7 @@ sealed class TimetableWidgetItem(val type: TimetableWidgetItemType) { data class Normal( val lesson: Timetable, + val isLessonNumberVisible: Boolean, ) : TimetableWidgetItem(TimetableWidgetItemType.NORMAL) data class Empty( From 0554aa91fd04bd489b93b634849cf9164f2a7e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 11 Mar 2024 23:38:39 +0100 Subject: [PATCH 1418/1526] Add WulkanowySdkFactory (#2479) --- .../io/github/wulkanowy/data/DataModule.kt | 21 ------ .../wulkanowy/data/WulkanowySdkFactory.kt | 65 +++++++++++++++++++ .../data/repositories/AttendanceRepository.kt | 18 +++-- .../AttendanceSummaryRepository.kt | 9 +-- .../CompletedLessonsRepository.kt | 9 +-- .../data/repositories/ConferenceRepository.kt | 9 +-- .../data/repositories/ExamRepository.kt | 9 +-- .../data/repositories/GradeRepository.kt | 9 +-- .../repositories/GradeStatisticsRepository.kt | 15 ++--- .../data/repositories/HomeworkRepository.kt | 9 +-- .../repositories/LuckyNumberRepository.kt | 9 +-- .../data/repositories/MessageRepository.kt | 59 ++++++++++------- .../repositories/MobileDeviceRepository.kt | 15 ++--- .../data/repositories/NoteRepository.kt | 9 +-- .../data/repositories/RecipientRepository.kt | 10 +-- .../data/repositories/RecoverRepository.kt | 20 ++++-- .../SchoolAnnouncementRepository.kt | 7 +- .../data/repositories/SchoolRepository.kt | 9 +-- .../data/repositories/SchoolsRepository.kt | 11 ++-- .../data/repositories/SemesterRepository.kt | 9 ++- .../repositories/StudentInfoRepository.kt | 12 ++-- .../data/repositories/StudentRepository.kt | 19 +++--- .../data/repositories/SubjectRepository.kt | 9 +-- .../data/repositories/TeacherRepository.kt | 9 +-- .../data/repositories/TimetableRepository.kt | 9 +-- .../ui/modules/captcha/CaptchaDialog.kt | 6 +- .../io/github/wulkanowy/utils/SdkExtension.kt | 43 ------------ .../wulkanowy/WulkanowySdkFactoryCreator.kt | 12 ++++ .../repositories/AttendanceRepositoryTest.kt | 10 +-- .../CompletedLessonsRepositoryTest.kt | 9 +-- .../data/repositories/ExamRemoteTest.kt | 9 +-- .../data/repositories/GradeRepositoryTest.kt | 9 +-- .../GradeStatisticsRepositoryTest.kt | 16 +++-- .../repositories/LuckyNumberRemoteTest.kt | 9 +-- .../repositories/MessageRepositoryTest.kt | 11 ++-- .../MobileDeviceRepositoryTest.kt | 10 +-- .../data/repositories/RecipientLocalTest.kt | 16 +++-- .../repositories/SemesterRepositoryTest.kt | 10 +-- .../repositories/TimetableRepositoryTest.kt | 9 +-- 39 files changed, 284 insertions(+), 284 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt create mode 100644 app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt diff --git a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt index 50d6c8f9f..a492c08db 100644 --- a/app/src/main/java/io/github/wulkanowy/data/DataModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/DataModule.kt @@ -18,17 +18,13 @@ import io.github.wulkanowy.data.api.SchoolsService import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.repositories.PreferencesRepository -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AppInfo -import io.github.wulkanowy.utils.RemoteConfigHelper -import io.github.wulkanowy.utils.WebkitCookieManagerProxy import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.create -import timber.log.Timber import java.util.concurrent.TimeUnit import javax.inject.Singleton @@ -36,23 +32,6 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) internal class DataModule { - @Singleton - @Provides - fun provideSdk( - chuckerInterceptor: ChuckerInterceptor, - remoteConfig: RemoteConfigHelper, - webkitCookieManagerProxy: WebkitCookieManagerProxy, - ) = Sdk().apply { - androidVersion = android.os.Build.VERSION.RELEASE - buildTag = android.os.Build.MODEL - userAgentTemplate = remoteConfig.userAgentTemplate - setSimpleHttpLogger { Timber.d(it) } - setAdditionalCookieManager(webkitCookieManagerProxy) - - // for debug only - addInterceptor(chuckerInterceptor, network = true) - } - @Singleton @Provides fun provideChuckerCollector( diff --git a/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt new file mode 100644 index 000000000..63890ea00 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt @@ -0,0 +1,65 @@ +package io.github.wulkanowy.data + +import com.chuckerteam.chucker.api.ChuckerInterceptor +import io.github.wulkanowy.data.db.entities.Semester +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.utils.RemoteConfigHelper +import io.github.wulkanowy.utils.WebkitCookieManagerProxy +import timber.log.Timber +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class WulkanowySdkFactory @Inject constructor( + private val chuckerInterceptor: ChuckerInterceptor, + private val remoteConfig: RemoteConfigHelper, + private val webkitCookieManagerProxy: WebkitCookieManagerProxy +) { + + private val sdk = Sdk().apply { + androidVersion = android.os.Build.VERSION.RELEASE + buildTag = android.os.Build.MODEL + userAgentTemplate = remoteConfig.userAgentTemplate + setSimpleHttpLogger { Timber.d(it) } + setAdditionalCookieManager(webkitCookieManagerProxy) + + // for debug only + addInterceptor(chuckerInterceptor, network = true) + } + + fun create() = sdk + + fun create(student: Student, semester: Semester? = null): Sdk { + return create().apply { + email = student.email + password = student.password + symbol = student.symbol + schoolSymbol = student.schoolSymbol + studentId = student.studentId + classId = student.classId + emptyCookieJarInterceptor = true + isEduOne = student.isEduOne + + if (Sdk.Mode.valueOf(student.loginMode) == Sdk.Mode.HEBE) { + mobileBaseUrl = student.mobileBaseUrl + } else { + scrapperBaseUrl = student.scrapperBaseUrl + domainSuffix = student.scrapperDomainSuffix + loginType = Sdk.ScrapperLoginType.valueOf(student.loginType) + } + + mode = Sdk.Mode.valueOf(student.loginMode) + mobileBaseUrl = student.mobileBaseUrl + keyId = student.certificateKey + privatePem = student.privateKey + + if (semester != null) { + diaryId = semester.diaryId + kindergartenDiaryId = semester.kindergartenDiaryId + schoolYear = semester.schoolYear + unitId = semester.unitId + } + } + } +} 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 46ea29f83..9b94cc103 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 @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.AttendanceDao import io.github.wulkanowy.data.db.dao.TimetableDao import io.github.wulkanowy.data.db.entities.Attendance @@ -7,14 +8,11 @@ import io.github.wulkanowy.data.db.entities.Semester 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.sdk.pojo.Absent 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.sync.Mutex @@ -28,7 +26,7 @@ import javax.inject.Singleton class AttendanceRepository @Inject constructor( private val attendanceDb: AttendanceDao, private val timetableDb: TimetableDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -59,8 +57,7 @@ class AttendanceRepository @Inject constructor( val lessons = timetableDb.load( semester.diaryId, semester.studentId, start.monday, end.sunday ) - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getAttendance(start.monday, end.sunday) .mapToEntities(semester, lessons) }, @@ -90,8 +87,10 @@ class AttendanceRepository @Inject constructor( } suspend fun excuseForAbsence( - student: Student, semester: Semester, - absenceList: List, reason: String? = null + student: Student, + semester: Semester, + absenceList: List, + reason: String? = null ) { val items = absenceList.map { attendance -> Absent( @@ -99,8 +98,7 @@ class AttendanceRepository @Inject constructor( timeId = attendance.timeId ) } - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .excuseForAbsence(items, reason) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt index c6cfc2f6b..78c98169b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt @@ -1,17 +1,15 @@ package io.github.wulkanowy.data.repositories import androidx.room.withTransaction +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -20,9 +18,9 @@ import javax.inject.Singleton @Singleton class AttendanceSummaryRepository @Inject constructor( private val attendanceDb: AttendanceSummaryDao, - private val sdk: Sdk, private val refreshHelper: AutoRefreshHelper, private val appDatabase: AppDatabase, + private val wulkanowySdkFactory: WulkanowySdkFactory, ) { private val saveFetchResultMutex = Mutex() @@ -43,8 +41,7 @@ class AttendanceSummaryRepository @Inject constructor( }, query = { attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getAttendanceSummary(subjectId) .mapToEntities(semester, subjectId) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt index f7f86b23d..45a36f55c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepository.kt @@ -1,17 +1,15 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.CompletedLessonsDao import io.github.wulkanowy.data.db.entities.Semester 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.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.sync.Mutex import java.time.LocalDate @@ -21,7 +19,7 @@ import javax.inject.Singleton @Singleton class CompletedLessonsRepository @Inject constructor( private val completedLessonsDb: CompletedLessonsDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -53,8 +51,7 @@ class CompletedLessonsRepository @Inject constructor( ) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getCompletedLessons(start.monday, end.sunday) .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt index fbe578604..58ce0091a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ConferenceRepository.kt @@ -1,16 +1,14 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.ConferenceDao import io.github.wulkanowy.data.db.entities.Conference import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -21,7 +19,7 @@ import javax.inject.Singleton @Singleton class ConferenceRepository @Inject constructor( private val conferenceDb: ConferenceDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -46,8 +44,7 @@ class ConferenceRepository @Inject constructor( conferenceDb.loadAll(semester.diaryId, student.studentId, startDate) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getConferences() .mapToEntities(semester) .filter { it.date >= startDate } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt index 9b8dd02e3..89dbcd5ce 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt @@ -1,18 +1,16 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.ExamDao import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.endExamsDay import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.startExamsDay -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -23,7 +21,7 @@ import javax.inject.Singleton @Singleton class ExamRepository @Inject constructor( private val examDb: ExamDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -56,8 +54,7 @@ class ExamRepository @Inject constructor( ) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getExams(start.startExamsDay, start.endExamsDay) .mapToEntities(semester) }, 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 ac1ef541b..e899f900d 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 @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.GradeDao import io.github.wulkanowy.data.db.dao.GradeDescriptiveDao import io.github.wulkanowy.data.db.dao.GradeSummaryDao @@ -10,11 +11,8 @@ import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.toLocalDate import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow @@ -30,7 +28,7 @@ class GradeRepository @Inject constructor( private val gradeDb: GradeDao, private val gradeSummaryDb: GradeSummaryDao, private val gradeDescriptiveDb: GradeDescriptiveDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -63,8 +61,7 @@ class GradeRepository @Inject constructor( } }, fetch = { - val (details, summary, descriptive) = sdk.init(student) - .switchSemester(semester) + val (details, summary, descriptive) = wulkanowySdkFactory.create(student, semester) .getGrades(semester.semesterId) Triple( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt index 809f92d3e..f120d34f3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.GradePartialStatisticsDao import io.github.wulkanowy.data.db.dao.GradePointsStatisticsDao import io.github.wulkanowy.data.db.dao.GradeSemesterStatisticsDao @@ -12,11 +13,8 @@ import io.github.wulkanowy.data.mappers.mapPointsToStatisticsItems import io.github.wulkanowy.data.mappers.mapSemesterToStatisticItems import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.networkBoundResource -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import java.util.Locale @@ -28,7 +26,7 @@ class GradeStatisticsRepository @Inject constructor( private val gradePartialStatisticsDb: GradePartialStatisticsDao, private val gradePointsStatisticsDb: GradePointsStatisticsDao, private val gradeSemesterStatisticsDb: GradeSemesterStatisticsDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -56,8 +54,7 @@ class GradeStatisticsRepository @Inject constructor( }, query = { gradePartialStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getGradesPartialStatistics(semester.semesterId) .mapToEntities(semester) }, @@ -104,8 +101,7 @@ class GradeStatisticsRepository @Inject constructor( }, query = { gradeSemesterStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getGradesSemesterStatistics(semester.semesterId) .mapToEntities(semester) }, @@ -163,8 +159,7 @@ class GradeStatisticsRepository @Inject constructor( }, query = { gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getGradesPointsStatistics(semester.semesterId) .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt index 1a9c7ffaf..7893ef631 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt @@ -1,18 +1,16 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.HomeworkDao import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Semester 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.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.sync.Mutex import java.time.LocalDate @@ -22,7 +20,7 @@ import javax.inject.Singleton @Singleton class HomeworkRepository @Inject constructor( private val homeworkDb: HomeworkDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -55,8 +53,7 @@ class HomeworkRepository @Inject constructor( ) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getHomework(start.monday, end.sunday) .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt index 45b7f6e29..3636cb51e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/LuckyNumberRepository.kt @@ -1,12 +1,11 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.LuckyNumberDao import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.data.networkBoundResource -import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.utils.init import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.sync.Mutex @@ -18,7 +17,7 @@ import javax.inject.Singleton @Singleton class LuckyNumberRepository @Inject constructor( private val luckyNumberDb: LuckyNumberDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, ) { private val saveFetchResultMutex = Mutex() @@ -33,7 +32,9 @@ class LuckyNumberRepository @Inject constructor( shouldFetch = { it == null || forceRefresh }, query = { luckyNumberDb.load(student.studentId, now()) }, fetch = { - sdk.init(student).getLuckyNumber(student.schoolShortName)?.mapToEntity(student) + wulkanowySdkFactory.create(student) + .getLuckyNumber(student.schoolShortName) + ?.mapToEntity(student) }, saveFetchResult = { oldLuckyNumber, newLuckyNumber -> newLuckyNumber ?: return@networkBoundResource diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt index a4517760b..ede2a0fde 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessageRepository.kt @@ -4,6 +4,7 @@ import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.data.Resource +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.dao.MailboxDao import io.github.wulkanowy.data.db.dao.MessageAttachmentDao @@ -29,11 +30,9 @@ import io.github.wulkanowy.data.pojos.MessageDraft import io.github.wulkanowy.data.toFirstResult import io.github.wulkanowy.data.waitForResult import io.github.wulkanowy.domain.messages.GetMailboxByStudentUseCase -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Folder import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -48,7 +47,7 @@ class MessageRepository @Inject constructor( private val messagesDb: MessagesDao, private val mutedMessageSendersDao: MutedMessageSendersDao, private val messageAttachmentDao: MessageAttachmentDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, @ApplicationContext private val context: Context, private val refreshHelper: AutoRefreshHelper, private val sharedPrefProvider: SharedPrefProvider, @@ -82,10 +81,16 @@ class MessageRepository @Inject constructor( } else messagesDb.loadMessagesWithMutedAuthor(mailbox.globalKey, folder.id) }, fetch = { - sdk.init(student).getMessages( - folder = Folder.valueOf(folder.name), - mailboxKey = mailbox?.globalKey, - ).mapToEntities(student, mailbox, mailboxDao.loadAll(student.email)) + wulkanowySdkFactory.create(student) + .getMessages( + folder = Folder.valueOf(folder.name), + mailboxKey = mailbox?.globalKey, + ) + .mapToEntities( + student = student, + mailbox = mailbox, + allMailboxes = mailboxDao.loadAll(student.email) + ) }, saveFetchResult = { oldWithAuthors, new -> val old = oldWithAuthors.map { it.message } @@ -115,10 +120,11 @@ class MessageRepository @Inject constructor( }, query = { messagesDb.loadMessageWithAttachment(message.messageGlobalKey) }, fetch = { - sdk.init(student).getMessageDetails( - messageKey = it!!.message.messageGlobalKey, - markAsRead = message.unread && markAsRead, - ) + wulkanowySdkFactory.create(student) + .getMessageDetails( + messageKey = it!!.message.messageGlobalKey, + markAsRead = message.unread && markAsRead, + ) }, saveFetchResult = { old, new -> checkNotNull(old) { "Fetched message no longer exist!" } @@ -159,19 +165,19 @@ class MessageRepository @Inject constructor( recipients: List, mailbox: Mailbox, ) { - sdk.init(student).sendMessage( - subject = subject, - content = content, - recipients = recipients.mapFromEntities(), - mailboxId = mailbox.globalKey, - ) + wulkanowySdkFactory.create(student) + .sendMessage( + subject = subject, + content = content, + recipients = recipients.mapFromEntities(), + mailboxId = mailbox.globalKey, + ) refreshFolders(student, mailbox, listOf(SENT)) } suspend fun restoreMessages(student: Student, mailbox: Mailbox?, messages: List) { - sdk.init(student).restoreMessages( - messages = messages.map { it.messageGlobalKey }, - ) + wulkanowySdkFactory.create(student) + .restoreMessages(messages = messages.map { it.messageGlobalKey }) refreshFolders(student, mailbox) } @@ -182,10 +188,11 @@ class MessageRepository @Inject constructor( suspend fun deleteMessages(student: Student, messages: List) { val firstMessage = messages.first() - sdk.init(student).deleteMessages( - messages = messages.map { it.messageGlobalKey }, - removeForever = firstMessage.folderId == TRASHED.id, - ) + wulkanowySdkFactory.create(student) + .deleteMessages( + messages = messages.map { it.messageGlobalKey }, + removeForever = firstMessage.folderId == TRASHED.id, + ) if (firstMessage.folderId != TRASHED.id) { val deletedMessages = messages.map { @@ -230,7 +237,9 @@ class MessageRepository @Inject constructor( }, query = { mailboxDao.loadAll(student.email, student.symbol, student.schoolSymbol) }, fetch = { - sdk.init(student).getMailboxes().mapToEntities(student) + wulkanowySdkFactory.create(student) + .getMailboxes() + .mapToEntities(student) }, saveFetchResult = { old, new -> mailboxDao.deleteAll(old uniqueSubtract new) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt index 48b4fc287..19466554a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.MobileDeviceDao import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Semester @@ -8,11 +9,8 @@ import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.mappers.mapToMobileDeviceToken import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.data.pojos.MobileDeviceToken -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -21,7 +19,7 @@ import javax.inject.Singleton @Singleton class MobileDeviceRepository @Inject constructor( private val mobileDb: MobileDeviceDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -42,8 +40,7 @@ class MobileDeviceRepository @Inject constructor( }, query = { mobileDb.loadAll(student.userLoginId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getRegisteredDevices() .mapToEntities(student) }, @@ -57,16 +54,14 @@ class MobileDeviceRepository @Inject constructor( ) suspend fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice) { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .unregisterDevice(device.deviceId) mobileDb.deleteAll(listOf(device)) } suspend fun getToken(student: Student, semester: Semester): MobileDeviceToken { - return sdk.init(student) - .switchSemester(semester) + return wulkanowySdkFactory.create(student, semester) .getToken() .mapToMobileDeviceToken() } 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 feb92c154..9551e01eb 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 @@ -1,16 +1,14 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.NoteDao import io.github.wulkanowy.data.db.entities.Note import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.toLocalDate import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow @@ -21,7 +19,7 @@ import javax.inject.Singleton @Singleton class NoteRepository @Inject constructor( private val noteDb: NoteDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -45,8 +43,7 @@ class NoteRepository @Inject constructor( }, query = { noteDb.loadAll(student.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getNotes() .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt index 4a1474ced..8233d932e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/RecipientRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.RecipientDao import io.github.wulkanowy.data.db.entities.Mailbox import io.github.wulkanowy.data.db.entities.MailboxType @@ -7,10 +8,8 @@ import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.uniqueSubtract import javax.inject.Inject import javax.inject.Singleton @@ -18,14 +17,15 @@ import javax.inject.Singleton @Singleton class RecipientRepository @Inject constructor( private val recipientDb: RecipientDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { private val cacheKey = "recipient" suspend fun refreshRecipients(student: Student, mailbox: Mailbox, type: MailboxType) { - val new = sdk.init(student).getRecipients(mailbox.globalKey) + val new = wulkanowySdkFactory.create(student) + .getRecipients(mailbox.globalKey) .mapToEntities(mailbox.globalKey) val old = recipientDb.loadAll(type, mailbox.globalKey) @@ -60,7 +60,7 @@ class RecipientRepository @Inject constructor( ): List { mailbox ?: return emptyList() - return sdk.init(student) + return wulkanowySdkFactory.create(student) .getMessageReplayDetails(message.messageGlobalKey) .sender .let(::listOf) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt index 5940f477b..b554bda0f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/RecoverRepository.kt @@ -1,17 +1,23 @@ package io.github.wulkanowy.data.repositories -import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.data.WulkanowySdkFactory import javax.inject.Inject import javax.inject.Singleton @Singleton -class RecoverRepository @Inject constructor(private val sdk: Sdk) { +class RecoverRepository @Inject constructor( + private val wulkanowySdkFactory: WulkanowySdkFactory +) { - suspend fun getReCaptchaSiteKey(host: String, symbol: String): Pair { - return sdk.getPasswordResetCaptchaCode(host, symbol) - } + suspend fun getReCaptchaSiteKey(host: String, symbol: String): Pair = + wulkanowySdkFactory.create() + .getPasswordResetCaptchaCode(host, symbol) suspend fun sendRecoverRequest( - url: String, symbol: String, email: String, reCaptchaResponse: String - ): String = sdk.sendPasswordResetRequest(url, symbol, email, reCaptchaResponse) + url: String, + symbol: String, + email: String, + reCaptchaResponse: String + ): String = wulkanowySdkFactory.create() + .sendPasswordResetRequest(url, symbol, email, reCaptchaResponse) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt index f09a46aa1..6a04ce75f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt @@ -1,14 +1,13 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.SchoolAnnouncementDao import io.github.wulkanowy.data.db.entities.SchoolAnnouncement 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex @@ -18,7 +17,7 @@ import javax.inject.Singleton @Singleton class SchoolAnnouncementRepository @Inject constructor( private val schoolAnnouncementDb: SchoolAnnouncementDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -41,7 +40,7 @@ class SchoolAnnouncementRepository @Inject constructor( schoolAnnouncementDb.loadAll(student.userLoginId) }, fetch = { - val sdk = sdk.init(student) + val sdk = wulkanowySdkFactory.create(student) val lastAnnouncements = sdk.getLastAnnouncements().mapToEntities(student) val directorInformation = sdk.getDirectorInformation().mapToEntities(student) lastAnnouncements + directorInformation diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt index b42b4d577..c48abb6f8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolRepository.kt @@ -1,15 +1,13 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.SchoolDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.data.networkBoundResource -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -17,7 +15,7 @@ import javax.inject.Singleton @Singleton class SchoolRepository @Inject constructor( private val schoolDb: SchoolDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -40,8 +38,7 @@ class SchoolRepository @Inject constructor( }, query = { schoolDb.load(semester.studentId, semester.classId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getSchool() .mapToEntity(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt index 216a8c112..4a16d6f13 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolsRepository.kt @@ -1,17 +1,15 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.api.SchoolsService import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.pojos.IntegrityRequest import io.github.wulkanowy.data.pojos.LoginEvent -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.utils.IntegrityHelper import io.github.wulkanowy.utils.getCurrentOrLast -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.withTimeout import timber.log.Timber import java.util.UUID @@ -23,7 +21,7 @@ import kotlin.time.Duration.Companion.seconds class SchoolsRepository @Inject constructor( private val integrityHelper: IntegrityHelper, private val schoolsService: SchoolsService, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, ) { suspend fun logSchoolLogin(loginData: LoginData, students: List) { @@ -40,10 +38,9 @@ class SchoolsRepository @Inject constructor( private suspend fun logLogin(loginData: LoginData, student: Student, semester: Semester) { val requestId = UUID.randomUUID().toString() val token = integrityHelper.getIntegrityToken(requestId) ?: return + val updatedStudent = student.copy(password = loginData.password) - val schoolInfo = sdk - .init(student.copy(password = loginData.password)) - .switchSemester(semester) + val schoolInfo = wulkanowySdkFactory.create(updatedStudent, semester) .getSchool() schoolsService.logLoginEvent( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt index 9ae22babc..da21f59ac 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student @@ -7,7 +8,6 @@ import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.getCurrentOrLast -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.isCurrent import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.withContext @@ -18,7 +18,7 @@ import javax.inject.Singleton @Singleton class SemesterRepository @Inject constructor( private val semesterDb: SemesterDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val dispatchers: DispatchersProvider, ) { @@ -60,7 +60,10 @@ class SemesterRepository @Inject constructor( } private suspend fun refreshSemesters(student: Student) { - val new = sdk.init(student).getSemesters().mapToEntities(student.studentId) + val new = wulkanowySdkFactory.create(student) + .getSemesters() + .mapToEntities(student.studentId) + if (new.isEmpty()) return Timber.i("Empty semester list!") val old = semesterDb.loadAll(student.studentId, student.classId) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt index d42be180d..db4c0aebb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentInfoRepository.kt @@ -1,13 +1,11 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.StudentInfoDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntity import io.github.wulkanowy.data.networkBoundResource -import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.sync.Mutex import javax.inject.Inject import javax.inject.Singleton @@ -15,7 +13,7 @@ import javax.inject.Singleton @Singleton class StudentInfoRepository @Inject constructor( private val studentInfoDao: StudentInfoDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, ) { private val saveFetchResultMutex = Mutex() @@ -30,9 +28,9 @@ class StudentInfoRepository @Inject constructor( shouldFetch = { it == null || forceRefresh }, query = { studentInfoDao.loadStudentInfo(student.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) - .getStudentInfo().mapToEntity(semester) + wulkanowySdkFactory.create(student, semester) + .getStudentInfo() + .mapToEntity(semester) }, saveFetchResult = { old, new -> if (old != null && new != old) { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index 353e7ddd2..a5fea4ecb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.repositories import androidx.room.withTransaction +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.dao.StudentDao @@ -16,9 +17,7 @@ import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.getCurrentOrLast -import io.github.wulkanowy.utils.init import io.github.wulkanowy.utils.security.Scrambler -import io.github.wulkanowy.utils.switchSemester import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @@ -28,7 +27,7 @@ class StudentRepository @Inject constructor( private val dispatchers: DispatchersProvider, private val studentDb: StudentDao, private val semesterDb: SemesterDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val appDatabase: AppDatabase, private val scrambler: Scrambler, ) { @@ -39,7 +38,7 @@ class StudentRepository @Inject constructor( pin: String, symbol: String, token: String - ): RegisterUser = sdk + ): RegisterUser = wulkanowySdkFactory.create() .getStudentsFromHebe(token, pin, symbol, "") .mapToPojo(null) @@ -49,7 +48,7 @@ class StudentRepository @Inject constructor( scrapperBaseUrl: String, domainSuffix: String, symbol: String - ): RegisterUser = sdk + ): RegisterUser = wulkanowySdkFactory.create() .getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, domainSuffix, symbol) .mapToPojo(password) @@ -58,7 +57,7 @@ class StudentRepository @Inject constructor( password: String, scrapperBaseUrl: String, symbol: String - ): RegisterUser = sdk + ): RegisterUser = wulkanowySdkFactory.create() .getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol) .mapToPojo(password) @@ -110,7 +109,7 @@ class StudentRepository @Inject constructor( studentId = student.studentId, classId = student.classId, ).getCurrentOrLast() - val initializedSdk = sdk.init(student).switchSemester(currentSemester) + val initializedSdk = wulkanowySdkFactory.create(student, currentSemester) val isAuthorized = initializedSdk.getCurrentStudent()?.isAuthorized ?: false if (isAuthorized) { @@ -170,13 +169,11 @@ class StudentRepository @Inject constructor( .distinctBy { it.student.studentName }.size == 1 suspend fun authorizePermission(student: Student, semester: Semester, pesel: String) = - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .authorizePermission(pesel) suspend fun refreshStudentName(student: Student, semester: Semester) { - val newCurrentApiStudent = sdk.init(student) - .switchSemester(semester) + val newCurrentApiStudent = wulkanowySdkFactory.create(student, semester) .getCurrentStudent() ?: return val studentName = StudentName( diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt index cf7f86c22..573c7c149 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepository.kt @@ -1,15 +1,13 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.SubjectDao import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -18,7 +16,7 @@ import javax.inject.Singleton @Singleton class SubjectRepository @Inject constructor( private val subjectDao: SubjectDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -39,8 +37,7 @@ class SubjectRepository @Inject constructor( }, query = { subjectDao.loadAll(semester.diaryId, semester.studentId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getSubjects() .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt index 5a488b27c..a5a6e3f9c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TeacherRepository.kt @@ -1,15 +1,13 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.TeacherDao import io.github.wulkanowy.data.db.entities.Semester 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.utils.AutoRefreshHelper import io.github.wulkanowy.utils.getRefreshKey -import io.github.wulkanowy.utils.init -import io.github.wulkanowy.utils.switchSemester import io.github.wulkanowy.utils.uniqueSubtract import kotlinx.coroutines.sync.Mutex import javax.inject.Inject @@ -18,7 +16,7 @@ import javax.inject.Singleton @Singleton class TeacherRepository @Inject constructor( private val teacherDb: TeacherDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val refreshHelper: AutoRefreshHelper, ) { @@ -39,8 +37,7 @@ class TeacherRepository @Inject constructor( }, query = { teacherDb.loadAll(semester.studentId, semester.classId) }, fetch = { - sdk.init(student) - .switchSemester(semester) + wulkanowySdkFactory.create(student, semester) .getTeachers() .mapToEntities(semester) }, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt index 0d208c1fc..335789991 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.db.dao.TimetableAdditionalDao import io.github.wulkanowy.data.db.dao.TimetableDao import io.github.wulkanowy.data.db.dao.TimetableHeaderDao @@ -11,14 +12,11 @@ import io.github.wulkanowy.data.db.entities.TimetableHeader import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.data.pojos.TimetableFull -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper 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.combine @@ -33,7 +31,7 @@ class TimetableRepository @Inject constructor( private val timetableDb: TimetableDao, private val timetableAdditionalDb: TimetableAdditionalDao, private val timetableHeaderDb: TimetableHeaderDao, - private val sdk: Sdk, + private val wulkanowySdkFactory: WulkanowySdkFactory, private val schedulerHelper: TimetableNotificationSchedulerHelper, private val refreshHelper: AutoRefreshHelper, ) { @@ -74,8 +72,7 @@ class TimetableRepository @Inject constructor( }, query = { getFullTimetableFromDatabase(student, semester, start, end) }, fetch = { - val timetableFull = sdk.init(student) - .switchSemester(semester) + val timetableFull = wulkanowySdkFactory.create(student, semester) .getTimetable(start.monday, end.sunday) timetableFull.mapToEntities(semester) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt index 98b4fda71..ce2173d28 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/captcha/CaptchaDialog.kt @@ -10,8 +10,8 @@ import android.webkit.WebViewClient import androidx.core.os.bundleOf import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R +import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.databinding.DialogCaptchaBinding -import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.ui.base.BaseDialogFragment import io.github.wulkanowy.utils.WebkitCookieManagerProxy import timber.log.Timber @@ -21,7 +21,7 @@ import javax.inject.Inject class CaptchaDialog : BaseDialogFragment() { @Inject - lateinit var sdk: Sdk + lateinit var wulkanowySdkFactory: WulkanowySdkFactory @Inject lateinit var webkitCookieManagerProxy: WebkitCookieManagerProxy @@ -59,7 +59,7 @@ class CaptchaDialog : BaseDialogFragment() { webView = this with(settings) { javaScriptEnabled = true - userAgentString = sdk.userAgent + userAgentString = wulkanowySdkFactory.create().userAgent } webViewClient = object : WebViewClient() { diff --git a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt index 77f03fb88..e69de29bb 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt @@ -1,43 +0,0 @@ -package io.github.wulkanowy.utils - -import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.sdk.Sdk -import timber.log.Timber - -fun Sdk.init(student: Student): Sdk { - email = student.email - password = student.password - symbol = student.symbol - schoolSymbol = student.schoolSymbol - studentId = student.studentId - classId = student.classId - isEduOne = student.isEduOne - emptyCookieJarInterceptor = true - - if (Sdk.Mode.valueOf(student.loginMode) == Sdk.Mode.HEBE) { - mobileBaseUrl = student.mobileBaseUrl - } else { - scrapperBaseUrl = student.scrapperBaseUrl - domainSuffix = student.scrapperDomainSuffix - loginType = Sdk.ScrapperLoginType.valueOf(student.loginType) - } - - mode = Sdk.Mode.valueOf(student.loginMode) - mobileBaseUrl = student.mobileBaseUrl - keyId = student.certificateKey - privatePem = student.privateKey - - Timber.d("Sdk in ${student.loginMode} mode reinitialized") - - return this -} - -fun Sdk.switchSemester(semester: Semester): Sdk { - return switchDiary( - diaryId = semester.diaryId, - kindergartenDiaryId = semester.kindergartenDiaryId, - schoolYear = semester.schoolYear, - unitId = semester.unitId, - ) -} diff --git a/app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt b/app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt new file mode 100644 index 000000000..dd1ce0569 --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt @@ -0,0 +1,12 @@ +package io.github.wulkanowy + +import io.github.wulkanowy.data.WulkanowySdkFactory +import io.github.wulkanowy.sdk.Sdk +import io.mockk.every +import io.mockk.mockk + +fun createWulkanowySdkFactoryMock(sdk: Sdk) = mockk() + .apply { + every { create() } returns sdk + every { create(any(), any()) } answers { callOriginal() } + } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt index e64144c2f..b34902363 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/AttendanceRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.AttendanceDao import io.github.wulkanowy.data.db.dao.TimetableDao @@ -16,8 +17,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest @@ -30,8 +31,8 @@ import io.github.wulkanowy.sdk.pojo.Attendance as SdkAttendance class AttendanceRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var attendanceDb: AttendanceDao @@ -63,7 +64,8 @@ class AttendanceRepositoryTest { every { refreshHelper.shouldBeRefreshed(any()) } returns false coEvery { timetableDb.load(any(), any(), any(), any()) } returns emptyList() - attendanceRepository = AttendanceRepository(attendanceDb, timetableDb, sdk, refreshHelper) + attendanceRepository = + AttendanceRepository(attendanceDb, timetableDb, wulkanowySdkFactory, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt index f8f688501..e20603d22 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/CompletedLessonsRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.CompletedLessonsDao import io.github.wulkanowy.data.errorOrNull @@ -15,8 +16,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals @@ -28,8 +29,8 @@ import io.github.wulkanowy.sdk.pojo.CompletedLesson as SdkCompletedLesson class CompletedLessonsRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var completedLessonDb: CompletedLessonsDao @@ -58,7 +59,7 @@ class CompletedLessonsRepositoryTest { every { refreshHelper.shouldBeRefreshed(any()) } returns false completedLessonRepository = - CompletedLessonsRepository(completedLessonDb, sdk, refreshHelper) + CompletedLessonsRepository(completedLessonDb, wulkanowySdkFactory, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt index d1ed9ca32..671c66f95 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/ExamRemoteTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.ExamDao import io.github.wulkanowy.data.errorOrNull @@ -15,8 +16,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest @@ -28,8 +29,8 @@ import io.github.wulkanowy.sdk.pojo.Exam as SdkExam class ExamRemoteTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var examDb: ExamDao @@ -59,7 +60,7 @@ class ExamRemoteTest { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - examRepository = ExamRepository(examDb, sdk, refreshHelper) + examRepository = ExamRepository(examDb, wulkanowySdkFactory, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt index 0ea5d3fa4..0045badf1 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.GradeDao import io.github.wulkanowy.data.db.dao.GradeDescriptiveDao @@ -18,8 +19,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest @@ -35,8 +36,8 @@ import io.github.wulkanowy.sdk.pojo.Grade as SdkGrade class GradeRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var gradeDb: GradeDao @@ -65,7 +66,7 @@ class GradeRepositoryTest { gradeDb = gradeDb, gradeSummaryDb = gradeSummaryDb, gradeDescriptiveDb = gradeDescriptiveDb, - sdk = sdk, + wulkanowySdkFactory = wulkanowySdkFactory, refreshHelper = refreshHelper, ) diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt index dfd36ee1a..6733190b7 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/GradeStatisticsRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.GradePartialStatisticsDao import io.github.wulkanowy.data.db.dao.GradePointsStatisticsDao @@ -13,9 +14,14 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.GradeStatisticsItem import io.github.wulkanowy.sdk.pojo.GradeStatisticsSubject import io.github.wulkanowy.utils.AutoRefreshHelper -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK +import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals @@ -24,8 +30,8 @@ import org.junit.Test class GradeStatisticsRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var gradePartialStatisticsDb: GradePartialStatisticsDao @@ -54,7 +60,7 @@ class GradeStatisticsRepositoryTest { gradePartialStatisticsDb = gradePartialStatisticsDb, gradePointsStatisticsDb = gradePointsStatisticsDb, gradeSemesterStatisticsDb = gradeSemesterStatisticsDb, - sdk = sdk, + wulkanowySdkFactory = wulkanowySdkFactory, refreshHelper = refreshHelper, ) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt index fa78b1bd3..854d5d548 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/LuckyNumberRemoteTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.LuckyNumberDao import io.github.wulkanowy.data.errorOrNull @@ -12,8 +13,8 @@ import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerify import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest @@ -25,8 +26,8 @@ import io.github.wulkanowy.sdk.pojo.LuckyNumber as SdkLuckyNumber class LuckyNumberRemoteTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var luckyNumberDb: LuckyNumberDao @@ -43,7 +44,7 @@ class LuckyNumberRemoteTest { fun setUp() { MockKAnnotations.init(this) - luckyNumberRepository = LuckyNumberRepository(luckyNumberDb, sdk) + luckyNumberRepository = LuckyNumberRepository(luckyNumberDb, wulkanowySdkFactory) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt index fbbe49345..9819fb1f7 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MessageRepositoryTest.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.repositories import android.content.Context +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.dao.MailboxDao @@ -28,10 +29,9 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just import io.mockk.mockk -import kotlinx.coroutines.ExperimentalCoroutinesApi +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking @@ -45,11 +45,10 @@ import java.time.Instant import java.time.ZoneOffset import kotlin.test.assertTrue -@OptIn(ExperimentalCoroutinesApi::class) class MessageRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var messageDb: MessagesDao @@ -102,7 +101,7 @@ class MessageRepositoryTest { messagesDb = messageDb, mutedMessageSendersDao = mutesDb, messageAttachmentDao = messageAttachmentDao, - sdk = sdk, + wulkanowySdkFactory = wulkanowySdkFactory, context = context, refreshHelper = refreshHelper, sharedPrefProvider = sharedPrefProvider, diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt index aa93a5e6f..5513a95fe 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/MobileDeviceRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.MobileDeviceDao import io.github.wulkanowy.data.errorOrNull @@ -16,8 +17,8 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.Assert @@ -28,8 +29,8 @@ import java.time.ZonedDateTime.of class MobileDeviceRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var mobileDeviceDb: MobileDeviceDao @@ -53,7 +54,8 @@ class MobileDeviceRepositoryTest { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - mobileDeviceRepository = MobileDeviceRepository(mobileDeviceDb, sdk, refreshHelper) + mobileDeviceRepository = + MobileDeviceRepository(mobileDeviceDb, wulkanowySdkFactory, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt index e608cafb1..0ecaad9ea 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/RecipientLocalTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.db.dao.RecipientDao import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.getMailboxEntity @@ -7,9 +8,14 @@ import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.MailboxType import io.github.wulkanowy.utils.AutoRefreshHelper -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK +import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before @@ -18,8 +24,8 @@ import io.github.wulkanowy.sdk.pojo.Recipient as SdkRecipient class RecipientLocalTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var recipientDb: RecipientDao @@ -63,7 +69,7 @@ class RecipientLocalTest { MockKAnnotations.init(this) every { refreshHelper.shouldBeRefreshed(any()) } returns false - recipientRepository = RecipientRepository(recipientDb, sdk, refreshHelper) + recipientRepository = RecipientRepository(recipientDb, wulkanowySdkFactory, refreshHelper) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt index 96db8a794..3a18ac48a 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.data.repositories import io.github.wulkanowy.TestDispatchersProvider +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.getSemesterEntity @@ -12,8 +13,8 @@ import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerify import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just +import io.mockk.spyk import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals @@ -24,8 +25,8 @@ import java.time.LocalDate.now class SemesterRepositoryTest { - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var semesterDb: SemesterDao @@ -38,7 +39,8 @@ class SemesterRepositoryTest { fun initTest() { MockKAnnotations.init(this) - semesterRepository = SemesterRepository(semesterDb, sdk, TestDispatchersProvider()) + semesterRepository = + SemesterRepository(semesterDb, wulkanowySdkFactory, TestDispatchersProvider()) } @Test diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt index 2a61f99ce..a14605435 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/TimetableRepositoryTest.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.data.repositories +import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.dataOrNull import io.github.wulkanowy.data.db.dao.TimetableAdditionalDao import io.github.wulkanowy.data.db.dao.TimetableDao @@ -18,9 +19,9 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.impl.annotations.SpyK import io.mockk.just import io.mockk.mockk +import io.mockk.spyk import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals @@ -37,8 +38,8 @@ class TimetableRepositoryTest { @MockK(relaxed = true) private lateinit var timetableNotificationSchedulerHelper: TimetableNotificationSchedulerHelper - @SpyK - private var sdk = Sdk() + private var sdk = spyk() + private val wulkanowySdkFactory = createWulkanowySdkFactoryMock(sdk) @MockK private lateinit var timetableDb: TimetableDao @@ -71,7 +72,7 @@ class TimetableRepositoryTest { timetableDb, timetableAdditionalDao, timetableHeaderDao, - sdk, + wulkanowySdkFactory, timetableNotificationSchedulerHelper, refreshHelper ) From b280316b07cf8093704abed1cb014c4c35393cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 21 Mar 2024 23:06:18 +0100 Subject: [PATCH 1419/1526] Bump sdk to 2.5.3-SNAPSHOT --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e73784a55..2d5d46663 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.2' + implementation 'io.github.wulkanowy:sdk:2.5.3-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' From a0818de7d14801cd820b359f1df84e80b72f880a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 24 Mar 2024 14:55:05 +0100 Subject: [PATCH 1420/1526] Add isAdded condition to HomeworkAddDialog (#2499) --- .../wulkanowy/ui/modules/homework/add/HomeworkAddDialog.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddDialog.kt index c51370ea7..400d9f46b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/add/HomeworkAddDialog.kt @@ -98,7 +98,9 @@ class HomeworkAddDialog : BaseDialogFragment(), Homewo rangeEnd = LocalDate.now().lastSchoolDayInSchoolYear, onDateSelected = { date = it - binding.homeworkDialogDate.editText?.setText(date!!.toFormattedString()) + if (isAdded) { + binding.homeworkDialogDate.editText?.setText(date!!.toFormattedString()) + } } ) } From 3a55c3c760e308d6c7d493efa32e3d46dd2885ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 24 Mar 2024 18:55:23 +0100 Subject: [PATCH 1421/1526] Add ignoring FeatureUnavailableException in SyncWorker (#2500) --- .../main/java/io/github/wulkanowy/services/sync/SyncWorker.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt index 5dddd9a78..bcbc23ef2 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt @@ -17,6 +17,7 @@ import io.github.wulkanowy.data.repositories.SemesterRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureUnavailableException import io.github.wulkanowy.services.sync.channels.DebugChannel import io.github.wulkanowy.services.sync.works.Work import io.github.wulkanowy.utils.DispatchersProvider @@ -48,6 +49,7 @@ class SyncWorker @AssistedInject constructor( val semester = semesterRepository.getCurrentSemester(student, true) student to semester } catch (e: Throwable) { + Timber.e(e) return@withContext getResultFromErrors(listOf(e)) } @@ -59,7 +61,7 @@ class SyncWorker @AssistedInject constructor( null } catch (e: Throwable) { Timber.w("${work::class.java.simpleName} result: An exception ${e.message} occurred") - if (e is FeatureDisabledException || e is FeatureNotAvailableException) { + if (e is FeatureDisabledException || e is FeatureNotAvailableException || e is FeatureUnavailableException) { null } else { Timber.e(e) From 76d038eefabfeb0a8522941695c9d786555daf09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sun, 24 Mar 2024 19:42:36 +0100 Subject: [PATCH 1422/1526] Hide grade statistics when is eduOne, add isEduOne flag migration (#2496) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- .../63.json | 2547 +++++++++++++++++ .../wulkanowy/data/WulkanowySdkFactory.kt | 54 +- .../github/wulkanowy/data/db/AppDatabase.kt | 4 +- .../wulkanowy/data/db/dao/StudentDao.kt | 4 + .../wulkanowy/data/db/entities/Student.kt | 23 +- .../data/db/entities/StudentIsAuthorized.kt | 16 - .../data/db/migrations/Migration63.kt | 11 + .../data/repositories/StudentRepository.kt | 38 +- .../ui/modules/grade/GradeFragment.kt | 38 +- .../ui/modules/grade/GradePresenter.kt | 39 +- .../wulkanowy/ui/modules/grade/GradeView.kt | 2 + .../ui/modules/main/MainPresenter.kt | 8 +- .../modules/timetable/TimetablePresenter.kt | 2 +- .../timetablewidget/TimetableWidgetFactory.kt | 2 +- .../io/github/wulkanowy/utils/SdkExtension.kt | 0 .../wulkanowy/WulkanowySdkFactoryCreator.kt | 3 +- .../wulkanowy/data/WulkanowySdkFactoryTest.kt | 129 + .../db/migrations/AbstractMigrationTest.kt | 8 +- .../data/db/migrations/Migration54Test.kt | 6 +- .../data/db/migrations/Migration63Test.kt | 89 + 20 files changed, 2935 insertions(+), 88 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/63.json delete mode 100644 app/src/main/java/io/github/wulkanowy/data/db/entities/StudentIsAuthorized.kt create mode 100644 app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration63.kt delete mode 100644 app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt create mode 100644 app/src/test/java/io/github/wulkanowy/data/WulkanowySdkFactoryTest.kt create mode 100644 app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration63Test.kt diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/63.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/63.json new file mode 100644 index 000000000..9c774bb4d --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/63.json @@ -0,0 +1,2547 @@ +{ + "formatVersion": 1, + "database": { + "version": 63, + "identityHash": "8c04a56e74b1c4f55302f28ede94cac0", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `scrapper_domain_suffix` TEXT NOT NULL DEFAULT '', `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `is_authorized` INTEGER NOT NULL DEFAULT 0, `is_edu_one` INTEGER DEFAULT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperDomainSuffix", + "columnName": "scrapper_domain_suffix", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAuthorized", + "columnName": "is_authorized", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "isEduOne", + "columnName": "is_edu_one", + "affinity": "INTEGER", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `kindergarten_diary_id` INTEGER NOT NULL DEFAULT 0, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "kindergartenDiaryId", + "columnName": "kindergarten_diary_id", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "kindergarten_diary_id", + "semester_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `kindergarten_diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `average` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`email` TEXT NOT NULL, `message_global_key` TEXT NOT NULL, `mailbox_key` TEXT NOT NULL, `message_id` INTEGER NOT NULL, `correspondents` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `read_by` INTEGER, `unread_by` INTEGER, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `content` TEXT NOT NULL, `sender` TEXT, `recipients` TEXT)", + "fields": [ + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mailboxKey", + "columnName": "mailbox_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "correspondents", + "columnName": "correspondents", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "recipients", + "columnName": "recipients", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`message_global_key` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`message_global_key`, `url`, `filename`))", + "fields": [ + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "message_global_key", + "url", + "filename" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Mailboxes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`globalKey` TEXT NOT NULL, `email` TEXT NOT NULL, `symbol` TEXT NOT NULL, `schoolId` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `studentName` TEXT NOT NULL, `schoolNameShort` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`globalKey`))", + "fields": [ + { + "fieldPath": "globalKey", + "columnName": "globalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolId", + "columnName": "schoolId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "studentName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolNameShort", + "columnName": "schoolNameShort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "globalKey" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`mailboxGlobalKey` TEXT NOT NULL, `studentMailboxGlobalKey` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `schoolShortName` TEXT NOT NULL, `type` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "mailboxGlobalKey", + "columnName": "mailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentMailboxGlobalKey", + "columnName": "studentMailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "schoolShortName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `repeat_id` BLOB DEFAULT NULL, `is_added_by_user` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatId", + "columnName": "repeat_id", + "affinity": "BLOB", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `author` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `destination` TEXT NOT NULL DEFAULT '{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}', `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "destination", + "columnName": "destination", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}'" + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `types` TEXT NOT NULL DEFAULT '[]', `is_ok_visible` INTEGER NOT NULL DEFAULT 0, `is_x_visible` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "types", + "columnName": "types", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'[]'" + }, + { + "fieldPath": "isOkVisible", + "columnName": "is_ok_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "isXVisible", + "columnName": "is_x_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MutedMessageSenders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`author` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesDescriptive", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `description` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '8c04a56e74b1c4f55302f28ede94cac0')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt index 63890ea00..a4911f95a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt @@ -1,11 +1,15 @@ package io.github.wulkanowy.data import com.chuckerteam.chucker.api.ChuckerInterceptor +import io.github.wulkanowy.data.db.dao.StudentDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentIsEduOne import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.RemoteConfigHelper import io.github.wulkanowy.utils.WebkitCookieManagerProxy +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @@ -14,9 +18,12 @@ import javax.inject.Singleton class WulkanowySdkFactory @Inject constructor( private val chuckerInterceptor: ChuckerInterceptor, private val remoteConfig: RemoteConfigHelper, - private val webkitCookieManagerProxy: WebkitCookieManagerProxy + private val webkitCookieManagerProxy: WebkitCookieManagerProxy, + private val studentDb: StudentDao, ) { + private val eduOneMutex = Mutex() + private val sdk = Sdk().apply { androidVersion = android.os.Build.VERSION.RELEASE buildTag = android.os.Build.MODEL @@ -30,7 +37,12 @@ class WulkanowySdkFactory @Inject constructor( fun create() = sdk - fun create(student: Student, semester: Semester? = null): Sdk { + suspend fun create(student: Student, semester: Semester? = null): Sdk { + val overrideIsEduOne = checkEduOneAndMigrateIfNecessary(student) + return buildSdk(student, semester, overrideIsEduOne) + } + + private fun buildSdk(student: Student, semester: Semester?, isStudentEduOne: Boolean): Sdk { return create().apply { email = student.email password = student.password @@ -39,7 +51,7 @@ class WulkanowySdkFactory @Inject constructor( studentId = student.studentId classId = student.classId emptyCookieJarInterceptor = true - isEduOne = student.isEduOne + isEduOne = isStudentEduOne if (Sdk.Mode.valueOf(student.loginMode) == Sdk.Mode.HEBE) { mobileBaseUrl = student.mobileBaseUrl @@ -62,4 +74,40 @@ class WulkanowySdkFactory @Inject constructor( } } } + + private suspend fun checkEduOneAndMigrateIfNecessary(student: Student): Boolean { + if (student.isEduOne != null) return student.isEduOne + + eduOneMutex.withLock { + val studentFromDatabase = studentDb.loadById(student.id) + if (studentFromDatabase?.isEduOne != null) { + Timber.d("Migration eduOne: already done") + return studentFromDatabase.isEduOne + } + + Timber.d("Migration eduOne: flag missing. Running migration...") + val initializedSdk = buildSdk( + student = student, + semester = null, + isStudentEduOne = false, // doesn't matter + ) + val newCurrentStudent = runCatching { initializedSdk.getCurrentStudent() } + .onFailure { Timber.e(it, "Migration eduOne: can't get current student") } + .getOrNull() + + if (newCurrentStudent == null) { + Timber.d("Migration eduOne: failed, so skipping") + return false + } + + Timber.d("Migration eduOne: success. New isEduOne flag: ${newCurrentStudent.isEduOne}") + + val studentIsEduOne = StudentIsEduOne( + id = student.id, + isEduOne = newCurrentStudent.isEduOne + ) + studentDb.update(studentIsEduOne) + return newCurrentStudent.isEduOne + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index 3189fc312..ec22c5a3d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -120,6 +120,7 @@ import io.github.wulkanowy.data.db.migrations.Migration55 import io.github.wulkanowy.data.db.migrations.Migration57 import io.github.wulkanowy.data.db.migrations.Migration58 import io.github.wulkanowy.data.db.migrations.Migration6 +import io.github.wulkanowy.data.db.migrations.Migration63 import io.github.wulkanowy.data.db.migrations.Migration7 import io.github.wulkanowy.data.db.migrations.Migration8 import io.github.wulkanowy.data.db.migrations.Migration9 @@ -175,6 +176,7 @@ import javax.inject.Singleton AutoMigration(from = 59, to = 60), AutoMigration(from = 60, to = 61), AutoMigration(from = 61, to = 62), + AutoMigration(from = 62, to = 63, spec = Migration63::class), ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -183,7 +185,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 62 + const val VERSION_SCHEMA = 63 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt index 95abb399b..bfaecef64 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt @@ -10,6 +10,7 @@ import androidx.room.Update import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.StudentIsAuthorized +import io.github.wulkanowy.data.db.entities.StudentIsEduOne import io.github.wulkanowy.data.db.entities.StudentName import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar import javax.inject.Singleton @@ -27,6 +28,9 @@ abstract class StudentDao { @Update(entity = Student::class) abstract suspend fun update(studentIsAuthorized: StudentIsAuthorized) + @Update(entity = Student::class) + abstract suspend fun update(studentIsEduOne: StudentIsEduOne) + @Update(entity = Student::class) abstract suspend fun update(studentNickAndAvatar: StudentNickAndAvatar) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt index 23e4439aa..dbaa573ce 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt @@ -82,8 +82,8 @@ data class Student( @ColumnInfo(name = "is_authorized", defaultValue = "0") val isAuthorized: Boolean, - @ColumnInfo(name = "is_edu_one", defaultValue = "0") - val isEduOne: Boolean, + @ColumnInfo(name = "is_edu_one", defaultValue = "NULL") + val isEduOne: Boolean?, ) : Serializable { @@ -95,3 +95,22 @@ data class Student( @ColumnInfo(name = "avatar_color") var avatarColor = 0L } + +@Entity +data class StudentIsAuthorized( + + @PrimaryKey + var id: Long, + + @ColumnInfo(name = "is_authorized", defaultValue = "NULL") + val isAuthorized: Boolean?, +) : Serializable + +@Entity +data class StudentIsEduOne( + @PrimaryKey + var id: Long, + + @ColumnInfo(name = "is_edu_one", defaultValue = "NULL") + val isEduOne: Boolean?, +) : Serializable diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentIsAuthorized.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentIsAuthorized.kt deleted file mode 100644 index a1290177c..000000000 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/StudentIsAuthorized.kt +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.wulkanowy.data.db.entities - -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey -import java.io.Serializable - -@Entity -data class StudentIsAuthorized( - @ColumnInfo(name = "is_authorized", defaultValue = "0") - val isAuthorized: Boolean, -) : Serializable { - - @PrimaryKey - var id: Long = 0 -} diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration63.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration63.kt new file mode 100644 index 000000000..f88d31fcc --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration63.kt @@ -0,0 +1,11 @@ +package io.github.wulkanowy.data.db.migrations + +import androidx.room.migration.AutoMigrationSpec +import androidx.sqlite.db.SupportSQLiteDatabase + +class Migration63 : AutoMigrationSpec { + + override fun onPostMigrate(db: SupportSQLiteDatabase) { + db.execSQL("UPDATE Students SET is_edu_one = NULL WHERE is_edu_one = 0") + } +} diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index a5fea4ecb..245b3e6e7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -16,9 +16,9 @@ import io.github.wulkanowy.data.mappers.mapToPojo import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.DispatchersProvider -import io.github.wulkanowy.utils.getCurrentOrLast import io.github.wulkanowy.utils.security.Scrambler import kotlinx.coroutines.withContext +import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @@ -101,23 +101,29 @@ class StudentRepository @Inject constructor( return student } - suspend fun checkCurrentStudentAuthorizationStatus() { + suspend fun updateCurrentStudentAuthStatus() { + Timber.i("Check isAuthorized: started") val student = getCurrentStudent() - - if (!student.isAuthorized) { - val currentSemester = semesterDb.loadAll( - studentId = student.studentId, - classId = student.classId, - ).getCurrentOrLast() - val initializedSdk = wulkanowySdkFactory.create(student, currentSemester) - val isAuthorized = initializedSdk.getCurrentStudent()?.isAuthorized ?: false - - if (isAuthorized) { - studentDb.update(StudentIsAuthorized(isAuthorized = true).apply { - id = student.id - }) - } else throw NoAuthorizationException() + if (student.isAuthorized) { + Timber.i("Check isAuthorized: already authorized") + return } + + val initializedSdk = wulkanowySdkFactory.create(student) + val newCurrentStudent = initializedSdk.getCurrentStudent() ?: return + + if (!newCurrentStudent.isAuthorized) { + Timber.i("Check isAuthorized: authorization required") + throw NoAuthorizationException() + } + + val studentIsAuthorized = StudentIsAuthorized( + id = student.id, + isAuthorized = true + ) + + Timber.i("Check isAuthorized: already authorized, update local status") + studentDb.update(studentIsAuthorized) } suspend fun getCurrentStudent(decryptPass: Boolean = true): Student { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt index 7ce07eb68..cc61dc25a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt @@ -7,7 +7,6 @@ import android.view.MenuItem import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE -import androidx.appcompat.app.AlertDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint @@ -31,14 +30,6 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade @Inject lateinit var presenter: GradePresenter - private val pagerAdapter by lazy { - BaseFragmentPagerAdapter( - fragmentManager = childFragmentManager, - pagesCount = 3, - lifecycle = lifecycle, - ) - } - private var semesterSwitchMenu: MenuItem? = null companion object { @@ -52,6 +43,8 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade override val currentPageIndex get() = binding.gradeViewPager.currentItem + private var pagerAdapter: BaseFragmentPagerAdapter? = null + @Suppress("DEPRECATION") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -71,13 +64,26 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade } override fun initView() { + with(binding) { + gradeErrorRetry.setOnClickListener { presenter.onRetry() } + gradeErrorDetails.setOnClickListener { presenter.onDetailsClick() } + } + } + + override fun initTabs(pageCount: Int) { + pagerAdapter = BaseFragmentPagerAdapter( + lifecycle = lifecycle, + pagesCount = pageCount, + fragmentManager = childFragmentManager + ) + with(binding.gradeViewPager) { adapter = pagerAdapter offscreenPageLimit = 3 setOnSelectPageListener(presenter::onPageSelected) } - with(pagerAdapter) { + with(pagerAdapter!!) { containerId = binding.gradeViewPager.id titleFactory = { when (it) { @@ -99,11 +105,6 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade } binding.gradeTabLayout.elevation = requireContext().dpToPx(4f) - - with(binding) { - gradeErrorRetry.setOnClickListener { presenter.onRetry() } - gradeErrorDetails.setOnClickListener { presenter.onDetailsClick() } - } } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -169,19 +170,20 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade } override fun notifyChildLoadData(index: Int, semesterId: Int, forceRefresh: Boolean) { - (pagerAdapter.getFragmentInstance(index) as? GradeView.GradeChildView) + (pagerAdapter?.getFragmentInstance(index) as? GradeView.GradeChildView) ?.onParentLoadData(semesterId, forceRefresh) } override fun notifyChildParentReselected(index: Int) { - (pagerAdapter.getFragmentInstance(index) as? GradeView.GradeChildView)?.onParentReselected() + (pagerAdapter?.getFragmentInstance(index) as? GradeView.GradeChildView)?.onParentReselected() } override fun notifyChildSemesterChange(index: Int) { - (pagerAdapter.getFragmentInstance(index) as? GradeView.GradeChildView)?.onParentChangeSemester() + (pagerAdapter?.getFragmentInstance(index) as? GradeView.GradeChildView)?.onParentChangeSemester() } override fun onDestroyView() { + pagerAdapter = null presenter.onDetachView() super.onDestroyView() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index 0ae6521cf..8a70b3c19 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -22,11 +22,8 @@ class GradePresenter @Inject constructor( ) : BasePresenter(errorHandler, studentRepository) { private var selectedIndex = 0 - private var schoolYear = 0 - - private var semesters = emptyList() - + private var availableSemesters = emptyList() private val loadedSemesterId = mutableMapOf() private lateinit var lastError: Throwable @@ -40,7 +37,7 @@ class GradePresenter @Inject constructor( } fun onCreateMenu() { - if (semesters.isEmpty()) view?.showSemesterSwitch(false) + if (availableSemesters.isEmpty()) view?.showSemesterSwitch(false) } fun onViewReselected() { @@ -49,8 +46,8 @@ class GradePresenter @Inject constructor( } fun onSemesterSwitch(): Boolean { - if (semesters.isNotEmpty()) { - view?.showSemesterDialog(selectedIndex - 1, semesters.take(2)) + if (availableSemesters.isNotEmpty()) { + view?.showSemesterDialog(selectedIndex - 1, availableSemesters.take(2)) } return true } @@ -83,7 +80,7 @@ class GradePresenter @Inject constructor( } fun onPageSelected(index: Int) { - if (semesters.isNotEmpty()) loadChild(index) + if (availableSemesters.isNotEmpty()) loadChild(index) } fun onRetry() { @@ -101,16 +98,24 @@ class GradePresenter @Inject constructor( private fun loadData() { resourceFlow { val student = studentRepository.getCurrentStudent() - semesterRepository.getSemesters(student, refreshOnNoCurrent = true) + val semesters = semesterRepository.getSemesters(student, refreshOnNoCurrent = true) + + student to semesters } .logResourceStatus("load grade data") - .onResourceData { - val current = it.getCurrentOrLast() - selectedIndex = if (selectedIndex == 0) current.semesterName else selectedIndex - schoolYear = current.schoolYear - semesters = it.filter { semester -> semester.diaryId == current.diaryId } - view?.setCurrentSemesterName(current.semesterName, schoolYear) + .onResourceData { (student, semesters) -> + val currentSemester = semesters.getCurrentOrLast() + selectedIndex = + if (selectedIndex == 0) currentSemester.semesterName else selectedIndex + schoolYear = currentSemester.schoolYear + availableSemesters = semesters.filter { semester -> + semester.diaryId == currentSemester.diaryId + } + view?.run { + initTabs(if (student.isEduOne == true) 2 else 3) + setCurrentSemesterName(currentSemester.semesterName, schoolYear) + Timber.i("Loading grade data: Attempt load index $currentPageIndex") loadChild(currentPageIndex) showErrorView(false) @@ -131,10 +136,10 @@ class GradePresenter @Inject constructor( } private fun loadChild(index: Int, forceRefresh: Boolean = false) { - Timber.d("Load grade tab child. Selected semester: $selectedIndex, semesters: ${semesters.joinToString { it.semesterName.toString() }}") + Timber.d("Load grade tab child. Selected semester: $selectedIndex, semesters: ${availableSemesters.joinToString { it.semesterName.toString() }}") val newSelectedSemesterId = try { - semesters.first { it.semesterName == selectedIndex }.semesterId + availableSemesters.first { it.semesterName == selectedIndex }.semesterId } catch (e: NoSuchElementException) { Timber.e(e, "Selected semester no exists") return diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt index 104f8505a..fc06c4809 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt @@ -9,6 +9,8 @@ interface GradeView : BaseView { fun initView() + fun initTabs(pageCount: Int) + fun showContent(show: Boolean) fun showProgress(show: Boolean) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index 67f729afb..a544381ce 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -73,7 +73,7 @@ class MainPresenter @Inject constructor( syncManager.startPeriodicSyncWorker() checkAppSupport() - checkCurrentStudentAuthorizationStatus() + updateCurrentStudentAuthStatus() analytics.logEvent("app_open", "destination" to initDestination.toString()) Timber.i("Main view was initialized with $initDestination") @@ -193,12 +193,10 @@ class MainPresenter @Inject constructor( view?.showStudentAvatar(currentStudent) } - private fun checkCurrentStudentAuthorizationStatus() { + private fun updateCurrentStudentAuthStatus() { presenterScope.launch { - runCatching { studentRepository.checkCurrentStudentAuthorizationStatus() } + runCatching { studentRepository.updateCurrentStudentAuthStatus() } .onFailure { errorHandler.dispatch(it) } - - Timber.i("Current student authorization status checked") } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index abaf7d86b..8ef0772b8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -150,7 +150,7 @@ class TimetablePresenter @Inject constructor( val student = studentRepository.getCurrentStudent() val semester = semesterRepository.getCurrentSemester(student) - isEduOne = student.isEduOne + isEduOne = student.isEduOne == true checkInitialAndCurrentDate(semester) timetableRepository.getTimetable( student = student, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index 5fb44a5e7..218c25834 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -78,7 +78,7 @@ class TimetableWidgetFactory( val lessons = getLessons(student, semester, date) val lastSync = timetableRepository.getLastRefreshTimestamp(semester, date, date) - createItems(lessons, lastSync, !student.isEduOne) + createItems(lessons, lastSync, !(student.isEduOne ?: false)) } .onFailure { items = listOf(TimetableWidgetItem.Error(it)) diff --git a/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SdkExtension.kt deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt b/app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt index dd1ce0569..9623c9f98 100644 --- a/app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt +++ b/app/src/test/java/io/github/wulkanowy/WulkanowySdkFactoryCreator.kt @@ -2,11 +2,12 @@ package io.github.wulkanowy import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.sdk.Sdk +import io.mockk.coEvery import io.mockk.every import io.mockk.mockk fun createWulkanowySdkFactoryMock(sdk: Sdk) = mockk() .apply { every { create() } returns sdk - every { create(any(), any()) } answers { callOriginal() } + coEvery { create(any(), any()) } returns sdk } diff --git a/app/src/test/java/io/github/wulkanowy/data/WulkanowySdkFactoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/WulkanowySdkFactoryTest.kt new file mode 100644 index 000000000..bedeffe74 --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/data/WulkanowySdkFactoryTest.kt @@ -0,0 +1,129 @@ +package io.github.wulkanowy.data + +import android.os.Build +import dagger.hilt.android.testing.HiltTestApplication +import io.github.wulkanowy.data.db.dao.StudentDao +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.db.entities.StudentIsEduOne +import io.github.wulkanowy.getStudentEntity +import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.sdk.pojo.RegisterStudent +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every +import io.mockk.just +import io.mockk.mockk +import io.mockk.spyk +import io.mockk.verify +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [Build.VERSION_CODES.O_MR1], application = HiltTestApplication::class) +class WulkanowySdkFactoryTest { + + private lateinit var wulkanowySdkFactory: WulkanowySdkFactory + private lateinit var studentDao: StudentDao + private lateinit var sdk: Sdk + + @Before + fun setUp() { + sdk = mockk(relaxed = true) + studentDao = mockk() + wulkanowySdkFactory = spyk( + WulkanowySdkFactory( + chuckerInterceptor = mockk(), + remoteConfig = mockk(relaxed = true), + webkitCookieManagerProxy = mockk(), + studentDb = studentDao + ) + ) + + every { wulkanowySdkFactory.create() } returns sdk + } + + @Test + fun `check sdk flag isEduOne when local student is eduone`() = runTest { + val student = getStudentEntity().copy(isEduOne = true) + + wulkanowySdkFactory.create(student) + + verify { sdk.isEduOne = true } + coVerify(exactly = 0) { sdk.getCurrentStudent() } + } + + @Test + fun `check sdk flag isEduOne when local student is not eduone`() = runTest { + val student = getStudentEntity().copy(isEduOne = false) + + wulkanowySdkFactory.create(student) + + verify { sdk.isEduOne = false } + coVerify(exactly = 0) { sdk.getCurrentStudent() } + } + + @Test + fun `check sdk flag isEduOne when local student is eduone null and remote student is eduone true`() = + runTest { + val studentToProcess = getStudentEntity().copy(isEduOne = null) + val registerStudent = studentToProcess.toRegisterStudent(isEduOne = true) + + coEvery { studentDao.loadById(any()) } returns studentToProcess + coEvery { studentDao.update(any(StudentIsEduOne::class)) } just Runs + coEvery { sdk.getCurrentStudent() } returns registerStudent + + wulkanowySdkFactory.create(studentToProcess) + + verify { sdk.isEduOne = true } + coVerify { sdk.getCurrentStudent() } + } + + @Test + fun `check sdk flag isEduOne when local student is eduone null and remote student is eduone false`() = + runTest { + val studentToProcess = getStudentEntity().copy(isEduOne = null) + val registerStudent = studentToProcess.toRegisterStudent(isEduOne = false) + + coEvery { studentDao.loadById(any()) } returns studentToProcess + coEvery { studentDao.update(any(StudentIsEduOne::class)) } just Runs + coEvery { sdk.getCurrentStudent() } returns registerStudent + + wulkanowySdkFactory.create(studentToProcess) + + verify { sdk.isEduOne = false } + coVerify { sdk.getCurrentStudent() } + } + + @Test + fun `check sdk flag isEduOne when sdk getCurrentStudent throws error`() = + runTest { + val studentToProcess = getStudentEntity().copy(isEduOne = null) + + coEvery { studentDao.loadById(any()) } returns studentToProcess + coEvery { studentDao.update(any(StudentIsEduOne::class)) } just Runs + coEvery { sdk.getCurrentStudent() } throws Exception() + + wulkanowySdkFactory.create(studentToProcess) + + verify { sdk.isEduOne = false } + coVerify { sdk.getCurrentStudent() } + } + + private fun Student.toRegisterStudent(isEduOne: Boolean) = RegisterStudent( + studentId = studentId, + studentName = studentName, + studentSecondName = studentName, + studentSurname = studentName, + className = className, + classId = classId, + isParent = isParent, + isAuthorized = isAuthorized, + semesters = emptyList(), + isEduOne = isEduOne, + ) +} diff --git a/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt b/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt index 18ff93392..0ac2a3cba 100644 --- a/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt @@ -21,10 +21,10 @@ abstract class AbstractMigrationTest { @get:Rule val helper: MigrationTestHelper = MigrationTestHelper( - InstrumentationRegistry.getInstrumentation(), - AppDatabase::class.java, - listOf(Migration55()), - FrameworkSQLiteOpenHelperFactory() + instrumentation = InstrumentationRegistry.getInstrumentation(), + databaseClass = AppDatabase::class.java, + specs = listOf(Migration63()), + openFactory = FrameworkSQLiteOpenHelperFactory() ) fun runMigrationsAndValidate(migration: Migration) { diff --git a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration54Test.kt b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration54Test.kt index 1855e0d50..ccff05d88 100644 --- a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration54Test.kt +++ b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration54Test.kt @@ -7,8 +7,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltTestApplication import io.github.wulkanowy.sdk.Sdk -import io.github.wulkanowy.sdk.Sdk.ScrapperLoginType.* -import kotlinx.coroutines.ExperimentalCoroutinesApi +import io.github.wulkanowy.sdk.Sdk.ScrapperLoginType.ADFSLight +import io.github.wulkanowy.sdk.Sdk.ScrapperLoginType.ADFSLightScoped +import io.github.wulkanowy.sdk.Sdk.ScrapperLoginType.STANDARD import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith @@ -19,7 +20,6 @@ import kotlin.test.assertEquals @HiltAndroidTest @RunWith(RobolectricTestRunner::class) -@OptIn(ExperimentalCoroutinesApi::class) @Config(sdk = [Build.VERSION_CODES.O_MR1], application = HiltTestApplication::class) class Migration54Test : AbstractMigrationTest() { diff --git a/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration63Test.kt b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration63Test.kt new file mode 100644 index 000000000..dcca90696 --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/data/db/migrations/Migration63Test.kt @@ -0,0 +1,89 @@ +package io.github.wulkanowy.data.db.migrations + +import android.content.ContentValues +import android.database.sqlite.SQLiteDatabase +import android.os.Build +import androidx.sqlite.db.SupportSQLiteDatabase +import dagger.hilt.android.testing.HiltAndroidTest +import dagger.hilt.android.testing.HiltTestApplication +import kotlinx.coroutines.test.runTest +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import kotlin.random.Random +import kotlin.test.Test +import kotlin.test.assertNotNull +import kotlin.test.assertNull +import kotlin.test.assertTrue + +@HiltAndroidTest +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [Build.VERSION_CODES.O_MR1], application = HiltTestApplication::class) +class Migration63Test : AbstractMigrationTest() { + + @Test + fun `update is_edu_one to null if 0`() = runTest { + with(helper.createDatabase(dbName, 62)) { + createStudent(1, 0) + close() + } + + helper.runMigrationsAndValidate(dbName, 63, true) + + val database = getMigratedRoomDatabase() + val studentDb = database.studentDao + val student = studentDb.loadById(1) + + assertNull(student!!.isEduOne) + + database.close() + } + + @Test + fun `check is_edu_one is stay same`() = runTest { + with(helper.createDatabase(dbName, 62)) { + createStudent(1, 1) + close() + } + + helper.runMigrationsAndValidate(dbName, 63, true) + + val database = getMigratedRoomDatabase() + val studentDb = database.studentDao + val student = studentDb.loadById(1) + + val isEduOne = assertNotNull(student!!.isEduOne) + assertTrue(isEduOne) + database.close() + } + + private fun SupportSQLiteDatabase.createStudent(id: Long, isEduOneValue: Int) { + insert("Students", SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { + put("scrapper_base_url", "https://fakelog.cf") + put("mobile_base_url", "") + put("login_type", "SCRAPPER") + put("login_mode", "SCRAPPER") + put("certificate_key", "") + put("private_key", "") + put("is_parent", false) + put("email", "jan@fakelog.cf") + put("password", "******") + put("symbol", "symbol") + put("student_id", Random.nextInt()) + put("user_login_id", 123) + put("user_name", "studentName") + put("student_name", "studentName") + put("school_id", "123") + put("school_short", "") + put("school_name", "") + put("class_name", "") + put("class_id", Random.nextInt()) + put("is_current", false) + put("registration_date", "0") + put("id", id) + put("nick", "") + put("avatar_color", "") + put("is_edu_one", isEduOneValue) + }) + } +} From 38816782080db4b787ff02fdbfdecfea1071b852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 Mar 2024 23:22:07 +0100 Subject: [PATCH 1423/1526] Fix issues related to not authenticated eduOne students (#2501) --- .../data/repositories/StudentRepository.kt | 31 ++++++++++++++++--- .../ui/modules/auth/AuthPresenter.kt | 5 ++- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index 245b3e6e7..61d6255b4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -12,6 +12,7 @@ import io.github.wulkanowy.data.db.entities.StudentName import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.exceptions.NoCurrentStudentException +import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.data.mappers.mapToPojo import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.sdk.Sdk @@ -110,7 +111,22 @@ class StudentRepository @Inject constructor( } val initializedSdk = wulkanowySdkFactory.create(student) - val newCurrentStudent = initializedSdk.getCurrentStudent() ?: return + val newCurrentStudent = runCatching { initializedSdk.getCurrentStudent() } + .onFailure { Timber.e(it, "Check isAuthorized: error occurred") } + .getOrNull() + + if (newCurrentStudent == null) { + Timber.d("Check isAuthorized: current user is null") + return + } + + val currentStudentSemesters = semesterDb.loadAll(student.studentId, student.classId) + if (currentStudentSemesters.isEmpty()) { + Timber.d("Check isAuthorized: apply empty semesters workaround") + semesterDb.insertSemesters( + items = newCurrentStudent.semesters.mapToEntities(student.studentId), + ) + } if (!newCurrentStudent.isAuthorized) { Timber.i("Check isAuthorized: authorization required") @@ -178,15 +194,21 @@ class StudentRepository @Inject constructor( wulkanowySdkFactory.create(student, semester) .authorizePermission(pesel) - suspend fun refreshStudentName(student: Student, semester: Semester) { - val newCurrentApiStudent = wulkanowySdkFactory.create(student, semester) - .getCurrentStudent() ?: return + suspend fun refreshStudentAfterAuthorize(student: Student, semester: Semester) { + val newCurrentApiStudent = wulkanowySdkFactory + .create(student, semester) + .getCurrentStudent() + ?: return Timber.d("Can't find student with id ${student.studentId}") val studentName = StudentName( studentName = "${newCurrentApiStudent.studentName} ${newCurrentApiStudent.studentSurname}" ).apply { id = student.id } studentDb.update(studentName) + semesterDb.removeOldAndSaveNew( + oldItems = semesterDb.loadAll(student.studentId, semester.classId), + newItems = newCurrentApiStudent.semesters.mapToEntities(newCurrentApiStudent.studentId) + ) } suspend fun deleteStudentsAssociatedWithAccount(student: Student) { @@ -202,4 +224,3 @@ class StudentRepository @Inject constructor( } class NoAuthorizationException : Exception() - diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt index 3c061f498..5c597eeb4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt @@ -5,6 +5,7 @@ import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject class AuthPresenter @Inject constructor( @@ -57,8 +58,9 @@ class AuthPresenter @Inject constructor( val semester = semesterRepository.getCurrentSemester(student) val isSuccess = studentRepository.authorizePermission(student, semester, pesel) + Timber.d("Auth succeed: $isSuccess") if (isSuccess) { - studentRepository.refreshStudentName(student, semester) + studentRepository.refreshStudentAfterAuthorize(student, semester) } isSuccess } @@ -68,6 +70,7 @@ class AuthPresenter @Inject constructor( view?.showContent(true) } .onSuccess { + Timber.d("Auth fully succeed: $it") if (it) { view?.showSuccess(true) view?.showContent(false) From b3faac01a50d60194f092e6b32ce9d24ab75c9ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 24 Mar 2024 23:43:45 +0100 Subject: [PATCH 1424/1526] Version 2.5.3 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2d5d46663..d7174a2d3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 151 - versionName "2.5.2" + versionCode 152 + versionName "2.5.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -164,7 +164,7 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.50d + userFraction = 0.20d updatePriority = 3 enabled.set(false) } @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.3-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.5.3' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 6eafb6a99..cd41a98be 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,7 +1,8 @@ -Wersja 2.5.2 +Wersja 2.5.3 -— naprawiliśmy omyłkowe wyświetlanie ekranu z wymaganą autoryzacją numerem PESEL -— naprawiliśmy kilka problemów ze stabilnością -— poprawiliśmy wyświetlanie kolorów we frekwencji +— naprawiliśmy wyświetlanie błędu "Brak uprawnień" po starcie aplikacji u użytkowników eduOne +— naprawiliśmy obsługę autoryzacji u użytkowników eduOne +— ukryliśmy numery lekcji i oceny klasy u użytkowników eduOne, bo VULCAN te funkcje usunął +— naprawiliśmy inne rzeczy u użytkowników eduOne (jak brak opisu oceny czy ładowanie danych na kilku ekranach) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 7fda4276d69260bab8bb13c9e04b56d1ce1fbdb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:31:46 +0000 Subject: [PATCH 1425/1526] Bump com.google.firebase:firebase-bom from 32.7.4 to 32.8.0 (#2504) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d3b365b60..3a71de337 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -248,7 +248,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.11.0' - playImplementation platform('com.google.firebase:firebase-bom:32.7.4') + playImplementation platform('com.google.firebase:firebase-bom:32.8.0') playImplementation 'com.google.firebase:firebase-analytics' playImplementation 'com.google.firebase:firebase-messaging' playImplementation 'com.google.firebase:firebase-crashlytics:' From 8c10606b6129f5fca49b395e2f279a56eb5a1af8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:32:07 +0000 Subject: [PATCH 1426/1526] Bump about_libraries from 11.1.0 to 11.1.1 (#2503) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f245e71b1..bb9f4179a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.9.23' - about_libraries = '11.1.0' + about_libraries = '11.1.1' hilt_version = '2.51' } repositories { From f13ce6e2b43985e8eaa8032326c9f540757a3150 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:32:28 +0000 Subject: [PATCH 1427/1526] Bump com.squareup.retrofit2:retrofit from 2.9.0 to 2.10.0 (#2502) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3a71de337..cf1b5c49f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -233,7 +233,7 @@ dependencies { implementation 'com.github.ncapdevi:FragNav:3.3.0' implementation "com.github.YarikSOffice:lingver:1.3.0" - implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:retrofit:2.10.0' implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0" implementation "com.squareup.okhttp3:logging-interceptor:4.12.0" implementation "com.squareup.okhttp3:okhttp-urlconnection:4.12.0" From b7f7b16aef883a4572efd9366205b18cfbc50c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 26 Mar 2024 12:54:07 +0100 Subject: [PATCH 1428/1526] Add logging error from units and symbols during registration (#2507) --- app/build.gradle | 2 +- .../data/repositories/StudentRepository.kt | 23 +++++++++++++++---- .../wulkanowy/utils/SemesterExtension.kt | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d7174a2d3..d69ea5a34 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.3' + implementation 'io.github.wulkanowy:sdk:2.5.4-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index 61d6255b4..df47d7a63 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -42,6 +42,7 @@ class StudentRepository @Inject constructor( ): RegisterUser = wulkanowySdkFactory.create() .getStudentsFromHebe(token, pin, symbol, "") .mapToPojo(null) + .also { it.logErrors() } suspend fun getUserSubjectsFromScrapper( email: String, @@ -52,6 +53,7 @@ class StudentRepository @Inject constructor( ): RegisterUser = wulkanowySdkFactory.create() .getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, domainSuffix, symbol) .mapToPojo(password) + .also { it.logErrors() } suspend fun getStudentsHybrid( email: String, @@ -61,6 +63,7 @@ class StudentRepository @Inject constructor( ): RegisterUser = wulkanowySdkFactory.create() .getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol) .mapToPojo(password) + .also { it.logErrors() } suspend fun getSavedStudents(decryptPass: Boolean = true): List { return studentDb.loadStudentsWithSemesters().map { (student, semesters) -> @@ -195,10 +198,10 @@ class StudentRepository @Inject constructor( .authorizePermission(pesel) suspend fun refreshStudentAfterAuthorize(student: Student, semester: Semester) { - val newCurrentApiStudent = wulkanowySdkFactory - .create(student, semester) - .getCurrentStudent() - ?: return Timber.d("Can't find student with id ${student.studentId}") + val wulkanowySdk = wulkanowySdkFactory.create(student, semester) + val newCurrentApiStudent = runCatching { wulkanowySdk.getCurrentStudent() } + .onFailure { Timber.e(it, "Can't find student with id ${student.studentId}") } + .getOrNull() ?: return val studentName = StudentName( studentName = "${newCurrentApiStudent.studentName} ${newCurrentApiStudent.studentSurname}" @@ -221,6 +224,18 @@ class StudentRepository @Inject constructor( appDatabase.clearAllTables() } } + + private fun RegisterUser.logErrors() { + val symbolsErrors = symbols.filter { it.error != null } + .map { it.error } + val unitsErrors = symbols.flatMap { it.schools } + .filter { it.error != null } + .map { it.error } + + (symbolsErrors + unitsErrors).forEach { error -> + Timber.e(error, "Error occurred while fetching students") + } + } } class NoAuthorizationException : Exception() diff --git a/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt index e3b8a3b4c..6cfc4fa11 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/SemesterExtension.kt @@ -18,7 +18,7 @@ fun Semester.isCurrent(now: LocalDate = now()): Boolean { } fun List.getCurrentOrLast(): Semester { - if (isEmpty()) throw RuntimeException("Empty semester list") + if (isEmpty()) throw IllegalStateException("Empty semester list") // when there is only one current semester singleOrNull { it.isCurrent() }?.let { return it } From 8cdd4311a903f592c6bd110f0cd933b2de2f8f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 26 Mar 2024 13:29:22 +0100 Subject: [PATCH 1429/1526] Version 2.5.4 --- app/build.gradle | 10 +++++----- app/src/main/play/release-notes/pl-PL/default.txt | 7 ++----- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d69ea5a34..92633dd3e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 152 - versionName "2.5.3" + versionCode 153 + versionName "2.5.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -164,8 +164,8 @@ play { defaultToAppBundles = false track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS - userFraction = 0.20d - updatePriority = 3 + userFraction = 0.99d + updatePriority = 1 enabled.set(false) } @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.4-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.5.4' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index cd41a98be..d848d01c9 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,8 +1,5 @@ -Wersja 2.5.3 +Wersja 2.5.4 -— naprawiliśmy wyświetlanie błędu "Brak uprawnień" po starcie aplikacji u użytkowników eduOne -— naprawiliśmy obsługę autoryzacji u użytkowników eduOne -— ukryliśmy numery lekcji i oceny klasy u użytkowników eduOne, bo VULCAN te funkcje usunął -— naprawiliśmy inne rzeczy u użytkowników eduOne (jak brak opisu oceny czy ładowanie danych na kilku ekranach) +— naprawiliśmy kolejnych kilka błędów związanych z obsługą dziennika eduOne (tak, nie umiemy za jednym razem) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 254719f22f5564e0455570d27c82bbde390bcbc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 26 Mar 2024 19:02:35 +0100 Subject: [PATCH 1430/1526] Remove classId from semester query when eduOne (#2509) --- app/build.gradle | 2 +- .../wulkanowy/data/db/dao/SemesterDao.kt | 12 +++++++ .../data/repositories/SemesterRepository.kt | 6 ++-- .../data/repositories/StudentRepository.kt | 4 +-- .../repositories/SemesterRepositoryTest.kt | 33 +++++++------------ 5 files changed, 30 insertions(+), 27 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 92633dd3e..1a74e198e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.4' + implementation 'io.github.wulkanowy:sdk:2.5.5-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt index 4d171907c..f50d95593 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt @@ -5,6 +5,7 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import io.github.wulkanowy.data.db.entities.Semester +import io.github.wulkanowy.data.db.entities.Student import javax.inject.Singleton @Singleton @@ -16,4 +17,15 @@ interface SemesterDao : BaseDao { @Query("SELECT * FROM Semesters WHERE student_id = :studentId AND class_id = :classId") suspend fun loadAll(studentId: Int, classId: Int): List + + @Query("SELECT * FROM Semesters WHERE student_id = :studentId") + suspend fun loadAll(studentId: Int): List + + suspend fun loadAll(student: Student): List { + return if (student.isEduOne == true) { + loadAll(student.studentId) + } else { + loadAll(student.studentId, student.classId) + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt index da21f59ac..e15f93099 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt @@ -27,11 +27,11 @@ class SemesterRepository @Inject constructor( forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false ) = withContext(dispatchers.io) { - val semesters = semesterDb.loadAll(student.studentId, student.classId) + val semesters = semesterDb.loadAll(student) if (isShouldFetch(student, semesters, forceRefresh, refreshOnNoCurrent)) { refreshSemesters(student) - semesterDb.loadAll(student.studentId, student.classId) + semesterDb.loadAll(student) } else semesters } @@ -66,7 +66,7 @@ class SemesterRepository @Inject constructor( if (new.isEmpty()) return Timber.i("Empty semester list!") - val old = semesterDb.loadAll(student.studentId, student.classId) + val old = semesterDb.loadAll(student) semesterDb.removeOldAndSaveNew( oldItems = old uniqueSubtract new, newItems = new uniqueSubtract old, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index df47d7a63..4fedcae96 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -123,7 +123,7 @@ class StudentRepository @Inject constructor( return } - val currentStudentSemesters = semesterDb.loadAll(student.studentId, student.classId) + val currentStudentSemesters = semesterDb.loadAll(student) if (currentStudentSemesters.isEmpty()) { Timber.d("Check isAuthorized: apply empty semesters workaround") semesterDb.insertSemesters( @@ -209,7 +209,7 @@ class StudentRepository @Inject constructor( studentDb.update(studentName) semesterDb.removeOldAndSaveNew( - oldItems = semesterDb.loadAll(student.studentId, semester.classId), + oldItems = semesterDb.loadAll(student), newItems = newCurrentApiStudent.semesters.mapToEntities(newCurrentApiStudent.studentId) ) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt index 3a18ac48a..57ace3e1d 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories import io.github.wulkanowy.TestDispatchersProvider import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.db.dao.SemesterDao +import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.getSemesterEntity import io.github.wulkanowy.getSemesterPojo @@ -50,7 +51,7 @@ class SemesterRepositoryTest { getSemesterPojo(1, 2, now().minusMonths(3), now()) ) - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns emptyList() + coEvery { semesterDb.loadAll(student) } returns emptyList() coEvery { sdk.getSemesters() } returns semesters coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs @@ -76,12 +77,7 @@ class SemesterRepositoryTest { getSemesterPojo(123, 2, now().minusMonths(3), now()) ) - coEvery { - semesterDb.loadAll( - student.studentId, - student.classId - ) - } returns badSemesters.mapToEntities(student.studentId) + coEvery { semesterDb.loadAll(student) } returns badSemesters.mapToEntities(student.studentId) coEvery { sdk.getSemesters() } returns goodSemesters coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs @@ -103,7 +99,7 @@ class SemesterRepositoryTest { getSemesterPojo(2, 3, now(), now().plusMonths(6)), ) - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returnsMany listOf( + coEvery { semesterDb.loadAll(any()) } returnsMany listOf( badSemesters.mapToEntities(student.studentId), badSemesters.mapToEntities(student.studentId), goodSemesters.mapToEntities(student.studentId) @@ -125,7 +121,7 @@ class SemesterRepositoryTest { getSemesterEntity(1, 2, now().minusMonths(6), now().minusMonths(1)) ) - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters + coEvery { semesterDb.loadAll(student) } returns semesters val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) @@ -138,7 +134,7 @@ class SemesterRepositoryTest { getSemesterEntity(1, 2, now().minusMonths(3), now()) ) - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters + coEvery { semesterDb.loadAll(student) } returns semesters val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) @@ -151,7 +147,7 @@ class SemesterRepositoryTest { getSemesterEntity(1, 2, now(), now()) ) - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters + coEvery { semesterDb.loadAll(student) } returns semesters val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) @@ -164,7 +160,7 @@ class SemesterRepositoryTest { getSemesterPojo(1, 2, now().minusMonths(3), now()) ) - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns emptyList() + coEvery { semesterDb.loadAll(student) } returns emptyList() coEvery { sdk.getSemesters() } returns semesters coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs @@ -193,12 +189,7 @@ class SemesterRepositoryTest { getSemesterPojo(2, 2, now().plusMonths(5), now().plusMonths(11)), ) - coEvery { - semesterDb.loadAll( - student.studentId, - student.classId - ) - } returns semestersWithNoCurrent + coEvery { semesterDb.loadAll(student) } returns semestersWithNoCurrent coEvery { sdk.getSemesters() } returns newSemesters coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs @@ -214,7 +205,7 @@ class SemesterRepositoryTest { getSemesterEntity(1, 2, now().minusMonths(1), now().plusMonths(1)) ) - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters + coEvery { semesterDb.loadAll(student) } returns semesters val items = semesterRepository.getSemesters(student, refreshOnNoCurrent = true) assertEquals(2, items.size) @@ -227,14 +218,14 @@ class SemesterRepositoryTest { getSemesterEntity(1, 1, now(), now()) ) - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters + coEvery { semesterDb.loadAll(student) } returns semesters runBlocking { semesterRepository.getCurrentSemester(student) } } @Test(expected = RuntimeException::class) fun getCurrentSemester_emptyList() { - coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns emptyList() + coEvery { semesterDb.loadAll(student) } returns emptyList() coEvery { sdk.getSemesters() } returns emptyList() runBlocking { semesterRepository.getCurrentSemester(student) } From d799ec7ac9ac5f42b495faacfe592614e4b321db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Tue, 26 Mar 2024 19:19:44 +0100 Subject: [PATCH 1431/1526] Add skipping migration when previous attempt failed (#2508) --- .../wulkanowy/data/WulkanowySdkFactory.kt | 18 +++++++++++++++--- .../data/repositories/SemesterRepository.kt | 5 ++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt index a4911f95a..cede6f920 100644 --- a/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt @@ -23,6 +23,7 @@ class WulkanowySdkFactory @Inject constructor( ) { private val eduOneMutex = Mutex() + private val migrationFailedStudentIds = mutableSetOf() private val sdk = Sdk().apply { androidVersion = android.os.Build.VERSION.RELEASE @@ -78,14 +79,24 @@ class WulkanowySdkFactory @Inject constructor( private suspend fun checkEduOneAndMigrateIfNecessary(student: Student): Boolean { if (student.isEduOne != null) return student.isEduOne + if (student.id in migrationFailedStudentIds) { + Timber.i("Migration eduOne: skipping because of previous failure") + return false + } + eduOneMutex.withLock { + if (student.id in migrationFailedStudentIds) { + Timber.i("Migration eduOne: skipping because of previous failure") + return false + } + val studentFromDatabase = studentDb.loadById(student.id) if (studentFromDatabase?.isEduOne != null) { - Timber.d("Migration eduOne: already done") + Timber.i("Migration eduOne: already done") return studentFromDatabase.isEduOne } - Timber.d("Migration eduOne: flag missing. Running migration...") + Timber.i("Migration eduOne: flag missing. Running migration...") val initializedSdk = buildSdk( student = student, semester = null, @@ -96,7 +107,8 @@ class WulkanowySdkFactory @Inject constructor( .getOrNull() if (newCurrentStudent == null) { - Timber.d("Migration eduOne: failed, so skipping") + Timber.i("Migration eduOne: failed, so skipping") + migrationFailedStudentIds.add(student.id) return false } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt index e15f93099..ef7ae5950 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt @@ -64,7 +64,10 @@ class SemesterRepository @Inject constructor( .getSemesters() .mapToEntities(student.studentId) - if (new.isEmpty()) return Timber.i("Empty semester list!") + if (new.isEmpty()) { + Timber.i("Empty semester list from SDK!") + return + } val old = semesterDb.loadAll(student) semesterDb.removeOldAndSaveNew( From 7463cf6253cec6ab8bb88ee382627957db53c43b Mon Sep 17 00:00:00 2001 From: Faierbel Date: Tue, 26 Mar 2024 20:29:35 +0100 Subject: [PATCH 1432/1526] Replace function in DAO to 'OR' in SQL query --- .../wulkanowy/data/WulkanowySdkFactory.kt | 2 +- .../wulkanowy/data/db/dao/SemesterDao.kt | 14 +------- .../wulkanowy/data/db/dao/StudentDao.kt | 4 +-- .../data/repositories/SemesterRepository.kt | 6 ++-- .../data/repositories/StudentRepository.kt | 4 +-- .../repositories/SemesterRepositoryTest.kt | 33 ++++++++++++------- 6 files changed, 30 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt index cede6f920..83268a0e5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt @@ -112,7 +112,7 @@ class WulkanowySdkFactory @Inject constructor( return false } - Timber.d("Migration eduOne: success. New isEduOne flag: ${newCurrentStudent.isEduOne}") + Timber.i("Migration eduOne: success. New isEduOne flag: ${newCurrentStudent.isEduOne}") val studentIsEduOne = StudentIsEduOne( id = student.id, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt index f50d95593..bf9a34d05 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt @@ -5,7 +5,6 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.db.entities.Student import javax.inject.Singleton @Singleton @@ -15,17 +14,6 @@ interface SemesterDao : BaseDao { @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insertSemesters(items: List): List - @Query("SELECT * FROM Semesters WHERE student_id = :studentId AND class_id = :classId") + @Query("SELECT * FROM Semesters WHERE (student_id = :studentId AND class_id = :classId) OR (student_id = :studentId AND class_id = 0)") suspend fun loadAll(studentId: Int, classId: Int): List - - @Query("SELECT * FROM Semesters WHERE student_id = :studentId") - suspend fun loadAll(studentId: Int): List - - suspend fun loadAll(student: Student): List { - return if (student.isEduOne == true) { - loadAll(student.studentId) - } else { - loadAll(student.studentId, student.classId) - } - } } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt index bfaecef64..5302b320c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt @@ -47,11 +47,11 @@ abstract class StudentDao { abstract suspend fun loadAll(): List @Transaction - @Query("SELECT * FROM Students JOIN Semesters ON Students.student_id = Semesters.student_id AND Students.class_id = Semesters.class_id") + @Query("SELECT * FROM Students JOIN Semesters ON (Students.student_id = Semesters.student_id AND Students.class_id = Semesters.class_id) OR (Students.student_id = Semesters.student_id AND Semesters.class_id = 0)") abstract suspend fun loadStudentsWithSemesters(): Map> @Transaction - @Query("SELECT * FROM Students JOIN Semesters ON Students.student_id = Semesters.student_id AND Students.class_id = Semesters.class_id WHERE Students.id = :id") + @Query("SELECT * FROM Students JOIN Semesters ON (Students.student_id = Semesters.student_id AND Students.class_id = Semesters.class_id) OR (Students.student_id = Semesters.student_id AND Semesters.class_id = 0) WHERE Students.id = :id") abstract suspend fun loadStudentWithSemestersById(id: Long): Map> @Query("UPDATE Students SET is_current = 1 WHERE id = :id") diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt index ef7ae5950..92d44650f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt @@ -27,11 +27,11 @@ class SemesterRepository @Inject constructor( forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false ) = withContext(dispatchers.io) { - val semesters = semesterDb.loadAll(student) + val semesters = semesterDb.loadAll(student.studentId, student.classId) if (isShouldFetch(student, semesters, forceRefresh, refreshOnNoCurrent)) { refreshSemesters(student) - semesterDb.loadAll(student) + semesterDb.loadAll(student.studentId, student.classId) } else semesters } @@ -69,7 +69,7 @@ class SemesterRepository @Inject constructor( return } - val old = semesterDb.loadAll(student) + val old = semesterDb.loadAll(student.studentId, student.classId) semesterDb.removeOldAndSaveNew( oldItems = old uniqueSubtract new, newItems = new uniqueSubtract old, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt index 4fedcae96..df47d7a63 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt @@ -123,7 +123,7 @@ class StudentRepository @Inject constructor( return } - val currentStudentSemesters = semesterDb.loadAll(student) + val currentStudentSemesters = semesterDb.loadAll(student.studentId, student.classId) if (currentStudentSemesters.isEmpty()) { Timber.d("Check isAuthorized: apply empty semesters workaround") semesterDb.insertSemesters( @@ -209,7 +209,7 @@ class StudentRepository @Inject constructor( studentDb.update(studentName) semesterDb.removeOldAndSaveNew( - oldItems = semesterDb.loadAll(student), + oldItems = semesterDb.loadAll(student.studentId, semester.classId), newItems = newCurrentApiStudent.semesters.mapToEntities(newCurrentApiStudent.studentId) ) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt index 57ace3e1d..3a18ac48a 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/SemesterRepositoryTest.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories import io.github.wulkanowy.TestDispatchersProvider import io.github.wulkanowy.createWulkanowySdkFactoryMock import io.github.wulkanowy.data.db.dao.SemesterDao -import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.mappers.mapToEntities import io.github.wulkanowy.getSemesterEntity import io.github.wulkanowy.getSemesterPojo @@ -51,7 +50,7 @@ class SemesterRepositoryTest { getSemesterPojo(1, 2, now().minusMonths(3), now()) ) - coEvery { semesterDb.loadAll(student) } returns emptyList() + coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns emptyList() coEvery { sdk.getSemesters() } returns semesters coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs @@ -77,7 +76,12 @@ class SemesterRepositoryTest { getSemesterPojo(123, 2, now().minusMonths(3), now()) ) - coEvery { semesterDb.loadAll(student) } returns badSemesters.mapToEntities(student.studentId) + coEvery { + semesterDb.loadAll( + student.studentId, + student.classId + ) + } returns badSemesters.mapToEntities(student.studentId) coEvery { sdk.getSemesters() } returns goodSemesters coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs @@ -99,7 +103,7 @@ class SemesterRepositoryTest { getSemesterPojo(2, 3, now(), now().plusMonths(6)), ) - coEvery { semesterDb.loadAll(any()) } returnsMany listOf( + coEvery { semesterDb.loadAll(student.studentId, student.classId) } returnsMany listOf( badSemesters.mapToEntities(student.studentId), badSemesters.mapToEntities(student.studentId), goodSemesters.mapToEntities(student.studentId) @@ -121,7 +125,7 @@ class SemesterRepositoryTest { getSemesterEntity(1, 2, now().minusMonths(6), now().minusMonths(1)) ) - coEvery { semesterDb.loadAll(student) } returns semesters + coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) @@ -134,7 +138,7 @@ class SemesterRepositoryTest { getSemesterEntity(1, 2, now().minusMonths(3), now()) ) - coEvery { semesterDb.loadAll(student) } returns semesters + coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) @@ -147,7 +151,7 @@ class SemesterRepositoryTest { getSemesterEntity(1, 2, now(), now()) ) - coEvery { semesterDb.loadAll(student) } returns semesters + coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) @@ -160,7 +164,7 @@ class SemesterRepositoryTest { getSemesterPojo(1, 2, now().minusMonths(3), now()) ) - coEvery { semesterDb.loadAll(student) } returns emptyList() + coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns emptyList() coEvery { sdk.getSemesters() } returns semesters coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs @@ -189,7 +193,12 @@ class SemesterRepositoryTest { getSemesterPojo(2, 2, now().plusMonths(5), now().plusMonths(11)), ) - coEvery { semesterDb.loadAll(student) } returns semestersWithNoCurrent + coEvery { + semesterDb.loadAll( + student.studentId, + student.classId + ) + } returns semestersWithNoCurrent coEvery { sdk.getSemesters() } returns newSemesters coEvery { semesterDb.removeOldAndSaveNew(any(), any()) } just Runs @@ -205,7 +214,7 @@ class SemesterRepositoryTest { getSemesterEntity(1, 2, now().minusMonths(1), now().plusMonths(1)) ) - coEvery { semesterDb.loadAll(student) } returns semesters + coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters val items = semesterRepository.getSemesters(student, refreshOnNoCurrent = true) assertEquals(2, items.size) @@ -218,14 +227,14 @@ class SemesterRepositoryTest { getSemesterEntity(1, 1, now(), now()) ) - coEvery { semesterDb.loadAll(student) } returns semesters + coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns semesters runBlocking { semesterRepository.getCurrentSemester(student) } } @Test(expected = RuntimeException::class) fun getCurrentSemester_emptyList() { - coEvery { semesterDb.loadAll(student) } returns emptyList() + coEvery { semesterDb.loadAll(student.studentId, student.classId) } returns emptyList() coEvery { sdk.getSemesters() } returns emptyList() runBlocking { semesterRepository.getCurrentSemester(student) } From 4dc5fc65ac60d08d4d93cc7bbfd53123c534e5ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 26 Mar 2024 20:37:51 +0100 Subject: [PATCH 1433/1526] Version 2.5.5 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1a74e198e..01f4c3b16 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 153 - versionName "2.5.4" + versionCode 154 + versionName "2.5.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.5-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.5.5' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index d848d01c9..9d72cb076 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,6 @@ -Wersja 2.5.4 +Wersja 2.5.5 -— naprawiliśmy kolejnych kilka błędów związanych z obsługą dziennika eduOne (tak, nie umiemy za jednym razem) +— naprawiliśmy migrację informacji o tym, czy szkoła ucznia używa eduOne +— naprawiliśmy w końcu (teraz naprawdę mamy taką nadzieję) ten komunikat o braku uprawnień Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 6b59973624e20b9bd6fd5f1a1789dd9268a94aa7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 17:41:28 +0000 Subject: [PATCH 1434/1526] Bump hilt_version from 2.51 to 2.51.1 (#2510) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bb9f4179a..878758d5b 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.9.23' about_libraries = '11.1.1' - hilt_version = '2.51' + hilt_version = '2.51.1' } repositories { mavenCentral() From b9f3ab2e56cdc7fb9dfbd8910f55f79cf0ef5ee0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 18:08:01 +0000 Subject: [PATCH 1435/1526] Bump com.squareup.retrofit2:retrofit from 2.10.0 to 2.11.0 (#2513) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ed452748a..bce1f208d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -233,7 +233,7 @@ dependencies { implementation 'com.github.ncapdevi:FragNav:3.3.0' implementation "com.github.YarikSOffice:lingver:1.3.0" - implementation 'com.squareup.retrofit2:retrofit:2.10.0' + implementation 'com.squareup.retrofit2:retrofit:2.11.0' implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0" implementation "com.squareup.okhttp3:logging-interceptor:4.12.0" implementation "com.squareup.okhttp3:okhttp-urlconnection:4.12.0" From c34a369286e96e579de5a4f6fd8a0af3702c3ae7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 18:08:20 +0000 Subject: [PATCH 1436/1526] Bump org.robolectric:robolectric from 4.11.1 to 4.12.1 (#2514) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index bce1f208d..c0232e0b0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -274,7 +274,7 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines" testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" - testImplementation 'org.robolectric:robolectric:4.11.1' + testImplementation 'org.robolectric:robolectric:4.12.1' testImplementation "androidx.test:runner:1.5.2" testImplementation "androidx.test.ext:junit:1.1.5" testImplementation "androidx.test:core:1.5.0" From b500d8e2044f79e3daf05d9a9d647090cca4f610 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 18:09:38 +0000 Subject: [PATCH 1437/1526] Bump org.sonarsource.scanner.gradle:sonarqube-gradle-plugin (#2511) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 878758d5b..b715bdda5 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ buildscript { classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath "com.github.triplet.gradle:play-publisher:3.8.4" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.2" - classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.4.1.3373" + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:5.0.0.4638" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" } From 7a3a97447fb8e5413449a21101ce39c5b50d5d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 8 Apr 2024 20:51:05 +0200 Subject: [PATCH 1438/1526] Add isAdded check in AdditionalLessonAddDialog (#2515) --- .../timetable/additional/add/AdditionalLessonAddDialog.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddDialog.kt index 134719979..9a84fb0a2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddDialog.kt @@ -155,7 +155,9 @@ class AdditionalLessonAddDialog : BaseDialogFragment .build() timePicker.addOnPositiveButtonClickListener { - onTimeSelected(LocalTime.of(timePicker.hour, timePicker.minute)) + if (isAdded) { + onTimeSelected(LocalTime.of(timePicker.hour, timePicker.minute)) + } } if (!parentFragmentManager.isStateSaved) { From 16c51f7b07ccc91a0716688512796edb39504b40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Apr 2024 19:55:50 +0000 Subject: [PATCH 1439/1526] Bump com.google.firebase:firebase-bom from 32.8.0 to 32.8.1 (#2519) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c0232e0b0..7ab2dec16 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -248,7 +248,7 @@ dependencies { implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'org.apache.commons:commons-text:1.11.0' - playImplementation platform('com.google.firebase:firebase-bom:32.8.0') + playImplementation platform('com.google.firebase:firebase-bom:32.8.1') playImplementation 'com.google.firebase:firebase-analytics' playImplementation 'com.google.firebase:firebase-messaging' playImplementation 'com.google.firebase:firebase-crashlytics:' From 7edd3df0744597176ce930a5d46da02c0f3df927 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Apr 2024 19:56:16 +0000 Subject: [PATCH 1440/1526] Bump about_libraries from 11.1.1 to 11.1.3 (#2518) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b715bdda5..38d38c703 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlin_version = '1.9.23' - about_libraries = '11.1.1' + about_libraries = '11.1.3' hilt_version = '2.51.1' } repositories { From 8b9b1460ab436a6533f33ed1d33086111d32c804 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Sat, 13 Apr 2024 22:03:23 +0200 Subject: [PATCH 1441/1526] Update AuthDialog text (#2506) --- .../io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt | 8 ++++++-- app/src/main/res/layout/dialog_auth.xml | 5 ++--- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt index 5c597eeb4..0be086b69 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/auth/AuthPresenter.kt @@ -27,8 +27,12 @@ class AuthPresenter @Inject constructor( private fun loadName() { presenterScope.launch { - runCatching { studentRepository.getCurrentStudent(false) } - .onSuccess { view?.showDescriptionWithName(it.studentName) } + runCatching { + studentRepository.getCurrentStudent(false) + .studentName + .replace(" ", "\u00A0") + } + .onSuccess { view?.showDescriptionWithName(it) } .onFailure { errorHandler.dispatch(it) } } } diff --git a/app/src/main/res/layout/dialog_auth.xml b/app/src/main/res/layout/dialog_auth.xml index e2e2aa304..a0b9d6ea7 100644 --- a/app/src/main/res/layout/dialog_auth.xml +++ b/app/src/main/res/layout/dialog_auth.xml @@ -32,12 +32,11 @@ android:layout_height="wrap_content" android:layout_marginHorizontal="24dp" android:layout_marginTop="8dp" - android:textSize="16sp" + android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/auth_title" - app:lineHeight="24sp" + app:lineHeight="18sp" tools:text="@string/auth_description" /> - Authorize Authorization completed successfully Authorization - To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. Skip for now From 895f5cbb761b60f9cdea4bf982d2db37192e7ab5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Apr 2024 14:24:38 +0000 Subject: [PATCH 1442/1526] Bump com.android.tools.build:gradle from 8.2.2 to 8.3.2 (#2517) --- app/src/main/AndroidManifest.xml | 2 +- app/src/play/AndroidManifest.xml | 11 +++++++++++ build.gradle | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 app/src/play/AndroidManifest.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4e617c931..79d75bc01 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,7 +51,7 @@ android:exported="true" android:screenOrientation="portrait" android:theme="@style/WulkanowyTheme.SplashScreen" - tools:ignore="LockedOrientationActivity"> + tools:ignore="DiscouragedApi,LockedOrientationActivity"> diff --git a/app/src/play/AndroidManifest.xml b/app/src/play/AndroidManifest.xml new file mode 100644 index 000000000..38f6306fe --- /dev/null +++ b/app/src/play/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/build.gradle b/build.gradle index 38d38c703..100c0eb9e 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.19" - classpath 'com.android.tools.build:gradle:8.2.2' + classpath 'com.android.tools.build:gradle:8.3.2' classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath 'com.google.gms:google-services:4.4.1' classpath 'com.huawei.agconnect:agcp:1.9.1.303' From a487378dafd7400feb4412198643ed50ea358a12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Apr 2024 02:24:04 +0000 Subject: [PATCH 1443/1526] Bump androidx.core:core-ktx from 1.12.0 to 1.13.0 (#2521) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 7ab2dec16..3505985c0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -198,7 +198,7 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" - implementation 'androidx.core:core-ktx:1.12.0' + implementation 'androidx.core:core-ktx:1.13.0' implementation 'androidx.core:core-splashscreen:1.0.1' implementation "androidx.activity:activity-ktx:1.8.2" implementation "androidx.appcompat:appcompat:1.6.1" From ff9be43291c490a51c08399e84e5de6e1299af47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Apr 2024 02:25:16 +0000 Subject: [PATCH 1444/1526] Bump org.apache.commons:commons-text from 1.11.0 to 1.12.0 (#2523) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3505985c0..2e0ded858 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -246,7 +246,7 @@ dependencies { implementation "io.github.wulkanowy:AppKillerManager:3.0.1" implementation 'me.xdrop:fuzzywuzzy:1.4.0' implementation 'com.fredporciuncula:flow-preferences:1.9.1' - implementation 'org.apache.commons:commons-text:1.11.0' + implementation 'org.apache.commons:commons-text:1.12.0' playImplementation platform('com.google.firebase:firebase-bom:32.8.1') playImplementation 'com.google.firebase:firebase-analytics' From 860095e862acf4719c8856ad93e698b150455e7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Apr 2024 02:31:28 +0000 Subject: [PATCH 1445/1526] Bump androidx.activity:activity-ktx from 1.8.2 to 1.9.0 (#2522) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 2e0ded858..2229f600b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -200,7 +200,7 @@ dependencies { implementation 'androidx.core:core-ktx:1.13.0' implementation 'androidx.core:core-splashscreen:1.0.1' - implementation "androidx.activity:activity-ktx:1.8.2" + implementation "androidx.activity:activity-ktx:1.9.0" implementation "androidx.appcompat:appcompat:1.6.1" implementation "androidx.fragment:fragment-ktx:1.6.2" implementation "androidx.annotation:annotation:1.7.1" From bbbafdfe70697e0893cf40a48558f53bd82e7843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 21 Apr 2024 20:37:31 +0200 Subject: [PATCH 1446/1526] Bump sdk to 2.5.6-SNAPSHOT --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 01f4c3b16..e6f4846ab 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.5' + implementation 'io.github.wulkanowy:sdk:2.5.6-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' From 4a65a5b19236d4cdb53a9d804cf8e91af7c4749e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 21 Apr 2024 23:51:34 +0200 Subject: [PATCH 1447/1526] Migrate away from userLoginId to studentId due to vulcan last changes --- .../java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt | 4 ++-- .../io/github/wulkanowy/data/db/dao/SchoolAnnouncementDao.kt | 4 ++-- .../java/io/github/wulkanowy/data/db/entities/MobileDevice.kt | 4 ++-- .../github/wulkanowy/data/db/entities/SchoolAnnouncement.kt | 4 ++-- .../main/java/io/github/wulkanowy/data/db/entities/Student.kt | 1 + .../wulkanowy/data/mappers/DirectorInformationMapper.kt | 4 ++-- .../io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt | 2 +- .../wulkanowy/data/repositories/MobileDeviceRepository.kt | 2 +- .../data/repositories/SchoolAnnouncementRepository.kt | 4 ++-- .../ui/modules/debug/notification/mock/schoolAnnouncement.kt | 2 +- app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt | 2 +- 11 files changed, 17 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt index 96382cc10..5ddb4dd08 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt @@ -8,6 +8,6 @@ import kotlinx.coroutines.flow.Flow @Dao interface MobileDeviceDao : BaseDao { - @Query("SELECT * FROM MobileDevices WHERE user_login_id = :userLoginId ORDER BY date DESC") - fun loadAll(userLoginId: Int): Flow> + @Query("SELECT * FROM MobileDevices WHERE user_login_id = :studentId ORDER BY date DESC") + fun loadAll(studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolAnnouncementDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolAnnouncementDao.kt index c32e4aba3..64d49bce7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolAnnouncementDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolAnnouncementDao.kt @@ -10,6 +10,6 @@ import javax.inject.Singleton @Singleton interface SchoolAnnouncementDao : BaseDao { - @Query("SELECT * FROM SchoolAnnouncements WHERE user_login_id = :userLoginId ORDER BY date DESC") - fun loadAll(userLoginId: Int): Flow> + @Query("SELECT * FROM SchoolAnnouncements WHERE user_login_id = :studentId ORDER BY date DESC") + fun loadAll(studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt index 89b04ccc8..44e900647 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt @@ -9,8 +9,8 @@ import java.time.Instant @Entity(tableName = "MobileDevices") data class MobileDevice( - @ColumnInfo(name = "user_login_id") - val userLoginId: Int, + @ColumnInfo(name = "user_login_id") // todo: change column name + val studentId: Int, @ColumnInfo(name = "device_id") val deviceId: Int, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt index ac096b02b..814a3c8dd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt @@ -9,8 +9,8 @@ import java.time.LocalDate @Entity(tableName = "SchoolAnnouncements") data class SchoolAnnouncement( - @ColumnInfo(name = "user_login_id") - val userLoginId: Int, + @ColumnInfo(name = "user_login_id") // todo: change column name + val studentId: Int, val date: LocalDate, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt index dbaa573ce..0300506ac 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt @@ -49,6 +49,7 @@ data class Student( @ColumnInfo(name = "student_id") val studentId: Int, + @Deprecated("not available in VULCAN anymore") @ColumnInfo(name = "user_login_id") val userLoginId: Int, diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt index 85b37afc1..1a84a6a5e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.sdk.pojo.LastAnnouncement as SdkLastAnnouncement @JvmName("mapDirectorInformationToEntities") fun List.mapToEntities(student: Student) = map { SchoolAnnouncement( - userLoginId = student.userLoginId, + studentId = student.studentId, date = it.date, subject = it.subject, content = it.content, @@ -19,7 +19,7 @@ fun List.mapToEntities(student: Student) = map { @JvmName("mapLastAnnouncementsToEntities") fun List.mapToEntities(student: Student) = map { SchoolAnnouncement( - userLoginId = student.userLoginId, + studentId = student.studentId, date = it.date, subject = it.subject, content = it.content, diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt index 1f4178fae..3818f01aa 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.sdk.pojo.Token as SdkToken fun List.mapToEntities(student: Student) = map { MobileDevice( - userLoginId = student.userLoginId, + studentId = student.studentId, date = it.createDate.toInstant(), deviceId = it.id, name = it.name diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt index 19466554a..1303d0e7a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt @@ -38,7 +38,7 @@ class MobileDeviceRepository @Inject constructor( val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, student)) it.isEmpty() || forceRefresh || isExpired }, - query = { mobileDb.loadAll(student.userLoginId) }, + query = { mobileDb.loadAll(student.studentId) }, fetch = { wulkanowySdkFactory.create(student, semester) .getRegisteredDevices() diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt index 6a04ce75f..78d956993 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt @@ -37,7 +37,7 @@ class SchoolAnnouncementRepository @Inject constructor( it.isEmpty() || forceRefresh || isExpired }, query = { - schoolAnnouncementDb.loadAll(student.userLoginId) + schoolAnnouncementDb.loadAll(student.studentId) }, fetch = { val sdk = wulkanowySdkFactory.create(student) @@ -57,7 +57,7 @@ class SchoolAnnouncementRepository @Inject constructor( ) fun getSchoolAnnouncementFromDatabase(student: Student): Flow> { - return schoolAnnouncementDb.loadAll(student.userLoginId) + return schoolAnnouncementDb.loadAll(student.studentId) } suspend fun updateSchoolAnnouncement(schoolAnnouncement: List) = diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/schoolAnnouncement.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/schoolAnnouncement.kt index e2dc5cd84..9b21f08e6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/schoolAnnouncement.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/schoolAnnouncement.kt @@ -19,6 +19,6 @@ val debugSchoolAnnouncementItems = listOf( private fun generateAnnouncement(subject: String, content: String) = SchoolAnnouncement( subject = subject, content = content, - userLoginId = 0, + studentId = 0, date = LocalDate.now() ) diff --git a/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt index 721297513..e43654b8b 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt @@ -23,7 +23,7 @@ fun getRefreshKey(name: String, semester: Semester): String { } fun getRefreshKey(name: String, student: Student): String { - return "${name}_${student.userLoginId}" + return "${name}_${student.studentId}" } fun getRefreshKey(name: String, mailbox: Mailbox?, folder: MessageFolder): String { From af989ba9f62774e6888059c3f79987ea66676917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 21 Apr 2024 23:59:29 +0200 Subject: [PATCH 1448/1526] Don't display brackets in login student select items when schoolShortName is blank --- .../studentselect/LoginStudentSelectAdapter.kt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt index e6d131829..ef8cf4ee9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt @@ -19,19 +19,23 @@ class LoginStudentSelectAdapter @Inject constructor() : override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) - return when (LoginStudentSelectItemType.values()[viewType]) { + return when (LoginStudentSelectItemType.entries[viewType]) { LoginStudentSelectItemType.EMPTY_SYMBOLS_HEADER -> EmptySymbolsHeaderViewHolder( ItemLoginStudentSelectEmptySymbolHeaderBinding.inflate(inflater, parent, false), ) + LoginStudentSelectItemType.SYMBOL_HEADER -> SymbolsHeaderViewHolder( ItemLoginStudentSelectHeaderSymbolBinding.inflate(inflater, parent, false) ) + LoginStudentSelectItemType.SCHOOL_HEADER -> SchoolHeaderViewHolder( ItemLoginStudentSelectHeaderSchoolBinding.inflate(inflater, parent, false) ) + LoginStudentSelectItemType.STUDENT -> StudentViewHolder( ItemLoginStudentSelectStudentBinding.inflate(inflater, parent, false) ) + LoginStudentSelectItemType.HELP -> HelpViewHolder( ItemLoginStudentSelectHelpBinding.inflate(inflater, parent, false) ) @@ -98,9 +102,11 @@ class LoginStudentSelectAdapter @Inject constructor() : with(binding) { loginStudentSelectHeaderSchoolName.text = buildString { append(item.unit.schoolName.trim()) - append(" (") - append(item.unit.schoolShortName) - append(")") + if (item.unit.schoolShortName.isNotBlank()) { + append(" (") + append(item.unit.schoolShortName) + append(")") + } } loginStudentSelectHeaderSchoolDetails.isVisible = item.unit.students.isEmpty() loginStudentSelectHeaderSchoolError.text = item.unit.error?.message @@ -170,9 +176,11 @@ class LoginStudentSelectAdapter @Inject constructor() : oldItem is LoginStudentSelectItem.SymbolHeader && newItem is LoginStudentSelectItem.SymbolHeader -> { oldItem.symbol == newItem.symbol } + oldItem is LoginStudentSelectItem.Student && newItem is LoginStudentSelectItem.Student -> { oldItem.student == newItem.student } + else -> oldItem == newItem } From 6eca8c42f5b996b0f2dd36f81c2c52c886af978d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 22 Apr 2024 00:11:29 +0200 Subject: [PATCH 1449/1526] Show graduated students on top of student select items list --- .../login/studentselect/LoginStudentSelectPresenter.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 344414180..c81d353d4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -12,6 +12,7 @@ import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.SchoolsRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.resourceFlow +import io.github.wulkanowy.sdk.scrapper.exception.StudentGraduateException import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.BasePresenter @@ -108,8 +109,8 @@ class LoginStudentSelectPresenter @Inject constructor( } private fun createItems(): List = buildList { - val notEmptySymbols = registerUser.symbols.filter { it.schools.isNotEmpty() } - val emptySymbols = registerUser.symbols.filter { it.schools.isEmpty() } + val notEmptySymbols = registerUser.symbols.filter { it.shouldShowOnTop() } + val emptySymbols = registerUser.symbols.filter { !it.shouldShowOnTop() } if (emptySymbols.isNotEmpty() && notEmptySymbols.isNotEmpty() && emptySymbols.any { it.symbol == loginData.userEnteredSymbol }) { add(createEmptySymbolItem(emptySymbols.first { it.symbol == loginData.userEnteredSymbol })) @@ -127,6 +128,10 @@ class LoginStudentSelectPresenter @Inject constructor( add(helpItem) } + private fun RegisterSymbol.shouldShowOnTop(): Boolean { + return schools.isNotEmpty() || error is StudentGraduateException + } + private fun createNotEmptySymbolItems( notEmptySymbols: List, students: List, From d943d03266283d4a0822a43583b6d96434e4e8c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 22 Apr 2024 00:39:04 +0200 Subject: [PATCH 1450/1526] Version 2.5.6 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e6f4846ab..e3e8a7e00 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 154 - versionName "2.5.5" + versionCode 155 + versionName "2.5.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -165,7 +165,7 @@ play { track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS userFraction = 0.99d - updatePriority = 1 + updatePriority = 3 enabled.set(false) } @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.6-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.5.6' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 9d72cb076..a966a31f6 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,5 @@ -Wersja 2.5.5 +Wersja 2.5.6 -— naprawiliśmy migrację informacji o tym, czy szkoła ucznia używa eduOne -— naprawiliśmy w końcu (teraz naprawdę mamy taką nadzieję) ten komunikat o braku uprawnień +— naprawiliśmy logowanie (pusta lista z wyborem uczniów), które zepsuło się po zmianach po stronie VULCANa Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From c72a117e3460414039460da870e7bbe0f0039eaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 21 Apr 2024 20:37:31 +0200 Subject: [PATCH 1451/1526] Bump sdk to 2.5.6-SNAPSHOT --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 2229f600b..5c00122a2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.5' + implementation 'io.github.wulkanowy:sdk:2.5.6-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' From 21211252835a77b7fe855b1be686a4cbcf6d197c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 21 Apr 2024 23:51:34 +0200 Subject: [PATCH 1452/1526] Migrate away from userLoginId to studentId due to vulcan last changes --- .../java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt | 4 ++-- .../io/github/wulkanowy/data/db/dao/SchoolAnnouncementDao.kt | 4 ++-- .../java/io/github/wulkanowy/data/db/entities/MobileDevice.kt | 4 ++-- .../github/wulkanowy/data/db/entities/SchoolAnnouncement.kt | 4 ++-- .../main/java/io/github/wulkanowy/data/db/entities/Student.kt | 1 + .../wulkanowy/data/mappers/DirectorInformationMapper.kt | 4 ++-- .../io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt | 2 +- .../wulkanowy/data/repositories/MobileDeviceRepository.kt | 2 +- .../data/repositories/SchoolAnnouncementRepository.kt | 4 ++-- .../ui/modules/debug/notification/mock/schoolAnnouncement.kt | 2 +- app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt | 2 +- 11 files changed, 17 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt index 96382cc10..5ddb4dd08 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt @@ -8,6 +8,6 @@ import kotlinx.coroutines.flow.Flow @Dao interface MobileDeviceDao : BaseDao { - @Query("SELECT * FROM MobileDevices WHERE user_login_id = :userLoginId ORDER BY date DESC") - fun loadAll(userLoginId: Int): Flow> + @Query("SELECT * FROM MobileDevices WHERE user_login_id = :studentId ORDER BY date DESC") + fun loadAll(studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolAnnouncementDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolAnnouncementDao.kt index c32e4aba3..64d49bce7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolAnnouncementDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolAnnouncementDao.kt @@ -10,6 +10,6 @@ import javax.inject.Singleton @Singleton interface SchoolAnnouncementDao : BaseDao { - @Query("SELECT * FROM SchoolAnnouncements WHERE user_login_id = :userLoginId ORDER BY date DESC") - fun loadAll(userLoginId: Int): Flow> + @Query("SELECT * FROM SchoolAnnouncements WHERE user_login_id = :studentId ORDER BY date DESC") + fun loadAll(studentId: Int): Flow> } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt index 89b04ccc8..44e900647 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/MobileDevice.kt @@ -9,8 +9,8 @@ import java.time.Instant @Entity(tableName = "MobileDevices") data class MobileDevice( - @ColumnInfo(name = "user_login_id") - val userLoginId: Int, + @ColumnInfo(name = "user_login_id") // todo: change column name + val studentId: Int, @ColumnInfo(name = "device_id") val deviceId: Int, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt index ac096b02b..814a3c8dd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/SchoolAnnouncement.kt @@ -9,8 +9,8 @@ import java.time.LocalDate @Entity(tableName = "SchoolAnnouncements") data class SchoolAnnouncement( - @ColumnInfo(name = "user_login_id") - val userLoginId: Int, + @ColumnInfo(name = "user_login_id") // todo: change column name + val studentId: Int, val date: LocalDate, diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt index dbaa573ce..0300506ac 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt @@ -49,6 +49,7 @@ data class Student( @ColumnInfo(name = "student_id") val studentId: Int, + @Deprecated("not available in VULCAN anymore") @ColumnInfo(name = "user_login_id") val userLoginId: Int, diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt index 85b37afc1..1a84a6a5e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/DirectorInformationMapper.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.sdk.pojo.LastAnnouncement as SdkLastAnnouncement @JvmName("mapDirectorInformationToEntities") fun List.mapToEntities(student: Student) = map { SchoolAnnouncement( - userLoginId = student.userLoginId, + studentId = student.studentId, date = it.date, subject = it.subject, content = it.content, @@ -19,7 +19,7 @@ fun List.mapToEntities(student: Student) = map { @JvmName("mapLastAnnouncementsToEntities") fun List.mapToEntities(student: Student) = map { SchoolAnnouncement( - userLoginId = student.userLoginId, + studentId = student.studentId, date = it.date, subject = it.subject, content = it.content, diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt index 1f4178fae..3818f01aa 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/MobileDeviceMapper.kt @@ -8,7 +8,7 @@ import io.github.wulkanowy.sdk.pojo.Token as SdkToken fun List.mapToEntities(student: Student) = map { MobileDevice( - userLoginId = student.userLoginId, + studentId = student.studentId, date = it.createDate.toInstant(), deviceId = it.id, name = it.name diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt index 19466554a..1303d0e7a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MobileDeviceRepository.kt @@ -38,7 +38,7 @@ class MobileDeviceRepository @Inject constructor( val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, student)) it.isEmpty() || forceRefresh || isExpired }, - query = { mobileDb.loadAll(student.userLoginId) }, + query = { mobileDb.loadAll(student.studentId) }, fetch = { wulkanowySdkFactory.create(student, semester) .getRegisteredDevices() diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt index 6a04ce75f..78d956993 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SchoolAnnouncementRepository.kt @@ -37,7 +37,7 @@ class SchoolAnnouncementRepository @Inject constructor( it.isEmpty() || forceRefresh || isExpired }, query = { - schoolAnnouncementDb.loadAll(student.userLoginId) + schoolAnnouncementDb.loadAll(student.studentId) }, fetch = { val sdk = wulkanowySdkFactory.create(student) @@ -57,7 +57,7 @@ class SchoolAnnouncementRepository @Inject constructor( ) fun getSchoolAnnouncementFromDatabase(student: Student): Flow> { - return schoolAnnouncementDb.loadAll(student.userLoginId) + return schoolAnnouncementDb.loadAll(student.studentId) } suspend fun updateSchoolAnnouncement(schoolAnnouncement: List) = diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/schoolAnnouncement.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/schoolAnnouncement.kt index e2dc5cd84..9b21f08e6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/schoolAnnouncement.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/schoolAnnouncement.kt @@ -19,6 +19,6 @@ val debugSchoolAnnouncementItems = listOf( private fun generateAnnouncement(subject: String, content: String) = SchoolAnnouncement( subject = subject, content = content, - userLoginId = 0, + studentId = 0, date = LocalDate.now() ) diff --git a/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt index 721297513..e43654b8b 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt @@ -23,7 +23,7 @@ fun getRefreshKey(name: String, semester: Semester): String { } fun getRefreshKey(name: String, student: Student): String { - return "${name}_${student.userLoginId}" + return "${name}_${student.studentId}" } fun getRefreshKey(name: String, mailbox: Mailbox?, folder: MessageFolder): String { From 622c75bb424363af77685c2cb8fe5cabd4fd55e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 21 Apr 2024 23:59:29 +0200 Subject: [PATCH 1453/1526] Don't display brackets in login student select items when schoolShortName is blank --- .../studentselect/LoginStudentSelectAdapter.kt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt index e6d131829..ef8cf4ee9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectAdapter.kt @@ -19,19 +19,23 @@ class LoginStudentSelectAdapter @Inject constructor() : override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) - return when (LoginStudentSelectItemType.values()[viewType]) { + return when (LoginStudentSelectItemType.entries[viewType]) { LoginStudentSelectItemType.EMPTY_SYMBOLS_HEADER -> EmptySymbolsHeaderViewHolder( ItemLoginStudentSelectEmptySymbolHeaderBinding.inflate(inflater, parent, false), ) + LoginStudentSelectItemType.SYMBOL_HEADER -> SymbolsHeaderViewHolder( ItemLoginStudentSelectHeaderSymbolBinding.inflate(inflater, parent, false) ) + LoginStudentSelectItemType.SCHOOL_HEADER -> SchoolHeaderViewHolder( ItemLoginStudentSelectHeaderSchoolBinding.inflate(inflater, parent, false) ) + LoginStudentSelectItemType.STUDENT -> StudentViewHolder( ItemLoginStudentSelectStudentBinding.inflate(inflater, parent, false) ) + LoginStudentSelectItemType.HELP -> HelpViewHolder( ItemLoginStudentSelectHelpBinding.inflate(inflater, parent, false) ) @@ -98,9 +102,11 @@ class LoginStudentSelectAdapter @Inject constructor() : with(binding) { loginStudentSelectHeaderSchoolName.text = buildString { append(item.unit.schoolName.trim()) - append(" (") - append(item.unit.schoolShortName) - append(")") + if (item.unit.schoolShortName.isNotBlank()) { + append(" (") + append(item.unit.schoolShortName) + append(")") + } } loginStudentSelectHeaderSchoolDetails.isVisible = item.unit.students.isEmpty() loginStudentSelectHeaderSchoolError.text = item.unit.error?.message @@ -170,9 +176,11 @@ class LoginStudentSelectAdapter @Inject constructor() : oldItem is LoginStudentSelectItem.SymbolHeader && newItem is LoginStudentSelectItem.SymbolHeader -> { oldItem.symbol == newItem.symbol } + oldItem is LoginStudentSelectItem.Student && newItem is LoginStudentSelectItem.Student -> { oldItem.student == newItem.student } + else -> oldItem == newItem } From 2fa868173bd7b634579d1c4e06e2591a7612985f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 22 Apr 2024 00:11:29 +0200 Subject: [PATCH 1454/1526] Show graduated students on top of student select items list --- .../login/studentselect/LoginStudentSelectPresenter.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 344414180..c81d353d4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -12,6 +12,7 @@ import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.SchoolsRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.resourceFlow +import io.github.wulkanowy.sdk.scrapper.exception.StudentGraduateException import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.BasePresenter @@ -108,8 +109,8 @@ class LoginStudentSelectPresenter @Inject constructor( } private fun createItems(): List = buildList { - val notEmptySymbols = registerUser.symbols.filter { it.schools.isNotEmpty() } - val emptySymbols = registerUser.symbols.filter { it.schools.isEmpty() } + val notEmptySymbols = registerUser.symbols.filter { it.shouldShowOnTop() } + val emptySymbols = registerUser.symbols.filter { !it.shouldShowOnTop() } if (emptySymbols.isNotEmpty() && notEmptySymbols.isNotEmpty() && emptySymbols.any { it.symbol == loginData.userEnteredSymbol }) { add(createEmptySymbolItem(emptySymbols.first { it.symbol == loginData.userEnteredSymbol })) @@ -127,6 +128,10 @@ class LoginStudentSelectPresenter @Inject constructor( add(helpItem) } + private fun RegisterSymbol.shouldShowOnTop(): Boolean { + return schools.isNotEmpty() || error is StudentGraduateException + } + private fun createNotEmptySymbolItems( notEmptySymbols: List, students: List, From 2816d7217ab140c1f3df744d6b611bd9abef6836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 22 Apr 2024 00:39:04 +0200 Subject: [PATCH 1455/1526] Version 2.5.6 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5c00122a2..2cfe55d3f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 154 - versionName "2.5.5" + versionCode 155 + versionName "2.5.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -161,7 +161,7 @@ play { track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS userFraction = 0.99d - updatePriority = 1 + updatePriority = 3 enabled.set(false) } @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.6-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.5.6' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 9d72cb076..a966a31f6 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,5 @@ -Wersja 2.5.5 +Wersja 2.5.6 -— naprawiliśmy migrację informacji o tym, czy szkoła ucznia używa eduOne -— naprawiliśmy w końcu (teraz naprawdę mamy taką nadzieję) ten komunikat o braku uprawnień +— naprawiliśmy logowanie (pusta lista z wyborem uczniów), które zepsuło się po zmianach po stronie VULCANa Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 82210c37e37a13d68924f014d079edba0f8e8fb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 22 Apr 2024 22:03:42 +0200 Subject: [PATCH 1456/1526] Display separate annual average and semester average if available (#2524) * Add displaying year average on grade details screen * Add displaying year average on grade summary screen * Add displaying year average on grade summary header * Fix tests * Hide semester average if it is not available in grade summary item * Add full names of summary averages labels --- app/build.gradle | 2 +- .../64.json | 2559 +++++++++++++++++ .../github/wulkanowy/data/db/AppDatabase.kt | 3 +- .../data/db/entities/GradeSummary.kt | 8 +- .../wulkanowy/data/mappers/GradeMapper.kt | 4 +- .../debug/notification/mock/gradeSummary.kt | 4 +- .../ui/modules/grade/GradeAverageProvider.kt | 8 +- .../grade/details/GradeDetailsAdapter.kt | 14 + .../modules/grade/details/GradeDetailsItem.kt | 1 + .../grade/details/GradeDetailsPresenter.kt | 3 +- .../grade/summary/GradeSummaryAdapter.kt | 57 +- .../main/res/layout/header_grade_details.xml | 21 +- .../main/res/layout/item_grade_summary.xml | 70 +- .../scrollable_header_grade_summary.xml | 74 +- app/src/main/res/values/strings.xml | 6 +- .../modules/grade/GradeAverageProviderTest.kt | 4 +- .../wulkanowy/utils/GradeExtensionTest.kt | 26 +- 17 files changed, 2816 insertions(+), 48 deletions(-) create mode 100644 app/schemas/io.github.wulkanowy.data.db.AppDatabase/64.json diff --git a/app/build.gradle b/app/build.gradle index e3e8a7e00..6d51ad841 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.6' + implementation 'io.github.wulkanowy:sdk:2.5.7-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/schemas/io.github.wulkanowy.data.db.AppDatabase/64.json b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/64.json new file mode 100644 index 000000000..178a5eab5 --- /dev/null +++ b/app/schemas/io.github.wulkanowy.data.db.AppDatabase/64.json @@ -0,0 +1,2559 @@ +{ + "formatVersion": 1, + "database": { + "version": 64, + "identityHash": "dd5446e82ad8d0a65c545a5dbbaeb81c", + "entities": [ + { + "tableName": "Students", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`scrapper_base_url` TEXT NOT NULL, `scrapper_domain_suffix` TEXT NOT NULL DEFAULT '', `mobile_base_url` TEXT NOT NULL, `login_type` TEXT NOT NULL, `login_mode` TEXT NOT NULL, `certificate_key` TEXT NOT NULL, `private_key` TEXT NOT NULL, `is_parent` INTEGER NOT NULL, `email` TEXT NOT NULL, `password` TEXT NOT NULL, `symbol` TEXT NOT NULL, `student_id` INTEGER NOT NULL, `user_login_id` INTEGER NOT NULL, `user_name` TEXT NOT NULL, `student_name` TEXT NOT NULL, `school_id` TEXT NOT NULL, `school_short` TEXT NOT NULL, `school_name` TEXT NOT NULL, `class_name` TEXT NOT NULL, `class_id` INTEGER NOT NULL, `is_current` INTEGER NOT NULL, `registration_date` INTEGER NOT NULL, `is_authorized` INTEGER NOT NULL DEFAULT 0, `is_edu_one` INTEGER DEFAULT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nick` TEXT NOT NULL, `avatar_color` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "scrapperBaseUrl", + "columnName": "scrapper_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "scrapperDomainSuffix", + "columnName": "scrapper_domain_suffix", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mobileBaseUrl", + "columnName": "mobile_base_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginType", + "columnName": "login_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "loginMode", + "columnName": "login_mode", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "certificateKey", + "columnName": "certificate_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privateKey", + "columnName": "private_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isParent", + "columnName": "is_parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userLoginId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "user_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "student_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolSymbol", + "columnName": "school_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "school_short", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolName", + "columnName": "school_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "className", + "columnName": "class_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isCurrent", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "registrationDate", + "columnName": "registration_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAuthorized", + "columnName": "is_authorized", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "isEduOne", + "columnName": "is_edu_one", + "affinity": "INTEGER", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nick", + "columnName": "nick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarColor", + "columnName": "avatar_color", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Students_email_symbol_student_id_school_id_class_id", + "unique": true, + "columnNames": [ + "email", + "symbol", + "student_id", + "school_id", + "class_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Students_email_symbol_student_id_school_id_class_id` ON `${TABLE_NAME}` (`email`, `symbol`, `student_id`, `school_id`, `class_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Semesters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `kindergarten_diary_id` INTEGER NOT NULL DEFAULT 0, `diary_name` TEXT NOT NULL, `school_year` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `semester_name` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `unit_id` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_current` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "kindergartenDiaryId", + "columnName": "kindergarten_diary_id", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "diaryName", + "columnName": "diary_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolYear", + "columnName": "school_year", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterName", + "columnName": "semester_name", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unitId", + "columnName": "unit_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "current", + "columnName": "is_current", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id", + "unique": true, + "columnNames": [ + "student_id", + "diary_id", + "kindergarten_diary_id", + "semester_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Semesters_student_id_diary_id_kindergarten_diary_id_semester_id` ON `${TABLE_NAME}` (`student_id`, `diary_id`, `kindergarten_diary_id`, `semester_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "Exams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `group` TEXT NOT NULL, `type` TEXT NOT NULL, `description` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Timetable", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `number` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `subjectOld` TEXT NOT NULL, `group` TEXT NOT NULL, `room` TEXT NOT NULL, `roomOld` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacherOld` TEXT NOT NULL, `info` TEXT NOT NULL, `student_plan` INTEGER NOT NULL, `changes` INTEGER NOT NULL, `canceled` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subjectOld", + "columnName": "subjectOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomOld", + "columnName": "roomOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherOld", + "columnName": "teacherOld", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "info", + "columnName": "info", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isStudentPlan", + "columnName": "student_plan", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "changes", + "columnName": "changes", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canceled", + "columnName": "canceled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Attendance", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `time_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `excused` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `excusable` INTEGER NOT NULL, `excuse_status` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeId", + "columnName": "time_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excused", + "columnName": "excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excusable", + "columnName": "excusable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "excuseStatus", + "columnName": "excuse_status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AttendanceSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `subject_id` INTEGER NOT NULL, `month` INTEGER NOT NULL, `presence` INTEGER NOT NULL, `absence` INTEGER NOT NULL, `absence_excused` INTEGER NOT NULL, `absence_for_school_reasons` INTEGER NOT NULL, `lateness` INTEGER NOT NULL, `lateness_excused` INTEGER NOT NULL, `exemption` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subjectId", + "columnName": "subject_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "month", + "columnName": "month", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "presence", + "columnName": "presence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceExcused", + "columnName": "absence_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "absenceForSchoolReasons", + "columnName": "absence_for_school_reasons", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lateness", + "columnName": "lateness", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latenessExcused", + "columnName": "lateness_excused", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exemption", + "columnName": "exemption", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Grades", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `entry` TEXT NOT NULL, `value` REAL NOT NULL, `modifier` REAL NOT NULL, `comment` TEXT NOT NULL, `color` TEXT NOT NULL, `grade_symbol` TEXT NOT NULL, `description` TEXT NOT NULL, `weight` TEXT NOT NULL, `weightValue` REAL NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entry", + "columnName": "entry", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "modifier", + "columnName": "modifier", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gradeSymbol", + "columnName": "grade_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "weightValue", + "columnName": "weightValue", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesSummary", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `position` INTEGER NOT NULL, `subject` TEXT NOT NULL, `predicted_grade` TEXT NOT NULL, `final_grade` TEXT NOT NULL, `proposed_points` TEXT NOT NULL, `final_points` TEXT NOT NULL, `points_sum` TEXT NOT NULL, `points_sum_all_year` TEXT, `average` REAL NOT NULL, `average_all_year` REAL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_predicted_grade_notified` INTEGER NOT NULL, `is_final_grade_notified` INTEGER NOT NULL, `predicted_grade_last_change` INTEGER NOT NULL, `final_grade_last_change` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "predictedGrade", + "columnName": "predicted_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalGrade", + "columnName": "final_grade", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "proposedPoints", + "columnName": "proposed_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "finalPoints", + "columnName": "final_points", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSum", + "columnName": "points_sum", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pointsSumAllYear", + "columnName": "points_sum_all_year", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "average", + "columnName": "average", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "averageAllYear", + "columnName": "average_all_year", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPredictedGradeNotified", + "columnName": "is_predicted_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFinalGradeNotified", + "columnName": "is_final_grade_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "predictedGradeLastChange", + "columnName": "predicted_grade_last_change", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "finalGradeLastChange", + "columnName": "final_grade_last_change", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradePartialStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `class_average` TEXT NOT NULL, `student_average` TEXT NOT NULL, `class_amounts` TEXT NOT NULL, `student_amounts` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAverage", + "columnName": "class_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAverage", + "columnName": "student_average", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "classAmounts", + "columnName": "class_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentAmounts", + "columnName": "student_amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesPointsStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `others` REAL NOT NULL, `student` REAL NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "others", + "columnName": "others", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "student", + "columnName": "student", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradeSemesterStatistics", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `semester_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `amounts` TEXT NOT NULL, `student_grade` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "amounts", + "columnName": "amounts", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentGrade", + "columnName": "student_grade", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`email` TEXT NOT NULL, `message_global_key` TEXT NOT NULL, `mailbox_key` TEXT NOT NULL, `message_id` INTEGER NOT NULL, `correspondents` TEXT NOT NULL, `subject` TEXT NOT NULL, `date` INTEGER NOT NULL, `folder_id` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `read_by` INTEGER, `unread_by` INTEGER, `has_attachments` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL, `content` TEXT NOT NULL, `sender` TEXT, `recipients` TEXT)", + "fields": [ + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "mailboxKey", + "columnName": "mailbox_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "correspondents", + "columnName": "correspondents", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readBy", + "columnName": "read_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "unreadBy", + "columnName": "unread_by", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hasAttachments", + "columnName": "has_attachments", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sender", + "columnName": "sender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "recipients", + "columnName": "recipients", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MessageAttachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`message_global_key` TEXT NOT NULL, `url` TEXT NOT NULL, `filename` TEXT NOT NULL, PRIMARY KEY(`message_global_key`, `url`, `filename`))", + "fields": [ + { + "fieldPath": "messageGlobalKey", + "columnName": "message_global_key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "filename", + "columnName": "filename", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "message_global_key", + "url", + "filename" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `category` TEXT NOT NULL, `category_type` INTEGER NOT NULL, `is_points_show` INTEGER NOT NULL, `points` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_read` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categoryType", + "columnName": "category_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPointsShow", + "columnName": "is_points_show", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "points", + "columnName": "points", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "is_read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Homework", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `entry_date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `attachments` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_done` INTEGER NOT NULL, `is_notified` INTEGER NOT NULL, `is_added_by_user` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "entryDate", + "columnName": "entry_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isDone", + "columnName": "is_done", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Subjects", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `real_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "realId", + "columnName": "real_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "LuckyNumbers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `lucky_number` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "luckyNumber", + "columnName": "lucky_number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "CompletedLesson", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `number` INTEGER NOT NULL, `subject` TEXT NOT NULL, `topic` TEXT NOT NULL, `teacher` TEXT NOT NULL, `teacher_symbol` TEXT NOT NULL, `substitution` TEXT NOT NULL, `absence` TEXT NOT NULL, `resources` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "number", + "columnName": "number", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacher", + "columnName": "teacher", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "teacherSymbol", + "columnName": "teacher_symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "substitution", + "columnName": "substitution", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "absence", + "columnName": "absence", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "resources", + "columnName": "resources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Mailboxes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`globalKey` TEXT NOT NULL, `email` TEXT NOT NULL, `symbol` TEXT NOT NULL, `schoolId` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `studentName` TEXT NOT NULL, `schoolNameShort` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`globalKey`))", + "fields": [ + { + "fieldPath": "globalKey", + "columnName": "globalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "symbol", + "columnName": "symbol", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolId", + "columnName": "schoolId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentName", + "columnName": "studentName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolNameShort", + "columnName": "schoolNameShort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "globalKey" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Recipients", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`mailboxGlobalKey` TEXT NOT NULL, `studentMailboxGlobalKey` TEXT NOT NULL, `fullName` TEXT NOT NULL, `userName` TEXT NOT NULL, `schoolShortName` TEXT NOT NULL, `type` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "mailboxGlobalKey", + "columnName": "mailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "studentMailboxGlobalKey", + "columnName": "studentMailboxGlobalKey", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "userName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "schoolShortName", + "columnName": "schoolShortName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MobileDevices", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `device_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "device_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Teachers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `name` TEXT NOT NULL, `short_name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "shortName", + "columnName": "short_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "School", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `class_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `address` TEXT NOT NULL, `contact` TEXT NOT NULL, `headmaster` TEXT NOT NULL, `pedagogue` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "classId", + "columnName": "class_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "headmaster", + "columnName": "headmaster", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pedagogue", + "columnName": "pedagogue", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Conferences", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `subject` TEXT NOT NULL, `agenda` TEXT NOT NULL, `present_on_conference` TEXT NOT NULL, `conference_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "agenda", + "columnName": "agenda", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "presentOnConference", + "columnName": "present_on_conference", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "conferenceId", + "columnName": "conference_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableAdditional", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `repeat_id` BLOB DEFAULT NULL, `is_added_by_user` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatId", + "columnName": "repeat_id", + "affinity": "BLOB", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "isAddedByUser", + "columnName": "is_added_by_user", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "StudentInfo", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `full_name` TEXT NOT NULL, `first_name` TEXT NOT NULL, `second_name` TEXT NOT NULL, `surname` TEXT NOT NULL, `birth_date` INTEGER NOT NULL, `birth_place` TEXT NOT NULL, `gender` TEXT NOT NULL, `has_polish_citizenship` INTEGER NOT NULL, `family_name` TEXT NOT NULL, `parents_names` TEXT NOT NULL, `address` TEXT NOT NULL, `registered_address` TEXT NOT NULL, `correspondence_address` TEXT NOT NULL, `phone_number` TEXT NOT NULL, `cell_phone_number` TEXT NOT NULL, `email` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `first_guardian_full_name` TEXT, `first_guardian_kinship` TEXT, `first_guardian_address` TEXT, `first_guardian_phones` TEXT, `first_guardian_email` TEXT, `second_guardian_full_name` TEXT, `second_guardian_kinship` TEXT, `second_guardian_address` TEXT, `second_guardian_phones` TEXT, `second_guardian_email` TEXT)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "full_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "first_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "secondName", + "columnName": "second_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "surname", + "columnName": "surname", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthDate", + "columnName": "birth_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "birthPlace", + "columnName": "birth_place", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hasPolishCitizenship", + "columnName": "has_polish_citizenship", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "familyName", + "columnName": "family_name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentsNames", + "columnName": "parents_names", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "registeredAddress", + "columnName": "registered_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "correspondenceAddress", + "columnName": "correspondence_address", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cellPhoneNumber", + "columnName": "cell_phone_number", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstGuardian.fullName", + "columnName": "first_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.kinship", + "columnName": "first_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.address", + "columnName": "first_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.phones", + "columnName": "first_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "firstGuardian.email", + "columnName": "first_guardian_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.fullName", + "columnName": "second_guardian_full_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.kinship", + "columnName": "second_guardian_kinship", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.address", + "columnName": "second_guardian_address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.phones", + "columnName": "second_guardian_phones", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "secondGuardian.email", + "columnName": "second_guardian_email", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TimetableHeaders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `diary_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `content` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "diaryId", + "columnName": "diary_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SchoolAnnouncements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_login_id` INTEGER NOT NULL, `date` INTEGER NOT NULL, `subject` TEXT NOT NULL, `content` TEXT NOT NULL, `author` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "user_login_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notifications", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`student_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `type` TEXT NOT NULL, `destination` TEXT NOT NULL DEFAULT '{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}', `date` INTEGER NOT NULL, `data` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "destination", + "columnName": "destination", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}'" + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "data", + "columnName": "data", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "AdminMessages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `version_name` INTEGER, `version_max` INTEGER, `target_register_host` TEXT, `target_flavor` TEXT, `destination_url` TEXT, `priority` TEXT NOT NULL, `types` TEXT NOT NULL DEFAULT '[]', `is_ok_visible` INTEGER NOT NULL DEFAULT 0, `is_x_visible` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "versionMin", + "columnName": "version_name", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "versionMax", + "columnName": "version_max", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "targetRegisterHost", + "columnName": "target_register_host", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetFlavor", + "columnName": "target_flavor", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "destinationUrl", + "columnName": "destination_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "types", + "columnName": "types", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'[]'" + }, + { + "fieldPath": "isOkVisible", + "columnName": "is_ok_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "isXVisible", + "columnName": "is_x_visible", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "MutedMessageSenders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`author` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GradesDescriptive", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`semester_id` INTEGER NOT NULL, `student_id` INTEGER NOT NULL, `subject` TEXT NOT NULL, `description` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_notified` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "semesterId", + "columnName": "semester_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "studentId", + "columnName": "student_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subject", + "columnName": "subject", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isNotified", + "columnName": "is_notified", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'dd5446e82ad8d0a65c545a5dbbaeb81c')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt index ec22c5a3d..f23c79de0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt @@ -177,6 +177,7 @@ import javax.inject.Singleton AutoMigration(from = 60, to = 61), AutoMigration(from = 61, to = 62), AutoMigration(from = 62, to = 63, spec = Migration63::class), + AutoMigration(from = 63, to = 64), ], version = AppDatabase.VERSION_SCHEMA, exportSchema = true @@ -185,7 +186,7 @@ import javax.inject.Singleton abstract class AppDatabase : RoomDatabase() { companion object { - const val VERSION_SCHEMA = 63 + const val VERSION_SCHEMA = 64 fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( Migration2(), diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt index a42832ced..f8a357a39 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt @@ -33,7 +33,13 @@ data class GradeSummary( @ColumnInfo(name = "points_sum") val pointsSum: String, - val average: Double + @ColumnInfo(name = "points_sum_all_year") + val pointsSumAllYear: String?, + + val average: Double, + + @ColumnInfo(name = "average_all_year") + val averageAllYear: Double? = null, ) { @PrimaryKey(autoGenerate = true) var id: Long = 0 diff --git a/app/src/main/java/io/github/wulkanowy/data/mappers/GradeMapper.kt b/app/src/main/java/io/github/wulkanowy/data/mappers/GradeMapper.kt index 66e922171..57322a7ae 100644 --- a/app/src/main/java/io/github/wulkanowy/data/mappers/GradeMapper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/mappers/GradeMapper.kt @@ -37,9 +37,11 @@ fun List.mapToEntities(semester: Semester) = map { predictedGrade = it.predicted, finalGrade = it.final, pointsSum = it.pointsSum, + pointsSumAllYear = it.pointsSumAllYear, proposedPoints = it.proposedPoints, finalPoints = it.finalPoints, - average = it.average + average = it.average, + averageAllYear = it.averageAllYear, ) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/gradeSummary.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/gradeSummary.kt index c452204b9..e92d1afb3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/gradeSummary.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/debug/notification/mock/gradeSummary.kt @@ -26,5 +26,7 @@ private fun generateSummary(subject: String, predicted: String, final: String) = proposedPoints = "", finalPoints = "", pointsSum = "", - average = .0 + average = .0, + pointsSumAllYear = null, + averageAllYear = null, ) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index 8da59eaf4..7f14c01f1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -266,7 +266,9 @@ class GradeAverageProvider @Inject constructor( proposedPoints = "", finalPoints = "", pointsSum = "", - average = .0 + pointsSumAllYear = null, + average = .0, + averageAllYear = null, ) } @@ -294,13 +296,15 @@ class GradeAverageProvider @Inject constructor( proposedPoints = "", finalPoints = "", pointsSum = "", + pointsSumAllYear = null, average = when { calcAverage -> details .updateModifiers(student, params) .calcAverage(isOptionalArithmeticAverage = params.isOptionalArithmeticAverage) else -> .0 - } + }, + averageAllYear = null, ) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt index 15b5db031..bcbd2df2f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsAdapter.kt @@ -96,9 +96,11 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter HeaderViewHolder( HeaderGradeDetailsBinding.inflate(inflater, parent, false) ) + ViewType.ITEM.id -> ItemViewHolder( ItemGradeDetailsBinding.inflate(inflater, parent, false) ) + else -> throw IllegalStateException() } } @@ -110,6 +112,7 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter bindItemViewHolder( holder = holder, grade = items[position].value as Grade @@ -133,6 +136,10 @@ class GradeDetailsAdapter @Inject constructor() : BaseExpandableAdapter ) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index d9621f51e..ec5d34c5e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -226,8 +226,9 @@ class GradeDetailsPresenter @Inject constructor( GradeDetailsHeader( subject = gradeSubject.subject, average = gradeSubject.average, + averageAllYear = gradeSubject.summary.averageAllYear, pointsSum = gradeSubject.points, - grades = subItems + grades = subItems, ).apply { newGrades = gradeSubject.grades.filter { grade -> !grade.isRead }.size }, ViewType.HEADER diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt index 95cf97bed..1cc74ef09 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryAdapter.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.grade.summary import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R @@ -65,37 +66,55 @@ class GradeSummaryAdapter @Inject constructor( val gradeSummaries = items .filter { it.gradeDescriptive == null } .map { it.gradeSummary } + val isSecondSemester = items.any { item -> + item.gradeSummary.let { it.averageAllYear != null && it.averageAllYear != .0 } + } val context = binding.root.context val finalItemsCount = gradeSummaries.count { isGradeValid(it.finalGrade) } - val calculatedItemsCount = gradeSummaries.count { value -> value.average != 0.0 } + val calculatedSemesterItemsCount = gradeSummaries.count { value -> value.average != 0.0 } + val calculatedAnnualItemsCount = + gradeSummaries.count { value -> value.averageAllYear != 0.0 } val allItemsCount = gradeSummaries.count { !it.subject.equals("zachowanie", true) } val finalAverage = gradeSummaries.calcFinalAverage( - preferencesRepository.gradePlusModifier, - preferencesRepository.gradeMinusModifier + plusModifier = preferencesRepository.gradePlusModifier, + minusModifier = preferencesRepository.gradeMinusModifier, ) - val calculatedAverage = gradeSummaries.filter { value -> value.average != 0.0 } + val calculatedSemesterAverage = gradeSummaries.filter { value -> value.average != 0.0 } .map { values -> values.average } .reversed() // fix average precision .average() .let { if (it.isNaN()) 0.0 else it } + val calculatedAnnualAverage = gradeSummaries.filter { value -> value.averageAllYear != 0.0 } + .mapNotNull { values -> values.averageAllYear } + .reversed() // fix average precision + .average() + .let { if (it.isNaN()) 0.0 else it } with(binding) { + gradeSummaryScrollableHeaderCalculated.text = formatAverage(calculatedSemesterAverage) + gradeSummaryScrollableHeaderCalculatedAnnual.text = + formatAverage(calculatedAnnualAverage) gradeSummaryScrollableHeaderFinal.text = formatAverage(finalAverage) - gradeSummaryScrollableHeaderCalculated.text = formatAverage(calculatedAverage) - gradeSummaryScrollableHeaderFinalSubjectCount.text = - context.getString( - R.string.grade_summary_from_subjects, - finalItemsCount, - allItemsCount - ) - gradeSummaryScrollableHeaderCalculatedSubjectCount.text = context.getString( + gradeSummaryScrollableHeaderFinalSubjectCount.text = context.getString( R.string.grade_summary_from_subjects, - calculatedItemsCount, + finalItemsCount, allItemsCount ) + gradeSummaryScrollableHeaderCalculatedSubjectCount.text = context.getString( + R.string.grade_summary_from_subjects, + calculatedSemesterItemsCount, + allItemsCount + ) + gradeSummaryScrollableHeaderCalculatedSubjectCountAnnual.text = context.getString( + R.string.grade_summary_from_subjects, + calculatedAnnualItemsCount, + allItemsCount + ) + gradeSummaryScrollableHeaderCalculatedAnnualContainer.isVisible = isSecondSemester gradeSummaryCalculatedAverageHelp.setOnClickListener { onCalculatedHelpClickListener() } + gradeSummaryCalculatedAverageHelpAnnual.setOnClickListener { onCalculatedHelpClickListener() } gradeSummaryFinalAverageHelp.setOnClickListener { onFinalHelpClickListener() } } } @@ -107,7 +126,12 @@ class GradeSummaryAdapter @Inject constructor( with(binding) { gradeSummaryItemTitle.text = gradeSummary.subject gradeSummaryItemPoints.text = gradeSummary.pointsSum + gradeSummaryItemAverage.text = formatAverage(gradeSummary.average, "") + gradeSummaryItemAverageAllYear.text = gradeSummary.averageAllYear?.let { + formatAverage(it, "") + } + gradeSummaryItemPredicted.text = "${gradeSummary.predictedGrade} ${gradeSummary.proposedPoints}".trim() gradeSummaryItemFinal.text = @@ -116,6 +140,12 @@ class GradeSummaryAdapter @Inject constructor( root.context.getString(R.string.all_no_data) } + gradeSummaryItemAverageContainer.isVisible = gradeSummary.average != .0 + gradeSummaryItemAverageDivider.isVisible = gradeSummaryItemAverageContainer.isVisible + gradeSummaryItemAverageAllYearContainer.isGone = + gradeSummary.averageAllYear == null || gradeSummary.averageAllYear == .0 + gradeSummaryItemAverageAllYearDivider.isGone = + gradeSummaryItemAverageAllYearContainer.isGone gradeSummaryItemFinalDivider.isVisible = gradeDescriptive == null gradeSummaryItemPredictedDivider.isVisible = gradeDescriptive == null gradeSummaryItemPointsDivider.isVisible = gradeDescriptive == null @@ -123,6 +153,7 @@ class GradeSummaryAdapter @Inject constructor( gradeSummaryItemFinalContainer.isVisible = gradeDescriptive == null gradeSummaryItemDescriptiveContainer.isVisible = gradeDescriptive != null gradeSummaryItemPointsContainer.isVisible = gradeSummary.pointsSum.isNotBlank() + gradeSummaryItemPointsDivider.isVisible = gradeSummaryItemPointsContainer.isVisible } } diff --git a/app/src/main/res/layout/header_grade_details.xml b/app/src/main/res/layout/header_grade_details.xml index e43e8993f..1765d9d1e 100644 --- a/app/src/main/res/layout/header_grade_details.xml +++ b/app/src/main/res/layout/header_grade_details.xml @@ -45,13 +45,30 @@ android:textColor="?android:textColorSecondary" android:textSize="12sp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@id/gradeHeaderPointsSum" + app:layout_constraintEnd_toStartOf="@id/gradeHeaderAverageAllYear" app:layout_constraintHorizontal_bias="0" app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintStart_toStartOf="@id/gradeHeaderSubject" app:layout_constraintTop_toBottomOf="@+id/gradeHeaderSubject" tools:text="Average: 6,00" /> + + diff --git a/app/src/main/res/layout/item_grade_summary.xml b/app/src/main/res/layout/item_grade_summary.xml index 2c8c4ea37..f425bad83 100644 --- a/app/src/main/res/layout/item_grade_summary.xml +++ b/app/src/main/res/layout/item_grade_summary.xml @@ -20,20 +20,80 @@ android:id="@+id/gradeSummaryItemTitle" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginEnd="40dp" android:layout_weight="1" android:textSize="17sp" tools:text="@tools:sample/lorem" /> + + + + + + + tools:text="2,50" /> + + + + + + + + + + + @@ -131,9 +191,9 @@ + android:textSize="16sp" + android:textStyle="bold" /> + + + + + + + + + + + + + + + android:textSize="16sp" + android:textStyle="bold" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2775365d5..3117eab9d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -126,13 +126,17 @@ Comment Number of new ratings: %1$d Average: %1$.2f + Year: %1$.2f Points: %s No average + Semester average + Annual average Total points Final grade Predicted grade Descriptive grade - Calculated average + Calculated semester average + Calculated annual average How does Calculated Average work? The Calculated Average is the arithmetic average calculated from the subjects averages. It allows you to know the approximate final average. It is calculated in a way selected by the user in the application settings. It is recommended that you choose the appropriate option. This is because the calculation of school averages differs. Additionally, if your school reports the average of the subjects on the Vulcan page, the application downloads them and does not calculate these averages. This can be changed by forcing the calculation of the average in the application settings.\n\nAverage of grades only from selected semester:\n1. Calculating the weighted average for each subject in a given semester\n2.Adding calculated averages\n3. Calculation of the arithmetic average of the summed averages\n\nAverage of averages from both semesters:\n1.Calculating the weighted average for each subject in semester 1 and 2\n2. Calculating the arithmetic average of the calculated averages for semesters 1 and 2 for each subject.\n3. Adding calculated averages\n4. Calculation of the arithmetic average of the summed averages\n\nAverage of grades from the whole year:\n1. Calculating weighted average over the year for each subject. The final average in the 1st semester is irrelevant.\n2. Adding calculated averages\n3. Calculating the arithmetic average of summed averages How does the Final Average work? diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index ad7bbe15f..b9f56efed 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -1679,7 +1679,9 @@ class GradeAverageProviderTest { finalPoints = "", finalGrade = "", predictedGrade = "", - position = 0 + position = 0, + pointsSumAllYear = null, + averageAllYear = null, ) } } diff --git a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt index 35dc4e5ba..37363f373 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt @@ -23,13 +23,15 @@ class GradeExtensionTest { @Test fun calcWeightedAverage() { - assertEquals(3.47, listOf( - createGrade(5.0, 6.0, 0.33), - createGrade(5.0, 5.0, -0.33), - createGrade(4.0, 1.0, 0.0), - createGrade(1.0, 9.0, 0.5), - createGrade(0.0, .0, 0.0) - ).calcAverage(false), 0.005) + assertEquals( + 3.47, listOf( + createGrade(5.0, 6.0, 0.33), + createGrade(5.0, 5.0, -0.33), + createGrade(4.0, 1.0, 0.0), + createGrade(1.0, 9.0, 0.5), + createGrade(0.0, .0, 0.0) + ).calcAverage(false), 0.005 + ) } @Test @@ -86,7 +88,11 @@ class GradeExtensionTest { assertEquals(-.25, createGrade(5.0, .0, -.33).changeModifier(.0, .25).modifier, .0) } - private fun createGrade(value: Double, weightValue: Double = .0, modifier: Double = 0.25): Grade { + private fun createGrade( + value: Double, + weightValue: Double = .0, + modifier: Double = 0.25 + ): Grade { return Grade( semesterId = 1, studentId = 1, @@ -116,7 +122,9 @@ class GradeExtensionTest { proposedPoints = "", finalPoints = "", pointsSum = "", - average = .0 + average = .0, + pointsSumAllYear = null, + averageAllYear = null, ) } } From 43d13db07ce22e9e433f3ff3e9b7373775068b84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 22 Apr 2024 22:17:03 +0200 Subject: [PATCH 1457/1526] Update translations --- app/src/main/res/values-pl/strings.xml | 6 +++++- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 33b715d75..895f7687a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -113,13 +113,17 @@ Komentarz Ilość nowych ocen: %1$d Średnia: %1$.2f + Roczna: %1$.2f Punkty: %s Brak średniej + Średnia semestralna + Średnia roczna Suma punktów Ocena końcowa Przewidywana ocena Ocena opisowa - Obliczona średnia + Obliczona średnia semestralna + Obliczona średnia roczna Jak działa obliczona średnia? Obliczona średnia jest średnią arytmetyczną obliczoną ze średnich przedmiotów. Pozwala ona na poznanie przybliżonej średniej końcowej. Jest obliczana w sposób wybrany przez użytkownika w ustawieniach aplikacji. Zaleca się wybranie odpowiedniej opcji. Dzieje się tak dlatego, że obliczanie średnich w szkołach różni się. Dodatkowo, jeśli twoja szkoła ma włączone średnie przedmiotów na stronie dziennika Vulcan, aplikacja pobiera je i ich nie oblicza. Można to zmienić, wymuszając obliczanie średniej w ustawieniach aplikacji.\n\nŚrednia ocen tylko z wybranego semestru:\n1. Obliczanie średniej arytmetycznej każdego przedmiotu w danym semestrze\n2. Zsumowanie obliczonych średnich\n3. Obliczanie średniej arytmetycznej zsumowanych średnich\n\nŚrednia ze średnich z obu semestrów:\n1.Obliczanie średniej arytmetycznej każdego przedmiotu w semestrze 1 i 2\n2. Obliczanie średniej arytmetycznej obliczonych średnich w semestrze 1 i 2 każdego przedmiotu.\n3. Zsumowanie obliczonych średnich\n4. Obliczanie średniej arytmetycznej zsumowanych średnich\n\nŚrednia wszystkich ocen z całego roku:\n1. Obliczanie średniej arytmetycznej z każdego przedmiotu w ciągu całego roku. Końcowa ocena w 1 semestrze jest bez znaczenia.\n2. Zsumowanie obliczonych średnich\n3. Obliczanie średniej arytmetycznej z zsumowanych średnich Jak działa końcowa średnia? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3117eab9d..957ad6de8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -126,7 +126,7 @@ Comment Number of new ratings: %1$d Average: %1$.2f - Year: %1$.2f + Annual: %1$.2f Points: %s No average Semester average From f6226e6b53a49ac6112e020ad6aaf52e65aa28a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Mon, 22 Apr 2024 22:36:05 +0200 Subject: [PATCH 1458/1526] Version 2.5.7 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6d51ad841..ede6dd951 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 155 - versionName "2.5.6" + versionCode 156 + versionName "2.5.7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.7-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.5.7' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index a966a31f6..d96ff15ac 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,6 @@ -Wersja 2.5.6 +Wersja 2.5.7 — naprawiliśmy logowanie (pusta lista z wyborem uczniów), które zepsuło się po zmianach po stronie VULCANa +— dodaliśmy wyświetlanie osobno średniej rocznej, bo VULCAN rozdzielił i zrobił się bałagan Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 6bf6a9da11567555f32f0f5e717f17c02f3ea0ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 24 Apr 2024 19:27:11 +0200 Subject: [PATCH 1459/1526] New Crowdin updates (#2480) --- app/src/main/res/values-cs/strings.xml | 12 +++++++++--- app/src/main/res/values-de/strings.xml | 10 ++++++++-- app/src/main/res/values-pl/strings.xml | 4 +++- app/src/main/res/values-ru/strings.xml | 10 ++++++++-- app/src/main/res/values-sk/strings.xml | 12 +++++++++--- app/src/main/res/values-uk/strings.xml | 10 ++++++++-- app/src/main/res/values/strings.xml | 2 +- 7 files changed, 46 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 780d9351c..f37e1cf2a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -31,7 +31,7 @@ Semestr %1$d, %2$d/%3$d - Přihlaste se pomocí studentského nebo rodičovského účtu + Přihlaste se pomocí žákovského nebo rodičovského účtu Zadejte symbol ze stránky deníku: <b>%1$s</b> Uživatelské jméno Email @@ -113,13 +113,17 @@ Komentář Počet nových známek: %1$d Průměr: %1$.2f + Annual: %1$.2f Body: %s Bez průměru + Semester average + Annual average Součet bodů Konečná známka Předpokládaná známka Popisná známka - Vypočítaný průměr + Calculated semester average + Calculated annual average Jak funguje vypočítaný průměr? Vypočítaný průměr je aritmetický průměr vypočítaný z průměrů předmětů. Umožňuje vám to znát přibližný konečný průměr. Vypočítává se způsobem zvoleným uživatelem v nastavení aplikaci. Doporučuje se vybrat příslušnou možnost. Důvodem je rozdílný výpočet školních průměrů. Pokud vaše škola navíc uvádí průměr předmětů na stránce deníku Vulcan, aplikace si je stáhne a tyto průměry nepočítá. To lze změnit vynucením výpočtu průměru v nastavení aplikaci.\n\nPrůměr známek pouze z vybraného semestru:\n1. Výpočet váženého průměru pro každý předmět v daném semestru\n2. Sčítání vypočítaných průměrů\n3. Výpočet aritmetického průměru součtených průměrů\n\nPrůměr průměrů z obou semestrů:\n1. Výpočet váženého průměru pro každý předmět v semestru 1 a 2\n2. Výpočet aritmetického průměru vypočítaných průměrů za semestry 1 a 2 pro každý předmět.\n3. Sčítání vypočítaných průměrů\n4. Výpočet aritmetického průměru sečtených průměrů\n\nPrůměr známek z celého roku:\n1. Výpočet váženého průměru za rok pro každý předmět. Konečný průměr v 1. semestru je nepodstatný.\n2. Sčítání vypočítaných průměrů\n3. Výpočet aritmetického průměru součtených průměrů Jak funguje konečný průměr? @@ -270,6 +274,7 @@ přesně v cíli %1$d pod cílem %1$d/%2$d přítomnosti + Nebyla zaznamenána žádná docházka Nepřítomnost ze školních důvodů Omluvená nepřítomnost Neomluvená nepřítomnost @@ -737,6 +742,7 @@ Vynutit průměrný výpočet podle aplikace Zobrazit přítomnost Cílová docházka + Zobrazit předměty bez docházek Třídění kalkulačky docházky Motiv Rozvíjení známek @@ -856,7 +862,7 @@ Autorizovat Autorizace byla úspěšně dokončena Autorizace - Pro provoz aplikace potřebujeme potvrdit vaši identitu. Zadejte PESEL žáka <b>%1$s</b> v níže uvedeném poli + Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. Zatím přeskočit Webová stránka deníku VULCAN vyžaduje ověření diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7bc5aa990..b8bf5019f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -113,13 +113,17 @@ Kommentar Anzahl der neuen Bewertungen: %1$d Durchschnitt: %1$.2f + Annual: %1$.2f Punkte: %s Kein Durchschnitt + Semester average + Annual average Gesamtpunkte Finaler Note Vorhergesagte Note Descriptive grade - Berechnender Durchschnitt + Calculated semester average + Calculated annual average Wie funktioniert der berechnete Durchschnitt? Der berechnete Mittelwert ist das arithmetische Mittel, das aus den Durchschnittswerten der Probanden errechnet wird. Es erlaubt Ihnen, den ungefähre endgültigen Durchschnitt zu kennen. Sie wird auf eine vom Anwender in den Anwendungseinstellungen gewählte Weise berechnet. Es wird empfohlen, die entsprechende Option zu wählen. Das liegt daran, dass die Berechnung der Schuldurchschnitte unterschiedlich ist. Wenn Ihre Schule den Durchschnitt der Fächer auf der Vulcan-Seite angibt, lädt die Anwendung diese Fächer herunter und berechnet nicht den Durchschnitt. Dies kann geändert werden, indem die Berechnung des Durchschnitts in den Anwendungseinstellungen erzwungen wird. \n\nDurchschnitt der Noten nur aus dem ausgewählten Semester :\n1. Berechnung des gewichteten Durchschnitts für jedes Fach in einem bestimmten Semester\n2. Addition der berechneten Durchschnittswerte\n3. Berechnung des arithmetischen Mittels der summierten Durchschnitte\nDurchschnitt der Durchschnitte aus beiden Semestern:\n1. Berechnung des gewichteten Durchschnitts für jedes Fach in Semester 1 und 2\n2. Berechnung des arithmetischen Mittels der berechneten Durchschnitte für Semester 1 und 2 für jedes Fach. \n3. Hinzufügen von berechneten Durchschnittswerten\n4. Berechnung des arithmetischen Mittels der summierten Durchschnitte\nDurchschnitt der Noten aus dem ganzen Jahr:\n1. Berechnung des gewichteten Jahresdurchschnitts für jedes Fach. Der Abschlussdurchschnitt im 1. Semester ist irrelevant. \n2. Addition der berechneten Durchschnittswerte\n3. Berechnung des arithmetischen Mittels der summierten Mittelwerte Wie funktioniert der endgültige Durchschnitt? @@ -242,6 +246,7 @@ right on target %1$d under target %1$d/%2$d presences + No attendances recorded Aus schulischen Gründen abwesend Entschuldigte Abwesenheit Unentschuldigtes Abwesenheit @@ -643,6 +648,7 @@ Mittelwertberechnung durch App erzwingen Anwesendheit zeigen Attendance target + Show subjects without any attendances Attendance calculator sorting Thema Steigende Sorten @@ -762,7 +768,7 @@ Authorize Authorization completed successfully Authorization - To operate the application, we need to confirm your identity. Please enter the student\'s PESEL <b>%1$s</b> in the field below + Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. Skip for now VULCAN\'s website requires verification diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 55c9db40d..48c90f599 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -274,6 +274,7 @@ dokładnie u celu %1$d poniżej celu %1$d/%2$d obecności + Nie odnotowano żadnej frekwencji Nieobecność z przyczyn szkolnych Nieobecność usprawiedliwiona Nieobecność nieusprawiedliwiona @@ -741,6 +742,7 @@ Wymuś obliczanie średniej przez aplikację Pokazuj obecność Docelowa obecność + Pokazuj przedmioty bez frekwencji Sortowanie kalkulatora obecności Motyw Rozwijanie ocen @@ -860,7 +862,7 @@ Potwierdź Autoryzacja zakończona pomyślnie Autoryzacja - Rodzicu, musimy mieć pewność, że Twój adres e-mail został powiązany z prawidłowym kontem ucznia. W celu autoryzacji konta podaj numer PESEL ucznia <b>%1$s</b> w polu poniżej + Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. Na razie pomiń Strona dziennika VULCAN wymaga weryfikacji diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0e7e0e1d2..d7f6e6cee 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -113,13 +113,17 @@ Комментарий Количество новых оценок: %1$d Средняя оценка: %1$.2f + Annual: %1$.2f Баллы: %s Нет средней оценки + Semester average + Annual average Сумма баллов Итоговая оценка Ожидаемая оценка Descriptive grade - Рассчитанная средняя оценка + Calculated semester average + Calculated annual average Как работает \"Рассчитанная средняя оценка\"? Рассчитанная средняя оценка - это среднее арифметическое, рассчитанное на основе средних оценок по предметам. Это позволяет узнать приблизительную итоговую среднюю оценку. Она рассчитывается способом, выбранным пользователем в настройках приложения. Рекомендуется выбрать подходящий вариант, так как каждая школа по разному считает среднюю оценку. Кроме того, если ваша школа выставляет средние оценки по предметам на странице Vulcan, приложение просто загрузит их. Это можно изменить, заставив приложение считать среднюю оценку в настройках.\n\nСредняя из оценок выбранного семестра:\n1. Вычисление средневзвешенного значения по каждому предмету за семестр\n2.Суммирование вычисленных значений\n3. Вычисление среднего арифметического суммированных значений\n\nСредняя из средних оценок семестров:\n1.Расчет средневзвешенного значения для каждого предмета в семестрах. \n2. Вычисление среднего арифметического из средневзвешенных значений для каждого предмета в семестрах.\n3. Суммирование средних арифметических\n4. Вычисление среднего арифматического из суммированных значений\n\nСредняя из оценок со всего года:\n1. Расчет средневзвешенного значения по каждому предмету за год. Итоговое среднее значение за 1 семестр не имеет значения.\n2. Суммирование вычисленных средних\n3. Расчет среднего арифметического суммированных чисел Как работает \"Итоговая средняя оценка\"? @@ -270,6 +274,7 @@ right on target %1$d under target %1$d/%2$d presences + No attendances recorded Отсутствие по школьным причинам Отсутствие по уважительной причине Отсутствие по неуважительной причине @@ -737,6 +742,7 @@ Принудительно высчитать среднюю оценку через приложение Показывать присутствия Attendance target + Show subjects without any attendances Attendance calculator sorting Тема Разворачивание оценок @@ -856,7 +862,7 @@ Авторизовать Авторизация прошла успешно Авторизация - Для работы приложения нам необходимо подтвердить вашу личность. Введите PESEL учащегося <b>%1$s</b> в поле ниже + Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. Пропустить сейчас VULCAN\'s website requires verification diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 9dbf72820..a84438944 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -31,7 +31,7 @@ Semester %1$d, %2$d/%3$d - Prihláste sa pomocou študentského alebo rodičovského konta + Prihláste sa pomocou žiackeho alebo rodičovského účtu Zadajte symbol zo stránky denníka: <b>%1$s</b> Užívateľské meno Email @@ -113,13 +113,17 @@ Komentár Počet nových známok %1$d Priemer: %1$.2f + Annual: %1$.2f Body: %s Bez priemeru + Semester average + Annual average Súčet bodov Konečná známka Predpokladaná známka Popisná známka - Vypočítaný priemer + Calculated semester average + Calculated annual average Ako funguje vypočítaný priemer? Vypočítaný priemer je aritmetický priemer vypočítaný z priemerov predmetov. Umožňuje vám to poznať približný konečný priemer. Vypočítava sa spôsobom zvoleným užívateľom v nastaveniach aplikácii. Odporúča sa vybrať príslušnú možnosť. Dôvodom je rozdielny výpočet školských priemerov. Ak vaša škola navyše uvádza priemer predmetov na stránke denníka Vulcan, aplikácia si ich stiahne a tieto priemery nepočíta. To možno zmeniť vynútením výpočtu priemeru v nastavení aplikácii.\n\nPriemer známok iba z vybraného semestra:\n1. Výpočet váženého priemeru pre každý predmet v danom semestri\n2. Sčítanie vypočítaných priemerov\n3. Výpočet aritmetického priemeru součtených priemerov\n\nPriemer priemerov z oboch semestrov:\n1. Výpočet váženého priemeru pre každý predmet v semestri 1 a 2\n2. Výpočet aritmetického priemeru vypočítaných priemerov za semestre 1 a 2 pre každý predmet.\n3. Sčítanie vypočítaných priemerov\n4. Výpočet aritmetického priemeru součtených priemerov\n\nPriemer známok z celého roka:\n1. Výpočet váženého priemeru za rok pre každý predmet. Konečný priemer v 1. semestri je nepodstatný.\n2. Sčítanie vypočítaných priemerov\n3. Výpočet aritmetického priemeru součtených priemerov Ako funguje konečný priemer? @@ -270,6 +274,7 @@ presne v cieli %1$d pod cieľom %1$d/%2$d prítomnosti + Nebola zaznamenaná žiadna dochádzka Neprítomnosť zo školských dôvodov Ospravedlnená neprítomnosť Neospravedlnená neprítomnosť @@ -737,6 +742,7 @@ Vynútiť priemerný výpočet podľa aplikácie Zobraziť prítomnosť Cieľová dochádzka + Zobraziť predmety bez dochádzok Triedenie kalkulačky dochádzky Motív Rozvijanie známok @@ -856,7 +862,7 @@ Autorizovať Autorizácia bola úspešne dokončená Autorizácia - Na prevádzku aplikácie potrebujeme potvrdiť vašu identitu. Zadajte PESEL žiaka <b>%1$s</b> v nižšie uvedenom poli + Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. Zatiaľ preskočiť Webová stránka denníka VULCAN vyžaduje overenie diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 2d8ac1f4d..d936e8cdf 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -113,13 +113,17 @@ Коментар Кількість нових оцінок: %1$d Середня оцінка: %1$.2f + Підсумкова: %1$.2f Бали: %s Середня оцінка відсутня + Середня за семестр + Підсумкова середня оцінка Всього балів Підсумкова оцінка Передбачувана оцінка Описова оцінка - Розрахована середня оцінка + Розрахована середня за семестр + Розрахована підсумкова середня оцінка Як працює \"Розрахована середня оцінка\"? Розрахована середня оцінка - це середнє арифметичне, обчислене з середніх оцінок з предметів. Це дозволяє дізнатися приблизну кінцеву середню оцінку. Вона розраховується спосібом, обраним користувачем у налаштуваннях програми. Рекомендується вибрати відповідний варіант, тому що кожна школа по різному розраховує середню оцінку. Крім того, якщо у вашій школі повідомляється середня оцінка з предметів на сторінці Vulcan, програма тільки завантажує ці оцінки і не розраховує їх самостійно. Це можна змінити шляхом примусового розрахунку середньоЇ оцінки в налаштуваннях програми.\n\nСередні оцінки тільки за обраний семестр:\n1. Розрахунок середньозваженого числа для кожного предмета в даному семестрі\n2. Сумування розрахованих числ\n3. Розрахунок середнього арифметичного з сумованих чисел\n\nСереднє значення з обох семестрів:\n1. Обчислення середньозваженого числа для кожного предмета у 1 та 2 семестрі\n2. Обчислення середнього арифметичного з розрахованих середньозважених числ за 1 та 2 семестри для кожного предмета.\n3. Додавання розрахованих середніх\n4. Розрахунок середнього арифметичного підсумованих середніх значень\n\nСереднє значення оцінок за весь рік: \n1. Розрахунок середньозваженого числа за рік для кожного предмета. Підсумковий середній показник у 1-му семестрі не має значення.\n2. Сумування розрахованих середніх\n3. Обчислення середнього арифметичного з суммованих середніх Як працює \"Підсумкова середня оцінка\"? @@ -270,6 +274,7 @@ точно у цілі %1$d під ціллю %1$d/%2$d відвідуваності + Немає жодних записаних відвідувань Відсутність зі шкільних причин Відсутність з поважних причин Відсутність без поважних причин @@ -737,6 +742,7 @@ Примусово розраховувати середню оцінку через додаток Показувати присутність Цільова відвідуваність + Показувати уроки без відвідувань Сортування калькулятора відвідування Тема Розгортання оцінок @@ -856,7 +862,7 @@ Авторизовать Авторизація пройшла успішно Авторизувати - Для роботи програми нам потрібно підтвердити вашу особу. Будь ласка, введіть число PESEL <b>%1$s</b> студента в поле нижче + Шановні батьки,<br><br>Для авторизації та забезпечення безпеки даних просимо Вас ввести нижче PESEL номер учня <b>%1$s</b>. Ці дані необхідні для правильного призначення доступу та захисту персональних даних відповідно до чинного законодавства.<br><br>Після введення даних буде проведена перевірка, щоб переконатися, що доступ до системи VULCAN надається виключно уповноваженим особам. У разі виникнення будь-яких сумнівів або проблем, будь ласка, зв\'яжіться з адміністратором шкільного щоденника для з\'ясування ситуації.<br><br>Ми підтримуємо найвищі стандарти захисту персональних даних і гарантуємо, що вся надана інформація є безпечною. Додаток Wulkanowy не зберігає і не обробляє номер PESEL.<br><br>Нагадуємо, що надання повних і точних даних є обов\'язковим і необхідним для використання системи VULCAN. Поки що пропустити Веб-сайт VULCAN потребує підтвердження diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 97bc6153b..9175321d3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -856,7 +856,7 @@ Authorize Authorization completed successfully Authorization - Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. + Dear Parent,

To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student %1$s. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.

After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.

We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.

We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system.
Skip for now From bc3aa7b8dc2686fb2a329e5a089bf496688f80f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 24 Apr 2024 22:28:16 +0200 Subject: [PATCH 1460/1526] New Crowdin updates (#2526) --- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index f37e1cf2a..9abd73c15 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -862,7 +862,7 @@ Autorizovat Autorizace byla úspěšně dokončena Autorizace - Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. + Dear Parent,

To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student %1$s. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.

After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.

We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.

We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system.
Zatím přeskočit Webová stránka deníku VULCAN vyžaduje ověření diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b8bf5019f..39fe5c14c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -768,7 +768,7 @@ Authorize Authorization completed successfully Authorization - Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. + Dear Parent,

To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student %1$s. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.

After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.

We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.

We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system.
Skip for now VULCAN\'s website requires verification diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 48c90f599..bdd5df91a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -862,7 +862,7 @@ Potwierdź Autoryzacja zakończona pomyślnie Autoryzacja - Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. + Szanowny Rodzicu,

W celu autoryzacji i zapewnienia bezpieczeństwa danych, uprzejmie prosimy o wprowadzenie poniżej numeru PESEL ucznia %1$s. Te informacje są niezbędne do prawidłowego przypisania dostępu i ochrony danych osobowych zgodnie z obowiązującymi przepisami.

Po wprowadzeniu danych, będą one weryfikowane w celu zapewnienia, że dostęp do systemu VULCAN jest przyznawany wyłącznie upoważnionym osobom. W przypadku jakichkolwiek wątpliwości lub problemów, prosimy o kontakt z administratorem dziennika szkolnego w celu wyjaśnienia sytuacji.

Zachowujemy najwyższe standardy ochrony danych osobowych i zapewniamy, że wszelkie przekazane informacje są chronione. Wulkanowy nie przechowuje ani nie przetwarza numeru PESEL.

Przypominamy, że podanie pełnych i prawdziwych danych jest obowiązkowe i konieczne do korzystania z systemu VULCAN.
Na razie pomiń Strona dziennika VULCAN wymaga weryfikacji diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d7f6e6cee..6914641b6 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -862,7 +862,7 @@ Авторизовать Авторизация прошла успешно Авторизация - Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. + Dear Parent,

To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student %1$s. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.

After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.

We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.

We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system.
Пропустить сейчас VULCAN\'s website requires verification diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index a84438944..8bb0e1bd8 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -862,7 +862,7 @@ Autorizovať Autorizácia bola úspešne dokončená Autorizácia - Dear Parent,<br><br>To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student <b>%1$s</b>. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.<br><br>After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.<br><br>We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.<br><br>We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system. + Dear Parent,

To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student %1$s. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.

After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.

We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.

We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system.
Zatiaľ preskočiť Webová stránka denníka VULCAN vyžaduje overenie diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index d936e8cdf..70269211a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -862,7 +862,7 @@ Авторизовать Авторизація пройшла успішно Авторизувати - Шановні батьки,<br><br>Для авторизації та забезпечення безпеки даних просимо Вас ввести нижче PESEL номер учня <b>%1$s</b>. Ці дані необхідні для правильного призначення доступу та захисту персональних даних відповідно до чинного законодавства.<br><br>Після введення даних буде проведена перевірка, щоб переконатися, що доступ до системи VULCAN надається виключно уповноваженим особам. У разі виникнення будь-яких сумнівів або проблем, будь ласка, зв\'яжіться з адміністратором шкільного щоденника для з\'ясування ситуації.<br><br>Ми підтримуємо найвищі стандарти захисту персональних даних і гарантуємо, що вся надана інформація є безпечною. Додаток Wulkanowy не зберігає і не обробляє номер PESEL.<br><br>Нагадуємо, що надання повних і точних даних є обов\'язковим і необхідним для використання системи VULCAN. + Шановні батьки,

Для авторизації та забезпечення безпеки даних просимо Вас ввести нижче PESEL номер учня %1$s. Ці дані необхідні для правильного призначення доступу та захисту персональних даних відповідно до чинного законодавства.

Після введення даних буде проведена перевірка, щоб переконатися, що доступ до системи VULCAN надається виключно уповноваженим особам. У разі виникнення будь-яких сумнівів або проблем, будь ласка, зв\'яжіться з адміністратором шкільного щоденника для з\'ясування ситуації.

Ми підтримуємо найвищі стандарти захисту персональних даних і гарантуємо, що вся надана інформація є безпечною. Додаток Wulkanowy не зберігає і не обробляє номер PESEL.

Нагадуємо, що надання повних і точних даних є обов\'язковим і необхідним для використання системи VULCAN.
Поки що пропустити Веб-сайт VULCAN потребує підтвердження From dbc7587741ba6c6181fd84b585b1124b0fdcef36 Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Wed, 24 Apr 2024 22:44:59 +0200 Subject: [PATCH 1461/1526] Add settings button to attendance calculator (#2492) --- .../AttendanceCalculatorFragment.kt | 30 ++++++++++++++++++- .../AttendanceCalculatorPresenter.kt | 12 +++++++- .../calculator/AttendanceCalculatorView.kt | 2 ++ .../settings/appearance/AppearanceFragment.kt | 10 +++++++ .../action_menu_attendance_calculator.xml | 11 +++++++ app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 ++ .../res/xml/scheme_preferences_appearance.xml | 5 ++++ 8 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/menu/action_menu_attendance_calculator.xml diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorFragment.kt index 2d5667015..63d1d8be5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorFragment.kt @@ -1,6 +1,9 @@ package io.github.wulkanowy.ui.modules.attendance.calculator import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem import android.view.View import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager @@ -9,7 +12,9 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.pojos.AttendanceData import io.github.wulkanowy.databinding.FragmentAttendanceCalculatorBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.ui.modules.settings.appearance.AppearanceFragment import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.getThemeAttrColor import javax.inject.Inject @@ -33,6 +38,12 @@ class AttendanceCalculatorFragment : override val isViewEmpty get() = attendanceCalculatorAdapter.items.isEmpty() + @Suppress("DEPRECATION") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setHasOptionsMenu(true) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding = FragmentAttendanceCalculatorBinding.bind(view) @@ -40,6 +51,19 @@ class AttendanceCalculatorFragment : presenter.onAttachView(this) } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.action_menu_attendance_calculator, menu) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return if (item.itemId == R.id.attendance_calculator_menu_settings) presenter.onSettingsSelected() + else false + } + + override fun openSettingsView() { + (activity as? MainActivity)?.pushView(AppearanceFragment.withFocusedPreference(getString(R.string.pref_key_attendance_target))) + } + override fun initView() { with(binding.attendanceCalculatorRecycler) { layoutManager = LinearLayoutManager(context) @@ -50,7 +74,11 @@ class AttendanceCalculatorFragment : with(binding) { attendanceCalculatorSwipe.setOnRefreshListener(presenter::onSwipeRefresh) attendanceCalculatorSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) - attendanceCalculatorSwipe.setProgressBackgroundColorSchemeColor(requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh)) + attendanceCalculatorSwipe.setProgressBackgroundColorSchemeColor( + requireContext().getThemeAttrColor( + R.attr.colorSwipeRefresh + ) + ) attendanceCalculatorErrorRetry.setOnClickListener { presenter.onRetry() } attendanceCalculatorErrorDetails.setOnClickListener { presenter.onDetailsClick() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorPresenter.kt index d292e5650..29cb2197f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorPresenter.kt @@ -1,6 +1,11 @@ package io.github.wulkanowy.ui.modules.attendance.calculator -import io.github.wulkanowy.data.* +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.onResourceData +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceIntermediate +import io.github.wulkanowy.data.onResourceNotLoading import io.github.wulkanowy.data.repositories.SemesterRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.domain.attendance.GetAttendanceCalculatorDataUseCase @@ -81,4 +86,9 @@ class AttendanceCalculatorPresenter @Inject constructor( } else showError(message, error) } } + + fun onSettingsSelected(): Boolean { + view?.openSettingsView() + return true + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorView.kt index 94e661212..21afe532e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/calculator/AttendanceCalculatorView.kt @@ -26,4 +26,6 @@ interface AttendanceCalculatorView : BaseView { fun updateData(data: List) fun clearView() + + fun openSettingsView() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt index ba234aae2..62544f83e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/appearance/AppearanceFragment.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.settings.appearance import android.content.SharedPreferences import android.os.Bundle import android.view.View +import androidx.core.os.bundleOf import androidx.preference.PreferenceFragmentCompat import androidx.preference.SeekBarPreference import com.yariksoffice.lingver.Lingver @@ -30,9 +31,18 @@ class AppearanceFragment : PreferenceFragmentCompat(), override val titleStringId get() = R.string.pref_settings_appearance_title + companion object { + fun withFocusedPreference(key: String) = AppearanceFragment().apply { + arguments = bundleOf(FOCUSED_KEY to key) + } + + private const val FOCUSED_KEY = "focusedKey" + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) presenter.onAttachView(this) + arguments?.getString(FOCUSED_KEY)?.let { scrollToPreference(it) } } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { diff --git a/app/src/main/res/menu/action_menu_attendance_calculator.xml b/app/src/main/res/menu/action_menu_attendance_calculator.xml new file mode 100644 index 000000000..c50906901 --- /dev/null +++ b/app/src/main/res/menu/action_menu_attendance_calculator.xml @@ -0,0 +1,11 @@ + +

+ + diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 080456ef9..e87e9854a 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -1,6 +1,7 @@ default_menu_index + attendance_calculator attendance_present attendance_target attendance_calculator_sorting_mode diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9175321d3..a8e159ec6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -796,6 +796,8 @@ Dashboard Tiles visibility Attendance + Attendance calculator + Settings Timetable Grades Calculated average diff --git a/app/src/main/res/xml/scheme_preferences_appearance.xml b/app/src/main/res/xml/scheme_preferences_appearance.xml index a05d95c04..1ca4d2048 100644 --- a/app/src/main/res/xml/scheme_preferences_appearance.xml +++ b/app/src/main/res/xml/scheme_preferences_appearance.xml @@ -85,6 +85,11 @@ app:iconSpaceReserved="false" app:key="@string/pref_key_attendance_present" app:title="@string/pref_view_present" /> + + Date: Wed, 24 Apr 2024 22:46:55 +0200 Subject: [PATCH 1462/1526] Fix race condition of showing empty view in timetable (#2486) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- .../history/LuckyNumberHistoryAdapter.kt | 2 +- .../ui/modules/timetable/TimetableAdapter.kt | 46 ++++++------- .../ui/modules/timetable/TimetableFragment.kt | 13 +++- .../modules/timetable/TimetablePresenter.kt | 23 ++++--- .../ui/modules/timetable/TimetableView.kt | 2 +- .../github/wulkanowy/utils/SyncListAdapter.kt | 66 +++++++++++++++++++ 6 files changed, 110 insertions(+), 42 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/utils/SyncListAdapter.kt diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryAdapter.kt index 0c1b89c8e..9c718af45 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryAdapter.kt @@ -33,4 +33,4 @@ class LuckyNumberHistoryAdapter @Inject constructor() : } class ItemViewHolder(val binding: ItemLuckyNumberHistoryBinding) : RecyclerView.ViewHolder(binding.root) -} \ No newline at end of file +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index a4221a2a2..b9b7a27e2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -7,20 +7,20 @@ import android.view.ViewGroup import android.widget.TextView import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.databinding.ItemTimetableBinding import io.github.wulkanowy.databinding.ItemTimetableEmptyBinding import io.github.wulkanowy.databinding.ItemTimetableSmallBinding +import io.github.wulkanowy.utils.SyncListAdapter import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.toFormattedString import javax.inject.Inject class TimetableAdapter @Inject constructor() : - ListAdapter(differ) { + SyncListAdapter(Differ) { override fun getItemViewType(position: Int): Int = getItem(position).type.ordinal @@ -61,12 +61,10 @@ class TimetableAdapter @Inject constructor() : binding = holder.binding, item = getItem(position) as TimetableItem.Small, ) - is NormalViewHolder -> bindNormalView( binding = holder.binding, item = getItem(position) as TimetableItem.Normal, ) - is EmptyViewHolder -> bindEmptyView( binding = holder.binding, item = getItem(position) as TimetableItem.Empty, @@ -307,31 +305,29 @@ class TimetableAdapter @Inject constructor() : private class EmptyViewHolder(val binding: ItemTimetableEmptyBinding) : RecyclerView.ViewHolder(binding.root) - companion object { - private val differ = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: TimetableItem, newItem: TimetableItem): Boolean = - when { - oldItem is TimetableItem.Small && newItem is TimetableItem.Small -> { - oldItem.lesson.start == newItem.lesson.start - } - - oldItem is TimetableItem.Normal && newItem is TimetableItem.Normal -> { - oldItem.lesson.start == newItem.lesson.start - } - - else -> oldItem == newItem + private object Differ : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: TimetableItem, newItem: TimetableItem): Boolean = + when { + oldItem is TimetableItem.Small && newItem is TimetableItem.Small -> { + oldItem.lesson.start == newItem.lesson.start } - override fun areContentsTheSame(oldItem: TimetableItem, newItem: TimetableItem) = - oldItem == newItem + oldItem is TimetableItem.Normal && newItem is TimetableItem.Normal -> { + oldItem.lesson.start == newItem.lesson.start + } - override fun getChangePayload(oldItem: TimetableItem, newItem: TimetableItem): Any? { - return if (oldItem is TimetableItem.Normal && newItem is TimetableItem.Normal) { - if (oldItem.lesson == newItem.lesson && oldItem.showGroupsInPlan == newItem.showGroupsInPlan && oldItem.timeLeft != newItem.timeLeft) { - "time_left" - } else super.getChangePayload(oldItem, newItem) - } else super.getChangePayload(oldItem, newItem) + else -> oldItem == newItem } + + override fun areContentsTheSame(oldItem: TimetableItem, newItem: TimetableItem) = + oldItem == newItem + + override fun getChangePayload(oldItem: TimetableItem, newItem: TimetableItem): Any? { + return if (oldItem is TimetableItem.Normal && newItem is TimetableItem.Normal) { + if (oldItem.lesson == newItem.lesson && oldItem.showGroupsInPlan == newItem.showGroupsInPlan && oldItem.timeLeft != newItem.timeLeft) { + "time_left" + } else super.getChangePayload(oldItem, newItem) + } else super.getChangePayload(oldItem, newItem) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index 0e6459110..b73e7c26d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -21,7 +21,11 @@ import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.timetable.additional.AdditionalLessonsFragment import io.github.wulkanowy.ui.modules.timetable.completed.CompletedLessonsFragment import io.github.wulkanowy.ui.widgets.DividerItemDecoration -import io.github.wulkanowy.utils.* +import io.github.wulkanowy.utils.dpToPx +import io.github.wulkanowy.utils.firstSchoolDayInSchoolYear +import io.github.wulkanowy.utils.getThemeAttrColor +import io.github.wulkanowy.utils.lastSchoolDayInSchoolYear +import io.github.wulkanowy.utils.openMaterialDatePicker import java.time.LocalDate import javax.inject.Inject @@ -104,8 +108,11 @@ class TimetableFragment : BaseFragment(R.layout.fragme } } - override fun updateData(data: List) { - timetableAdapter.submitList(data) + override fun updateData(data: List, isDayChanged: Boolean) { + when { + isDayChanged -> timetableAdapter.recreate(data) + else -> timetableAdapter.submitList(data) + } } override fun clearData() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 8ef0772b8..111050618 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -81,7 +81,7 @@ class TimetablePresenter @Inject constructor( } else currentDate?.previousSchoolDay reloadView(date ?: return) - loadData() + loadData(isDayChanged = true) } fun onNextDay() { @@ -90,7 +90,7 @@ class TimetablePresenter @Inject constructor( } else currentDate?.nextSchoolDay reloadView(date ?: return) - loadData() + loadData(isDayChanged = true) } fun onPickDate() { @@ -104,7 +104,7 @@ class TimetablePresenter @Inject constructor( fun onSwipeRefresh() { Timber.i("Force refreshing the timetable") - loadData(true) + loadData(forceRefresh = true) } fun onRetry() { @@ -112,7 +112,7 @@ class TimetablePresenter @Inject constructor( showErrorView(false) showProgress(true) } - loadData(true) + loadData(forceRefresh = true) } fun onDetailsClick() { @@ -145,7 +145,7 @@ class TimetablePresenter @Inject constructor( return true } - private fun loadData(forceRefresh: Boolean = false) { + private fun loadData(forceRefresh: Boolean = false, isDayChanged: Boolean = false) { flatResourceFlow { val student = studentRepository.getCurrentStudent() val semester = semesterRepository.getCurrentSemester(student) @@ -169,9 +169,9 @@ class TimetablePresenter @Inject constructor( enableSwipe(true) showProgress(false) showErrorView(false) + updateData(it.lessons, isDayChanged) showContent(it.lessons.isNotEmpty()) showEmpty(it.lessons.isEmpty()) - updateData(it.lessons) setDayHeaderMessage(it.headers.find { header -> header.date == currentDate }?.content) reloadNavigation() } @@ -216,15 +216,14 @@ class TimetablePresenter @Inject constructor( } } - private fun updateData(lessons: List) { + private fun updateData(lessons: List, isDayChanged: Boolean) { tickTimer?.cancel() - if (currentDate != now()) { - view?.updateData(createItems(lessons)) - } else { - tickTimer = timer(period = 2_000) { + view?.updateData(createItems(lessons), isDayChanged) + if (currentDate == now()) { + tickTimer = timer(period = 2_000, initialDelay = 2_000) { Handler(Looper.getMainLooper()).post { - view?.updateData(createItems(lessons)) + view?.updateData(createItems(lessons), isDayChanged) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt index 40190d51f..f4d5b7621 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt @@ -12,7 +12,7 @@ interface TimetableView : BaseView { fun initView() - fun updateData(data: List) + fun updateData(data: List, isDayChanged: Boolean) fun updateNavigationDay(date: String) diff --git a/app/src/main/java/io/github/wulkanowy/utils/SyncListAdapter.kt b/app/src/main/java/io/github/wulkanowy/utils/SyncListAdapter.kt new file mode 100644 index 000000000..e9135f498 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/SyncListAdapter.kt @@ -0,0 +1,66 @@ +package io.github.wulkanowy.utils + +import android.annotation.SuppressLint +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView + +/** + * Custom alternative to androidx.recyclerview.widget.ListAdapter. ListAdapter is asynchronous which + * caused data race problems in views when a Resource.Error arrived shortly after + * Resource.Intermediate/Success - occasionally in that case the user could see both the Resource's + * data and an error message one on top of the other. This is synchronized by design to avoid that + * problem, however it retains the quality of life improvements of the original. + */ +abstract class SyncListAdapter private constructor( + private val updateStrategy: SyncListAdapter.(List) -> Unit +) : RecyclerView.Adapter() { + + constructor(differ: DiffUtil.ItemCallback) : this({ newItems -> + val diffResult = DiffUtil.calculateDiff(toCallback(differ, items, newItems)) + items = newItems + diffResult.dispatchUpdatesTo(this) + }) + + var items = emptyList() + private set + + final override fun getItemCount() = items.size + + fun getItem(position: Int): T { + return items[position] + } + + /** + * Updates all items, same as submitList, however also disables animations temporarily. + * This prevents a flashing effect on some views. Should be used in favor of submitList when + * all data is changed (e.g. the selected day changes in timetable causing all lessons to change). + */ + @SuppressLint("NotifyDataSetChanged") + fun recreate(data: List) { + items = data + notifyDataSetChanged() + } + + fun submitList(data: List) { + updateStrategy(data.toList()) + } + + private fun toCallback( + itemCallback: DiffUtil.ItemCallback, + old: List, + new: List, + ) = object : DiffUtil.Callback() { + override fun getOldListSize() = old.size + + override fun getNewListSize() = new.size + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) = + itemCallback.areItemsTheSame(old[oldItemPosition], new[newItemPosition]) + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int) = + itemCallback.areContentsTheSame(old[oldItemPosition], new[newItemPosition]) + + override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int) = + itemCallback.getChangePayload(old[oldItemPosition], new[newItemPosition]) + } +} From 6a1851da13dd6678b1bf3e82cfde1b99d83efe43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 25 Apr 2024 09:26:47 +0200 Subject: [PATCH 1463/1526] Bump sdk to 2.5.8-SNAPSHOT --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ede6dd951..12fe81108 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.7' + implementation 'io.github.wulkanowy:sdk:2.5.8-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' From f983a23b1a2f6033c089e10470c4edd018c05ba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 25 Apr 2024 12:45:09 +0200 Subject: [PATCH 1464/1526] Version 2.5.8 --- app/build.gradle | 8 ++++---- app/src/main/play/release-notes/pl-PL/default.txt | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 12fe81108..7a2f0ca57 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 156 - versionName "2.5.7" + versionCode 157 + versionName "2.5.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -165,7 +165,7 @@ play { track = 'production' releaseStatus = ReleaseStatus.IN_PROGRESS userFraction = 0.99d - updatePriority = 3 + updatePriority = 4 enabled.set(false) } @@ -195,7 +195,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.5.8-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.5.8' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index d96ff15ac..2b87f21d5 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,6 +1,5 @@ -Wersja 2.5.7 +Wersja 2.5.8 -— naprawiliśmy logowanie (pusta lista z wyborem uczniów), które zepsuło się po zmianach po stronie VULCANa -— dodaliśmy wyświetlanie osobno średniej rocznej, bo VULCAN rozdzielił i zrobił się bałagan +— obeszliśmy próby blokowania Wulkanowego przez firmę VULCAN, o czymś pewnie zapomnieliśmy, ale nie miejcie nam tego za złe Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From cde2121b60f5dadcd6fc884d12f568451aef1b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 26 Apr 2024 22:05:46 +0200 Subject: [PATCH 1465/1526] New Crowdin updates (#2527) --- app/src/main/res/values-cs/strings.xml | 14 +++-- .../main/res/values-de/preferences_values.xml | 10 +-- app/src/main/res/values-de/strings.xml | 62 ++++++++++--------- app/src/main/res/values-pl/strings.xml | 2 + app/src/main/res/values-ru/strings.xml | 2 + app/src/main/res/values-sk/strings.xml | 14 +++-- app/src/main/res/values-uk/strings.xml | 2 + 7 files changed, 59 insertions(+), 47 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 9abd73c15..7dfab1872 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -113,17 +113,17 @@ Komentář Počet nových známek: %1$d Průměr: %1$.2f - Annual: %1$.2f + Roční: %1$.2f Body: %s Bez průměru - Semester average - Annual average + Pololetní průměr + Roční průměr Součet bodů Konečná známka Předpokládaná známka Popisná známka - Calculated semester average - Calculated annual average + Vypočítaný pololetní průměr + Vypočítaný roční průměr Jak funguje vypočítaný průměr? Vypočítaný průměr je aritmetický průměr vypočítaný z průměrů předmětů. Umožňuje vám to znát přibližný konečný průměr. Vypočítává se způsobem zvoleným uživatelem v nastavení aplikaci. Doporučuje se vybrat příslušnou možnost. Důvodem je rozdílný výpočet školních průměrů. Pokud vaše škola navíc uvádí průměr předmětů na stránce deníku Vulcan, aplikace si je stáhne a tyto průměry nepočítá. To lze změnit vynucením výpočtu průměru v nastavení aplikaci.\n\nPrůměr známek pouze z vybraného semestru:\n1. Výpočet váženého průměru pro každý předmět v daném semestru\n2. Sčítání vypočítaných průměrů\n3. Výpočet aritmetického průměru součtených průměrů\n\nPrůměr průměrů z obou semestrů:\n1. Výpočet váženého průměru pro každý předmět v semestru 1 a 2\n2. Výpočet aritmetického průměru vypočítaných průměrů za semestry 1 a 2 pro každý předmět.\n3. Sčítání vypočítaných průměrů\n4. Výpočet aritmetického průměru sečtených průměrů\n\nPrůměr známek z celého roku:\n1. Výpočet váženého průměru za rok pro každý předmět. Konečný průměr v 1. semestru je nepodstatný.\n2. Sčítání vypočítaných průměrů\n3. Výpočet aritmetického průměru součtených průměrů Jak funguje konečný průměr? @@ -811,6 +811,8 @@ Domů Viditelnost dlaždic Docházka + Kalkulačka docházky + Nastavení Plán lekce Známky Vypočítaný průměr @@ -862,7 +864,7 @@ Autorizovat Autorizace byla úspěšně dokončena Autorizace - Dear Parent,

To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student %1$s. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.

After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.

We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.

We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system.
+ Vážený rodiči,

Chcete-li autorizovat a zajistit bezpečnost dat, prosíme Vás, abyste níže zadali PESEL číslo žáka %1$s. Tyto detaily jsou nutné pro správné přidělování přístupu k osobním údajům a jejich ochranu v souladu s platnými předpisy.

Po zadání údajů budou data ověřena, čímž se zajistí, že přístup do systému VULCAN získají pouze autorizované osoby. Pokud máte jakékoliv pochybnosti nebo problémy, kontaktujte prosím školního správce deníku pro objasnění situace.

Udržujeme nejvyšší standardy ochrany osobních údajů a zajišťujeme, aby byly všechny poskytnuté informace chráněné. Wulkanowy neukládá ani nezpracovává číslo PESEL.

Připomínáme, že poskytování úplných a přesných údajů je nutné a nezbytné k používání systému VULCAN.
Zatím přeskočit Webová stránka deníku VULCAN vyžaduje ověření diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 0170acfa3..7130cdd47 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -1,10 +1,10 @@ - Alphabetically - By date - By average - By attendance percentage - By subject attendance balance + Alphabetisch + Nach Datum + Nach Durchschnitt + Nach Anwesenheitsprozent + Nach Subjekt Anwesenheitssaldo Licht Dunkel diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 39fe5c14c..4945d13ce 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -10,10 +10,10 @@ Einstellungen Mehr Über die Applikation - Log viewer + Log Viewer Debuggen Benachrichtigungen debuggen - Clear webview cookies + Webview-Cookies löschen Mitarbeiter Lizenzen Nachrichten @@ -38,14 +38,14 @@ Anmeldung, PESEL oder e-mail Passwort UONET+ Registervariante - Custom domain suffix + Benutzerdefinierte Domeisensuffixe Mobile API Scraper Hybride Token PIN Symbol - E.g. \"lodz\" or \"powiatjaroslawski\" + Zum Beispiel \"lodz\" oder \"powiatjaroslawski\" Anmelden Passwort ist zu kurz Anmeldedaten sind falsch @@ -56,9 +56,9 @@ Ungültige email Den zugewiesenen Login anstelle von email verwenden Benutze den zugewiesenen Login oder E-Mail in @%1$s - Invalid domain suffix - Invalid symbol. If you cannot find it, please contact the school - Don\'t make this up! If you cannot find it, please contact the school + Ungültiges Domain-Suffix + Ungültiges Symbol. Wenn Sie es nicht finden können, wenden Sie sich bitte an die Schule + Denken Sie sich das nicht aus! Wenn Sie es nicht finden können, wenden Sie sich bitte an die Schule Schüler nicht gefunden. Überprüfen Sie das Symbol und die gewählte Variation des UONET+ Registers Ausgewählter Student ist bereits angemeldet. Das Symbol kann auf der Registerseite in Student → Tost Möbeln → Registrieren Sie Ihr Mobilgerätgefunden werden.\n\nStellen Sie sicher, dass Sie die entsprechende Registervariante im Feld UONET+ Registervariante auf dem vorherigen Bildschirm festgelegt haben @@ -73,7 +73,7 @@ Discord email senden Stellen Sie sicher, dass Sie die richtige UONET+ Registervariation wählen! - Reset password + Passwort zurücksetzen Ihr Konto wiederherstellen Wiederherstellen Student ist bereits angemeldet @@ -81,13 +81,13 @@ Andere Suchorte Keine aktiven Schüler gefunden Geben Sie ein anderes Symbol ein - Get help - Full school name with the town (required) - Np. ZSTiO Jarosław lub SP nr 99 w Łodzi - Enter correct name of the school - Additional information in Polish (optional) - Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\" - Submit + Hilfe anfragen + Vollschulname mit der Stadt (erforderlich) + Z. B. ZSTiO Jarosław oder SP nr 99 w Łodzi + Geben Sie den richtigen Namen der Schule ein + Zusätzliche Informationen auf Polnisch (fakultativ) + Z. B. „Ich habe kürzlich die Schule gewechselt und...“ oder „Ich bin ein Elternteil und kann das Konto des anderen Kindes nicht sehen...“ + Einreichen Benachrichtigungen aktivieren Aktivieren Sie Benachrichtigungen, damit Sie keine Nachricht vom Lehrer oder eine neue Klasse verpassen @@ -98,8 +98,8 @@ Anmelden Die Sitzung ist abgelaufen Die Sitzung ist abgelaufen, bitte loggen Sie sich erneut ein - Password has expired or been changed - Your account password has expired or been changed. You will need to log in to Wulkanowy again + Das Passwort ist abgelaufen oder wurde geändert + Ihr Passwort ist abgelaufen oder wurde geändert. Sie müssen sich erneut bei Wulkanowy anmelden Anwendungsunterstützung Gefällt Ihnen diese App? Unterstützen Sie ihre Entwicklung, indem Sie nicht-invasive Werbung aktivieren, die Sie jederzeit deaktivieren können Werbung aktivieren @@ -113,17 +113,17 @@ Kommentar Anzahl der neuen Bewertungen: %1$d Durchschnitt: %1$.2f - Annual: %1$.2f + Jährlich: %1$.2f Punkte: %s Kein Durchschnitt - Semester average - Annual average + Semesterdurchschnitt + Jahresdurchschnitt Gesamtpunkte Finaler Note Vorhergesagte Note - Descriptive grade - Calculated semester average - Calculated annual average + Deskriptive Note + Berechneter Semesterdurchschnitt + Berechneter Jahresdurchschnitt Wie funktioniert der berechnete Durchschnitt? Der berechnete Mittelwert ist das arithmetische Mittel, das aus den Durchschnittswerten der Probanden errechnet wird. Es erlaubt Ihnen, den ungefähre endgültigen Durchschnitt zu kennen. Sie wird auf eine vom Anwender in den Anwendungseinstellungen gewählte Weise berechnet. Es wird empfohlen, die entsprechende Option zu wählen. Das liegt daran, dass die Berechnung der Schuldurchschnitte unterschiedlich ist. Wenn Ihre Schule den Durchschnitt der Fächer auf der Vulcan-Seite angibt, lädt die Anwendung diese Fächer herunter und berechnet nicht den Durchschnitt. Dies kann geändert werden, indem die Berechnung des Durchschnitts in den Anwendungseinstellungen erzwungen wird. \n\nDurchschnitt der Noten nur aus dem ausgewählten Semester :\n1. Berechnung des gewichteten Durchschnitts für jedes Fach in einem bestimmten Semester\n2. Addition der berechneten Durchschnittswerte\n3. Berechnung des arithmetischen Mittels der summierten Durchschnitte\nDurchschnitt der Durchschnitte aus beiden Semestern:\n1. Berechnung des gewichteten Durchschnitts für jedes Fach in Semester 1 und 2\n2. Berechnung des arithmetischen Mittels der berechneten Durchschnitte für Semester 1 und 2 für jedes Fach. \n3. Hinzufügen von berechneten Durchschnittswerten\n4. Berechnung des arithmetischen Mittels der summierten Durchschnitte\nDurchschnitt der Noten aus dem ganzen Jahr:\n1. Berechnung des gewichteten Jahresdurchschnitts für jedes Fach. Der Abschlussdurchschnitt im 1. Semester ist irrelevant. \n2. Addition der berechneten Durchschnittswerte\n3. Berechnung des arithmetischen Mittels der summierten Mittelwerte Wie funktioniert der endgültige Durchschnitt? @@ -159,8 +159,8 @@ Neue Abschlussnoten - New descriptive grade - New descriptive grades + Neuer Deskriptive Grade + Neuer Deskriptive Grades Du hast %1$d Note bekommen @@ -175,8 +175,8 @@ Sie haben %1$d Abschlussnoten bekommen - You received %1$d descriptive grade - You received %1$d descriptive grades + Sie haben %1$d deskriptive Grade erhalten + Sie haben %1$d deskriptive Grades erhalten Lektion @@ -241,9 +241,9 @@ Endzeit muss grösser sein als Startzeit Übersicht über die Schulbesuch - Attendance calculator - %1$d over target - right on target + Anwesenheitsrechner + %1$d Über Ziel + direkt am ziel %1$d under target %1$d/%2$d presences No attendances recorded @@ -717,6 +717,8 @@ Dashboard Sichtbarkeit der Kacheln Schulbesuch + Attendance calculator + Settings Stundenplan Noten Berechneter Durchschnitt diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index bdd5df91a..212e442b9 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -811,6 +811,8 @@ Start Widoczność kafelków Frekwencja + Kalkulator frekwencji + Ustawienia Plan lekcji Oceny Obliczona średnia diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6914641b6..87b458adc 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -811,6 +811,8 @@ Главная Видимость плиток Посещаемость + Attendance calculator + Settings Расписание Оценки Рассчитанная средняя оценка diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 8bb0e1bd8..9f145efac 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -113,17 +113,17 @@ Komentár Počet nových známok %1$d Priemer: %1$.2f - Annual: %1$.2f + Ročný: %1$.2f Body: %s Bez priemeru - Semester average - Annual average + Polročný priemer + Ročný priemer Súčet bodov Konečná známka Predpokladaná známka Popisná známka - Calculated semester average - Calculated annual average + Vypočítaný polročný priemer + Vypočítaný ročný priemer Ako funguje vypočítaný priemer? Vypočítaný priemer je aritmetický priemer vypočítaný z priemerov predmetov. Umožňuje vám to poznať približný konečný priemer. Vypočítava sa spôsobom zvoleným užívateľom v nastaveniach aplikácii. Odporúča sa vybrať príslušnú možnosť. Dôvodom je rozdielny výpočet školských priemerov. Ak vaša škola navyše uvádza priemer predmetov na stránke denníka Vulcan, aplikácia si ich stiahne a tieto priemery nepočíta. To možno zmeniť vynútením výpočtu priemeru v nastavení aplikácii.\n\nPriemer známok iba z vybraného semestra:\n1. Výpočet váženého priemeru pre každý predmet v danom semestri\n2. Sčítanie vypočítaných priemerov\n3. Výpočet aritmetického priemeru součtených priemerov\n\nPriemer priemerov z oboch semestrov:\n1. Výpočet váženého priemeru pre každý predmet v semestri 1 a 2\n2. Výpočet aritmetického priemeru vypočítaných priemerov za semestre 1 a 2 pre každý predmet.\n3. Sčítanie vypočítaných priemerov\n4. Výpočet aritmetického priemeru součtených priemerov\n\nPriemer známok z celého roka:\n1. Výpočet váženého priemeru za rok pre každý predmet. Konečný priemer v 1. semestri je nepodstatný.\n2. Sčítanie vypočítaných priemerov\n3. Výpočet aritmetického priemeru součtených priemerov Ako funguje konečný priemer? @@ -811,6 +811,8 @@ Domov Viditeľnosť dlaždíc Dochádzka + Kalkulačka dochádzky + Nastavenia Plán lekcie Známky Vypočítaný priemer @@ -862,7 +864,7 @@ Autorizovať Autorizácia bola úspešne dokončená Autorizácia - Dear Parent,

To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student %1$s. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.

After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.

We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.

We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system.
+ Vážený rodiči,

Ak chcete autorizovať a zaistiť bezpečnosť dát, prosíme Vás, aby ste nižšie zadali PESEL číslo žiaka %1$s. Tieto detaily sú nutné pre správne prideľovanie prístupu k osobným údajom a ich ochranu v súlade s platnými predpismi.

Po zadaní údajov budú dáta overené, čím sa zaistí, že prístup do systému VULCAN získajú iba autorizované osoby. Pokiaľ máte akékoľvek pochybnosti alebo problémy, kontaktujte prosím školského správcu denníka pre objasnenie situácie.

Udržujeme najvyššie štandardy ochrany osobných údajov a zaisťujeme, aby boli všetky poskytnuté informácie chránené. Wulkanowy neukladá ani nespracováva číslo PESEL.

Pripomíname, že poskytovanie úplných a presných údajov je nutné a nevyhnutné na používanie systému VULCAN.
Zatiaľ preskočiť Webová stránka denníka VULCAN vyžaduje overenie diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 70269211a..f48732c3c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -811,6 +811,8 @@ Головна Видимість плиток Відвідуваність + Attendance calculator + Settings Розклад Оцінки Розрахована середня оцінка From 6f2168d6417711be34d129a626cf31352a417571 Mon Sep 17 00:00:00 2001 From: Michael <5672750+mibac138@users.noreply.github.com> Date: Fri, 26 Apr 2024 23:33:45 +0200 Subject: [PATCH 1466/1526] Additional lessons in timetable view (#2491) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- .../data/enums/ShowAdditionalLessonsMode.kt | 11 ++ .../repositories/PreferencesRepository.kt | 7 + .../ui/modules/timetable/TimetableAdapter.kt | 24 +++ .../ui/modules/timetable/TimetableItem.kt | 8 +- .../modules/timetable/TimetablePresenter.kt | 130 ++++++++++----- .../additional/AdditionalLessonsFragment.kt | 14 +- .../additional/AdditionalLessonsPresenter.kt | 34 +++- .../additional/AdditionalLessonsView.kt | 2 +- .../add/AdditionalLessonAddDialog.kt | 14 +- .../add/AdditionalLessonAddPresenter.kt | 9 +- .../additional/add/AdditionalLessonAddView.kt | 2 +- .../layout/item_timetable_main_additional.xml | 153 ++++++++++++++++++ .../main/res/values/preferences_defaults.xml | 3 +- app/src/main/res/values/preferences_keys.xml | 1 + .../main/res/values/preferences_values.xml | 11 ++ app/src/main/res/values/strings.xml | 2 + .../res/xml/scheme_preferences_appearance.xml | 21 ++- 17 files changed, 379 insertions(+), 67 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/data/enums/ShowAdditionalLessonsMode.kt create mode 100644 app/src/main/res/layout/item_timetable_main_additional.xml diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/ShowAdditionalLessonsMode.kt b/app/src/main/java/io/github/wulkanowy/data/enums/ShowAdditionalLessonsMode.kt new file mode 100644 index 000000000..3e7cdef5b --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/enums/ShowAdditionalLessonsMode.kt @@ -0,0 +1,11 @@ +package io.github.wulkanowy.data.enums + +enum class ShowAdditionalLessonsMode(val value: String) { + NONE("none"), + INLINE("inline"), + BELOW("below"); + + companion object { + fun getByValue(value: String) = entries.find { it.value == value } ?: INLINE + } +} 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 2bb1538cb..8082068c5 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 @@ -14,6 +14,7 @@ import io.github.wulkanowy.data.enums.AttendanceCalculatorSortingMode import io.github.wulkanowy.data.enums.GradeColorTheme import io.github.wulkanowy.data.enums.GradeExpandMode import io.github.wulkanowy.data.enums.GradeSortingMode +import io.github.wulkanowy.data.enums.ShowAdditionalLessonsMode import io.github.wulkanowy.data.enums.TimetableGapsMode import io.github.wulkanowy.data.enums.TimetableMode import io.github.wulkanowy.ui.modules.dashboard.DashboardItem @@ -213,6 +214,12 @@ class PreferencesRepository @Inject constructor( ) ) + val showAdditionalLessonsInPlan: ShowAdditionalLessonsMode + get() = getString( + R.string.pref_key_timetable_show_additional_lessons, + R.string.pref_default_timetable_show_additional_lessons + ).let { ShowAdditionalLessonsMode.getByValue(it) } + val gradeSortingMode: GradeSortingMode get() = GradeSortingMode.getByValue( getString( diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index b9b7a27e2..5cb6c401f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -12,6 +12,7 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.databinding.ItemTimetableBinding import io.github.wulkanowy.databinding.ItemTimetableEmptyBinding +import io.github.wulkanowy.databinding.ItemTimetableMainAdditionalBinding import io.github.wulkanowy.databinding.ItemTimetableSmallBinding import io.github.wulkanowy.utils.SyncListAdapter import io.github.wulkanowy.utils.getPlural @@ -39,6 +40,10 @@ class TimetableAdapter @Inject constructor() : TimetableItemType.EMPTY -> EmptyViewHolder( ItemTimetableEmptyBinding.inflate(inflater, parent, false) ) + + TimetableItemType.ADDITIONAL -> AdditionalViewHolder( + ItemTimetableMainAdditionalBinding.inflate(inflater, parent, false) + ) } } @@ -69,6 +74,22 @@ class TimetableAdapter @Inject constructor() : binding = holder.binding, item = getItem(position) as TimetableItem.Empty, ) + + is AdditionalViewHolder -> bindAdditionalView( + binding = holder.binding, + item = getItem(position) as TimetableItem.Additional, + ) + } + } + + private fun bindAdditionalView( + binding: ItemTimetableMainAdditionalBinding, + item: TimetableItem.Additional + ) { + with(binding) { + timetableItemSubject.text = item.additional.subject + timetableItemTimeStart.text = item.additional.start.toFormattedString("HH:mm") + timetableItemTimeFinish.text = item.additional.end.toFormattedString("HH:mm") } } @@ -305,6 +326,9 @@ class TimetableAdapter @Inject constructor() : private class EmptyViewHolder(val binding: ItemTimetableEmptyBinding) : RecyclerView.ViewHolder(binding.root) + private class AdditionalViewHolder(val binding: ItemTimetableMainAdditionalBinding) : + RecyclerView.ViewHolder(binding.root) + private object Differ : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: TimetableItem, newItem: TimetableItem): Boolean = when { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt index 402b03dd9..93290ba21 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableItem.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.modules.timetable import io.github.wulkanowy.data.db.entities.Timetable +import io.github.wulkanowy.data.db.entities.TimetableAdditional import java.time.Duration sealed class TimetableItem(val type: TimetableItemType) { @@ -23,6 +24,10 @@ sealed class TimetableItem(val type: TimetableItemType) { val numFrom: Int, val numTo: Int ) : TimetableItem(TimetableItemType.EMPTY) + + data class Additional( + val additional: TimetableAdditional, + ) : TimetableItem(TimetableItemType.ADDITIONAL) } data class TimeLeft( @@ -34,5 +39,6 @@ data class TimeLeft( enum class TimetableItemType { SMALL, NORMAL, - EMPTY + EMPTY, + ADDITIONAL, } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 111050618..c00bdc3e4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -4,6 +4,9 @@ import android.os.Handler import android.os.Looper import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Timetable +import io.github.wulkanowy.data.db.entities.TimetableAdditional +import io.github.wulkanowy.data.enums.ShowAdditionalLessonsMode.BELOW +import io.github.wulkanowy.data.enums.ShowAdditionalLessonsMode.NONE 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.TimetableMode @@ -14,6 +17,7 @@ import io.github.wulkanowy.data.onResourceError import io.github.wulkanowy.data.onResourceIntermediate import io.github.wulkanowy.data.onResourceNotLoading import io.github.wulkanowy.data.onResourceSuccess +import io.github.wulkanowy.data.pojos.TimetableFull import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.SemesterRepository import io.github.wulkanowy.data.repositories.StudentRepository @@ -169,9 +173,9 @@ class TimetablePresenter @Inject constructor( enableSwipe(true) showProgress(false) showErrorView(false) - updateData(it.lessons, isDayChanged) - showContent(it.lessons.isNotEmpty()) - showEmpty(it.lessons.isEmpty()) + updateData(it, isDayChanged) + showContent(it.lessons.isNotEmpty() || it.additional.isNotEmpty()) + showEmpty(it.lessons.isEmpty() && it.additional.isEmpty()) setDayHeaderMessage(it.headers.find { header -> header.date == currentDate }?.content) reloadNavigation() } @@ -216,7 +220,7 @@ class TimetablePresenter @Inject constructor( } } - private fun updateData(lessons: List, isDayChanged: Boolean) { + private fun updateData(lessons: TimetableFull, isDayChanged: Boolean) { tickTimer?.cancel() view?.updateData(createItems(lessons), isDayChanged) @@ -229,53 +233,84 @@ class TimetablePresenter @Inject constructor( } } - private fun createItems(items: List): List { - val filteredItems = items - .filter { - if (prefRepository.showWholeClassPlan == TimetableMode.ONLY_CURRENT_GROUP) { - it.isStudentPlan - } else true - } - .sortedWith(compareBy({ item -> item.start }, { item -> !item.isStudentPlan })) + private sealed class Item( + val isStudentPlan: Boolean, + val start: Instant, + val number: Int?, + ) { + class Lesson(val lesson: Timetable) : + Item(lesson.isStudentPlan, lesson.start, lesson.number) + + class Additional(val additional: TimetableAdditional) : Item(true, additional.start, null) + } + + private fun createItems(fullTimetable: TimetableFull): List { + val showAdditionalLessonsInPlan = prefRepository.showAdditionalLessonsInPlan + val allItems = + fullTimetable.lessons.map(Item::Lesson) + fullTimetable.additional.map(Item::Additional) + .takeIf { showAdditionalLessonsInPlan != NONE }.orEmpty() + + val filteredItems = allItems.filter { + if (prefRepository.showWholeClassPlan == TimetableMode.ONLY_CURRENT_GROUP) { + it.isStudentPlan + } else true + }.sortedWith( + (compareBy { it is Item.Additional } + .takeIf { showAdditionalLessonsInPlan == BELOW } ?: EmptyComparator()) + .thenBy { it.start } + .thenBy { !it.isStudentPlan } + ) var prevNum = when (prefRepository.showTimetableGaps) { BETWEEN_AND_BEFORE_LESSONS -> 0 else -> null } + var prevIsAdditional = false return buildList { filteredItems.forEachIndexed { i, it -> - if (prefRepository.showTimetableGaps != NO_GAPS && prevNum != null && it.number > prevNum!! + 1) { - val emptyLesson = TimetableItem.Empty( - numFrom = prevNum!! + 1, - numTo = it.number - 1 - ) - add(emptyLesson) + if (prefRepository.showTimetableGaps != NO_GAPS) { + if (prevNum != null && it.number != null && it.number > prevNum!! + 1) { + if (!prevIsAdditional) { + // Additional lessons do count as a lesson so don't add empty lessons + // when there is an additional lesson present + val emptyLesson = TimetableItem.Empty( + numFrom = prevNum!! + 1, numTo = it.number - 1 + ) + add(emptyLesson) + } + } + prevNum = it.number + prevIsAdditional = it is Item.Additional } - if (it.isStudentPlan) { - val normalLesson = TimetableItem.Normal( - lesson = it, - showGroupsInPlan = prefRepository.showGroupsInPlan, - timeLeft = filteredItems.getTimeLeftForLesson(it, i), - onClick = ::onTimetableItemSelected, - isLessonNumberVisible = !isEduOne - ) - add(normalLesson) - } else { - val smallLesson = TimetableItem.Small( - lesson = it, - onClick = ::onTimetableItemSelected, - isLessonNumberVisible = !isEduOne - ) - add(smallLesson) + if (it is Item.Lesson) { + if (it.isStudentPlan) { + val normalLesson = TimetableItem.Normal( + lesson = it.lesson, + showGroupsInPlan = prefRepository.showGroupsInPlan, + timeLeft = filteredItems.getTimeLeftForLesson(it.lesson, i), + onClick = ::onTimetableItemSelected, + isLessonNumberVisible = !isEduOne + ) + add(normalLesson) + } else { + val smallLesson = TimetableItem.Small( + lesson = it.lesson, + onClick = ::onTimetableItemSelected, + isLessonNumberVisible = !isEduOne + ) + add(smallLesson) + } + } else if (it is Item.Additional) { + // If the user disabled showing additional lessons, they would've been filtered + // out already, so there's no need to check it again. + add(TimetableItem.Additional(it.additional)) } - - prevNum = it.number } } } - private fun List.getTimeLeftForLesson(lesson: Timetable, index: Int): TimeLeft { + private fun List.getTimeLeftForLesson(lesson: Timetable, index: Int): TimeLeft { val isShowTimeUntil = lesson.isShowTimeUntil(getPreviousLesson(index)) return TimeLeft( until = lesson.until.plusMinutes(1).takeIf { isShowTimeUntil }, @@ -284,11 +319,20 @@ class TimetablePresenter @Inject constructor( ) } - private fun List.getPreviousLesson(position: Int): Instant? { - return filter { it.isStudentPlan } - .getOrNull(position - 1 - filterIndexed { i, item -> i < position && !item.isStudentPlan }.size) + private fun List.getPreviousLesson(position: Int): Instant? { + val lessonAdditionalOffset = filterIndexed { i, item -> + i < position && item is Item.Additional + }.size + val lessonStudentPlanOffset = filterIndexed { i, item -> + i < position && !item.isStudentPlan + }.size + val lessonIndex = position - 1 - lessonAdditionalOffset - lessonStudentPlanOffset + + return filterIsInstance() + .filter { it.isStudentPlan } + .getOrNull(lessonIndex) ?.let { - if (!it.canceled && it.isStudentPlan) it.end + if (!it.lesson.canceled && it.isStudentPlan) it.lesson.end else null } } @@ -341,3 +385,7 @@ class TimetablePresenter @Inject constructor( super.onDetachView() } } + +private class EmptyComparator : Comparator { + override fun compare(o1: T, o2: T) = 0 +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt index faa833c20..bf6be56f6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt @@ -13,7 +13,11 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.timetable.additional.add.AdditionalLessonAddDialog import io.github.wulkanowy.ui.widgets.DividerItemDecoration -import io.github.wulkanowy.utils.* +import io.github.wulkanowy.utils.dpToPx +import io.github.wulkanowy.utils.firstSchoolDayInSchoolYear +import io.github.wulkanowy.utils.getThemeAttrColor +import io.github.wulkanowy.utils.lastSchoolDayInSchoolYear +import io.github.wulkanowy.utils.openMaterialDatePicker import java.time.LocalDate import javax.inject.Inject @@ -132,8 +136,12 @@ class AdditionalLessonsFragment : binding.additionalLessonsNextButton.visibility = if (show) View.VISIBLE else View.INVISIBLE } - override fun showAddAdditionalLessonDialog() { - (activity as? MainActivity)?.showDialogFragment(AdditionalLessonAddDialog.newInstance()) + override fun showAddAdditionalLessonDialog(currentDate: LocalDate) { + (activity as? MainActivity)?.showDialogFragment( + AdditionalLessonAddDialog.newInstance( + currentDate + ) + ) } override fun showDatePickerDialog(selectedDate: LocalDate) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsPresenter.kt index d0a01b38c..16ec9746f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsPresenter.kt @@ -1,14 +1,27 @@ package io.github.wulkanowy.ui.modules.timetable.additional import android.annotation.SuppressLint -import io.github.wulkanowy.data.* import io.github.wulkanowy.data.db.entities.TimetableAdditional +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.onResourceData +import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceNotLoading +import io.github.wulkanowy.data.onResourceSuccess 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.domain.timetable.IsStudentHasLessonsOnWeekendUseCase import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.* +import io.github.wulkanowy.utils.AnalyticsHelper +import io.github.wulkanowy.utils.capitalise +import io.github.wulkanowy.utils.getLastSchoolDayIfHoliday +import io.github.wulkanowy.utils.isHolidays +import io.github.wulkanowy.utils.nextOrSameSchoolDay +import io.github.wulkanowy.utils.nextSchoolDay +import io.github.wulkanowy.utils.previousSchoolDay +import io.github.wulkanowy.utils.toFormattedString import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach @@ -22,11 +35,14 @@ class AdditionalLessonsPresenter @Inject constructor( errorHandler: ErrorHandler, private val semesterRepository: SemesterRepository, private val timetableRepository: TimetableRepository, + private val isStudentHasLessonsOnWeekendUseCase: IsStudentHasLessonsOnWeekendUseCase, private val analytics: AnalyticsHelper ) : BasePresenter(errorHandler, studentRepository) { private var baseDate: LocalDate = LocalDate.now().nextOrSameSchoolDay + private var isWeekendHasLessons: Boolean = false + lateinit var currentDate: LocalDate private set @@ -43,12 +59,18 @@ class AdditionalLessonsPresenter @Inject constructor( } fun onPreviousDay() { - loadData(currentDate.previousSchoolDay) + val date = if (isWeekendHasLessons) { + currentDate.minusDays(1) + } else currentDate.previousSchoolDay + loadData(date) reloadView() } fun onNextDay() { - loadData(currentDate.nextSchoolDay) + val date = if (isWeekendHasLessons) { + currentDate.plusDays(1) + } else currentDate.nextSchoolDay + loadData(date) reloadView() } @@ -57,7 +79,7 @@ class AdditionalLessonsPresenter @Inject constructor( } fun onAdditionalLessonAddButtonClicked() { - view?.showAddAdditionalLessonDialog() + view?.showAddAdditionalLessonDialog(currentDate) } fun onDateSet(year: Int, month: Int, day: Int) { @@ -131,6 +153,8 @@ class AdditionalLessonsPresenter @Inject constructor( flatResourceFlow { val student = studentRepository.getCurrentStudent() val semester = semesterRepository.getCurrentSemester(student) + + isWeekendHasLessons = isStudentHasLessonsOnWeekendUseCase(semester, currentDate) timetableRepository.getTimetable( student = student, semester = semester, diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsView.kt index 76d37b754..291c12172 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsView.kt @@ -36,7 +36,7 @@ interface AdditionalLessonsView : BaseView { fun showDatePickerDialog(selectedDate: LocalDate) - fun showAddAdditionalLessonDialog() + fun showAddAdditionalLessonDialog(currentDate: LocalDate) fun showSuccessMessage() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddDialog.kt index 9a84fb0a2..9470c910f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddDialog.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.timetable.additional.add import android.app.Dialog import android.os.Bundle import android.view.View +import androidx.core.os.bundleOf import androidx.core.widget.doOnTextChanged import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.timepicker.MaterialTimePicker @@ -26,10 +27,12 @@ class AdditionalLessonAddDialog : BaseDialogFragment lateinit var presenter: AdditionalLessonAddPresenter companion object { - fun newInstance() = AdditionalLessonAddDialog() + const val ARGUMENT_KEY = "additional_lesson_default_date" + fun newInstance(defaultDate: LocalDate) = AdditionalLessonAddDialog().apply { + arguments = bundleOf(ARGUMENT_KEY to defaultDate.toEpochDay()) + } } - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return MaterialAlertDialogBuilder(requireContext(), theme) .setView( @@ -40,10 +43,13 @@ class AdditionalLessonAddDialog : BaseDialogFragment override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + arguments?.getLong(ARGUMENT_KEY)?.let(LocalDate::ofEpochDay)?.let { + presenter.onDateSelected(it) + } presenter.onAttachView(this) } - override fun initView() { + override fun initView(selectedDate: LocalDate) { with(binding) { additionalLessonDialogStartEdit.doOnTextChanged { _, _, _, _ -> additionalLessonDialogStart.isErrorEnabled = false @@ -53,6 +59,7 @@ class AdditionalLessonAddDialog : BaseDialogFragment additionalLessonDialogEnd.isErrorEnabled = false additionalLessonDialogEnd.error = null } + additionalLessonDialogDateEdit.setText(selectedDate.toFormattedString()) additionalLessonDialogDateEdit.doOnTextChanged { _, _, _, _ -> additionalLessonDialogDate.isErrorEnabled = false additionalLessonDialogDate.error = null @@ -61,7 +68,6 @@ class AdditionalLessonAddDialog : BaseDialogFragment additionalLessonDialogContent.isErrorEnabled = false additionalLessonDialogContent.error = null } - additionalLessonDialogAdd.setOnClickListener { presenter.onAddAdditionalClicked( start = additionalLessonDialogStartEdit.text?.toString(), diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddPresenter.kt index c207165d3..db59a2ab5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddPresenter.kt @@ -10,9 +10,12 @@ import io.github.wulkanowy.utils.lastSchoolDayInSchoolYear import io.github.wulkanowy.utils.toLocalDate import kotlinx.coroutines.launch import timber.log.Timber -import java.time.* +import java.time.LocalDate +import java.time.LocalTime +import java.time.ZoneId +import java.time.ZonedDateTime import java.time.temporal.ChronoUnit -import java.util.* +import java.util.UUID import javax.inject.Inject class AdditionalLessonAddPresenter @Inject constructor( @@ -30,7 +33,7 @@ class AdditionalLessonAddPresenter @Inject constructor( override fun onAttachView(view: AdditionalLessonAddView) { super.onAttachView(view) - view.initView() + view.initView(selectedDate) Timber.i("AdditionalLesson details view was initialized") } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddView.kt index 0df53815b..8d9678e7b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/add/AdditionalLessonAddView.kt @@ -6,7 +6,7 @@ import java.time.LocalTime interface AdditionalLessonAddView : BaseView { - fun initView() + fun initView(selectedDate: LocalDate) fun closeDialog() diff --git a/app/src/main/res/layout/item_timetable_main_additional.xml b/app/src/main/res/layout/item_timetable_main_additional.xml new file mode 100644 index 000000000..b3aa55d42 --- /dev/null +++ b/app/src/main/res/layout/item_timetable_main_additional.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 2981e1845..2177b25f0 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -22,7 +22,8 @@ 0.33 0.33 true - false + true + below no alphabetic between diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index e87e9854a..ce8773081 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -31,6 +31,7 @@ grade_sorting_mode show_whole_class_plan show_groups_in_plan + show_additional_lessons timetable_show_gaps subjects_without_grades optional_arithmetic_average diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index b588ea5e1..e5020b533 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -152,6 +152,17 @@ before_and_between
+ + Don\'t show + Show inline + Show below regular lessons + + + none + inline + below + + Lucky number Unread messages diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a8e159ec6..8c3825b4d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -195,6 +195,7 @@ Lesson + Additional lesson Room Group Hours @@ -731,6 +732,7 @@ Theme Grades expanding Show groups next to subjects + Show additional lessons Show empty tiles where there\'s no lesson Show chart list in class grades Show subjects without grades diff --git a/app/src/main/res/xml/scheme_preferences_appearance.xml b/app/src/main/res/xml/scheme_preferences_appearance.xml index 1ca4d2048..55f425d99 100644 --- a/app/src/main/res/xml/scheme_preferences_appearance.xml +++ b/app/src/main/res/xml/scheme_preferences_appearance.xml @@ -88,19 +88,18 @@
+ app:key="@string/pref_key_attendance_calculator" + app:title="@string/pref_attendance_calculator_appearance_view"> + app:title="@string/pref_attendance_target" + app:updatesContinuously="true" /> + From e1a19be06c306e26c5dac744a883788dd937b979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 1 May 2024 12:29:41 +0200 Subject: [PATCH 1467/1526] New Crowdin updates (#2530) --- .../main/res/values-cs/preferences_values.xml | 5 ++ app/src/main/res/values-cs/strings.xml | 2 + .../main/res/values-de/preferences_values.xml | 5 ++ app/src/main/res/values-de/strings.xml | 74 ++++++++++--------- .../main/res/values-pl/preferences_values.xml | 5 ++ app/src/main/res/values-pl/strings.xml | 2 + .../main/res/values-ru/preferences_values.xml | 5 ++ app/src/main/res/values-ru/strings.xml | 2 + .../main/res/values-sk/preferences_values.xml | 5 ++ app/src/main/res/values-sk/strings.xml | 2 + .../main/res/values-uk/preferences_values.xml | 5 ++ app/src/main/res/values-uk/strings.xml | 6 +- 12 files changed, 80 insertions(+), 38 deletions(-) diff --git a/app/src/main/res/values-cs/preferences_values.xml b/app/src/main/res/values-cs/preferences_values.xml index 5e488e40c..c9b2258fc 100644 --- a/app/src/main/res/values-cs/preferences_values.xml +++ b/app/src/main/res/values-cs/preferences_values.xml @@ -56,6 +56,11 @@ Pouze mezi lekcemi Před a mezi lekcemi + + Nezobrazovat + Zobrazit v řadě + Zobrazit pod pravidelnými hodinami + Šťastné číslo Nepřečtené zprávy diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 7dfab1872..fe1da1b85 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -198,6 +198,7 @@ Lekce + Další lekce Učebna Skupina Hodiny @@ -747,6 +748,7 @@ Motiv Rozvíjení známek Zobrazit skupiny vedle předmětů + Zobrazit další lekce Zobrazit prázdné dlaždice, kde není žádná lekce Zobrazit seznam grafů v známkách třídy Zobrazit předměty bez známek diff --git a/app/src/main/res/values-de/preferences_values.xml b/app/src/main/res/values-de/preferences_values.xml index 7130cdd47..23828b030 100644 --- a/app/src/main/res/values-de/preferences_values.xml +++ b/app/src/main/res/values-de/preferences_values.xml @@ -56,6 +56,11 @@ Only between lessons Before and between lessons + + Nicht zeigen + Inline anzeigen + Unterhalb der regulären Lektionen anzeigen + Glückszahl Ungelesene Nachrichten diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4945d13ce..7ccae51ae 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -180,6 +180,7 @@ Lektion + Zusätzliche Lektion Klassenzimmer Gruppe Stunden @@ -198,8 +199,8 @@ Wechsel des Lehrers von %1$s zu %2$s Thema von %1$s zu %2$s wechseln - No lesson - No lessons + Keine Lektion + Keine Lektionen Änderung des Zeitplans @@ -244,9 +245,9 @@ Anwesenheitsrechner %1$d Über Ziel direkt am ziel - %1$d under target - %1$d/%2$d presences - No attendances recorded + %1$d Unter Ziel + %1$d/%2$d Präsenzen + Keine Anwesenheit verzeichnet Aus schulischen Gründen abwesend Entschuldigte Abwesenheit Unentschuldigtes Abwesenheit @@ -306,10 +307,10 @@ Weiterleiten Alle auswählen Alle abwählen - Restore from trash + Wiederherstellen aus dem Papierkorb In Papierkorb verschieben Dauerhaft löschen - Message restored successfully + Nachricht erfolgreich wiederhergestellt Nachricht erfolgreich gelöscht schüler Eltern @@ -347,10 +348,10 @@ %1$d ausgewählt Nachrichten gelöscht - Messages restored + Wiederhergestellte Nachrichten Postfach auswählen - Incognito mode is on - Thanks to incognito mode sender is not notified when you read the message + Inkognito-Modus ist aktiviert + Dank des Inkognito-Modus wird der Absender nicht benachrichtigt, wenn Sie die Nachricht lesen Keine Informationen über Eintragen Punkte @@ -647,13 +648,14 @@ Berechnete Durchschnittsoptionen Mittelwertberechnung durch App erzwingen Anwesendheit zeigen - Attendance target - Show subjects without any attendances - Attendance calculator sorting + Anwesenheitsziel + Lektion ohne Anwesenheit anzeigen + Anwesenheitsrechner Sortierung Thema Steigende Sorten Gruppen neben Schulfächen anzeigen - Show empty tiles where there\'s no lesson + Zusätzliche Lektionen anzeigen + Leere Kacheln anzeigen, wenn es keinen Lektionen gibt Liste der Diagramme in Klassenbewertungen anzeigen Schulfächer ohne Noten anzeigen Farbschema der Noten @@ -694,12 +696,12 @@ Wert des Minus Antwort mit Nachrichtenhistorie Arithmetisches Mittel anzeigen, wenn keine Gewichte angegeben sind - Incognito mode - Do not inform about reading the message + Inkognito-Modus + Nicht über das Lesen der Nachricht informieren Unterstützung Datenschutz-Bestimmungen Vereinbarungen - Show consent to data processing + Einwilligung zur Datenverarbeitung zeigen Anzeigen in der App anzeigen Einzelanzeige ansehen, um Projekt zu unterstützen Einwilligung in die Datenverarbeitung @@ -717,8 +719,8 @@ Dashboard Sichtbarkeit der Kacheln Schulbesuch - Attendance calculator - Settings + Anwesenheits-Rechner + Einstellungen Stundenplan Noten Berechneter Durchschnitt @@ -764,37 +766,37 @@ Die Anwendung muss neu gestartet werden, damit die Änderungen gespeichert werden Restart - Authorization has been rejected. The data provided does not match the records in the secretary\'s office. - Invalid PESEL + Die Autorisierung wurde abgelehnt. Die vorgelegten Daten stimmen nicht mit denen des Sekretariats überein. + Ungültig PESEL PESEL - Authorize - Authorization completed successfully - Authorization - Dear Parent,

To authorize and ensure the security of data, we kindly ask you to enter below PESEL number of student %1$s. These details are essential for the proper assignment of access and protection of personal data in accordance with applicable regulations.

After entering the data, it will be verified to ensure that access to the VULCAN system is granted exclusively to authorized individuals. Should you have any doubts or problems, please contact the school diary administrator to clarify the situation.

We maintain the highest standards of personal data protection and ensure that all information provided is secure. Wulkanowy app does not store or process the PESEL number.

We remind you that providing full and accurate data is mandatory and necessary for the use of the VULCAN system.
- Skip for now + Autorisieren Sie + Autorisierung erfolgreich abgeschlossen + Autorisierung + Liebes Elternteil,

Um die Sicherheit der Daten zu gewährleisten, bitten wir Sie, die PESEL-Nummer des Schülers/der Schülerin anzugeben%1$sDiese Angaben sind für die ordnungsgemäße Zuweisung des Zugriffs und den Schutz der personenbezogenen Daten gemäß den geltenden Vorschriften unerlässlich.

Nach der Eingabe der Daten werden diese überprüft, um sicherzustellen, dass nur berechtigte Personen Zugang zum VULCAN-System erhalten. Wenn Sie Zweifel oder Probleme haben, wenden Sie sich bitte an den Administrator des Schülerkalenders, um die Situation zu klären.

Wir halten die höchsten Standards für den Schutz personenbezogener Daten ein und gewährleisten, dass alle bereitgestellten Informationen sicher sind. Die Wulkanowy-App speichert und verarbeitet die PESEL-Nummer nicht.

Wir erinnern Sie daran, dass die Angabe vollständiger und korrekter Daten obligatorisch und notwendig für die Nutzung des VULCAN-Systems ist.
+ Vorerst überspringen - VULCAN\'s website requires verification - Why am I seeing this?\nThe register website from which Wulkanowy downloads data displays the same screen as above, so Wulkanowy must also show it to be able to download data from this website. There\'s no way around it - Verified successfully + VULCAN\'s Website erfordert Überprüfung + Warum sehe ich das?\nDie Website des Registers, von der Wulkanowy Daten herunterlädt, zeigt denselben Bildschirm wie oben an, so dass Wulkanowy ihn ebenfalls anzeigen muss, um Daten von dieser Website herunterladen zu können. Es gibt keinen Ausweg + Erfolgreich verifiziert Keine Internetverbindung Es ist ein Fehler aufgetreten. Überprüfen Sie Ihre Geräteuhr - This account is inactive. Try logging in again + Dieses Konto ist inaktiv. Versuchen Sie, sich erneut anzumelden Registrierungsverbindung fehlgeschlagen. Server können überlastet sein. Bitte versuchen Sie es später noch einmal Das Laden der Daten ist fehlgeschlagen. Bitte versuchen Sie es später noch einmal - Your password has expired or been changed. Please log in again + Ihr Passwort ist abgelaufen oder wurde geändert. Bitte melden Sie sich erneut an Passwortänderung für Registrierung erforderlich Wartung im Gange UONET + Klassenbuch. Versuchen Sie es später noch einmal Unbekannter UONET + Registerfehler. Versuchen Sie es später erneut Unbekannter Anwendungsfehler. Bitte versuchen Sie es später noch einmal - Captcha verification required + Captcha-Verifizierung erforderlich Ein unerwarteter Fehler ist aufgetreten Funktion, die von Ihrer Schule deaktiviert wurde Feature in diesem Modus nicht verfügbar Dieses Feld ist erforderlich - Mute - Unmute - You have muted this user - You have unmuted this user + Stumm + Stummschaltung aufheben + Sie haben diesen Benutzer stummgeschaltet + Sie haben die Stummschaltung dieses Benutzers aufgehoben
diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 4df60b51f..8eafa1cb4 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -56,6 +56,11 @@ Tylko między lekcjami Przed i między lekcjami + + Nie pokazuj + Pokaż razem + Pokaż poniżej zwykłych lekcji + Szczęśliwy numerek Nieprzeczytane wiadomości diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 212e442b9..acb1e601a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -198,6 +198,7 @@ Lekcja + Dodatkowa lekcja Sala Grupa Godziny @@ -747,6 +748,7 @@ Motyw Rozwijanie ocen Pokazuj grupę obok przedmiotu + Pokaż dodatkowe lekcje Pokazuj puste kafelki gdzie nie ma lekcji Pokazuj listę wykresów w ocenach klasy Pokazuj przedmioty bez ocen diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index 8d4bd8d7b..6c7a74aea 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -56,6 +56,11 @@ Only between lessons Before and between lessons + + Don\'t show + Show inline + Show below regular lessons + Счастливый номер Непрочитанные письма diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 87b458adc..3236b70a3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -198,6 +198,7 @@ Урок + Additional lesson Аудитория Группа Часы @@ -747,6 +748,7 @@ Тема Разворачивание оценок Показать группы рядом с темами + Show additional lessons Show empty tiles where there\'s no lesson Показывать диаграммы в оценках класса Показать предметы без оценок diff --git a/app/src/main/res/values-sk/preferences_values.xml b/app/src/main/res/values-sk/preferences_values.xml index d78dd92da..b19caae7a 100644 --- a/app/src/main/res/values-sk/preferences_values.xml +++ b/app/src/main/res/values-sk/preferences_values.xml @@ -56,6 +56,11 @@ Iba medzi lekciami Pred a medzi lekciami + + Don\'t show + Show inline + Show below regular lessons + Šťastné číslo Neprečítané správy diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 9f145efac..4ce141234 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -198,6 +198,7 @@ Lekcia + Ďalšia lekcia Učebňa Skupina Hodiny @@ -747,6 +748,7 @@ Motív Rozvijanie známok Zobraziť skupiny vedľa predmetov + Zobraziť ďalšie lekcie Zobraziť prázdne dlaždice, kde nie je žiadne lekcie Zobraziť zoznam grafov v známkach triedy Zobraziť predmety bez známok diff --git a/app/src/main/res/values-uk/preferences_values.xml b/app/src/main/res/values-uk/preferences_values.xml index c32eedb96..72abe1f70 100644 --- a/app/src/main/res/values-uk/preferences_values.xml +++ b/app/src/main/res/values-uk/preferences_values.xml @@ -56,6 +56,11 @@ Тільки між уроками Перед і між уроками + + Не показувати + Показати у рядку + Показати нижче стандартних уроків + Щасливий номер Непрочитані листи diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f48732c3c..559ed753d 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -198,6 +198,7 @@ Урок + Додатковий урок Аудиторія Група Години @@ -747,6 +748,7 @@ Тема Розгортання оцінок Показувати групи поруч з темами + Показати додаткові уроки Показувати порожні плитки там, де немає уроків Показувати діаграми в оцінках класу Показати предмети без оцінок @@ -811,8 +813,8 @@ Головна Видимість плиток Відвідуваність - Attendance calculator - Settings + Калькулятор відвідуваності + Налаштування Розклад Оцінки Розрахована середня оцінка From 71ab9586acbcb2e7efa36c7fed54231c714ad4db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Wed, 1 May 2024 16:57:31 +0200 Subject: [PATCH 1468/1526] Add admin message to LoginStudentSelect and LoginSymbol (#2531) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikołaj Pich --- .../data/db/entities/AdminMessage.kt | 4 ++ .../wulkanowy/data/enums/MessageType.kt | 2 + .../SafeMessageTypeEnumListSerializer.kt | 27 ++++++++++++++ .../LoginStudentSelectFragment.kt | 15 ++++++++ .../LoginStudentSelectPresenter.kt | 35 +++++++++++++++++- .../studentselect/LoginStudentSelectView.kt | 5 +++ .../login/symbol/LoginSymbolFragment.kt | 16 ++++++++ .../login/symbol/LoginSymbolPresenter.kt | 37 ++++++++++++++++++- .../modules/login/symbol/LoginSymbolView.kt | 5 +++ .../layout/fragment_login_student_select.xml | 14 ++++++- .../main/res/layout/fragment_login_symbol.xml | 14 ++++++- .../LoginStudentSelectPresenterTest.kt | 10 +++++ 12 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/data/serializers/SafeMessageTypeEnumListSerializer.kt diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt index 0c8f1a5d1..a8604c5c1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/AdminMessage.kt @@ -4,6 +4,8 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey import io.github.wulkanowy.data.enums.MessageType +import io.github.wulkanowy.data.serializers.SafeMessageTypeEnumListSerializer +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable @@ -34,6 +36,8 @@ data class AdminMessage( val priority: String, + @SerialName("messageTypes") + @Serializable(with = SafeMessageTypeEnumListSerializer::class) @ColumnInfo(name = "types", defaultValue = "[]") val types: List = emptyList(), diff --git a/app/src/main/java/io/github/wulkanowy/data/enums/MessageType.kt b/app/src/main/java/io/github/wulkanowy/data/enums/MessageType.kt index 531684e4e..ecd8d916f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/enums/MessageType.kt +++ b/app/src/main/java/io/github/wulkanowy/data/enums/MessageType.kt @@ -4,6 +4,8 @@ enum class MessageType { GENERAL_MESSAGE, DASHBOARD_MESSAGE, LOGIN_MESSAGE, + LOGIN_STUDENT_SELECT_MESSAGE, + LOGIN_SYMBOL_MESSAGE, PASS_RESET_MESSAGE, ERROR_OVERRIDE, } diff --git a/app/src/main/java/io/github/wulkanowy/data/serializers/SafeMessageTypeEnumListSerializer.kt b/app/src/main/java/io/github/wulkanowy/data/serializers/SafeMessageTypeEnumListSerializer.kt new file mode 100644 index 000000000..a95eab807 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/data/serializers/SafeMessageTypeEnumListSerializer.kt @@ -0,0 +1,27 @@ +package io.github.wulkanowy.data.serializers + +import io.github.wulkanowy.data.enums.MessageType +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +@OptIn(ExperimentalSerializationApi::class) +object SafeMessageTypeEnumListSerializer : KSerializer> { + + private val serializer = ListSerializer(String.serializer()) + + override val descriptor = serializer.descriptor + + override fun serialize(encoder: Encoder, value: List) { + encoder.encodeNotNullMark() + serializer.serialize(encoder, value.map { it.name }) + } + + override fun deserialize(decoder: Decoder): List = + serializer.deserialize(decoder).mapNotNull { enumName -> + MessageType.entries.find { it.name == enumName } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index 0fe36aa99..4eb602658 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -6,10 +6,12 @@ import androidx.core.os.bundleOf import androidx.core.view.isVisible import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.FragmentLoginStudentSelectBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.dashboard.viewholders.AdminMessageViewHolder import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.support.LoginSupportDialog @@ -111,6 +113,19 @@ class LoginStudentSelectFragment : LoginSupportDialog.newInstance(supportInfo).show(childFragmentManager, "support_dialog") } + override fun showAdminMessage(adminMessage: AdminMessage?) { + AdminMessageViewHolder( + binding = binding.loginStudentSelectAdminMessage, + onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, + onAdminMessageClickListener = presenter::onAdminMessageSelected, + ).bind(adminMessage) + binding.loginStudentSelectAdminMessage.root.isVisible = adminMessage != null + } + + override fun openInternetBrowser(url: String) { + requireContext().openInternetBrowser(url) + } + override fun onDestroyView() { presenter.onDetachView() super.onDestroyView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index c81d353d4..39070cf0a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -2,16 +2,23 @@ package io.github.wulkanowy.ui.modules.login.studentselect import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.dataOrNull +import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.db.entities.StudentWithSemesters +import io.github.wulkanowy.data.enums.MessageType +import io.github.wulkanowy.data.flatResourceFlow import io.github.wulkanowy.data.logResourceStatus import io.github.wulkanowy.data.mappers.mapToStudentWithSemesters +import io.github.wulkanowy.data.onResourceData +import io.github.wulkanowy.data.onResourceError import io.github.wulkanowy.data.pojos.RegisterStudent import io.github.wulkanowy.data.pojos.RegisterSymbol import io.github.wulkanowy.data.pojos.RegisterUnit import io.github.wulkanowy.data.pojos.RegisterUser +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.SchoolsRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.resourceFlow +import io.github.wulkanowy.domain.adminmessage.GetAppropriateAdminMessageUseCase import io.github.wulkanowy.sdk.scrapper.exception.StudentGraduateException import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException import io.github.wulkanowy.services.sync.SyncManager @@ -33,6 +40,8 @@ class LoginStudentSelectPresenter @Inject constructor( private val syncManager: SyncManager, private val analytics: AnalyticsHelper, private val appInfo: AppInfo, + private val preferencesRepository: PreferencesRepository, + private val getAppropriateAdminMessageUseCase: GetAppropriateAdminMessageUseCase ) : BasePresenter(loginErrorHandler, studentRepository) { private var lastError: Throwable? = null @@ -65,6 +74,7 @@ class LoginStudentSelectPresenter @Inject constructor( this.loginData = loginData this.registerUser = registerUser loadData() + loadAdminMessage() } private fun loadData() { @@ -88,7 +98,20 @@ class LoginStudentSelectPresenter @Inject constructor( refreshItems() } } - }.launch() + }.launch("load_data") + } + + private fun loadAdminMessage() { + flatResourceFlow { + getAppropriateAdminMessageUseCase( + scrapperBaseUrl = registerUser.scrapperBaseUrl.orEmpty(), + type = MessageType.LOGIN_STUDENT_SELECT_MESSAGE, + ) + } + .logResourceStatus("load login admin message") + .onResourceData { view?.showAdminMessage(it) } + .onResourceError { view?.showAdminMessage(null) } + .launch("load_admin_message") } private fun getStudentsWithCurrentlyActiveSemesters(): List { @@ -341,4 +364,14 @@ class LoginStudentSelectPresenter @Inject constructor( ) } } + + fun onAdminMessageSelected(url: String?) { + url?.let { view?.openInternetBrowser(it) } + } + + fun onAdminMessageDismissed(adminMessage: AdminMessage) { + preferencesRepository.dismissedAdminMessageIds += adminMessage.id + + view?.showAdminMessage(null) + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt index b69700f17..4d0ef9e92 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.login.studentselect +import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo @@ -25,4 +26,8 @@ interface LoginStudentSelectView : BaseView { fun openDiscordInvite() fun openEmail(supportInfo: LoginSupportInfo) + + fun showAdminMessage(adminMessage: AdminMessage?) + + fun openInternetBrowser(url: String) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt index 23ebffe9d..a813e7c00 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt @@ -9,13 +9,16 @@ import android.view.inputmethod.EditorInfo.IME_NULL import android.widget.ArrayAdapter import androidx.core.os.bundleOf import androidx.core.text.parseAsHtml +import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.databinding.FragmentLoginSymbolBinding import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.dashboard.viewholders.AdminMessageViewHolder import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.support.LoginSupportDialog @@ -179,4 +182,17 @@ class LoginSymbolFragment : override fun openSupportDialog(supportInfo: LoginSupportInfo) { LoginSupportDialog.newInstance(supportInfo).show(childFragmentManager, "support_dialog") } + + override fun showAdminMessage(adminMessage: AdminMessage?) { + AdminMessageViewHolder( + binding = binding.loginSymbolAdminMessage, + onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, + onAdminMessageClickListener = presenter::onAdminMessageSelected, + ).bind(adminMessage) + binding.loginSymbolAdminMessage.root.isVisible = adminMessage != null + } + + override fun openInternetBrowser(url: String) { + requireContext().openInternetBrowser(url) + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index 5c31f14d4..8de2994a7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -2,10 +2,18 @@ package io.github.wulkanowy.ui.modules.login.symbol import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.dataOrNull +import io.github.wulkanowy.data.db.entities.AdminMessage +import io.github.wulkanowy.data.enums.MessageType +import io.github.wulkanowy.data.flatResourceFlow +import io.github.wulkanowy.data.logResourceStatus +import io.github.wulkanowy.data.onResourceData +import io.github.wulkanowy.data.onResourceError import io.github.wulkanowy.data.onResourceNotLoading import io.github.wulkanowy.data.pojos.RegisterUser +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.resourceFlow +import io.github.wulkanowy.domain.adminmessage.GetAppropriateAdminMessageUseCase import io.github.wulkanowy.sdk.scrapper.getNormalizedSymbol import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException import io.github.wulkanowy.ui.base.BasePresenter @@ -21,7 +29,9 @@ import javax.inject.Inject class LoginSymbolPresenter @Inject constructor( studentRepository: StudentRepository, private val loginErrorHandler: LoginErrorHandler, - private val analytics: AnalyticsHelper + private val analytics: AnalyticsHelper, + private val preferencesRepository: PreferencesRepository, + private val getAppropriateAdminMessageUseCase: GetAppropriateAdminMessageUseCase, ) : BasePresenter(loginErrorHandler, studentRepository) { private var lastError: Throwable? = null @@ -43,6 +53,21 @@ class LoginSymbolPresenter @Inject constructor( clearAndFocusSymbol() showSoftKeyboard() } + + loadAdminMessage() + } + + private fun loadAdminMessage() { + flatResourceFlow { + getAppropriateAdminMessageUseCase( + scrapperBaseUrl = loginData.baseUrl, + type = MessageType.LOGIN_SYMBOL_MESSAGE, + ) + } + .logResourceStatus("load login admin message") + .onResourceData { view?.showAdminMessage(it) } + .onResourceError { view?.showAdminMessage(null) } + .launch("load_admin_message") } fun onSymbolTextChanged() { @@ -166,4 +191,14 @@ class LoginSymbolPresenter @Inject constructor( ) ) } + + fun onAdminMessageSelected(url: String?) { + url?.let { view?.openInternetBrowser(it) } + } + + fun onAdminMessageDismissed(adminMessage: AdminMessage) { + preferencesRepository.dismissedAdminMessageIds += adminMessage.id + + view?.showAdminMessage(null) + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt index ace12f780..2fc910242 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.login.symbol +import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.pojos.RegisterUser import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.modules.login.LoginData @@ -44,4 +45,8 @@ interface LoginSymbolView : BaseView { fun openFaqPage() fun openSupportDialog(supportInfo: LoginSupportInfo) + + fun showAdminMessage(adminMessage: AdminMessage?) + + fun openInternetBrowser(url: String) } diff --git a/app/src/main/res/layout/fragment_login_student_select.xml b/app/src/main/res/layout/fragment_login_student_select.xml index 04c808857..6b603c9f0 100644 --- a/app/src/main/res/layout/fragment_login_student_select.xml +++ b/app/src/main/res/layout/fragment_login_student_select.xml @@ -11,6 +11,18 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + + Date: Wed, 1 May 2024 18:50:57 +0200 Subject: [PATCH 1469/1526] Update screenshots (#2533) --- .../play/listings/pl-PL/full-description.txt | 2 +- .../graphics/phone-screenshots/1-start.jpg | Bin 349651 -> 188563 bytes .../pl-PL/graphics/phone-screenshots/2.jpg | Bin 455924 -> 267623 bytes .../phone-screenshots/3-timetable-dialog.jpg | Bin 371438 -> 232165 bytes .../graphics/phone-screenshots/4-exams.jpg | Bin 276565 -> 175412 bytes .../phone-screenshots/5-timetable-widget.jpg | Bin 480600 -> 257241 bytes .../phone-screenshots/6-class-grades.jpg | Bin 354200 -> 208968 bytes .../phone-screenshots/7-account-switcher.jpg | Bin 300110 -> 193797 bytes .../graphics/phone-screenshots/8-themes.jpg | Bin 424342 -> 257099 bytes 9 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/play/listings/pl-PL/full-description.txt b/app/src/main/play/listings/pl-PL/full-description.txt index 7da51da2d..b0193b5d1 100644 --- a/app/src/main/play/listings/pl-PL/full-description.txt +++ b/app/src/main/play/listings/pl-PL/full-description.txt @@ -6,7 +6,7 @@ Wyróżnione cechy i funkcje: - szczęśliwy numerek, - podgląd lekcji dodatkowych i zrealizowanych, - ciemny motyw. -- brak reklam, +- opcjonalne reklam, - tryb offline, - powiadomienia. diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/1-start.jpg b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/1-start.jpg index 0ed20c04dccf9da83e1457c1eb57bec7bbe6a036..19b96d9a6a32df8ad4b497cf9c55e9b519f5e45b 100644 GIT binary patch literal 188563 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�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 edG~SGZ$(*4HtB8aeQM{G?Qd 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[x93~l_96*U-4kNh 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%0A# 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

g!=L@G6 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

6oey@#%Q~EVGHsQW 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

pX* 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 cwIku$70CU1>+yDRo literal 455924 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

dx+% z>SL4qXHGrcsk|yT-KSqPH{34QW{c*kuV!hPM#^tBesu~@{c<$x`u=s*nY#1z z$TVBZ=38jv7~yjf6T!ZXLvIi_>P~iE`6W3|LT8+JK`PT z9bv5h8D9Qp_|K5`OeW*8TVnL@hWhOJ&O5e?@_hTxFopfwPK$50s{8*lxc@s;@}zpz zJBgzXcRw($7w^pDKGP!}ckoWN`3&>($=BvAx+3AHyr^WI&ArXnCv1?}oavM%TzSvu z%1X&^)e|=RoKE@AP^qO`xc|1^!`xZb3^}Zm%_r>ceZre$q_rruFDPnzkJr95pIH_+ zxgPAB6)A4G(BjHTQJ+ZZtO;!))5A_`OiEd-%#biy<)Eee%AKztUc2`1>ACDZ>$V*W z-T5@t!k1OFZvDj_XXY3O-LQ^1r`(kMNnGttU+CjyE5nP_J?tJXUA|#)pnzn}ll4jk z=X73W_nw>|kRvl)YU$QvuT(=`%UB(@J{>!GN}S_@hA&xMPq%%Zu-Io_>&Z%QFUgc% zx3pTJ1P8v1yQwj)PxlM`Fpr;`E_FTNt!(LL^LHO6H%H${+_^8e@Q?s8*oH6u<6-Pv%TwYNXKV{`JPlyjeNUI(QeVNS7PRV*B2ga3A&xgSLc;! zce!PQmYvqI6Fb(Q?_GWH*Pr(mXDt3ROnxC#JyFW6Kk>=6nP>m4-`G3dwk>^zYglxx zQkbKBMNDzhFkA;9b0?T-{AEcyK{^)cAb7> zu`NFJ+Q-|X+g|INE!lB-?V65DOJ-`S#d`c|P-t%tv$^;1!>-5MwCBa9maWO*Bo!5Dls%Qb{BD`K!V;53s;Vg|ZVrywd~BH=^OP#COU*uG zDgAZjmPfqz?oJJ>nSPf&W6dkJtKA*PHfTRheV#MJV^N`p#mbVI!OQ$4OZD1VYft+s zuTd`Ae)xLN&$xp(Bj&X?FR$blI_CM_=QaQK4b=iGkET9a_hdKgo_V`oJv%BKlH%t* zK9FH&*yxUZtQ>Anj$-zCpkubj4Mv1+-}{m8NxjWMO|S~+Y<#uHN| zMPllbPt03tkt^(HcRzjWRZS13bOxPrrApydJGQPW(mlGPNbE(S7u%)FJVs4ZD<|DM z={@gC(u}o%y8JOuruT2Zd#tb7%loFqtJ|sDWgVnK-}7bW#^rzd?(>G{Z}!3?8s%{t z+gE+fvFw`cxqijcoSZ~Ho8K*-S9<30`MxcC~M(?%xp z(owZrY%adP%_{A;WKO1+-*JI*K9B(dUL>;11XWyfUeKEGZ&{m6mr&vR#6ZM^XzdeORTr%%L% zY4@B}uhk4nKhtfR`)#J#EMu>e4$k*Eta&!&Eq!uC=d%6TZME0*&)Pn370ceRUN!z{ zc<7Jjilw|Yt0jYEq6O#F*(enTK2}|^X6;d753iaAE^Yh6ON-YZF)sc1J~J)y4xjNy z=di5Zu32~3%}#vasMgPZTk$!+_Coq~i8;6CG+kRSwxDmtMukPuKB|x3`}A*lsKb}v zv-SHO&yP&!ECT)Krc36_mFdeReiHUhwq{n_er{c9=wG?ich;6iGK11F?kzws_|^;%?=Y zh37!4N@m+1{;l=s+2c*8%hJvs+4Oo}p78HvrL*&Q9?bqKa{ABngd(HaD*HFKuHUrA zy}(>_#U#~@!D==;{SW1`9hCNEoNlN3uIKwiiDk(<-)UxVyz4mg+2qh;C%hWX)S~N` zzg%qS&z$nK&uiMUN%t=7YS(%;O-tFm$d;!gtK?4MA z4r{!^e{LRkk@exl6K~EJ|LNFPJ@tmf`to$&;)o}!WrWicrWq}FJGO1w+LI{<*L@FN z|7m^pe4k3LB$E@t%3kX>cC%gM`61}g!NBQ$Z0@=}`l_zHQx<2nJx%jAogd;p&!f=r z+Pq6ACQT1X@iOfE9M-q_qwUAkaJBn~W0xKIW&c&JX6YGj*DHAiFLoBa{c(FrmVWk) z**DH?54aDHu8CNl*=ha)R1y-2BBIHAo*CvfxSxzZuQJyF$?W_CB~)o~>bWKH&A*gpdF+qe8LxO^$*+kLuTxWE z`3*mn;cki$>g&`=$k-m2S3K8}{=PT>YVfHdrs*+v$Z?-?o`arpcIScvV}!* z(JgLUC0Cr(3>2(U68gKkaBFUK(~_Wt&z3EmT_1RM_w32)+TYcl+`jc~(=6Fm$=%QQ zYJG_N^(DRHe%G^q?&WK?tUGX0(_;VX{DOL)?k(TuS^I@f-oCW8Ewk6-__No4?I*~i{F%!VAeap-;?e^cvYIPJhJ7=7?r;eJUy;rp?>x?at>-YwI0eaG9Dt!g&bGW%HHSx;WoWYg}e zYnk!YKJ(g5<+p3P7kQjH(Zk-seD;aWwGRsqtdhyg3zVKH&7bDGGWE#16dQfsYhk=G z_f95inMXF=>1HvTF5)s(XNpU0PzuAhkCERD_lx{z5L#n*^~$lmr$71`<;DZum-zR;_yd}4fdD^uxd}>ylv-#MuFE3;BqD;*hUu$hn-L@z& zrL=d1O1?!Hz21?!@=hjy%%32m-q z{2j5gW6PUgnrn7V-mm>;7lXRH;QJjsw`XosK2+^zweaY=&6?+5nAr5VY6acN4Y_JQ zQ${D|^r~rBoO@267oRfQMDV8-gT6YrUf#ZHlkVXiMQSe$z1SvQ<}vB_+H*2rRp@eX z*Q2YNK`Aj$%7cXO9#53z=-%>rRc_neQihDPXZ785dry6(Z?D=hXGH0COwB`A|bDDtiDyL|> zu6NbiFK-4)FkgPi^jPH9<7u;Q6~8r}nSHOU$VxBVY3rn%EUtf_c0KEJ+420%?f(3j z_tmoXTCai@d(L-esH~{=%vXLU-u13HXwl5>8%4%Z4^6+lS*dq;cI~>aySLtqiCDkj z%H?}k&u-3KI?Lym&aWBI!*bM%&N+V)MarByHZ z%CC9X?rmK$Ipx`$2|JqA_HTN9YRWlXshj^!mY>meh`gJ9YF=>A>p0z_`6`<(s~@*> z%dO2`m2GjiGyCRMNwEdjcPA^y39icf_;=2=aK$;>)fYx--`Tk~RwwFnl1tme?{R$> zSMXeCFgX0U|DkBtk9~!*YlGR9j(+^3HW0@$AkH_0N0aowVFF_6dgq@Hb|l8kQdb(LY}q!~DQv1r!-HFeIXiBz zU2*BLw|7UNytCJYlqECeSGhU2O_?h9toHU!>u}{VzRBIb_EJU{kKgTCv!8EWT}aEi zbAnYe*G`<@^Pge$Qr>NkI!^5R-ud$B5A`d~H7A#@(Rt~{{XFQ_-r&o69iN}TqrO1Xj$ww5UWkt^`{F{O{I`0kYX5B@W}G{?>`-R94zqOm*ywK#`&+My-r@Kd=0n$GLcG+LlYRwsqgxx9Re){|vlWcfFSScJ9&p zJMTExe>`=^UvSa4=Smy4pV0lg;`l4&<6l-@dg?Rr?zelT$3>RT5NBXuaR297xIC(8 zHPedg(jl9Sk82jcQBOJaUB6aYcH?)?h8XiohkU=D+kMutFVBkC9h{!}q*~aB!GnRd z`Np06Yrnk+U!` zH?FC2@msUkZka}}FPz|0p0LON(w%t+Ruu5Abxt?3lTVMYZG5^#l69Z?M$>=Zq4F0K zp4><)4p&|MEBe^u-=e#whxkwbc4hs-5~jurG6I)kYHyfFH|;u}{xg?(_ z(R)|U3r$LS?Z009xUSw=!Hu^f`8Txgxnm|7{K~VuE3j0VdCHS;&XVn_Mm_dPDd*FF zu-!Va$aD2kbGaGk)|E~>w`Red?Xq)wtS1GoU%Jj*_j|~rg}!Od8iig#oNQaaHLTci z{YbCzQLi=Y%r>muKX+1&^pYpl$|=upnr ztL4>k(xsOF1j82A<9>E3mohI}<*KzRW*A+Q@RSm{)#~@=XeG22D z)LqwOo}Y6nw>n_3=IX60Hg}6>=4rc5+{w68?bZ?{p?3;CAt83lCS`uakH z+#dgkY#%P4n>+OO9Ne&Tnvbc}p*Z!|+eo-ZV2Py2!8S)Voi&mu#Ew zzqNGP-BM0xUd3h7-U%G_{~0d4RQ|hu&3}eZX`8=&V_5Owe)W?cZ<9lt{xf{tvT6Q1 zdy^wY{~5B+`(Hcm+rBfVZ_|H1KB&?RQz<6hAMQIsZhrx`Ng9C1$r41kc`Z@s6v1h*7LZ&#wlJJhy`N-bKj@ zhmH4ajJ(FXb?f7xhl$nwe$T#JUCy`|9HE&P@woS?NVaN3a`FB6swbMgo(XeaEm39L zZk5}KN znp?YiwRx@DbCnb8*2GQDte<%I^s6^JC(SK<9(rNdB%zii+>^P*kFD0-#Qo|`Ro}kP zI-y0MR<8&(P`aJ6dPP&{RIL*_5q)<~PYt~`eerQi?&2NEpG?YvpD;MBQ9r!d=|SZ= z&B<5p=H9%Kw)>pUwz%~dw(nNEcHJ?X=ik}ik#(;MddpsOx|W<;x&8C~wTVB25<~YJ z9zBvcwaiz+Ux0z}I{W*xHCA@pcHa*9F+D-_ZjblGd6!=7bEv=eJFao>1{uruYr}&7 zGi=-3`K@T*&M0rbs^u3lGZHReuFc=8mC~+$Z}~R12??CW$9#6ID0-e1A2`{3?IL5A zEG4BW?a_fHuj)!we%0757Jaryza~-p;{DvKKY1I!)I4il^x5Uh>GjVmCkFO+m4+@arySX<=O}J=TavY3 za?9@R7T-equdDke=0B?JyLhJ1y8ZpFqucE4H-6h3`X$fP*XhoJt=El}-8Te1i*!lg zeNI`4Plj$r0n49<*9aeBZoAX+@Y&IsZ{6(ol>RwWwqNy2b?3i_pLca$FghE(v3A*_ zlOIm*)W3E=?eSOfdsp<%saW@C@8yc>Q)!>Dz{+wHrH$EdNn)oLpIoUMu-JdWjpH@v zPhVaXqpLPI-D15rXraU9&$2q z`sB}g3e)1*uLQIfud(n8sO_D%q-fcyO&@cf9Q-+5QBq$yRK?BOe5Jy!U-Q||f2cVu zd2;(LzbdiVAlG}V>sJLo{c2l(AnA0KwWqz`-jJ?aO1~yn-IoaPl`J!PHQBQ5{7QkB zsh9LK-^#0J;0k6!Yd7U(rj`YzzY?5(wt@0}WE!(&EfAKog^Q+{O;MW&%`Ie1bKa+&lg&4;N~j zd3!VC%&#xGJGH%n++PVyGnw(><+te{1)uu|>RaD=zQS|Y(ut-YPVCWB6DfE9A&|Kz z*|ox^q9W0v=k;r;)%#2nqbJ4m^o7>!X8Tm?tb69nEqM-8wS0aA-3^d%^86O!rQeWJ zFYv3`vU{;_nX%Taz8gy)RXqN?Zu#4s5REfVM8~kwNw~mk2Z^WA!j6g>v@fQ3^sQnENH z1T8AA{dE0sK2PWI9qU{tPqMX-PL0r(I2v;Dtl6!%MR(G(-|UVNJ)E0zN#*{fU)p)P zwm-L}-(bkqe7N_K`NBQEKi)IfzEsy)sdnv_WoNE!^yGEwyK{XvBp&HC%hR2(Ot{Z^ zW2=_Pwq>EWTuq&~tgqZ2c%xum;so^{I3s}i60cdlzq(&*?)Z0s)aIW@i&ikM5MWlS z(kk59eocM-wdjr}PdJi(M(pKmd&#}FGN+55)>K@-wPc^9iD9ShlI?Hy+?}_- z;TZ39(eMqo`Qr9R9M8Mk`eR}Bs-W0f|IQ~rmE}&joLzKxmB-GnuV1;ouH)~~H5XKT za6Uptx7&m4-CxB)v26x!(C^R=lA}JGb^j@)(3z3WBem&AIFhm z_2wnp-K zI^|FHq)kgUdi`!i_sYpR3;lFX?Bkpil)$&YzdE-2`e*f{-)H@~a(hL(;h7J=-ga&+ z-w(TGkJGnYt*lsKc4=SnJrg#jg1RP#_wc0)XW!yb4 zFR>XLUOnA$(_+a&ZswSO_SxraE{|SGdwv9(F z>0{~5P3cbrH4>9P8}|hDYm_seNqG9j)cdTbGq>C+r$ z;Y#t&<2`e~_u3o(@IT_)9J%eO&yCyNp)Yy!w`vz!{S95Hsh#~%d!_WESI2lov}bqR z+O%?JT{mCN&RpNANw>ZFbq{B@Hs=03y5;YO?@jZvpgGkDmQoD)ALt-7B~y6 zH|1^fm10>lschY;g4HqHTzd{joYYvoOljS%E^oC{GsB%Tk1XV4oUAYRF8lLj<_F)| z{*-CxWrxvuP}pDur9lECVMp1z$+^KInjTVE;r)^(z=I#bts@xJxboegiiGdq1e z=~Ok#CZ`6;{>Dd^T_--&x_4GBJNzZ>N5#L_6HXrg&#=0-c)`QGqtiP@!g}wY**7pEUxOTy)Je+b5+HpdAFveu;Ezvz0r^C{5vQtfcuIAKKE!Hf(lKL)GUA!`L*`A(Ba<^%@4mHbxvZ+>B;PImQw~k@GMVq!Qd`AfIm7tD z&7)bRIX9*W%vUx`Jviyij`f0)OU|woy!O~nP@`v0TU`MAHMqfG2J;%>`>Sie+-3jP zkahmK=&1#43miC~E{ZdGG|~G?y#K!!zc{|nNRBy{SMIjX^mN$u{zsFeMJ8U={bQv6 zqNcDZ%{|-f_Ox}^3_lqCXGnfupRM%6r7k`qd8XmAdzW%9s%{id+j?HfW?tQV`30L} zJJk}(L~ByNs{FKLU#0P6+f3KiXY&iSAM))I?aZ;Sj_1&@aL<0o%Fgk&Mq$B2+4U_V zGRj*&G&Q%B?Gp$n=(~Q1i%;;@4@bvC))XpLt8keZmT`e=1JfFY)eKq(2rvZh&$#X% zo@~*RVf@5-L)AC$X9Z8StpBxLtzNr+&%0RXyO;Yd=FM~VoW=iOA~)aOvVhIGu3Po= z&a-khFOeuXab?rH`0bK6dRz9qxLRnbzG>yECG-39dz!vV%iAstx*j+qB_QPC#Pz$j z%}80-Hu*(n;ngLV7CTkDUS70Y_4<0Jm%X>ooZ7nW?#cBbvp@YTcRJ^p`tb2teIDhH z;?w4F?aJ4Fwaz2YYVxZ&dw(;%@KlL*YP9LJeO|HY)tkDTv(BHqWo)XddQolC>uam- ztzY5zS8%_U&xX`5ucsJIyW?@Y{>YTYH~o&^d~oO9wVCG@Pq%h5x>Ba|c-z{N_$PVS zb_$%iGOtrrPh?up?fg@Vl#~Kj{8?r6iR-r2yP~>smg$q`9qh@n)p*)@Xques%8HO5 zyK98}v%jvq8N1Xn_w=8cM^%fVxi{p9t9acf?C9xaT%{q#RWL-$v^nX#=ewId53tUGn^`qiv>;q;!X zldB>Zz0S|k4!af1F@H*wr?+;XuJ6*5+<~fIo`RCo4+*!;wEN6-<$8|bQ+=DqHg@?} z3YT12%CmCSkBrlP+C2g9UVP~Mebr7{KBHfF-@yt4W+es&=F5t0Pu=T`kKRgi*4yx^ z>dRZRPa?NYuRri=ss!`;`}c0A23RCMWodzGyzQ$Deq4JuC28BaFKySi zoyao0(Z6GfTa{n<8YA&{+PgH}b=&xNy_M=-A^j_5rYxIm-~H5^v1jwFyB}TIHdD@X zLd=<@eT%xA&2`G{k|+O6y*p92fUEq;PhqK3dD1;MBFeS&?iWpZ<&wa)`taUg zZ>;a97kf>&Prgvpvt94$?g-6WZo&SirWg9Rq=%dfTl?j!evWC0_?*;CyS}5DDU*$q z71&yxh}omWL)uCGP%Hw5oL5lf0>aG$U2#PR>pGDBE8vmLk4ZZi|- z_6tt;={lAa=Dv2rygS>Jb$OR=wfXMyGc49&!H)2UA0N-&^<(0(w@Z($m$oq%yKu8? z_JL)u&gii*=d1QG3wAp4t=k{7>vPDu1=@~DwirjO3)}fh|kMG{rsH!`A z>dL?5P0u|F=UwzHeDmm6q2f_ZFSDQ~VG?-XAA z(Bb-q{6yb&(~yaqR%`z7T~<8t)EOg=Et0agl-!qf1uQt+bt+OlC{O3N_ge*S-<5mR zY{E=bU6;|WWFL3`XArQe|8xA*{>}%iZ6|AV_XHaFY&Ux9vMwn5{<^nj^5y0Vw@NGb zC9UmF?F)L`V{Eo`=BCogrsuwI5fOZ3(z{+dzFp@v7qvU~q=b}NvUq*Fx!$J9#HMGFXYI7xK15h$#6?1vb&3Q?(lZ{8BXPwK=$*L!!b6mSc+pcVviJH`+sFs%E zlE!c?JMZ)U8Febsi@x{%lkwbez?9AE)#GQ;Jt&|W9TJvIA}-ANzo zw=Po8Vo&NtIiB#`aB}6g1Ivr_S=VW2&)9k`=GODWAC1qCOA23ub~oITzAw%E=YEBAJ{x^G*z z-e%uA>mPpQR=0fe34@#~-)1MDHaBxW;NeqSuMu0n()eG)u}#@q zCr@iv4T*iVwNyp^z>9c=$b9oHQ%b&X6rGd&N&Q2Ou!wQasgK{Q+LfGFtyve{e_^#< zLui9&0&4_g7z06u@zE=uAtvFSeG46r91mFVD0xLdq2Uz`iy5y(WPD1w_|&Xg*@b1D znu$|zUUWy>gzYj>(z#n!=2>hN5@=EA^@_T(SY@fEXQ{EhqCie`+~XM^y}S%VCzp8U z=N$RZpt4P>cyF_6hu_j$If;6gudS8k)!X5x^8BP%_wtbaikn_u>GV|jVz-wg(P~@J z$x~VO&TU6O`mT6+ty!1fq369;TFRv-f4t^peHH$cyFOFCsymkFcjx@Jgo#I%yeKs0 zzp?tdeNXZ}j%}%)7Z&7+U*48_;g`za{KgMQj~!as`fBox)9yKo-;2NcHu?JV)BhYR zH*KqW62H>(d*43!u7v2!x)+u8e}CJ5F755SWUm(SE9x7+xK;nJ(p9xTi=TC|#Q11n ztJxVCt}7q?&v5Tw;y%S_sr6H1DsC-3rk4`9(W&$1LdWgp+&BA^*bXL^-Hg7m<=39= zeCIbji*Po*Y3tl~Hc#94c%99(Tgf|_MR)c$x$l#G>SrnK@ag!G)4a2fZx@vl3%E1q zx9vG@t(Cos%Z1;5)Anx8J}o<8+gX-ZN-5&JM@x^W+%uJAFzf#C;KP#(^CWF5n-^}W zHVZd;^Hy})TiwNzw{v{1-MB&ZP&Zpy;Dnv5(~=yTrF7gLUA=ltsXdf&i_!huwAbeu zyVr}KXX;r$EBZe3b9=7sOXBoD=f@vEzS#R@4%a(A!};3Wnw$qexu(pR6?@X4x4X-6 z+S?+X+uiA6rxyAioG!jAm75{?()$D5$DEHy8(!b>pP}n}N0@%$@!0Zmxtn+NL-xE~ z=UcaIc9qHU7q7B5=;k&Br;3^OS#nCMt}gp#n&Vv>xL7kQJix5{o}GM6;{6znxd(Js zGbgR?dwK20y{$(wHeOvMx^8!Sv&;JQ_>>u;OWKz1jGmS#yh`azt6|Ek>5B7Do_u2Q zN`^V?Z2p7EkDnfx`qXOq;qOP%Bjx4Zzt4HQYW1h3e#he0R$crYvU~Z~XTIydtut+Z z@-0)vGU1!0J1Ht#*aXfcsT>NKI)A-To zRGC@-=8L$zskQicSd3kpbceL4ZvGt35_gM2-@u^*&FlSN0)5&K3LY|&xXVcO= znfxn0R%GVui{$BK*UBz5jty^4ttk7rC-i-kOi&`F9*Ye&*4+w%3N2Zkb1A>nyr2R&?-A-l^|A zM_y~>JP)+a=G%4l)Jmg=nmICUk`=d&-YTkJX^>LOw&Q+f`|*F87f)6db_{rqR%wleFq744DYlYZ({-CKIYX-bgPo3a^^8hl3szjt>)6o7gd_LCp+N${&|N} zd+#MrkN+JfB6`g3Rkr4fhu=O*y+q@@HsI!p?1x`bV@LE37%XQK#?UrMdEP zs@t>UgT1W|r3N2+_iV1r>`mRWIV-o0mOl~jZ}+vnh3gZhEdFG&dijKoJ@cFx(&vB!lCd>kcJBAWl@&R?)jg*tiv6Bo z*^*mseBsKnW%eyj>!(k6R{Al{X~MQU`;$bnmQIu`o4KK&|3sPt=hBCNkDkfzl!>`6 z^=R2PEu-639+uNC?8-AzK7X=I&z;TY_w{GH(z2sPxe7%$1f+SU@t95U^mk^+?my&b zmE|ui=kn=&N^x-dleKTWY$gSUJPasiEBL+Q%f8zwrSDI-Y8^FFHSEat*pd^vHBxYk zW6$&O)TObnI1{}6na@nS&+??*xME}L^GjyovR~hvtdwJ&u;llt(8z=5bvE3%{zaqj z_14lg>01OY{b^hHrCZIlXvvmX8B+~D^JCHs#T|2&KDO^DTbO){`{d6vQMvQQHZFB( zt}X6!^_jF`OE9;S*t5!YqS@|AZZ1KBQbt$2f>+U?dgQ{cCykuhXY?{qB1H zTW#Ji);Vs=4wrAL3;90rzUP-8vJNr}z`@FVS+(QS;{8(5Iwv|6r$Mkm)Q@LXcR(QMehXA0hH`_feFQ-%SZY}Dn*zs=D+d6)sk3UYXUOuPU`g7afHAh!-=dRAJ&VTG{-}_Jd-u4+k zB{teMus`ez{H)wQtL|v(hpPEUK23Pv_UZbxKi41X{@wXgEN+qi6Yk!=!yH%c9oyr& zXshx2sZamSwD0pjDZX0!tTM0ni}j~J`taq--{sc-&#*uJU*5(Izx9|MGU$L-m!au~V0D^FO%w;B?E6kcYRG75Cp* zm+$BEUQ+b+t?I&8l_FO+YOG52+q~|O!49#q@ab!>XuZ4U+dJpy<+%CfDKG66Ciog% zc1WY}QtRyW^ZEPhAHMz1Q1W{I&A!_V)jIWmAK%J!gJojHTAOp8etN6?`i;NNsi$E_s^cS$r-d$-m|NO>VUe|>%PpCjNw?-0dCF&> zVAv?fAN4yqAtvpkbbew&v@~1Mb+M+e&ehz4r$3tON_MZ@{A}sofSyg;b{604dfn-L zs?XayJIK?`Erns?yzj|BMV{Lq-g^AT^@s*z=&@ecmG+eEeb@p;-i zrkzZb-7;lOw{+5_gkCs}ce>AYVK_fccwX|&ZM%fA|C#TUNue%kAH9|x5_Sg3Nz8C5<*w*|jj9JBy z#lkS_R>ZHQkN+9;^pE%O$NtWpoqx&wKg0CIcl$Jr3XQ+%PG6DwS6<`b=W5@zPp5BE z={SD=ME{{5k0npu^V_BTZRw+xpT*b2OGM`9tJ)gAiF4Z7Rp<2eKf@ETmoxj!o<6ZO zlJ!~N`NYBw(k%yj9fdGHp|Tm<<+HlSlDBRB$JKsX;lzW@hAmQmSM@wny=9fM*lTv4 zvX^Q3N|T>Ki~ar8&2JF#|mTsYVy2f_gVcXFKXI4_UFNjm@=2=Ev%-7Bi15eI(trbWOI= z*)ra92W*@#KZ=TYv}LkJ;heH*oBown_lK`mn8+`!SrnOgTu?NKb8_I0)`^T$H-P=j zlKu3)v|(R#;p?OqbLKgQE!SJ=J>#8A;6=?p{zfZmcl-FO_ng`#-L+y@&!xLLy=s4o z3)fu~ZcE@b(TTZNP#jzS@Z{M#r<9uXi@)j~ecM-+65_x4Xi|9OnVGqsC6A}pb*%Z$ zwR57XZ}K#=btjfC=~mwKI>YSR6vmBmQ$D18xME|r?bN(g=WD{wwcXr2%lCHKx2s{^ zQ9?`4tjUgx4tR8N(pJfpEQf7_CM%h0oL<2!AE&radJg-ecdEu|*?Dd$G8K1B*6dAf zdcglo%<}EI*iuREiQ$30;YX%_y>|48$CQf;&DQwEXsD%ZpX93=>#*3y;>&!+J?=Ys z*HlKHntgiD?ZCoCi{%#{G18f)k|upqGELgZcbcVpOyFYo=80P!C+wLWGwb#4@NL15 zUHi7`#(pnhyA2LC1_q|7=hhf`%~3YmdRQxR{~2w=n6|?rizYnWEcaTaHPFac)cf6} z+h#L2ZOL60vhGr~X5{=JhAi`kYtQl3zFAlOa7JAG#%*TjI%nKVDJ;LY{&d8f$5EHM zOiO!aN6(n?ee1=@tDg#9UsK-5JB>@y`)!qRXRTi;L!Jx+0|Va%|GKr`FPF&QVq9%M zCtRyRs*yo$*^Iy5?tixImoxA!e|!9i+4Uv+7jO6;FEUeN=6{B4{l*LZAO1A6pM7h# zd0O0wN$T>S&Hv^|ck;H*k4qn~{4D;kCNX92o~b5hPpnI>Sy}a;L7{b5T5|VJ znT0is*G~PI=ltXi)aMw~d4)-5L96EB63mY`%{d!e^4pTLFelt;s^u3W&)`#O%6uM$ zx~kc^T!kJvCsndMC4ZjT^Y~d&K=te|V~Y^*kG|+WFP9w&&5C%E{{&&#aDho)RfE zJMf>!*&1Q*qt`dJPI|Wg;?|$Gv#Q?ON-+6g+e$&0UVz1&AL56qqY=VPi-0O2wR{EJOR-K%0b|vGDS=KjCyHhyuO)iw`}rHU7cAOIU(Uo-jR5*g)=oTuAR`%RVQ*g_ea@!{#3IYG0P|Hj@HR6 zeEOs>>`0;Qbft?%v$kDxc{C?~b+6QtNwWffiwd`_SCpJN%j49|>X5VhR%%|dW8H9W z%RYyvxmsRN=cE?Bx~sju_ub+f-*VrEEc+F-W;6f3KhwkhOrJa9_wrkX&+kO9+p(@C zcIl3XE3@rdpBsyPyIooxIpdJPc2@38H|`>@&PpL$=VnmcF<;wn_)q+};+N9B&-wKq z{5je8LTt~vOZRX8ocp!^3HRK-!|Yehy-!5`wtxHl_2Q3D^v(9J6wmU1zHj@cgzk)g zFCw7>T5Xr=)o%QXsck+Mx9H!TSM%#)el818dX$)6?%v{mZ{>#@zg;Tke&asaASuAW zAg3J_?Q|#di*rWMwOXEEsw!E5Up%Gy7mCm5Uct;%#aFKXC(t`Jf7ZU(=QeJS|H@rB zz4h4qYqN~Hg{zIXtv|fflq)ZIlhK}Kt1f=^+Z1#wx=_+9+Ud$mA?cji<_`O$%x#`t z7q@Kf{K!4Q@|*vuUelch-EYq_g<95ePJAr;`r8b>TU(F5mOL7lb#aRRg;a}- z%A@NnReot+yTz=2+c^8Ru5q{5*>C4+J6`v=Nw3}T&voYgYmcwGs$N;^b0jZzPRH95 zGd@KJE}Zt;Z_T9IDf68f3Z&{MSlLf770%z%cjG|WQs3mW?whAKKlvKTzBPZ}R6Xmk z9EVA7W<5ROB$7M%gnNajv433q1wMV%C(mU!+_?E?&*t)1ck=93ZC<_PCg0s>KmKMW znwL+UJKfuN;*^zVwKm>?O$(Rw(fL+jptI2 z(?+*yt~LJB3A2hS{mjM9&F6>wr(kdv1TbcB|`7qoq5xB^i6G-JLP(#igl+KXi61S(?ACb<^Y^k1MfDzA}AD*=c6p z7H})ovi7f@ZqLP|F|X&eD{XG|_6+9S>=mwe?9$N}9~QcMO>xOC%=8addVS@9SaLwo z;hx|BPMwYYonz*cl3&Got)C!|(hk8;mVkoMcQ@!HKT6G7q6wCZlnv>c^#CY*Yw)?2dN+P&{5 z$9rq7H(y`WG8_-{ezbPg%AI>VUUKaA?mJ&NuWb6s&obxB_s>77eDqtd?2}hNZm`Vh zH19a9X!nO>$)`vA=KH)#zi|4ggQVI1+fv6xCpNjBEdJxx=67LZ*7BH*x%JVEcOISn zk-0IAO{ddH+InZ6L!^yI|Lwpnwd>~2*I;hFy8FG?yXT)JZq;Wd{5CvWUvkZQ=4#Fp zt2db$-rjz*$XWE7(Q5gLk~{egE=`$t>WY`jeCJOLI{9`#m8XA<@0q#m;<(wnI1j z&n-Cg^_Vf&yi4zlZ_Z22IBOd^^^R59+}UqMrDTgzChMIFo5s0ScT;?>f@4j8+drir z?^bNP)A}fOo9ZW}e#xoxysvj3HeF=#Rat3W)9#f&bZT-fF8cY|EZwpr=VbK0_@u37 zp2nVx);pL_R>#E^s{6lR(>6<&EqHpcU+1*2@X4)V_xyWfZX{0+%JRG}SGeo6)I#1{?jh8c*(@Tb(0d#ijZ!Wboq`$_vTK zGtbJcc3iaRviB2qrETXl7k_2m$&+$!`NEwi?-Z6r*1S4iWt!GgwsYMriQ?66pH~ET z7H-kp+Q@6kxP0g5L%PO=r*-`2McYsODYm4O+3>bhbl#&GPNi+Nou+!4X$6KHKmMAg z-cwX#3BOaNbXn)xjJNYQs|!t8!!z-DO~=h|cj69|&lmqP>HD$lt(jZTZj)^AIJ3&& z)u|WOTq2t1<5MktyF`Ud> zs=NL~-@Vh+>2}UDarKAF>sL*R<`#B@h3DIgt(s)pyk_n8$0C*25isdhO~>>nq(4*D1a1x%ZlF=eeTU zwIBEDf85m3ogq_wB{OH~r*11v`4YSM6MJ z!f@89vYd@SQx!KAwns-*@B7osQOL7vgZ}vrcE#;e%dS86=eF28IV?eX^5koguC4#B zY+TVf!Q<+z*<6h;EA2d;-4nbU&6Q@&`?_PDP3yv`2DKd19?52KoZrVi-Ak z({E><_T^07^pUr8f9bu?%MN$Fn$&MP_ic>N_qZn!drh^k@?Z9i4_CHXx@D=fr%~xv z%e#$}^@88Z`9Cz7p;|BWMa_24W}jF0YBaY;&MOz^xNdcAnrKvx)G4Ezp3c+719Rp@ z8cM0wd-Cb8ocKk7MdHKnyEQw`>|A{2t@)|mxjoOORb>laezErW*0bCd|27|cQ*<>Y z{PN$k8}+y&Rl8p{Yw5Tzy|M4}x;b$x-z-1J()UsB$-mQ&x2-y0xR#%7QMqEJ_|}iP zlFMcH_spD9@y~I}+RJli+;S@9PO7QNV|IHaQ84Aw{ld+K+PT_J4K24n2Yvp}&}=oW zT(_{U_{}`Ob63tdpDvG^aC^o!dHMLX8`gfCDi>D>8SaXhZn3mC*iZ9C`~8)!lHB2y zw;fGhNUpwmo3B0hbq;&Rqt{U%@3yx;-Z@vlD#LtY?4*#R+j@@l9h}AGQ}$FiZ(_~r zPNN?TTp!@=QLGHcruoAA_&!}u{}k+8^t=7_QN3?+%NKU`E6beBUGehC#oL$e#>WPv zeqDJgU{2CM#_f|%_nOHppH;}^&1W*bYKI5Y(eL+uGXG}?y|Vw`x%j6I?6vPF*nf@n z{?G8{>Awhu4~6e*T5s4L$@RYVspOxZ-OAF>XI?&I$Z2K1^p{P1`L|l@i^^5`=^Jl; z+4od#^38XD+tc^GzP$O#R|feAn0uA}GpJV-9-kMVY`Agn^M=DG=B;w+FOE#DejoT; zqWe<7603jaQ?6^S*6=9adaKCj?2UYlj=QPnS{M%NUf=s>$;!DpU;Z-~mK|es*YfV0 zYV)SBvwz#6znx}Z=SfbUOS-Yvboc50cmw$p{Q2DXBYf9l#rmaICq zu_|g!vFzezxlPmB`u3@Y+WMBbom{a&J3C>^5sQGw+a`HQ=W;rE>=I-G3r?xo5pQcmT)H-nwpMO_79K ze&*Jit-Dk@kN-LQ>xp5{+&6Q#*!SwIy3g2~^yARU>iTtFyW*aN8}19)TR*|+uCdY4 zJADEB7+z~%PkdsBb7cz8Cr+Jylj3*%#L30QTXY?>cG;ONnjHIe#;N}7 z)zR6n{xf{r`&7k>8`8aJU|?WhTd%eL;0O1M*M9rS#UK1R`N!j3tn0P6Z2$Hzy*BwL z)AQsF2fzAW`Xp9$`FH(8P{TiL?@F;(@vd>pH}wdD2CDV`GwfFf4OH*)e{$R2JMQ3P z^T2vPQ~&*XH5VPZaSh8zq@Jp=u9Q7Kw|8!CJ?}Z^%dbw|?Vk|wEb_c`xv22YxM|x@ zz7bm){Kl}d;8xjVfvS_Ajoxg#HRYoAhUu41MQ1M1Gnc4*yIr^ZNuF$Ry8Dp}cY3!S zd$Z|mb$MrO^^z;Qo4V%AjqU!?JL~>bqiyGGBF^o7@!sZF_#K;@E0@pq_GXsd{k=T9 z=J3(*9M31~Cf~W!fAvo2p^ZHL-mhwtS1rkXQ!RP^)2>~6y0vafo>MDUy0R|k*t0oN z&!3uo&*WXI5*y*wAk${M;Uo8Y!FL+(>XZxZCq)U##p)|xv02zXrSR72px0+Mv+ZAN z{!ymuVpq7zrMU@?(QqeVH=+YpFAnk8+MxKTX;)|)H44`=UKWyd~}+HJk@X{^|mJ)5t85uH&SDJDF@$tRmj z`$ol=s2|%5`>fAxnHv>sgp51rM zt&{#xJY|;q#9z+&56!RaOsP}zzBWZ%>SEE=$a#s9COx6YC#Q#|dTTGvu{(6Z)9d!D zDHfXy)bj02r)Bql?sofhJ?Z0S{b%f=8*<%qJM7mR?DBf^>T^JjHuucpCvTdseA^V= zKYhE=(qmD1uOg=WgbhClPm3e!hD=S?u=Pb1Mry-_OjB7lk=~r8Lzn~-uzV7AUePM-PWUJ zVaGq5xw8G^lf#FL{etHS=1a>>C@Eh2*sS7-gqY}+%Zb8ymw)*tYH8~B9h#kbRLDx+ zuOW4_f8l=ykB{GG#n~?@jpJRN`G#x9ngtIdzSauqiU*1otd8GWB(1wYQ%lBmc1D%c zobpX+u?tx5Gb9zy`_p^gc+WEX_I4rJ{_K;s=N%qLyPJ5~>dQPh+3J&9_>HRxE!XpX)hPadFAkbsg7ptj;N~*_a`5HF{IEy4lea zPnNHFw0${OZj_^@RfBGZm>_tvlMb<$BSQ*_YMK<{ddcWr=EbKr_ z4KJ%-`_9Mh^V>Tq{ELHd{t=f;F(Oa5=P&nPBX(Np^|QBf#x@gwq;1xl&%=1UB4^U+ zhCl9aCrOASUDu{RSmh_aME}xkzkq9*ofm)Ks*S5YyQ=J?#Ltb1`D)zy zmQmZ4buL}>%(&p;AQ}DP;<<|d46{G%_C4`9&M>nn+b3>On%Fz;iTi>+&C%CCw%lIa zWbx@W9%pyQbef;4@|n5vMQ6LhJg;cg$r((?DrzTw;;t*^pI6-R*MDu#kkr=X za4IQl-Y`2jxiaqZu_bD9wHxQmw)A%VQhqU@F3E#gV`o}qZ^DeD|1xLBg(X|e(+#%! zt#m>!bt~JdS@SkoPkMgCf7+)>w*?owXL<$B{KMCJ<(B|6-<*=hDL;BYO&5QjmhPC| z{n5F9-^&$0f;;XVtKvO&{?yu#S#y?8yuS64)lR;J*OIh!xz(m!Sz>m3`ITEy^O*1N z`z78d&wMtPqrbbRL8bJE)|Z;a+dO~NS}|zF%L;o|l;+I4I6e5h$xG$+bFO|pas13l zd;Z<3b>abRp&ODS6Dv(I;n7b(a@Y~7*67>)3@27tB{?D+>;_GkO z4Gi(}B6jw9yj$0pnq7N*Hri6{Z2QJpv@nK73v@ySE^{OXM2wo--?MsmJbF zw&Yvq7gKw=_GC%DNgY$XH7;Ge(tpZ<6VIM)P+Nj9#=3xT=`#DEH+3=bGHsme{_gnG zcB^FimomB6k0#3tf8P4THn8PcUfR{7b1x>T%h@ZtemMQ1-X-a$?2@+&YceadY>xhj zmxy>jY1{OjRjsAcPra}IWYPU>tP^|U$>}pzr=ITkjC+qSTP4f14Ae8U*wif@B|C1< zR`cdvx~a@oXL?nsap6xxsNB+8 z^6b@>G2Ta}o>bY#ulLEGJ90ieG^(zDTJ=YsrB*h7%fqLCfR{>*DduWI=lb-yK?s@)Wph5DqQ})n$O$6#l7=>!X636i3|*khf_*Se}>uC_C%|G z4NWPzHpMKnSMkQA(D*{uUq4s&YqqMsI6o(o>y1UTs$wip|4Igf=}RI%GJbe??0Ml| znSwpf?V1MkS=*kQAttxe7R&6}HnrrQ;U>eq&Gvg{Jq_MGt?jA%ge`)zCQV(t z$tjv?&DCGQQ){+9JGcBhb#J-ic zytIC3>fK6KJ@?V=GN*Tz*SwMg&$r*}esW)?a(d;tIvlkVy4QQY%KY4uUH*F>J>k(7#eZKEC7Fgxk^0i66x7M?APz*_*fW=|0u@Zz89DUh!~y z=fkOQ&1UXoc@lFw%vMjQSg-Al%ZUl~jGGxMiZ}P{essSuBQB>Ii_y1MSzsuqzQ`c3KR{d>&~(*2VhDb2n=W<$t`xE_6LS_g;#n>YuWyVkXC9dZpB>{MOp} zE66-oe)9RW+ovG2KNoM@U9MH}baH~Bq0Q?aL8G2@{!<@#Hf>7IPELAlxqZ#y_M+V@ zPUh~MsNxm5{8O=tpzd}lrUMUmZJu;z|MPnJpShbVPO7)x`rW(ZS}yDUvdA>e`kiKf z?}bOa4Tx80u ziQ`}7QkNR-EpAD*IA%OE>~_>0|6QxLbv+B#Q&C^NOf4w-z3uE=-K9$}=kLi);GTW< zt@FB>BY{>XTI%n&DZpJ{MHjw z9$mY+Qp04X1hbX{$JsMH=O;v{%WqzNPWN?5uI`i9rdNL0S^YUxu~GZ!-J5P}XHN6Y z`*v>Lu2W{pOwQZbd4r_CY&DqnYo^AD14sDz)>Y;oiP8I}QqSG{c5}Jdsa?g!_kQ13 zf5O+Hb2=}5v&ieqx^H5u9;I}M7{pF^Tsrk+$*s17^C$0#?hX)UuPEL=Vb|=YJ55i% z#UE|HFxxxq-12n?Oxy0Adtuyl=gZr58?{b+bGMJYY4F+SRMD?so+HjDrsN-aD=D3& zw;-iIChqQ2sn5(OH)UO0xyh!R=ji()t};QzZCZJ6Up%-Gb#2p~tvfZhEjT~nv8TGo za*l}?-O{fxcFT)a{5gGNtA$+i<9kzYNbZ|_K5BB}Ntyi-X*=xX=S4ldsFQqT;&Q`k zpMBp}Y+PRK^*uJ`wTYqjzg6=dbgFC*dLUD_>&bDQl52a9nNC~xA@5d1A7|6WjqaU~ zN@^M}Ow@k8dZD7*l{C*Vub?NMm0pFaU;+Q|50y zRdSLuQdJ@KdhaZ6`Nw5VSEAGoctXbf5Lq-n8~e z(eIq;Dvhbp>k3|LocWboq%>*G-Jq%WtHpd5=$|z=+POARY+Bp;L)JM#f!CKUn#5!E z_xFONu)v@VE3TedBwORTcGJ;X(<+Y(hc!KgeT4*EpD3`~pMPia?#=e3!sFBTL^k$6 ziT>QZefzPsCCfv_ zjraIG%UY{C`=h)1BX(KCwX-|l^uC;$EAyQ5q|u&RX5t!eUVYHv>K2%7zrQ`*RQ>*$ zNmI7C`K~$1()ad(@un8VC5qcFOuL<{>73!@so^BxGG(Erl9E@@q!%u6P6}+=KQ=G= z_Ko+E#a&%4{-H&O2D z+N_|B9d937w2HR8So^E`w0Vq)@+#g#dT$-l7H!(bYFb+B8ser9dex~jI+{(3bH#-P zj)^-qJaW&pJGxETJyXNU`-G>b0P|aTyNFB%<2BCrSNHwOYyRzEn*O=#X#jJ80?Vb# z@+-^i_4JR6|5?m(z3xt(bFP*5FKhnNkDk4qKW}|KCOmuR?BLVVi=V3a+5SEKVV}b> zBWuswjz8`P?73=}@}D94V{6w>?abNJSA-kZtkggFfg}1^TE*^(r^IKJPCZ@t%+Buu z4)Ix4j^43iuW#G^qCA!@`y!7VofNq9uBP{Cd&_V7{7w60x9a8xi@5oRS_GF4?B)uRXPXbwusHYeg3-p;}daft3zCGP5$|Q?VB0Ox9oR`#r|ig^Z#=< zIk9B^$!&Gh_BJ2uTl8;E7HGzNQIohZxAiU?rMj>FZO3mZA9=qaj)&m{t^*%+*`8du zHGhK1k9D@&KXS}mD<(Pr(Qd1*S*Jq2y}CH#VbPtreG!ok?OHa`J0_%BWm^;r{4o!` za3|Ak$`_{hNQT$l~0S8DBJtwPSIS;Y&d=WY&^Tv*Fu|&v zZsFIMM|&`3yzIYnSbo}nh7@Pk>vgy5oO6EpLQ+GuRlfnrpaAX=g|J4gZHVNg~3=HeoON0(yS& zE!t`Be12u0Mp>cZmE-KDNRfIxm=Sl3#rje%^_rSKlsPTyiriyeM-4mz1c@qk;S4e{Rb@J?)j?!)c-?`;K?iBWnA_*f3{aCci8q+?AQILF+b=3 zQhJ_TWsn^Avp@XvfFz^z5>Mg&{|trjRHWbgmHTw?GyRx-1{?3I#u^uCub8hf|Im*k zx}S}0VoyBfK4aDObjK$d+3vz$>qhOady{jsd+JRqmF?S->g(U`l-AcQ(~-2@ z6V&;A=F(hEuVB^lQ|gY!PPM%1U-D+j$t+bxl|?VyJpII1KDXI@$FSbA`{p0DOP}Pm zZa+P17`tC8Yx<+P#~(yru{O`I7L{I}8rvjx*c#z(TkoI2f8<$;N^Oq|>Oc5%{-o>$ z-JP!cw*L&bOaIrg^Txd%>Cn6SiW$20+vl(AKR#j4t#2#3zv?ggb?;=8EofQh{qIlU zt1{DHX5X;Mc%}dH*vjuu&(G3OEHv1>d+{Ol_aQ%WY8Tn~{bqe|fTx3j{($t7=8yd( zgPyZzZuLdp6>@p}pW#mZ+MmplC*G>ZazCzh`gG-I_jUaqo${06K6koash?8+u+NaY z=FEBVB1@;we2aGG*|f7K-KlFlf!(i?&xAY|mpZTpForOMGKj(%?kBBktWFf==%{Sw z6EO?>Gc!nR+RfByr&mqey848R>yNZLr%(MeJ)QJGi6!Ue?#X3lIuYBXvMLl6+N&c%Cv>Lb;Fs)!fX7oq> z3;EB$eo$s^?kX7@SizEN68*YTAFjoKi|z?w!V=w`6~S7amepa&(Deo?3fXG_u@n0@2hIe>@Lcw*EW4f zU~|D9k~9@9ZL0p7zi;+}e;0To|2*0m!f=Iy(WK<~tHl1(^_vu%UhmJ{uehyN?XPV6 zt{+Q|9@+D@>iNeriITHtZk5>#noRu9u;V{N^d~msiMRY_i68sb`gG-I_3Pkt6YWzi z7<1&O%RljBiup5VKHBP1)cQ;|H7l!q#!u_u5Nv^t84X~O^BR+SCE&rZ<+gB1!mWG8 z`))^WHoD1rb(PllfWO_xrhW@+RkdBVc&**yws~!-*BAL*35kqqvs0=09{EG;v)0pp ze%F4sJ^H?OJ5Tt&H&Ye%$eF(i-!`?HCpTC2>5QD4+G!zELoX=$shOIHi`~vn%{HAF zVbSb)COmGQvy!{Z@|BvNsy+V3f%|8?xX-(u>Bm0dq{{S3Tl%86Ezh!jSG+XOGjzFE z+c*%0nx(3Yhu`={E2CL!U~RM~-TPsRS-ej4+2|BLRqb6*_%>U&9- zb@{i?UoZanB)&TCs$kjjFY(bg-8jqo-!(&Psel{4uv%*UiuucaL2Ic4hxxD_hlT6_ zda$w9QVW;WgKDWy9tpdi-_AdgJKgg?19)oM&`{nwZs(su&~WVKqGK;6Y0G^!{SmK_ zYzZ2R&Ffzg7d3yX|GN1-I_2LdEt~l^d_}mRU7&sI$ByV{X%WaR>7zSv-A63>T*z}V zxJk!;(C*Tvm6IoCCNphqQq{OW-^j+yQ^RD^l{}BaEhV07cFm7h5BlnUW;ut}*(H1O z+G~4a=BzA8j-Gq+hqAc(Yn9WSGm7fNA3b?&@O=N|^ImapjxEbyQ?l>Sl~zNo?7z1p zf~L$@T*@c-Rlo7dshjl?hc|E1Jr}3{(0Hx-vOT9)ZneJlxHoBa?(uE?xgnw1uNNt# z-&t{f)3tD>sXC8BS9{Gazx7VNovKFD0~V{A^(SBWRcfqv@y4gpIkR84 z-Ji)X_MahUT8Z9_7f~Ts|D1aIM0a&>koHN@ef`DNwN1u$zdyxBe~K$}em6h!`251W zU5|DNmQ8!ywsg%e@i}Lrq;s#nP3h-wx+9{yR6_Tpmg*CauYCL)P!a}z5Tw+TcMrZ( zDD;p2%%6$3nQl*s{+&Oy_}YJlMS5lBi`lQ5d!V)X=U=SNPnA%;WxtCL+U9poG=a7G z_bsZM4PGU?s7aie2UnY)`O4=v?w)$iXAN3)b(iK_v`xwmKeb@WW>2ZBmrukM%a~2O z_M(4B^v=Q$x4WmTjP2YzPquwaQ4PrTRkLc_f7c#9YkPOi?c!a9eC2uSPiMy`oZqzN z>!*o7Jql)3&-LGVduQI9!opRnRxJ&0t?18q@&lxk!PejINQv|&xy-f`Cwh<1arRIK zEziA{=^t!w@Nmo2=tXu9^U75Z=jjD~P!0dkpFjUpT;j4ZumAV_DG}b~pHkI#M1^<7 zT>I+%=fsv+b5U=$DHb>7bG@No*IpX_tk(whv9zC{o3v*Clc;)*1>wca;2N)Qy z>}kDzsxH6%HQ1L3;zQxJn~pm^cVuq)@>cigQV#!MCB0RFle|~X_m5$G22#g-E#Js* zX>;kON>9_JlcPMZD(q?7vMv3#$;9dNmpib-lZzZj>GJB@+r2yQuJv8NVaxgrkLn_~ ze)IXQ?H{ixKcztqoasOY;=s%w&UBwjbBXoXv;6X@G#A&`Gv_-o)Iqvxwpo=^cC>}O z&MZA-oV!$4<#EgWX(kHiw=D8M_#zI;4Gaue`|cMm+plc1*Zrwt5L^6q`xCR%Oa3!} zcLU6r(LZ;6%s-1m#pcGDJCjR1Mf)pf{n4LbIH&JY*@f-ySM+uLPc6Uhe@x8!_sL+N zZ>z6pcfgy*I*_LEDew$X(j5lqemHdRaem~U%`2?>wvFM@5~(TaFTzjePFZ}y)3f|* zpKjKtQsZx`PhVa>dF4~YXQt)zv-3OuGaPU%-({+2|F!1J+RKmEhW^o9vQNHkZ}-%2 z(~Xb3dL?vEO}+42Gjxl{lB<_*OqvonEmPUv@{8TPg?;BgvaWye^!1{tCHZ!{i*qjD z@&4hbm2W0x=6~xCb%?1Wnf8n93_DxIU(7VrEO<%cf{doP# zhg-krdE{xYTe4>BuOpiK-g+$S7TUh5YU0GnJ)82kJ=Ey=of#EUTP68LNon!U)#-PB z{HipQ)RXtObmuQq$+NoteA1ME!X?>9uG&UjyKwVfY^=_m?b|kPj@*&=b*_=iB(Jl! z^DYT|?sBdbh@GS|QBY-<_=JFSPfz!4SGhlRW}2CpoJ>WbZuGX5{$`pvA1~&9tuC7r z@Iwod%8+9Y+KK#v=p$^<-RZi2+s|;@{9j7X)2j?>gG;&{Gym@STT*A!`s(^tm)Mnm z#jkw}Y>Hj{d%;sk7vYMTu;-uI;4VV;EA^NApk0IlgTpww2!HIBxTVDUbo>&Jo9q8T zJihS?)BWv*E9LpN+RgrGc4yDjEg#wL?beKGI&Sv%pK8;`k89UfuS!g;$jyG|>SV~1 zI`hKac`L-yp0K)iOo}P)ekm06defyB*Z;*HxV-ar;Mw`+sd0buc{-gW{=QkO;h6JT zIW)@ZSa+$m*3OWxuh-nUeQsX&pP8pE_Vr8g&HT0J zd=>?FgLk~NvwL^BC1;0Z&4>RCkNI_ev~T~uZSm>i<=@h|#5$(iw0!{C6yFSnj)WUs~DjiJ7Io&d!r&euZY6>r*V&$$Q>c zyzRYnV#1b73KuViA5Y9H^Nnqja{TG3sW-Q3zQ1L$vDUxUv&)Tyc524V4u8twzRhp; zV$ly1BTwv`aX0yRmaCmpoo!LEao*Ilf3CNJ?ylHr_O$HHZSSNtPriq~ zJ*MBvF7mPV@|l?PQ-9Uf-9Nq~f5E5dm}IwU2X92Wg-*zedAqCqh0dmG$+GqCj!735 z`Bfb(I6GNQ#iw0-%W~z@N{1}D9XGBl7QI{TS1IuHjOUIU@AbTb_F5I}H2Y_&_S7pU z&+y)oT=Avr!%X8mUtAOStUPtEck;EmgrnQ*gTF6R?H1eeCcH4VwZrXJ{{AV8rL~@m z&*d&(chT+Xsx$loJ->5`=Fg2XKP(>k=FH@P*WGu_(r!G-i)=Ypx7cvcvBk$X&z0wI z&X>%XD7H1!G{xneT}ZF~2`k8kpnvVAPq zp1STXE(%@MD`WZM{pmkTFU@Pt-Zv%Y{L;tSGAEPGETru0d_vDuhtF<_b6I=RRP+1f z^}?SQ<{i1ZUGnauUj7sOTsGf3LVlF}`LN~0_U7OBInQKVpYU2{cK*8G61R5bw1;$e zm~Z@CJ*&z*I`_)9qKMMVsV~-9G-G zLw4NipK9*5+GUo{zAxV|op*T6mzMAUSL@>zjZb1_qF2++j?KRtf8eCowx^koZtpBL zTYb>tc$aZt@RYTu3M&hqxQiRa<-hb%XT8^xlOtwb7P0NvT;GQDB14%;{W`slR>oh1 zKS>Esx!YoO^}a{y6SJj8uh%LbS@B!bP~o+doWAkPX&Xyjt1dn2J+}6IQ{a5=7`?!? zL60)OnN2ojUTzz5eV639pSQj%p7uSz<8A!m-ZOhbC#Jn^uM!GROncAWviz=7V6LW{ z(UhoL7uThCoM-v5|5*7~zm~_b(^bBi8&z^nyc+!KkJ;l1lBGw@jQdwz6nwk6XWNS2 zNwLvOWnXOUd}?-5NYy9m_X@tH0naTyZEIh&TPmzu=k}fB(@oYo-k%-VTXrt{;9jja z-!9!{tMYtt_xie(U#;$~y~4Nb*3-G>i~j8HEqYewyH{QA?&<40wDZN~p53<%Ggm(} zXWOk!)5Tn*&V*GSFa4-|h`%`F*=FuNo8GfOX1i7P+jx3<%F1s$YtPx%)=s=}&AayV zrpB=D)9jPuZtlEyyrXSWmZ{2>BE7J_pY_XkT1D;Do}Qa<_tEUUb$LcpW>sH$l;6Hp zODcUqsg!Npmm?P|UqzG|d??KSNZ~*=Ms&f7hHgoH*~E-RX~W_wEdqB+*X%W4w3q*~Nq5vTyV+^~maj}riaL4n^!}>dD)02J z%6+`HN^p*DRF5*-Q`-vfBkv*#R!^C&9Uh!&KHK~7ea&Oid#;B?3n#npKle4Q?2@we zTNbHqzPpF73JJe7OwqG16>_Z7nfH=k&2i_{qH~SwKV92h&35N${ggcCuG>2cy~>tv zKI{2**_W3tf3CZ{j$mIW8~su}dROSO;;=m3UhPZD;+nV4w8=?t?Vj6pXL_~vgr!>x zDD+!@>UBdV=7GEH=g3`$t)CtXdE;|CEo7&X=|9yq4y1-a#4LHIJE?Wc zr5fGb&|9}dN_vH3T<>3$pJ1tWUB5Uy{#S1^Z?NN&Kdw4C+MQn4+;Sdj9=zK#x#x;q zIfq+TK)Am4q@LYd<~BcB-r}n+ULqHMqE0@4oyQ}a?u!v;-cFg*_Bt!(iRo`9Jx#&# z%G%s@_NqQtU1Il^c=9VwQ7o7jSuPY&xm;w)t^_T5^WZtd($}GIxHu-{Ow(+uG-$Dv@&yFyAb6zO?>D}aW zcW+#KGIi%E!J^#QuAfg=9t!k)y1#MHJ<6oH+JnZ85?HqQ^ggZjB^%>&e)nd<GDbn^Mm$bDPS;yfms!cMeaF&*~46(>K4;|CG{t{<$-AJ#)8c%4(l)Lsygx_ze%yA}EaNH5IhJY`?$da4tLM#oTl=o} ze;qfPoXdXMaqOF(etNI}^k^*?X|L^Srq@`nhMed>Hc{$Y-^p#M$D+dKoqn@?eb6g+ z&8%6az0v-Amp!?@b1%Et<;+#@CS^@2EXh9B%l*W!=xSB%IjeH37jyW7FBdJW5}XsV z&{X{St(}sZn$f%2wTpeNj`_{@k^GTY%vCOIlCM{>^K|sexc7T(`qfS-dvBboTU=c0 zs{8fCv97+DXZPz0y-uoal-rqIcyGgd?Pz@^|0VG!=N#2#_P%1GTjzhj%3Wk~?zOV{ zTOa1vrd;a#JGsex_oe8?WmY@S*UZ1_H!-69NBxSuM`yYTcJ=8k6q)+&n?a^~+nH4B zlNx_Mi>t-1*u9TuR(isdifh+CGT#@PBcnYeRtAl zWoEuFSDyRDUM{s&zxaGYa+=M;lQS-Cu6v@$YSZ)Yt=r?>rgEC6&SWi*JpDK6op0Gv zpGTcG7vUXC9*rMAZ$(}%Fj%9dvnFfV@w>Y&=AK%;ac-pYqKK1XxmvC@9h*cBomIW< zp1o<2z9xf)&g_Hl-GVY!+b&#VK3}6W@8Zg9b?-Bb-M{}!G+Q+3*KQd<*ZWZp6P2vI zW)?{X+U4##bu;6vM_^gC8q2Z|^PYxPp48(?md-CZ7xHE`@1`>!-b~i5Ty}f%)bIyw zm)E44@g7gIDZOPM^hBy%yX_G4o|1%WkaQC)$ zJe{%5H7QhM)9Q&?wQpS~7pH6$vm@0?rc>>EoElGKLH<} zK1w&JINhHomFN2|=KVBDJ&8y?|4j?u_e|N;!=2~d@@2aA+Kv3V^QN?iXY%VFFA^_OFPh^g8#49L_U+rb z+GAed^j~OI_;gq9WGqav1+aw%~OhUGOFsRFbJ}`+BP)vq zyE&w$Tb};Jeecyeku6TMK53ucGof87ypngh$DdBUhMauO8)mF})v^lql^ ziKV}yU2m?_Nx%JEvsTf?6`1` zANOYzS-i^0d#7@!GkE)^Td!BKEL#H<9T*n(Uw;lf3G~77xHOioZZ9IxsT$jpQwI){gfe8PImTw^-FQGHR}$3>z#6A zwt4gR>cirDyVH}E?$rh^mY+N)DKI?YOJ}g!(z0*ok0++BPw^E`KlwyKrM#(a-=0H% z?7#LoPPq|z^U3a__lCE=O?s#9w{iBJC+7a)K_)>tDyM56iSp{COM2>W@ZI6&;+Dp6 zyuUlmafhYt$?CuI$N$WGG}A`-@wD($KCfI==k^w!J@0u+IxD7B@$cXsYcoTOxpN>)PIQ22-u5{6-SC>{bPc72iuqXEQ%*nY%cQ(cTyZ&u9 z`w@vvb-@Am=WJQ%FYTe0=BDxh3zd*X-k=3?vw7AoJhZv=u&w6{%gDJzXwG6{>@Lh-*=q%foW#e z)$Bi&r{+!!JG->mG$__b_V~>z-{_*?c-1H0gfC|2dg+}ku~#f%woc%JLad)*$>34Paj0^KV zNvn8%WjMFp@blm9RX^6A;O$+h9iF|Z;B4rO6p5O!)z@<#hkgC3zw7Gc(hTRWO|ix< zJ6q*9EvmTjM#`t>#DN3L*(;=v>?{BHYH|Man%Q@L3s19*@vg4y+)HXUhDd6P0)@{ZayAgWqW8OP{xt)cL+n_fm8>v*G0`9szab$0v&ts&}BH!e1tJkmOD_H(&QKok3aR@IjLNlf0qXR68hti4V9nWW!Hox(E13 zK3xjB)}mI{zwn6n4}0TJ?m66ff%$Lug`SW8*Rk{Fy&n0HyGj?L>htYm<@*(@w!RG% z&#HI*x_3&#^o)NmEX)7?wEtYn+j6O1?I!5VV5wi7zw*K7Uv+WB@EG7Y5YXcGZ1$|o zx4Dw*=H`9P&3VnXDqG<8w6MOzU2oc6ufAP*EHdWhs+?IF)3&JG2^5?uKBXpR_V&DR zp`ya>lIXi)PajuL3~ue0*>gH#^3J?7dUtzdPi|Yts;TnaY;u<2dXZVa7p>G1RtsH| zlae!)Sm(I&`da<1b&rmH^89hkJ5lOYe@y-@%PkXcX_Wo+Ez>Wpjx1$-;`Q$Fsm)1I zCj(>pZ#iz*c3JH4gHPc>Yy5-C)RO~S?xg%!ocAZD+*0F|=i1#elkZ$R6>wiSc~-4@ zEvIQtooC<5{#BpS{7mw1G;c3A_S`MK_G9!$>u+!U?p*Fo=N8_!(&EmN9arXBKlI(Q zZ5!k1e-Q;@*DG!n#d~MW;(9YZ`pxc_`|igj>sw~}M{4s;pCtY1&Sd$`IXhl=t>oV< zc4(RZ;_}?J$7a8LV)N#YU*h?v-ZO*FUM@^nn)hVB$l|T)?7Ca;dxb95@NVnevd(T= z%*sGNWCpN_1K-= z94VWk|9+9+vO988<^FZ+tV*eG%kw9iWUe^%RCRjMZrxiUd7>Y-Zu8!@vF)YT+`8^N zy^BkxPcpXE{x!K<``U&pYd-xG?k+xaZr0QtPc$xW@u5Oy9;SciI?t=zW+`4e=l7?* zRZrHQbu+ywactFut$A8zZx3y0-EmAi$)J0GZdS$B#|IagyIq)b&U9`0zs~vVG>o;w zx#X|4@5^XaCwyjS-d zEz`Lk6TJ27#G9{PFS#`#Z^vns+Q(;?Ms7FxoW`%6;BNFK_VwjiJ-SYTk7w7ev^#q1 zkFM@psl6BC-QQ)sK5usS=~=TkC1=gW#h(6|^QJpI&des!%k9acsp@8bZd|pKIG0;+ z$TxQF>yv-9d*|fsdQ$edU0ZPN!XsMmo<7`^>Q=5aaoSzy-nU^p)|z}tJFGUlQqw^A z?vmT8LifT`r|5d_$eQ)ctb4I{(y&DStCzrKH7fhwD0{lHutSRT0C94 zl*#$eH%=`!%6U27a!W z^V3r9KF_TS_>(*Hi^jHnrK#_hmKW-FZ*R`NZ7Ci5GVX(dK#A#V7noewKVQ&9%ls{otkt`FcykeLL+8Kfcddu*7N7 znPt4WkHl6+aXu4!oVG;!MC$dG5@#y670%asCDiO^_j&j3{A0#3wsIfeKQ8?~`EAOf zvUmR(IyT6v%!!qA-IbGRyG&w_)gHqg>?i!hU;I6|+mJQ#&7E8GRi;k$|MlkSjGLYl zV`n|tGNEV1t4~ocLhp9Xy7BUj;uNV}W#?C}UU}@!{F5@vSAV*vw|M34N9T4+TH1Xp zytQ0oy{V__M!oZryY5Z=HzjU@t<~$a-6!`S)iO>36mLidtX9&JKGlam>a`uglQ;K##!>-KQdv`#H?jIdaQH&rN;8w)3pn zKIw@rD>nB#ZrSjxsC`;nu}zR|d%0rp$J{xj%)w)uLeT5M@+>mASJ z)!#17-90(>IqN&kL%!ym1%bIiUQd3k_RV&zX#SB`ENtTZ(d3!w#Hg%4_tm}m_cIGm zPBzPFOOIMP?XH?steLM_lFi)Z(yJ>b-wN_*&A0Q+w7I*uSj;zUF6Zvx=_%6r*&@avul z`Brs~@_D7%a~}mie0Hnb=xFI{)1R^~m(S^co|Bf#%94{Cm})n>OziC@l|7$jANw56 zJ$^0amdK(rmb+svZ}}H->eSA%+r4)xkKI+7FSA@+V#UR`_rtCoS#|G7cK_n--j%0k z|9ZaQg~bfXY3~zWOI-hS=gpn|y}3#EdT(#qdsOu9mbE+FjFv1dJa#8|$|N26Hg}1o zrVqVWn=CtDYNxD{~oiRU8V6&FF1QjsM2iqrNHND&Xgadb~t9t5g%+t-gy{)bOrSnzpa9f?NdF4+_ zo2UO+Z*;Uf_Ur1(i0gU}Z?tyzl`WgQdt>j5v#MH0cWCC`aK6uAV;$&pHTrhqz2vH| zb9+5c`0N%~bnd;vh4t3!jx4wsv`kfmr|+cJ-cJA9lYUKUo8zQn^>|f$ZfsTZUbSPF zA2&{&SteHdQ|9C$<4OHeO+A^S>d#fTzPtB2YO?;%=IogJ)w50HVh^6W60dvz>7APH z9ov?cCY@Ib&nt|bJEP`RxS6ZE${nReiw~`g?O70Y_141UT5lFanw>hiJ)9|}vLo}b zr_Sucz&nK+kqb`zl6QVl>vEWT!p?0%LEZ;mRqmeHJ+v87-BI_Es*$)_^;m#)3P=1#EQe}?Re3Fo{PXP&p;P|&^bk1|7z$vxr7dFKv% ze6@DzBmJ{HkE2p{+_U?8ZCkbWs?|&82P*B7nG&e!a<)q_=Cqp6B(cjU->7uDEMN;Z zsIz&!*7f+8kM{#FZtO_7I>Yy!vOBN-$!VX&%h`&Jb>HTsSiE`doh{Az&TG2r)s@%h z7kU|gnkXRA`$6-@jAOz}w(S=zww9Q&?Bm7g!-<@(In zrlKA7Gw_M-5?x)P$U--d2`5+ZF_)%@$jtw^`B9(YDxJlt8!eWuE1I)DFU7=2deh=# z&rX#c3NG2Kt9|W{)0{IWuNKPWT)%4cTv|&hT3=P6cAiq6+4*ksR_F5;w{^B=Pt`ph zSIBE}%j@F)l*fHi0Zp%;=q-!&InjM8g<)Myp7}9eN7@5C#^XTOhgPM6?QZ_Un$ zipl=7@R{P%((p|=PeZTk`E&@X*hihwcwI6f-(yPb{Y>3G%MQ${*3Y~6qxwTK=c#RZ zqBC-4@tUqPwcCA8>+2t`>S`u0t&9!b+{+i=j}8fwvpKqG@=NZ*f2Sl%`WH?QVBx$K zCo98y_t!jsqaEkxo_^Hlo!m0-^wL{V&9>jQ+kt*S+HRd zmsz^3`(p2zVV^GQ?#Pk*=o<&UiZ} z{V2WW9rVz5Nw#WgZ>HZ@Z?T@ThaQuzPGxzvOELXci21J4cULd)yFFXF`sAK!lV|#s zyt}1jmbdL(W?mchpCPzE)jPj0_s2B@6@{MNIbMBfQ^i*#@Ko*1-uUp<%YE#+_7kmV zo_h9K>XVwoYay?_HZ~JAt#ixLelEEGu5+26?)vEd24&*+QN= z>CzqFjjaU|%C9oBbdpq5_Bt`t+?lj%`D5|k>2l`JF3spE z4#~Gw&0qQY^K4TQpS;54~zhv&` zwHy3cbMH9ic?Vk?+$|N2VB2-{wfd0_drmyRd*|ATiB`MTX`eegH99s_^!c>k8Nq4q zOD<~fsa&#xv-i;1@cflKYLBlCoay*3zp&T7GdNY$=u&owwWY~hj~&aWwO4(c&gOGm zdDrA`wgIWn7_vnd7_R&-{W|(b_~~Y)Sh2+)4Q}p!uj4#-@|vluw$9Ug=Ik8us^{eX zlk1e!oCGGl@I9M<^47~M+*2P-Ev`In`~94*b+5ymEBb=H;m4)t_}_XerMz)o@@|d| zcOFGQYgztpXJIJEEic~qN$Vn2V>vSo*iQY};^WjN#hn#+}zYgnQrL3ww1=;PITc_0RfBi>F3D z`?>Afanqm6C01`ep*j0tW~R=SHzy^oCVx_KeShtCu1$_m(9~@$We(HqxFYA}E-&u$ z{h(g(SZM3D{Pmm6zUN7=Pmgfk`rWwe`H6K!zhzhL?o@KgKGiinM=RBJ!l^snD>g=5 zy;!?%K}fYHNAZ28!jsztrc1|*6fM!^_SEHeT2ZbPGF8BIgyV*r-}}O} zgeGN&nEz^=vnKq#L-^kXlj;s$Vvyl)ntt!rYR~`{e@R=^NO-P-+UJ-FXcV=e)+`JdrIa6mb_VVqT>YPMtAXw z+sDu8JltOOzVE8f#Yf+6>a00-Z=+@Ix|ommZaOtaD`hRc8+F^a=k~>{nVx3e-Yyx& zO0UwdaH8y%0#yc=SNHytGr9BSuAIvI*z|2bmfTI=SvJ*g`|9R@exx8V%;2G*8d@6Z%g$@Gw5ZDC2XS+cKFR61ZhAs|&*#{3 zu2Z63MLo$Z+N{Yx?(V&^)9`WNm0Mc-?u9JB7sa{6F*ozAMQ(%AbQ|OM0ut{({%4r> zJHDmjz1)I=^VZ8xDyIGLyL!Bgaevp{=nKL7o9+c&UAeMw<8JeaEKR$%JDF2GO;&0+ zcfV!aaP7g}Ra?h=*HTw;3mrDJOSjOKHd8#?O`SI6lm&EmIqYG{~T$z65RJ6~m ze}{P8rgJc=>`^H8`Oo0|DS1ka+MOR#CRe{jo5swzUbXoyk51QSVK-kz-KP@gj7wR6 z7V5p`o8_AP#-`mmZHAEbk;y9xI(WOFiyzq|)c1$|ez}YPEyLCM=d`Cf@H#XIJNx`w zCh=$clL-e)&u_aw;kMr7e|?AV)&wOb*_G`r{_&Xe%$>8#p7vf;3A25c4chZsWbJv| z>8^aho~`y;^JDELBHq7O^)#E)QTwNQPH+iIeIj7E^W!RY zziBC1b?%Fo{^Smt_UhVF$$6ryzWisH`n6_fdi+N1%Hq-~YyHB0%+H?G?YaHd%kWz_ zH_vH)S${omUeVump_jf|TkhH4D=IBk{Bcd%YQeZ`X6aQzJ2{S*Bp!RnGN~nLlFPKm z{QMQ~5ASiSlRW;mG``hw*R(T#Cfz()CO$JP*v{JROlG89V7XT5)s;sxz0{(j?;e)j zI@@=_wauZgU7p^RpI&&+Y;tN;%iNS#Pc`k1YkKaqD$}}{yXe-5)2nP#UYSRhc2`{w z_^Lhg`WweXXSYg3ZA{|57PvX-N@CW1;pHMzDxQ0M^!#vaqIB91qYu`3Z({y4WTo9u zt2H*fxifWN?sV_&rf|8!NoRz~Ho8k1aop?hXF>B|#i zrsPJ&82A-$dTuuDr{_-FxAV>hKDc_|ukPjzwtE{MR6gN(9Q|a%r#(TXZTD_`4@io2 za6ZxVXVq$-w$PeyLDR3e-9EdL>-AH`bL@VV;l5|Lu1Jd7wQ0>+FWtL4Rc3uyt~P&F z&FB1O{c%6Y8KUY_nE}Jo;leX>s?*<&Ua4+?U%1Jl{9Dn5A<5@?X7gt-~HZnB2~@ zu?fK!HUjMmXmB|6WT`L?4g8OgtP0xI^>(Y0vvmeWEP4Bq%=FfAD z8#+nFi|1$Qw(|OZ`Mydy;!yaee#IQCFQpT8mnx=s>6ClFe6F2oIq}@aq;R9PyAIx+ zv#!AIxTw0z_2k9bRkwWR{C?Scecr-PZ~ui{-D)i{OD-g)NcX{`8%HVy>u!nXMK$fz z@Gg0(c7m-z`b%Upi;b_nUjaR_{Nj{^D2lFHhGXt7$W)Kik8^bI;6lL4!NhimgkGGbE4ZIeO}woP4uh#r4L#$?p~#e%g7>KgHnA)R)=su3c$a z*=)DM$Z%5Pr+pKf7sWh%li`~=J><%w=jvK9-|kh{cx`=CZOsupiQv@qJlIvIP^ZVEK{p!2_3>LGlFF(Fy(%qGr^S`ID-{5I3?C;)H-w}0UD_{Te z9g7d1R^EN8i}#*)<y~I_j}hyJldLewc~qPa6s(c z8HYq;{MJpa-QDs2q(8TxMA35duyZ%1ZXKGRy07i_=JQ*(MNY`xGwmnOrj9q&3nuoS z?dE&stfQ#m)5){Wzii5aJ0?q2!fLZ8R_4c^`u;6`=)Si@AoPF@9+O0TMm)}11tNu;68}-^n=h5e9E46R=+3Z-G z6uCWLT1;rE#qVyz7FCmNns**g3C_}0d#&_s-{Nbt&ok}2CSA_G=!OKJudLv^jdQvb zy&83973#a!ZdLU?*=i@#qI%*}@{TJV@0Luvb!m~Zc+X#Z?vNw%_!ee~Z&cg!;$*0O z*Q|T97W-$V6rPH?f96l;`p2LB)t{$i{yEsKb!&fGjB#(MRP|#GPqXEmE1e4SjJo~W zEWRFZs&AjR|x6-gZ@yq2Y2AdX7<*AIBBAYBdUEM-GYQ33X-#pGxY1K3PX8)U5bADmm1tZgL ziD^Z;JL2|scJ}v9F4EI8^833&dqR=#wXnH6b8lRn`tB{u{gNq@qE*UMS_D-!9o08^ zda5r}>9lit`AqVusOF8Vc#$1DZm(G#A9DE3dZv25&P}P_6W4vSx<6Ad=K7WB{aK1y z6V1FYJ<-%~^P93ztM;p;O7|jQcoTK{xq9G@wZFZ7Wqx>g-=JvYjpcVv zJFoo~wB*Z+t%85E_Uv8y+A`wi%#TynKZ<$0?aEV;r4f5qnk?O>oxJ|A=1=xDHD53L za>qQ~7rZ~|+SD@<-O^^}hHvgod8=`^DPZmiudw;NujiF+7Z018E$V5f-x3AtQ$VnL zoqu7re=&2!>VSNy?%8`}BYFM&3RY~YzT;KD?MuguuJ3!d9Z$P{W3ukD;R|{9O+WB&8x$%t%=)L8 zf3aHb*_m$Y;dizy_p(;oIy-mCwZ#Uy{~0v@*j1c9v!`F+)b@R*Q{rMCTq)b}&FU*# z?evFlj;+}_SLj%Ek#cg`)-%49MGMU`3$LuqP%`qIDA{0_XZ53?;BvR5RB^2R(wDD` zk3F^)?0K)cW$)QfF9PQ~ntjsNGrDbEzDn$M>=NA*Er(awY7Jni3z|`-b=I76$>R&Q#)pP8_AQ$>qwl16=JlAMIh9vu&8vO7 z^0>%$k);v>!8JbuKP;Yb^Y6S%r?(zGrawQ0yY$X-m8&<``L9!X+HZF|*IrqM5eLVZLJu&F(SJB&* zaSms>CC=QqzEQqcSum@r@Mh7JbM6{l&J(YEl)99%ZiT;t?Ycr`7t52+DqHqAUcMjr zA^G~+r>d1Dp--JM%FLI@nFQ}$5c)D~-;TI>g@3g#^zVH8jiZC{F>_~B*!Ica=N#)1|jQ?P)xvURdFCFv%uuqw4uEYq_ZCbs2q5%9BsMNXz;(gK6WvJvEnW zrXNVpmVMlC@r{mA@!8W_x7+5rbiEc6+Ty-#$<~%P(NWeFCrUkCX7n37oOfd4gw$AXy`9(I@?&fNF?Gkrg)5AS~Z^=CF6K8{`zpR~c z^~oH5>sGnV>aG1LWHt=XOU%oiw?4a=ztD;qdXom)Lhb?z9T}KKaLdgPhEKnR^ytqQ>zTVz*Cy!V|Eu=X`IikWZ$> zEqF)RV|f5Pi0S@`!+MJ-`jkz^7c2sYu9TqKYe_!;o6>rD?7GLx?;Mm zRO&wipSH;4T^+eSxcc|%lfgO9%ATJu^?WZAo~Y)j*W%*9!91Ztt)l+P z_n&OO`3-N>*KVq5`mDaabnf}hNt?dzbIsO!cJW!V`$_2}W54rr9!A za#GP-St)R)AcGoucbdugg`7&JopDO_eC;b+wof&;{%jU@@TPwB(@Hjvv(tQbmIqH& z+oXHvXHTH3r6kMZFBP4c^SV6CsuXP*9u}Pw$&lGS=|{WXlYl2C(XaU$#a5Zcccw+^ z865o@67fl4*=D1KD>nAKPdi+-%4?z3%riE5F5bBsXLUB;U}}2uzU{rJW&OOXIddO& zr%tboHPaR5ZPe;cN}DmoCD3WhrX78Ur`~vbv_^f2TIuFf=2MyrJ&io)yG#@i`|bV1 z{ljdBw?4+j*)iG{YtI`xWG2Wq9t2X3Sq}F8r{CcfzRiaEMuS|-|&GhP- z5_h8GfKbr#jwq+alW&R}NH5+qcW;r6=N#ETUAMJQ=)BU}xGXu`#Yd)GY^rU=U!kdT zTP7_}KJMK0e!g+w>~m5LyREZBA4>0!dbVqF$`#pn+#3vk-nix)GPCIQy~)wGvQt;- zwy-Zgw|=hVm8I9@Q;%4kKH+sCWy!<_&9~+Yw;t=hT=A^sQ1%+tY?-iWb>_jYGh!mr z*8QHhX`<;*kuot!+(J%Q_kxEzi%v_j`W(x@J+t(lMX>6eR)y7*l!-C(bnH;{X8gZ(sbnBANu(04|{G9412-MGn3rAt22rY$W^2dae5A2mOmzzO(48XMa}b@wPGd zl?Kj$kTZ3k=!flHrS#VS#lG#EdW7D}-(}Z>TobTx!z}+N zx53v0#0T2@e)Wf36VTWudza?7H)8V^s@R|#_p`U^pS8Jb;T5f;0k1@pR+MsW46$mB zSS9PUCX{bsm{xnhYEkDEp=2nq^|ns}Mdzx`E4Mm#OslJ(`BQlp@3cG1y6bc5j-HSH z*ReAqKe72$Z;7IcK2+AVqbaTbsx?Cd~C*qvL1IL<;C=W!OO zflgx{)+-U)X8!dt{F#5!HZx--DKC{zOyRHhJ68y;?8yPce z;nOQMSLb%FlHcpJ<{1^^&c>Y`*LATBjIZKP&42Ji`Niw%es58;>HNQReM@d@vbkPe z5jbzsmPx&_BAYU~-d%iRY^uG;qvOo^gvzwya0-gsD}Hc$skZEATi^MQ^Y^UgsS55f@(iA|KuZ0%lc%TM zs+d%r6FohGE_`2GX``0n2J zttji1Die#FDmZcK+eS&r5+kDtn~aR?H6mqBNc z9ma9M0F4tKn(^4qAWMHaA9UK`pD8`kF`z^0Homln98#yI{`d5C`@Uqhv!FSJxffO3 z>>=l97L{)*fgHx+erh^64gS>1tezO-0zXPB>7BbqT;i3mwZ~^XcpKdSy4M)ZB?P!} zwZ2P?Y*(u08>NT#9W||rJ^gm(!lMga;yQWl%H>Ky>`Zuhy*M@W z*{$gNN8AL@&Uv}KXzx7EKi>nUZ{0TUYJA`HM%^!~^3z@|OUakIzGK_oRjz54QAdK` z33L{7%BG$#RZCmGWY<#Nqbt4a<^>zSS*ns&J4texp6;9ojVRBG_-xbq8Kr;y<4;X< zTUZnnnrHaq#(Jjc{SR}OtU9Hx_A~rn%05f(rJEVg+&Qs)R>bwo+wE@M%89zQ>%{5# z$;p=A79DD4Q-AVl>FG(ICY-6bcq7+4>PpI#B|T?;aZjCb%GXVEr@71Y%$8T?xe-0< z?@vig6D*pt-J)Gne z5f$**qgGaAQc%z$&*?$RuUxesMNeIm5j|_klu&>BpUpCy{q31~td8l{nikv-lh3^EJvdM14Nve9Zk)3OEcCO%S^gip5bMsvMAPndCl>;E1sm?xVAj)=D z_u$-Hcc;YMue9_(_j$?PNZoypzgyQo3ZD5lpveBmB@z48avA^r&0jzHTd?NeUsl5Z z8J66*uf3@L;p2Dq#oPa>TF$@9uKb^&SK)8OXZP=4{?^Rj)PH~RLi=C7y`Ofe|C6&r zF^>Ogze#<)|MiovlG13NKrm~yW>vR!+qgfKJgwuDbqh$^yfF* z&fp8dH)3<9-#((2ye*RFwzS&hjYex`8HE=eJ*+Ev)Z6=|#O}03Z@!$~=|0soFJ^z; zyQM2mn~5i~iu}HBc=Y7<&nHjU2Ho_%?OXb#>r2DS?~z~TYWqJ~=ePCLPpLXL*VEe- zHVB{SeG%28@b`It;-9y-r%acg^!Z!hl~du@nd&did4HK>{@k7yR~^3|nEz$D^_N5H z&lA`YG7a)Eoc|fTiud~{)s->S7O4N#Jone2^XCo5QT3pZ8x5a9njVjM*KL}gj=VS9Ze`Th-Vx`+d8}FP>m8sIp=FO{5Vz^SnX#C|o=mgX{FE`$G zwcGx*-S{#ea)Xet@V}?8=N~t0PJ5Sj8FYn^vi!fN;4>?&Z(3zUFMcIHZShm@>-s%O z$7`mV>^*_84Ca+~*yA$=Wor)<;Ao=$c`LrkaH~tTHdtBEVmD*E8p-rxq4mhvA9N;ZNH6jIQ4|i z248q&+hQ*HY00GY+i%6QSC(Bc;ieN$lZ3UUvkNoTLPDJH{C1?aJ_Qra;AUq zt6Gjdi#2;h#Ce1Q-S(%%pE$Ma{gZRSyVb*PufFx_pLEVcU6EM+(|j<$r+NXGpL@8v zRqEQly%ezZiPz*wZ}Ye}F6Ll1Fg?Ivy~RfPwRHKR-G_4zdrGcvniCNCRoQNDNgiKa z{b7a_>s!m}_bz{4FTn6^<^1=VKkpx5uw9k@`&M1~M+W|^ng71cpZmvwc~sG85R9e* zA~OPe#Pa>#eKYQ9S_yJ^s`NKhZLQ_lRp~!bX1U(}zbBXj4zQfRY`=1vz3#u0%50D= z(^dYEEz|9tGwWPm|7SR5P;>Xpt-Q#%D-$I?PIueC_9wH%$>>O{49`n;3oElkVkdq2 zBlP2#PWffkSY0cn9UY6_sGojSlO*(Zv=>YkZp929sfYD#AAw3FUSrfWStC8q~}>N{PwE^gNLOiSNyA~SdX zs46qr^m(1zHIuNL-VavSsfMLgdwyIuTd<#9`Hb@R?5Sn5r^^|yG<95|cRXb4i+82o zpMoAv+MT7c(sq(wr*afq`0|%#Z&b^EJ=*(W;`*AWS7OeFJ^Aui$?w`scX8FX%eU8t zJ@uUuEt|cqbJB^pjx}F)e(L(V&*PWXO`oXB{%7uYyrSxqNq*@5PEqC2=g1Gz#xTJ23BF zJV-AL01eiiwx2fraYw=}@L}EkUiRR#x(y2Ljq7$CGOqSr{&d=&OU{pvzljE4D4||y zm62PyZ(+qN{u|3b?3YS9Su?d{+lsDdiqjKeM|H0alvyZQBI{a|)jmB)Miw+$>`_om zN@~QOj^&gmV;%b2@#}e5YPHqbfWjB8FFyX+{N~C0ay})F-Cq7Vzl1mO%4;)%K+Tu6GXzJ=O|FqX= z-ALP{9F#ZZQrDrcUsQurb8{>ptFyO}l|J-~eF`6=ydKb2p+PBqMYW#lmdw`cht<%<433-SX1xRqu9zC94;8oL~&a(Z;2=FxE-Nxy$N< zb^b-f%Ov~)C*^i8cQ$@p(sq2$+5ZfYpV&+%@0n|2-}{yO zWbmhz|F(Zzrc=I8Q|l$@1}Esb^8r3*3c-unUx6007nJE9C@3P{FDx@J*A(r)p`G>Y z$J|B7A}gm#rEK^dymt1hTUYL+Xzvc@*>UQ(%fp``^X6KsY_ZV$Ar*RN{=C@FIe*MQ z)W`{0K6|&|!3)iY4=(*%botKZ9=W^gYon?)Z+ySjr{?qVPS#|RRh_=h@pAiE%%uA+ z=WLr4b>Vu>N&j6g-j#==y8>tJ7h?$FS%;+~cz`%h0ppHw?2R9#@+&xcWSNGK0+b5OB zOx}5Z<9h+S;B2pK9{0(&H#4tn?|k%A)OMAuk(&2L>YA6M{HdP~ zC*)h-E<63`d3U?n9)pj5Zn^7xKgx#|UXOYoqZ>Wnc=FcbI*Xi|?FuWKt^Iv&3jb&L zHhF?xR$lzZ{%BRVZ8tKfF61mUmaX9Y`tZs=1?yA%B3BD{y{?POb+e3&6`s1`+t;U4 zmkIlBlRCaewwK$}dA91e>1la+XGYJWje^S>w*QVl-rZiockX7@;i%Vf z@kMvEYY&iWRpvyfVvMarW!J^0%>Xi;EtfYE5KoI%j&!a?*uc?(L;LPrgh# zadUR8owd-6c)v^5T252gbZp=DId&)5vD=iMF6z#TapyZS^NE`8r2Dr|fws0@xcts{ za&~!nuAS42*7)dH&h`|K+M}wx+otNexws{8tvp{7e~?9Z=j^D*vxR<~IOnvd^j@y( zqp%a@oteSKf7cd$*rr}Kr?ujcs^F66Y7=gKD%D%Sb1M3Mthw{jWuJ`hrzK9<;#$YB zcDa6zWi@Aok?F0>ZUw)%yPy3m`CPTHoKnA4x>bL#*CY>BO&2#d>4N_ZHSq`LEMmU7 zcN_ni*!%^l##t5ZTHngWjo0}1Mzf`GT#{e6`slah?rC=-Zzi7+$?DHjx@v5cz4rKf zfzO?ejc-0OJel5pUw4n8#ov>04zWdf&0V|q7ZyI&y)L}v@-+#)`(eqY(@yrTd-$Yq zRnFZQovP5qeo6r{RV&XFgfXFk64U z!q2>TL)o)CXO~W{>+X0RTir49@+MA3D0KY%L?*TS{=0gwf(;Dh58J(HUA1@RxxC;FwDG_{?+LG)7Fp2_#s0X zC5yk5$-S6iF@5I#_?|L$_~K*&S*BWx9B>Q|6q> zsm|}$bY>K>Sv{Oy%$jSJwp_+ zLwnAysYPGr%|E?)nXS~+tNTKu7vC1W9s9Sxx@-0eCn+cCT+ZBWm!_EA67p~oXi{0q z;pH)D%2L$}9eY}w74B}#Q=E2Z_LSL0`Pnw$iAH9um3IA%`zL2lynn#&*58Kv-N&Z> zbUJ={;b)KDU5&qFSO3d7_3Ox4u_H$+moYG~m%F$4-&^_N#&4I3x!<@CHb@FEFfg!9 zoX2%f%qn=cRQj~v(TVT=rM<4cwO-&}_=C3>KK`C!`EAz0CD%fpTn(GJW?53irrYZ$ zPqh2``|OEX`_}C_oU^T#bI~i7mmhvz|Ibh~{pf9z51X#dWHOsCT^V{j`d@a^O|@LH zrqdIC-A_yY8TCbKqre%oy))E2M)CjN47&yIeJUsFB_ zif*f#6y+%(u==o&Y@GDj^)=x zSucW~#vgD>-*$?7cTCvqa3?1Z#!lDxXCiT*i^cLKrzXaGPRvRBXuCK$YWb`>vE?T! zXJ#^+1b>ov@ucc!;j}B6TCY4q%CEJSdiC`1-d$0;uHRqcm8ndYP2fFCZFlDbvyWf7 zB41c!^7w{vNqXGtTHEzuw#s~wOVjEnu56W@KjBw{NyO}_&-{O1_Nch^eiNruqRhkm zAj66;H<$Q*v@_S6=i*|SQ9C`n$28$qvg+mVl4%n>Uf=W-WZcOLF3m@mCd&i4u94#@IF59yp*kx_k4lmEL$am4vX>Lj?|@F;vG@tQ|wfBevv&q>Em?6duFFK>9NHX_>VfOh~?*(@3Q?z59w&%f) zho#M`=i3#tH$R$Zxhpe&)stJvTiU0GKiM`rS#i5IPf?D>#DJE=Sw?pYH<_RGe50z6 z$A^)-sVwjs%iW3Tne(rlwx1?`T*7YWx7(kj6EF2&yivU<;Za=L-};|y{IhT6n(NeL zDsFslTz{>mu{Y(tx-UQIHnWgFtLoSO$?TSW-{rL{?ddDgBmPsM_a@53!tT8LEF;@p zAR`0aAxX$PF+Aqs&n2InxLEj#bG@;mhknkJ4S%whNe4}uJmJe#lMFLy)8$(-RA-iT zpM0tqn#`}P<{8z!`0bmor}@^O*`?Q+6<+-Qpr7_FwK=yxXk4$p?RB~MgQV8wUE$)-FJ0a%od?1xAwWLcMk4w&(jgRly*tV>w?#-+Qq7ZC4pbw%0)IWyLF^%a_Iht zA1ZmvpWUmtQrY!oP1NMAOVwRjKVDg@s=jaEwzID{#(yj_2w(sMZ2jdW^3Tjar9CPC zAiQmVg88G5OX~tQetA)INjYypU3=DlhS^5@HX6HbG?dG1U|__0YZ>F(c?&-1JiRX+ zxM{_Y(~k}Jm89*vIeU82yVo)7Qjg90_pIri{$}>#&ATRD?TbyU%y@jS?M%k8bsu?k z7OSRQvYO?=`JdsSKiAsK!?CNkSennu^F4XGFX>&E)*J7HPsJ0=MXyB`6?C;PwvTU2 z*zs3IL*gHMo8qk>T}3h>7RyBiCz*3@n{dlvr;XhMTYI7H@iyf$vC~sG#5~vglUx;( zY&K(St%`2d?~o#mtKA1@OIKIXy-4?tcd92QTkN@A=Tft$F&c`KOh;^lm5Y6nY(eJ#z0)<$$EwZ(S;5 zA7_2zUC5Ba-?mToR&ev2)RQ}&u2@ray0Tg*E_3SJvu8KxM4vL-cJJ10F0MyUXZt7I zUAZFn_7mZ28Sid-N%bA(S-53--0g0rI|aWF-480e58)m|Ld@n^?Tg-0#3qsZP@^4)LAfAXJx zeoc7hg{L>`b{$+%>O6zZ>UXh@shs>`gWp^}!STDNp3CIkd~#M@?wUopTUN@pU6|6i z0p~(CaE7Fu7<|27_UlahYS%1VaP9D9tLRf+QT?Jz_q;mm<;8tNQ7vWOrS6sUo%Hqv zewXkndf1c~r!?=MZ%?-0Heo#bdk(h*=QEm>)YNrhGZJQa=odP=6vc^ZPm|Rl{SyJX6$_bIOuC&{`3$_ zC#_XqPgd&sKRPONgik5AQqL@yUuIpVUzynU+^LGWOHS;vy?eChrS7J{pB__hD=8a! z{^a4#+n*-GU)M+NRr z-?Hq~-J{bd{3>x;eM_~}{^!vP`xM?rvAO3w^bh~RU9;=(qRVHGo+|qIJ^P>WH@?7i zBKM^;%{QNFyZhBZ7QbWm7tPK)w$J^Ks?M&H zElZyz+%5cgr>kx|_cyPZeIlV>a)UO%d{*0JK0B$;Qc&mOQ}6tp3AF)JfA-u~4iulU z>!)?N{^4z}zwUpid-=7R-_?A!dw+ZH)bnc8#K%05dKjnYr*iLX{+;a8x12-2p4n07 z{N`IshjI~w=POp`^x`ns?M*KXD5a9ym9>zy7gmL*DQ4zlOt|3^Y4UYdZjOSUwR|j z=Ji~WEdSa|MN;JpD{WSObBT*ve&zf&t1y;O>n(rQ{%7FK+kM3@f491RotNe}Hv`W~ zn_KJSPZVWb*j35xb(&$3vD2hQs*Aikj6Ek#)ZDJ3$?YHXY2w6*)919`e{@ImKZB~! z%+J@&PMUmPANb?akIYa}6W+}A+EU&I8)_n_U3j?brmSr7sob=bb!&BhywlzERy?lL zNGWjU&ogJr-G#-tCT{1d6wKRyX4XHKIq%a_cAC0>KDp{=#?|`f#K=vT4R3oJ-pp(Z zyuRVGhO_VTEsKM8Yd8f>`8H*-@r$@%!+Vpwx(n0i-n=ti_SjSNTX*BvRaf<8)O_Sy z=y=4cm0jSKh>Y`!fI=u&@MXc@roH)-EEisT67;S831}qJRrh7SBD-P#e}+y_za|Xa zuQ>Y5RJ3ow?$zY`1{(4%9|kQaB3T{oowO^KslHaPC&G`HHDUb=63Yi_KaEp*p+>Zhw0L)No8CgTcxL<7|O7Hq<1 zi2}3%DvH(st*igbcXhwn)7qr8?nQ|<*BBTE@7zh+%k@_-+fNgJ+yNSJ_CJwZ?^TaB zce3>9{9Y9^`)B#T?)N!Mp1gPRvdfS20eedAlD?k)xJ+kzr@!x=u1ET(#2!q+!k*=^G+ar-k<}D_S)z<%HO^iHTuv)Ym_ESvNKASFD=ij`vTr-zVqbyLm(H`SlxZm#@uVobtmgKj7#+^GZ?vEq89{YvyWim-Eg!)vaYRZQAKKyIQPH zpIynV6y(z&`hxlK#_2CaKQAv&d%w_mvi>gBGT!rUsrlt8n^lE;Yy0L_$@?wfmOi@o z**vcow)uMkyLY!PPYm_ntP}e>?S1TuFVeT8;vSZrIk+}2bNAcy>RW2kFTCG;v776| z{fA-W?e@%P7OKm(9W8yfa__CmyyK@X`z=cISyRn@(9r5yu(8hh;xjj1=4G#3y)tpf z?ScoBv*#CDep`IZ@t@aYhj`HVj(c86{*{l@ePZ7}eU$g?}+*H0=AV2G>m@SvjjKZgPqt;GJGR`jDvi9kcUKjT(j1OB<`kz^p=}z-Hwn@j# z&%6IhoX3$(KXSsKMx4GjA!5c`F;_N|nHwM84b^>|=ABV_WZ@HyPB+&pjDa2{kB`@W zN`1+8T5p$+yH~j4=UlExqeCJ~RQ)Y)zFE@i;ycFE63yeWg`Up2+gfH#d)ys3DWFBA=ggU3f((jb?2lNFon61nP*!=>ChN29#WN0{ zUUu!-j%Vg6YhyAFW%nKXW@Gc|=nhdynPoy5`AZ#dn6<9yJi36<3|GlRp*Yr!Q|7*P z%Vz%BuwTZR{kq+)I_KL&Yw)hjsF>p>#zMOk~ru0&2N_a zv8vX`D?f{`i|;i|-Q!i2_at1fE?__OxTHRxJ%?AUjqW!*cw;+*C3aUc+d8?M)L@rm zU|^s{A0Vr@%hVxNWIccpKkrx z=hAMxXRp7<#v>AkulH_Gmb#g*X3TectLT+&x8_A>M*U*^e0W>KapoQJZH2S5-_~Z7 z$Lu>~$`?ERjMl5Wy{^-5KKZRB_F%=y6|cjdX_~%>TzSsyfu!e3yLVP6<~a#vF?r|D zEo{m76|28Of2Z%sHiPUt^R4#IUHy^U=RZT*r{;+_O|~sMowrJ@zDH)wxAwS4TD3Q~ z@f=7}NiDmTSu`VK(yapzeiUx_#1Z{@>Yn=M%)KdDHp#)S*UoK7j+vPEv)Y<@)9G&g zWhYl8Mm)_sc`C=CnmtouI>Yn*in%uVid(;N{A%ReVZCkrPs#N=&L8|^Z+o(29e?wK z?KjUoIJ@d;bmGi^?}}w_l%0>vJS#rQ@Wpv!SBJkXp=sd;@tP~UekHlSI~gRaU}n`V zIU_LHxzF3DqQ_XWWykCFYjrl$?XF&CT?b!(II%6MDm=I~|YrzLhLotD2nMaT7ejPVqS>)!3dWwhMB7{IBoAj%D!^wl0&rS$XX4 z?aDI$%5?W$hZ{HlvGN_aTXV$lR+PHRu9vpFVc+~G#n!qUFI%9wiZ3{Kt>{9_r>Py< zX)o2EB}G*^!ybqj4|eiUX(Q+$77gHy`~@{iHB>se zc4_+0&}dEVUEe2Xb{`A&FrKrk_0a5;DO)aIvTi%OwK4zeKj)36>$ZLjy5yT{+dlQ; z$9>bT#mzWf^k&+j`^k??XKt6jdv0RjyQjwktCQa)E52Q~EqI;GiWepmb$+W};PTG= zq;A@}XphBKl{>EsE;-)6)zxiu_qTLta7yL9?>mkf)CTv&MqEtFyL@!#DW$vVH*GI- zZrhtUJBnpvGy96-;`Ut8`?T+KpX9mOr}Ew=eX$! z^?F5@l~2BX9(V8NPWi;A7ap%WbnE0#<7K)X6K`j-J-U*ayJg9q78iy&2lz!7@-57@ zYO%Q85hRnFsk$&DQYx%(?B1xvOHWJ@&J1%+oZo-f4I6)Fw8SGo`nUr;6#6Y&x7%#_5s} zZ7mm8#4PY|-i5-3l(aR@K4^Nbg zlAmxZ%BOto<8Nm-t4i^3=KCMs+q}{^H*`+MKj*i*Ek$p-*2I49&+nZ+J!emLe)i9a zOU)-n9AC5f%a0%H&NW)*das%u(e*>6_A$Ttoi&{bj@oB$_P$?x`NU1@!+OtZfu|(5WbRXC~)5Evu?C<7AoZKX=vd!9pjW&s^1XnRiO4@T$PZ zuQzk!yq?dAdc+#$xMAD6^*6u8ygt6gXYbO)p0kIHdoITts#~u)Ufk2qzO$8$<>XI2 z`4>ehM`nwj;EURluRFEOnt@X+LiWDc&aFrHq_f|VUafb?QrdlwrdgZvwldRqr<(1) z$3Ogfv(9?IX#w!sSpHeP9HLF&3VOgi<&c20?M~(+9c$B;% zpwRG&h6U*g=1u3n0a`ossy%qJX1DVv`7`}H7R~xH?~*{V$bW_(Gk41VVa=U?gZIOp z%=jrfwN~;b9rx$o|K|_uO&vtD~g{LfuCzF*%q{ZrbunYWGP%#%}v zVt4O7zQpZal`6{?osJU+c5ytgu?hD7*d3I8=dN3?{K+-$6K5WaoaIn-=zH4TBRfwO z`Fu-Wv9gNCYW15pJzR zuQRvYc9!0DYU{qtb(<}}mW!1Z-#Gp@a}$^J4)KtSPuyn5gQ|%eKFTx;Z#}WpIKJEM+owBo4=g;m*JMM`ouZ2` zy-J_YwY#av5ExKn_b#d6KZDE56|$#yce&_9uO>c~1n)H189?f`XZ@GHe{C>{m+RBe(SEjw@3Td^x zYTK{D{NV1N+?!?A%jKS2moDSeUB6w2NB?!|?2B)7vg&--lwI4Mb@TPDsyVAnS?B6` z``32Gc-Q{AZ4o5$IAg+VJ+p1oQXFb^3eTs#J!`+abidxVQn>?uA66B$p2?0(THc

E2tP#6_8HQI1O!+<4m$_Z7U;H5GSyv(NA4 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∾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 U@6QtpyK4{F6|gsY>;K;b0LiN5N&o-= diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/3-timetable-dialog.jpg b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/3-timetable-dialog.jpg index 968fccdbe91439e686a63b41c266e0529a2be928..0e62c2e1016528730514872980658fafad828750 100644 GIT binary patch literal 232165 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%0At}F?i7j)T) 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 diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/4-exams.jpg b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/4-exams.jpg index 3f49e774a214400ea0aa9d305963793d2746f7db..980993af1c49742d6b2ebbbacb2180dae61a05d9 100644 GIT binary patch literal 175412 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

;SD#A^UQ+S( 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

t-PPf$_ke8*9sdg)ZI| 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

65fQ&+x^KX?9{-_>1PmwtJ#^f{}zX5Q7RzgEgg z>wcBjZd~%~j;`3XRdZFR{mx#0EMrqly4I3h(Rb%VzIJLQ=bJ0f)DDc5zJ2cRRKc20 z>uxU&UG?HtnWgi|SH&l`7Ija~`nvMgq8;~_oSXGpMor!0TUoa7i_dxr8{=>Mdbuph zcxk|cZ8dEf%l7)bUUT(pXs6VoO(v6kr%qh7Ji0t2_U_Fy?=rg7W3#5upZ+OY^jGbk z(-uc-_MR>@bjdkta(TVvC5!X(clS+PKI7!q_Oo(biMwo{mGAv?GAt~#!hPS*->;WX z^R%qeb9wUgrP=+tx8FXwvn6|O3V z1EsF`Ypq(PSUJ~xllOFu%`SI#S_KQPIiKP#cB`bD!`I@nPdQg;*6Hkp$y%a&`{v%> z7wVsxQhep*nb%hP0?rrf&;6`@_xzN)UJYvW#N%}mT*x;%XQ)IWV8cXuxjdV5Rgc?$yw z@N=)0Qd~OgZd&T(;6g6zBLVNWe72rt)s-4|wJS}_cJ`aui}X%!%Ik7DwurfXXY*l} z(7!)^6s=r%zwS%zT_OGAvSa=K8IHJ};Z|I}E4%Tfn@`}BpeOI|Ye-Swo`=stf z*H5`s>n6VH=vY^^dV0!h-DOREQCoiVT$OvNwmz})oxN|x=IhD6o-3ETzV*=Evp#!b z;F&7@D9cq{^ISELx$Mt)m+@hD*1qFalg`)ga24rP&iy()v{XOnUB`-RTi@kxSs(jn z_vFn?7cT?^M!m>CgLat#-E1vXz%tFLSwF5?)qXDZCPV|_xsp(;H_@zaQ-gT_a zj(Wa)%X2OLq<5`l30_szhutQ>Oj~r{)Si7yXms9Bo}#1CBBg%sT~j8Rxw<(%m*{w= zu6JU#+KahfOJ3NfEql35bM+3}^M0SRJhO7Pmvm|+b)~y}eepD9O-OOo<@94$|G0dV zkIG*jv21c;*jc+n8e)B?Gm>xm3eQ_#-uK=1UGem_=fd}%TD31!hJD&Oi-JqNE?0TV zBaBw7e6`fmnV`Ba?aJPX+ZWEf?0R0RV%^h;?~3x=n*3Fqc0E4C)?Ub5(Di%H}7DrgPJ~<}{Y6Q(y4Sc{a=0apCn_QYQ_)OLawM z1l+@(c})yj93&Dcd@OdS^sb*}Ql%W#-?r=s{l|OX{&8?^avJ;6%YCdC)tA=Xy1qi9 zbkbY@%FQQ!W~R(~sk0_~&T+%?>|N83R!_)ezJK?NxZnD!)9Ke|xAG=$dMzq-;iBKI z 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 D6eXA& literal 276565 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 @RN~ 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 G2~7Yj(~7tN diff --git a/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/8-themes.jpg b/app/src/main/play/listings/pl-PL/graphics/phone-screenshots/8-themes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce3af9bbfd314a4a2e6d5e2d212dac654f393b30 GIT binary patch literal 424342 zcmex={G?Qd zlmiS542=J8Gqf-;5)YUVfEf;;+L;&`nV6UunV8@b#4`RLU=ZZsFkzX?%qYmfB*@4t z$oT&VqdEg410xF)Gb6%B9Bk~IT+FOYEZmHYAW3FMBuO@AR(1|X7EUHE0R{#(kZV}j zg++PU7?`9P7@3$^SlQS)1cf*i4TVJ<0}GWz#kf8sPTY9VXp{1mE2gDpVbivWhf6kI zbP8&kWE@<)xg>Pz)obSE)3-}lEPR+$bjW#Y+4YJUmXVi|FRPeDNKKin+Ws*_O?`Ps zrPZRvF0O9Jb~L9fNlkmMk)bKb$iT?V#Kg?bF2=*e&dS8kz$gfEfDoIaA-iK>Vqv2& z$Ha|FMnxi~3lBO4P1&KKOk5bjtpSV6v`+tjphnbOqNsw8P!JgsxhfC$JbPxeH${G!U z(GVC7fzc2c4S~@R7}+7f`16X!<1W61&ZBrV45*R@cHJqZjYYYkAIBW7ShQ+rM_F!QHE+ zo5fvzEYlYH>V9egQC_E?B4(RrEfX2W3-^|W`|FBu(R)u)w3oA{_wfVSH0BIHuR^brSyp>aUe0p2 z?|qo9=gS{!rf>ds_)L^m@?D*yYYxj68$SC~b9Lk4S2vAqzl5Ioad68=llGcTembaKJ~5l z)bgz4v(w(HEvs`kafyy+^O(75p7gStAC#YTTvD=olbK^H=FM$(uU~QLrr&z%$J(O` zH4C>+U*zVJbkWf4Jnu!r5+gaA8J{C13-0FLSl4yr$dMz*>(s1N4_MST&@ZkC+hlyg zXt5)xco7MUUAJM*JIjqzlc#Pw^`_G7nZ@}DoBQVTJN2eZ+?+3~l74;DbWXK8Bg1P~ zGQQkev8-C@J%9PtzNzoipV@v+Jb8S}tD;9;*K#}8PJX=U)lECgu7&R^50?i%U7o%B zy-wWDRM&}`8pRg_w+lTocDZ%_f|FdT{6p&(9q(38SJN)*`}Lne?R~G|$H%A6%x2HI z7JImP#+N_FSDzPrIo|iC*!07h+a*7AoO>4Yoif<@JaWp#8$qXEtyi1bGt*d6!>+4H zX4~09wN361-fr5uc>N;fonL-_x&9%2Tkh_|AD6GH={dXgy>;04<=@X;oiA5odr$IZ zKkK!#dfRHmUA$(Bh#L?NCVHu0t7HqwumIb}ylUs-WhWNchS!EOJ=*!{XO6YRn$vxY zm5jVjZlAEpdBy9i+WxL8e^gSE=J`Z?jyyQ+#;%j^d_r$u%>KGNZ;@#f&rX9^xvzGe zUUu_inAPL`!WV6?nBMqfzkd4DH($4QhI!asZtsh+d42V@J?BrW-_Gi(N9;uR=ReR-T7&qs%$$hC(r!Bd2HGi$zMu_ z^ZjT0*3UklbGyF%arvK~ms{WcPW!sFH|_eYGq)<=-L^HfeZ45Nbn}BM$QIPCJ3O7Y z=%sd@-uIL4AAkMh%u&}Y+q~e;vb+2SM|b6xTvAr4W&8Qz`f{1`ZE5G9MqlJ;*rL02 z<#wSZx?DkGtxGO#(N)U~3YjV>6*5_`&HbUW;J{5E2w(We#9(TS$68I=V z&%nU(dHavg-EX!%iMl@7;$7m+pozJ%lQgFF307TuuWaJ_^lZHJa}IsIrkB@Gsj4() z+%fBsx-n;3&{_BTop!J6?Bn}aPOP-v5_^4`-geIwkFLDA`b*~grcKsA*3Db@pMmAK z$pH>#eynGPke;_3@P}L<< z!*8+gZ0|{h>D#8eue6hx_r|O`?cTS${~28K9&UZwGeht7yV#uXx%=+z&g=W~`aAW@ypDY*Uv5_2uU%7KBP=qz z>QQ1>?aGx!zQLt$YIoUuS`{@XRQF5Sl^J0^3x3TKam)G~`DV%KQyZ2_E?*xqYeHt^ zfv>lCZt?7qw91*cdiUf%!S~y46fHN;opW>1_hWq(re!XbXM*ico&3+RH04k4MUil&i1v#X=V48ipP)p`sTbbp=gD$U5o_MijzRO<8Clh~4PPq3XtJlb= zf0bCAKBuIV&xseWOnz*QSk9NRcJfCX!+SGgzV+UZ-}w5?oo%KYV2C* zY21(}#j}g&Uf#bs#c$L1%O97$k$YX^b6Wdsvl~}mzD!$p$}Oh!<)(Lk%HQl>mb-iR zW#P-hf?4g3+7K@cESWwb)vXz&?W7Ug-4OIef@Y_4zDGlkz1yUM1I^g zvottuvDd{bo!6!;k({W#;?--D8C!R#v&Fp+`M!Lo{o!@u@1mdamg~IR@!eMBTJDQ| zC+GD{^WV0qrnb;txy0qWMD-a%?K$$wn~&+w_#|eUKifN~+U>})5SJa7lh%5A?i7pW z^186DrIvr;M2((qxh#{PCOg+1oTgd3`PGl)gSy9Wey33=cY`r|ZEs<)=z3M(TsPzP#>)?l zP0XgsALpsum1+BY&2HKK&hu0AyQ=4Tt}z#%@UyM5f7*vvpU#%<_|LHE^!?dyI=%(J zdpkRSKF^tQv4ZHy3IiM-3=CM30|S%XXK^9dY2x0~4X#I4TwUor?VdINw}CN&VGTnVgEoU`1J?o81g22|hBfg1Gg1PQn>uI7!L=J^ZGO>F zu=G^q{Dw}$8--UT=P$f4!7hJy+sWN~g|&X=1kVrdXWe(}_uK7PXS8v)>E~x488I+S zW}CyBCTR28jM>{`UlpDWo_ka3BzKs-(Kf4HUjn^$t6X*qvNc`!^JQRF^WvSUpRIVd zf3Hxp*?jTirFotg&OJU`#cSf4`~B$l^E;3KU3y>WW}8%-bza24_zTHaBrh^57RG55 zshh4?yZ_i$H*dRHk3_PicB^~s+os#X*|W&SbEC|bxg7I)RojKOU7NQu%BQF2MC^u~ z=zYs&QV%!%JYM2*4;Pm)uPj_&$Uq1NQ`)6>L@`oRLk~hn&-*^5$ zL-YBwH~*&g{kykYb@QU~>Y7=#F~4r8zM0RkGtVXcyP7>?>4)^H3+E5M6ijnVOMd-# z_5S+8zc%&Pga0nDR{qZr_MhQfZ2p5+QNP=2795v|>E<<`>XEx;)|3$U&?&YTx>tTv zPBt_9Bx7GQMY2n>vb^fB=zjm2ve_E>hulikJJ~Q$(+e6`JbU>l334-Pf5F*b+<>? zl&h(!Uzz51@pVac+q}DB&1O2kqIa!7Ub_9Jo%Y(9ou9nd%JZFIU|qXe zds%sQ&((W37OKCV7#}tDSWA2Gub7?Z*Jl1_;L`l3lRe|BjK!ME?y;AT+G)J#535bf zeUqL(XV+i9pOfr2A5NdO`R;x1bu&KP&T;W?`ewu8xdGNuM~Z!PCf9L>>pPEKJ)^OK zx3KH(vz^Pl4HjH{T=9i{O|Fhgnb_-jzHLEuel{6z*IvIDxpc;xg?ScB%%*DWmhx3w z9=l?@=i*IoX3c&!?RHLB`hSLt*Nv|VUbf{nH~1`e^i;K3UBa{2I9{>S%QkoGQrloxgW#u0MVz^6%JfD}LqU8)kTBmQ}Lm-jkep zWNGSSFF~!pd*oG5swRKfv*=QDU3QMibdf2uI=z&vpFKYL=j4``%Olrcx}P@7>RtDm zeaeT+S+DzUd^pQl9n)zaWCTW{J-t_vJ(nir4 z+te~6JJyG$iSZ>p+ZXnfS9W&0SzdJA^#vy<8Qz{AzT)t*<7J-PUN1VGf3|ko+0VJ# zW5te~y_~zSMz@XE)^UstHfOlCiboL$v6w*BhQ}yV3XO%xyuzhg0%%-PCSyIVUoU3*`Oq03Z_axCepmIh+rq|oTB^mSIWsVnZ3zjl zbiL|k-Wz=DNu=oCDN~@aNnKNHpT-<%moOf|4IlX$_^%rG(#d1#DjWiEH?e5T(w%$*jQ<9j`})zFwAnRaW@!%53#jt7E$h!gUu_`b;{xxRhnx+(oZ%Ud!Fxch~IL!)7zi zeS7SRPOn*O_424-RG7Bksx>v+&+VCgE-dZjDd}xDcimh*J6Y$&*9cR?zWg;eCDr-7 zf2h5a-jVdGu;8q=XSCyG&jtqZ^q3d6FLxx~jCkd%yRB?$t;w{+7{BXQ&kfE#yy`RQ z()@m*Q+~$2X=fz$H%*R`F7*hSZrzi#(} z@_q9gV>7pHS$6yC)oGvZtY5kD#;*H@hY}*sXHK5*M(gEFUDK4xO}G0d7y52nsxu*W zvEDp^Yq`n=d09Sbe(TJu2lS`iJzR$R88j;ie zDRS|(%&+D*Q_d>AetUS*&uus7b?iz~+AF&15?@mcr1aQ1>#^56+hcDxOLYh5oL%vk zx!~^J^q7Q7zk;{gVOo>AzU$6DrnOc)>dx0g6*J8{Szd10(xHx?#O@k_kPZ;HCKEuc9qUrBb9N|tl;A@ z%d?ZtS#IvSrziE{V{}xQ?7qW~w=0y2n#Azi?T>qI{ncB{rnzfknNRsmVUw9l ze6Jk|n`rE}%jNrAyV$qlo8RSMyT9$zyx*JiX7||yPkIyOn>Ran(w)N6ZRfn#9G>=j z(TQEZb!R`bNP4}tbJkta%}w`aGU)x={rKLW+h2>L_xa3xO?4gsV7hKLVe!MNyxL@}B z5&u}V+|G_!KE49~lHT%9u(S_NYoA?yc7FD?r^lb`9AACy<(BLBQ`7EQ=bW8%dfn!( z+iM?n%vj?Swo%_XC6o8!vcGM=*T0foxN7gl-^y>R-%V^ttuWtw@9@w5P4^C0r>|W7 zE%?U%ROQO!6F$vzJ}33|Tg@V?KiOt?kLNx7leqkRb00XrJX)&lr_pt3V^nFF_O&-f z_ic*8Eq}iMR`+r1yM5mte7^Vj>VvD5>n)Ey`}2Ip$$EBq);}^Kj~?u9+hgn{gF|9Nix&v0vN!Z~a6gI4)Vl7HT)^uHDVTDbPl+SUIVTw zR&esUL)(tMI9ABBZIg{=@W-2i`D@-jGE5en`5~rCRMvI&3C)5hibur#RylPXjrrZz z4H}G}bUVNAxo@5F!Y!ZTP2TUyE}b3Lt(U8M*--pAPqeYH=gVC$`Z`}sov!yy?)~BT z$^SN7uy$K_Jox(VoQc=h`|S()Ae1xt`lr~ck}vMjAD>;l`aJnr-oI5}e`!7c75=gG ze(1rkS6^JWdGtu_#(b&eEKk%nZ{0EHp)u36I)`hf<+e{NW;FUwSv2ij@v}I&!@jz) z-0S_CH+L6acs@@iGH3Skol*WPO{PvSe6lX**2Z(Wb@x|o=G|NFI=OV?<6Y;plTT~k zp8x7?{MWluIAmNk4dZ^wKdAFDh2&&nJ=wd=(7qHmk+CI<_PKG>CXd*z*dC)ZBD{b%;u zT{b)#pAI*e-CD#u?Z}n$5l?d;OI14Kod+ zm4cVN5_wktFUoCsJW?Rs@3Ws2GDOyj`$4IS;mhB?01OQHpSAMg9KQ}<|>+MDSG`Dq&tjQEe z5eXt0Z(RzEeX?!Bi;t(OqkpevuW7BdRjt__?Rj2Os&hu^hse5^>AouIH=RUkIY70g z>Bnx~?eWv97TuUR^P@}2>6PF*QuWv0^JcPk?J{A1X6A2~vrgV$`u$9FPDNVc^9jj2 z*;Gr@ds9QoCC<5f>z)u7kz`G|mAz`_nJ?;zH?Kx)lq%uOmHhSWZZ5a~BIh|bie7%Y z+itr(a@Nfyw@Z9th40On<>TLb?C#Fo+xyzZo^N@6c-8IVo8rl*+kO`%oy_?fo93+wL~~%Ker}TPFSxsV#b*Qn+;P>2UK8zdsq=K6wA(qj^@971~cKFaAEdDSz9i zaQ);y``e1IzP2qdHl9x%xJk3q^fAmw?a#2=z`)=og zdttLb_k?&IyB@D--da-3vq;qQn)JScygzGZzAf7$>sER?Py1tRT1Mw#voo>6SG`KE z?G;%bee&&ov)%sd53abacQWm1TD0ELGRqk!C6!*xRy(sBO{QBWG?_Gt#%da;L zU;aD(c%FQ5xeaxuHSqvM{sf1mM@pm|j~{gz%O!F_vUW#6?oyih&B zz%%)~$GiF+>utVF`B^M1)SYIo_!kFZP@DdfAN4K96?)+oYNQ<%jB8x#>02|9yQUTz$ChW9x6++Vx@b8@po%H|>!->*b$)^3bV_=RqEo zs*lwr@-o-5#qw%-N=ix!++3SBU2MDOboW`>?RwU0cG-x#9QpO0yRx|UdeL!%jLOM5 zyK?T7NbRxe33o46lbQBpTWxgm;#E~kKYPyiE$@wrO}c54Z+vp2_31g$D(%;|6ukd< zThrvbpwBP$mB%-=$YeW9mcu`GRC_3xRvSMJK+%q+Y+srpXv8{Ph} zm%D6F`~J18d}JBCk>|G>_oKVVYp*`K6fOEKF74*`V~bw=^XJnpxEuE@KqPPoCYj&V1^&3(-omE?vChZYgBDFh^bap`}P!FYD7Nr=rLZqr35~9BEQ#T`%nR zJo$I&+pyQ)_-k*Ao?W`XOMUm@Qr%s)agy_kF6uj;yI@>2J^TLKJ3B4P&VKi`$lI1S z?Ocvb`;?04VvV#_b<%&W%_Tg|zDZoAr|!nCr;bt*TR2f2sPDEYR>fE3i~0V#VYOQ`TMa-Fb=rsI1%>AAj!YVSJ&!?#hemfcO$;Ol=k_@8XQ{C|du>94(0|1{>`uUZoG-Mh@_(GwermIAxX?ME9-rz4136yZvWSx%Hpn zZPbQz+1U@~nqM;f^TuZRTm7${`~HPp{m;-}9lh_vo}_-I_e^*1ow>fzX3=A-H8<5K z-%^p<`p^3M!s?F<&)!UbeCOSRStZe*H{6kTx0Rb6e&WX8k2$eEJ2T^##q_+qej~`E z`_|pSFJB%joPW?UfBxA|mu}P_wJ!f|R@LuRw)UX@bGNx)@aAH_TG@~7;l_2-AKiY~|LE2Gz=qwvZ@4p` z+1mM@pRT*vcfX78U0Jcz`BP5{UX1+rNx5tDn;nZ6nS~uQ$|<%!rdhNn>6Gj@!^u}& zx31XSRTre%o7&7-I-QeGRog#z>$kAmonE&CrNkx$N{aa(pDdSCI9=u_Xsy$CHPwZ? z?#gY>x%TA3>zw_3yV*Q9{my%_>-O7OKK^ZLb~dJOo==xu^kVH&sn_C7fu`3^X?~j` zIMZ=TOx-`JTXBv(+dTEvj+p$sT=YQYx9StwXbsP0MpG(Q&nn9Wq8Q z?cEz6y*ob5y5G^7>8-xL)u+F=?LJQKpRw)7w%hAwev902-gTz>Zu6rSM*hBOy8B+P zePO1ww!zsh;%&>NV6p8>CdHk;Z!mq6dSv{%Mz_tc?yySvuTqK8*jrTfRpX?Q(Ti6; z?&fdnXCHrW6a07S$2WV#zVF$$y?5qswWpTXv+eK9dR_lvhTbxX8Q*?ZZ~u`jUsM-2 zW!6odqK@WdO5mXTCrE zx$#!Hd9lCA=eEc7MtM@tcavlv7u(bi7wR@hLKDb}4tRm*=-HQh&p4uihNJc;B0KTo*CXw9Q+IxPvhDQZouwPa-HQ?>G_#T~g}blozjEPJ zl~n(+t@Dp-{0$bUb<5r=nXY@c=+@fBIfu7obMx_b zQ%hEzr);x&0az5e2yyo;s&6OL}jIvZ!=Jsl~=-PUmUgdsIXZyp`c{#y8+hWCC zzAsbTXy;j4`b$>r`NFf?Ucc#?CF`dBF=bQLy5o~>Zu^~nuynJbo%yA7_cyQZUS9S! z?aqofqID+^7}{K%7Eu4o^@+)ZH%kr_^qjf$w`3)E;*ptOy?bZMcjW2aUc0&Q_J{0` zzkP13-De{ccI5KOD0|aAZ%YjJum&oUy&;ChKx^mg?_D60@+3#7KwxuUH zCQy#!V4cK=pt&K*a~z_}81A^=`IpIbsN(S4yxklbdAG}+uXkQK^`>$34Zp3LB?dgx z7U>;aZ7{!L>QXyaVGmizP6^vmq85V!IB zd8@B|(w6UMUVO7v4_;`qn^84llGy0mIp-jeck-P`Vhhb&W%{hiowcvF9R z+q>G*S&4<~qP$z$#PgZXHO|g>@;K#@%B2{E`I)ivR#r9{DZen%Tg@hW+Htb4ag620 zySX)mhVjZiX1te+p48=D%rA>J%Ztw2%vZ6k`p5h2D$#b_ix*XY)SqLrYj#gn?L6~| zhl;i3b@+RINaWqr!rbkr!a z=C-A6C_B-iy`e|XIhq9?(--m_y@7lC} z`Kqojue~!bYHKGP_s{(~`T2=F9g8*UE6e6hRJ^iK^~H)4waJ_QY(HjG7&G0+#l0?l zk)m_>s>?4*c9!ni{a9`?pY{5EFJEmtt(3Rx;M=c$dmBuxF!MD1bQzTBg0`<%cZAzNq8Z#nijcbB!<+x=`!=d;^Ir`4R@ zDEjHr`m^!Y#d?e9>^xrj>}>o^>1hvFTsc#|=Uen9*NykOlU{67-YF>X^UkN|h5s2M z`SOaESD7jbXBow=t#mow3HQ<1Oj*?q_EhbgJP{l4hD+JA;EzfEs%snnfad~@-p{LU_))Uz=^7bX9+ zG>Xlyn|LR(kvr!Fxb$OAlP~W48hF}%iB$eyEBhnPB(Q{lg7pQr)}sUw-tLAO9Knm1Aq!|1-o?)~h`E{o3tHNp|w> z3vBo0o|peNcz6Ek)Bg-FzH>?bXV~Q5Xlh^T|D(*N{_msswYt+kvF@*ZHPQaA;or~? z%>NlSO@31GPP1&|H@WHmw*Pxs`1juZIlJHgXHa~dJ?nN4*VjE@=aNm3({74gSMi_W z40miez0*REtCn~dp1PD%xpv#UWqBtj?H4%lXX?(_NvFTv*&Mma zV$H{}>F$%#)KBYbep&crj+JfL^m!&`uG?Peec!ie?wyG_ciVn`xSP8DX35u})5`0D zHt&&+UY=B#ob1_meCnR-0++XH$au#^KAV3ix~}%Ik6GN_yqihf8#^ZXw_N!t@BH$@ zlbC~xw?}VHJ?@{LQ+T}Z-u!OSer>KY`!hQ$uc+Lp4Nt&=Y_re5O$Y$qj>7cJDX0vb1&|DH)ESk z@ztD-qUELO6K~(Rcjt6b>C!dJ(|o7AoSu1oZg}vENlM?8Xyw zzHN?tIY;TS)tOwOLF?;9k6#HH_X-znFDW{^?1te2&?a-7Pudb7`WnG?>i-~&VOZ#Z-k8K zn%!}}XYOl$D!gC2WTt9H-c;X7zrMvrRY^XbyLprKx=s3bzs8uKsrCuGHvjzYU-Kd> zAD@@s6U?XU`z!9;Hh$~n+ukRyxc+o@#p3-^IkJYr*M+TSU7ET{eUYl;?|FGLm3$|2 z{d_8~r!Svovp#IL?7sQ3&+Zp76>q-v;mfDJRTWmhlz#qFefp|aK03a%`*pl*xBXYX zx0Cz!ckN6+dwunp?A5RS87%)&)3I<*?YXCWq;5{zQ+l5_?tJ1@Ju}H|n$oL^vL?7K z&h2?DY5qvb`=s9K+}(bcWB1M7eqpk)Z+G#VNxySuf9nkwy(o8CCuslq?TfE&K6UC& z@9(1~H@BK)R=eFu=i^?tfUZ%V*?XJ&Rt2HxU%&q#aHtE)#+H-Hd zu6uGwZ-dUcC6gY1HP>0ZQBQhxq2OE1H;Z;Et@}1BYF4DNk@WdvB^MTXow>9~$9Kou zS#OtzmUR~%Ez|Ygd-5Gc3D@7;tWx?@Y`X2m zl5;lGVg>7Trd_kx_+;DdM`~)hOOBjfEi1ByapF6H?@2|%vzI*c?NQnu_sSyp?z#=P zBAbn_#+#)izd5u1@Jgjg>Z#idrqxdG?`=+m9x5 zwqKiUcwH=7*8EI))!M$5yY}+ty*+-ZdGoy^YG!*+pUbnkUuUuJF5kS|?zP+A&Ca`$ zx@+6ZH@mEI*KU8hOS5#xvXhU}gN43Z&&h0$mEH5cBHyO#rmo6T-y?e$Je+!N|K;oJ zY*UY^&O6z6arKc_?~)VyRg%>c-b_y2cB0pBd1#&Ao7>Oc^athatJB%yU-tJ=?XqWA z?v@?j_{OSM=KRL(Hd$ZAkCZFrA763lw(-NBvLAELF5mg+k@p!*lik%5r+)HP^C-LY zIr5Id)GD?WA5D9uyZ!g62i5%v*}o~aDfzdp+a~qHWtLwz9$vZZ?<3iDH*5ShXFT0A z$dDm0=J6e9vzVjisOXG9S7QatN%$TBIeW^*eUp%)lMstz>ziGNpQ}(Qy zb|`bj-mLj~TPG`jSZQlDC%^E`8!b3PSjqO^DfUWrEU-H+plY}DY{v8+V@AdH^<)VT<^B)^F!-syVByRykN( z@YH>-V7^Ob;oXqTjWSg_JDxpGzfrn$<#yqVp2o_`68);vllK+g_0vvE%DgNq`?9a| z>Gs=4o!ef;3K|~Gy(k`SGH-U8Qc{(gQncC8?-p^zQa1gs zC*SzoCRx4lZ(Mb3zt*krn{R9HOuqHz+pf|Vv2N+xH~u=}|5$FvzsLU>dOj=bzgPTR zsdxO}nf1Jv<+;BvoBy(RM!}i#TWzwPkLoJlv~R7+>X!ZdpTYdIzuh;nb-MZUD%Ve+ z{On%wv%CA%pUS)`+f_F8^2%qqcKU`*XGGVtPRy-Z?a{GTF7>^1`{Uf(p}Pty_t(5C zdirp^IRBh|uYXjm6kVDb<(e7g9vol${SNQ=BNI-ee~&{bNczmpIkCr_n+bB_Qz*Wt37;w-}JfO%!i+CLe{sR zyB#06Cw5|0UR~Eub@!9^-}cx4zRbJh&-cgjhQ|-b%{PC~bH{XjxXh1hOYaxgKbci{ z{`J)BC%0|=@^8JY)i>V*D}tf9L-*982Y{uM`)(nE%^&UH#Sn z4F4G-u70zbrn+VNW2^R?@o}enS4?Rw`S``?gT$flk)_iM?u+bvd5_mkHcaE}@?H8z zZG&YEz6DLy^>h+ix;9H?sitz!l%?`6OEvYDWf|Ku^3U7X@j7H?cT(Q2%pBwRqjHb? zyx;H2I&(cc`ufM)oZC`6r(WEYm05mU=@j>o>C#i?h_2jna&h9bo?oI%UKCxb6@7Nf zaZ)fe9C`l%h;dWrT$Y_CNYt zbZ=v<+5Iw^X^$@6ED2My{c84P&Sv4i=d?ebDRGOK*B0{P?|FWa6p*L}IR?HqfnW;ff%rkpov)js5D$!(<19{jQMoZZPXjcqfxO6^|v!OuGR%AE45 zw_(@*eU!Uals0?Y+xgQA6V|(=9A9&~#J%lx>5QbB8o@`cnsa~8trfP~=2Y7EpW$}I z(f!G5!awg?V{NteQ;S<|r(of)y`|b49{#ZQtX^gH_08(#&I?z)>CfJE^82*afoXov zWg=^;rX92Vv3lLn-$!?TXIpjiS#ER2)r{3|7JJt%_O7)NPd&MM+s1pdtEyJZ=13GP z?>3(tqxbgybCH0}x-n0dxOQ&c;Of2kSVWogJuexbSt=bD*M5}zB(g=(uHvL~>C?%D zPxdV`?Ah5p>HE5vf475kQZ8JZIPKKgjd3e>scEO2Z__lsDDJa;`Ns90=g#cToN;@b z&-WKQSLw`Ncj48JoU?JMMFS_U?1hIley)BeUfesoW@Fy?$wybH*p- zq>HcC+IL2zMXvpI$71V-n%RL55B1-)+%9ew6n2IyE9#3*@6Vu^+-bi({ez<>OfBDb zcXRCS*SZ(p{&=po?BA1e<=w`{7X@W+&g<7wJ@@DHsk?JNJ*&%pE*obncY1lp+V5d` zyIy|V@$shUezoYAHfE8+C706X7#d4Uzl<;59JH!q@=yN#xqD|%IP5*MC-YZ@;Df6+ znW|QYjCBsFc2E1u^Q)|Dnxf$J<}L15(s;LTvWd&nySp{K@@C)cLKheJ&+j|epK(4X zSNiwSuJ?8E&71c&^JL`iO1g8q&HLScm2$O`U)5`R>hx<;KB*-AJ#Wv;yIE~pzuJZG z=?Atx{k8Vk$+*tho|khqF2CQM`l@@&H{a7+UYuXMe)rL@)2z0CZ!bH0G_KSJ+*|2@}-*Ufo zBAj+i_K^=iM4Qf?n7QoM+h1p<-Mx1*C06+9w%p}s&UacqU4PGbU-D_O;&$Da#tHLw zf2r!3k+=Quv(LBZ>3^)eZF`w<&Y_3vZamaGzUJEOyfVqu%vy)YP}V;2n%xy*5x?F% zzha!QWAlP5cdu1OZtYjpoGQ5P*6i?vYo3AAbe_q@T>o@!-CebPg?CH8eT+7XjhLNn z7&oJ{Z^pbG{jAa7Z#>VnS$w-(KlPbj(B{Z)w)yrmPp2&xN#1v6kJyvhNjdw~tY7AS zJDamFGvZNqHpdJdogFv)d;cE3e~sHEYwpdzS+y(vUf!^)X8*18cdT#zXGpZ2mVCNe z_RaabP1A4cn}4j#H|f9qXCcq#&EH~wT+cqZv-jgUzxbcQ_T8Py|E_$$|7dSnto^({>Cg7OpS`=i|Li~glLzDW$y?UiMMX?`wp}XX z;dhnIeKyLrZpZ7n*B?pWJ$ah>Ti0T4?W3BXO3YUA=SbSmoMLjjQYd`h?x)qV`#Rp1 zadDs7EqZ77uKU~0`P=4B%sKkUM)c7(y;qNRuiElDH$U<3ng?&^Z~m)qeRFZ|ZnMQ| z)p?gI|1;G1*&EOL6KFj7Y{Gh($m9OzB5Sox)*LNNNd3T;V7>eIivJAjx2-<&E&cB6 zcfoJn6HXkoZTUUzchxuN6Uj6FIlfuHDZV7e`mA-`xu5ci&)$9c6uVyY^={1*GD}bF ze>a!SH-F!rrJvZ0(OXrsje;Gf=bx*Sws5AS1?{41e zbH9Jz+ar2*w)pG^-{&pvnwQ<(-FH9NPp<3imiH>}UiII7t?lhxT&kS2cgO4-c?PZ7 zj}C-;zh#YZwD9oXKIg*QzZ1Vbi>?21&-q0CoKN#MuRi-{cDdFu?!|%cyNe62|F+|k z@=oUuLq^ftfgZ8xt~zbgLy_`c}!f8xFepZz&f zvtL~P#E0KHsT|&!LCtM3dH=TCOu6=_^4s(8cE1<=F8I&za{sOO+s-H1u6z*bm;Z(N z=AG>GfBrMvx<2ba!|TXTanYx${vDqj`g(d<{qf)DWS5_-TyK5+&5w$ehf}Zrj?>PL zlPW!`9nUQO?ffnO7u}m$p98=ezLbYT2O)l6oc2Z1zgO;mQl_3$ssJ^)%-1jXc|KO_$@z zr+=>LSHHe~a=2f!!n?Us&)wek{QB*6pC`AAUjOiOR$;->%y?^)^>vdUW!_h;s!M(z zS9)uwyS~=3ezB+P4=urZ)N77q8QAPo~7D9Jy&2G2`8ygI^dJ81AO;=r5Xg{GoFM z&r9#B$L{Gn)uep)yq`Lu;+n%Nfz6aZMFTS6}V>Pd1iCa#fRnE2V zJC>h$e7fX#%+obr&Ma8J%kuJ*%YTxd_-MRcu;;b*#hpI;RX<(tt0{fHgQd7;S4o!U zwUn+mtJklqUsYB0Zd=~9vi}U0i!Z-3JMKH(ckG_JiYC@5QOd{JQW$}2CwMCHsn z8~g3?rAM1yzu)z8>9(7om2<{-Iyz>~eDC~X^16*#anc_yb;}n9PK-XjmRs%EulO~2 zCOdzG$!jZ|){}ix7VQ~z$91~yVSV;+pJVrOZ~0Wqo$U7hB$aF9a=tEi+jjqH*>>U2 z<>y*9hu@l?74B_nEcLFq;)TbEkLfY{@nILf*80vlZRbT2>_$s3^PW zRjohQx5?Y856@VCJ|$Re(T$UGmM?anJ}PV%zWiTH%}1M?H}=iWz7lVq{jKKuOT9JM zDs-0qsIq!=)x-<-3RftS(GBIZ1uzL1S5iJGb{}S524t;eRsr z)R}9m-x=mcPB?Vrsnxzyfpb&Wnzuce%h9V{aNgjAV%3$InyyzmP9KZb-G#`5?ZPfa9N&5M z+wtDVH~GIF`fQ)R;#FSF`Ct2f9-sAFlgZ}2+2{V<#d7f{D(lYYZ|J-3w|CO(3#oH# zCsy7uOZ}7Rr=67f%xbmhzn{J;-EVZcEkv4T{+SK=9HM#%ZJf3S%)_&r5 zyk+81smePg7Nz2eJ@d-XoQqcadEC;%@Z;I3%f(rzF0Dvjnc2G4oFU!0%x6A z(*FJ1G{1O#?&VJ>?5_NKJn#12{%`B2+rc`v%1WWCv5dbcrT)w|(mzVoN5#n#WP zY_^@1JKeSE&&^G-S97PirXMc7{5EHscIkJY=p5h6g4POQzvpnXuU=rAe}-d%ZfvXQ zX$u1r<82cXBXrxYnyF};e^(8@W~l6Gs<{2Sn9)2Z&$P>FwM}Ql%Is@y3QsQR*f%kv zN3>(!8<(Fi)>LGQzIQ%**Z;lZ<(n%`rcIu_{^Zi`cinosOS|=UotXJ>*K6gxeLB06 zCYv4oesuFi@mQ~OESABmO3PaBRo2b87QM~xXF5~$jhMy8tsRDK*Gy-)lzvYOOO13pVC#ibI`Ru~Y&Yq=r($7e{@y;&X@4W21)tri7di$H3EPii0Qg}aN z`>M2!mm`+DrdRHke=A)2)_8KsovV9u%W`(@jq&q|im$DHt-kl!ynH?Hz3-QQE>C^A z>rRciPx5TN*{e%#=G2Ipg{DaN-@P7l<4KK$`HZxAn~oLyW>I~ybK99I*VrA^j9VsW zrPfrJOmnYfeX@F${QC9NPIdHO=S;hNQs(5IXvvaam7D!-!=KFKPCqPYcPjaC?q=S~ zx9pc@Z`3>cIpxB8>0`EWANw-PX1nIR+H~Z2?Do6;zj?~t%g*dvv&;I-^u&G7-3!il z9G=ZQN$S4%oGlYibayO%>5fveah7$%-7%E)IQIt?T~Dd z%XR~Avrwh8%PzEh$y${{H%<(6&xH z?d1pK`m}j-Y9|$6+bwo}fAq?ye{Y*!%$>Yyw%({eE?_V^dmM?X;ST!lSl( z(-hm5F7#dL5f#$9(5-c0N@kGAWTT*v$x0?G)na-254joM4|n;x-AYZbW7o~jZOMz` z6rN5x_s;I!e}+S>#amz5y^$}9-`Sg{n*3b8_&-DbymQr=Q|qNq{M668k-l+X@*DZ= zt+ysVty%Ba@#bsD>B&Fc|6ZSLJMYK${WH4NU)0pZ1ebq$v(%!-bamuk<-bb%)9>F#kgLm%Tb6jR=Z~xW_Pgj@KSbG_}yFFc-C;WE)WdBT++PciA zIe)h9xVfPFx$REFqu1_=6)(tS@4qK6ta`(}eee41a^6>qQ*Xso`_;;A zR+G7*cjZ_ex8dXC(~M)M6})_zdhNcgai5af>AzDhWm^AOf5-NO?NR^8nfWn`_~ky% zR$F|gz1MqrT=3?nhl>|4DYN*LqouV`c&e=H4b922a}J$3`NPBHo1gE-Z?U`cB;H=h zo2l&C_HM?uIgx5MX4jNX{YcB}d%NM_+*MVT-)c|(Ied>dExY^_qe z;~BN->9x!6d%spKN=;AMvtRJyxHNahGJ8&uXrh%FS+%-g}$3Pp_RXQ@`4`vSY@KD#x4qGi&DG+OPBI**@;^FCL z9T(pl#gEsVovFJfOxx_Pu=vf=Z?U|K&-_PE; z+q8}USUsy+WR<=!{TW~4ji2G^=g-I-Uv+TN&5~<{PtQ(!vFWt(DsAKI#>Qf|bHZM~ zo3ZW2>}5)2T#w)He0AfeYHICwvranrqF&z^eu!h`7ax2-8|L_T>GyM=ue-3nB46+A ztvR#!&Tgxj-Mj6~k*uxd=jQWXmRC)icRTNF?c_UiroVju{wC*6`8%IJyfwTuGdg_I zc`ucTx-WkEt?QNb{t`0dT$W~@s@;#f#@`=#%TD_A)plBKzWA=AUsry;;jR9j?`>a^ z&!byA(+ta(v+YX1+I#56zpewh?~7ME?Ye37MPD&bIeOFORh^F84PO|)eiQd1?X>^X z8O5PRT7p-0X{P#`oL?VzvgAeC+QXY{j8pDz&3e}}@oHXlQd0fgRL#%g>US3YKKfm| z)a=pocX0>n`d;?w?Bdyevv%U$83$L)nK-HX;`^RBvwboXAFccHC@-%4akG2^F zEB?}MyV9)_uCu=HQFQDy{fS53UXMENY0+G|DJa#|Txce*(Zg?S>i5cY&nI5_eZBao zS-jn~s<-=;cjsQbXeaTy>&p@E3+v8Shd=SV_RatJp5AqvLz_;y#T36We))cvwpjY% z^39vlCLb>Mv;L7*c)xaINQGFNYmW4>d5?bSdB4bw-dlJse%ZR+DM=I7$1U~iaNYU% zyJqy(pK@lqUGipdZY-BMk?7U5{LekhUCVggF4tDGPBY6pQ;8y(#fUU2lwqg_+y6qYxC$a~!wT`zqt_;dd*U%S}mBWFJTIcu?M!?S1e zH*E{~E^^$bQZC5%%+krMTX!s)vG20c&A_F$>zb6$&RIKq>eg+Uc_*K5NI5PZUC+}8G(CBrw#h2?j@9-JMu~UN-rYN)ydmn%CAZ_Y{#~!Velbs-V%fZN_S9{T z6Hm^4CL)-9UiHRY4_Fwrew`2Tn|F~Ux=ly9P!BxHHvyZmvJUU%^FFDXS z`cri3v=7nZ)t23RTaJ9MeO!Cv`rrFscO6#JT@qa^a^sr$75;nbEH=Woo_Pn0srGPH z3i2DB@hV!s>bmAP8Sk}{BJ3TPA9&8q%X`xEXKg=U#o710c9FBw-tqBCFPbc9c)Ye^ z(PrU`Z&P!>lzdrwYj@4Hch-Kso6K^bJNL^)8~UxjA6GB>xpe#e+j2Ba2j>Ozer`R%RjU|0WjR~RKif&Ek!oqHSW{X1f&v`%)iqWK z7x!1Itmb~XAwkG5rzq#?Prp@f%ET3(_BQJqz1#M7$NSG=A7V?dfB0B%JE!!+wOiL- zZo9YR_4=Y7>)Y$If5{!Gwm*CB*Iu31n~yE$}=XaPuI`h zw=chK;?bj$qR-|R>zN+rvwAMmaB^qHoT+OfPf5M134W*4Q+a36e+K0}jh@i~XAjSA zd$2&T^3juBFI^{O^vfO<&N6zT7X6?Bi7uT9Mm)C7J znb$F|ZOb>;mwV@Lt*gKA$xbh9vvYsArMlX(x0laFx6A32KiT#3_>cYaGUs_BbN7@L z#+Pn9DrlN8SIg_t)Fmf90|l45J~FcBl&pR%u`Ow`=j;5v+oNkYmTrztUs+bNulLrU z_Ve1N%Vr(QE8cVJqITu3Q`08+9BjIDJI{CP)j7+RuU-sxi9Vs8dZu#5i=a!B<1;;# z-@o0Rw!i#p^rG7vW2Xm}7g7+wQnIX;$HV zf3*4O3k ztOsjTZ+*&p_S12*5$EKi(MsZ{gidAFqE5 z*Qwm~wX(OgHvX8%zb=Ek`NbRFRPCG=Q+@wkMAY%bt4EG(yJmMLEGO3ARdLbTjm~cl z7J4dsd6ukpnwEO2aLZT2)H}PCmrky`yn5z7xy^;Ew~NVUwxn%o zyFE$k&7@m5XR>}SSQLFZ(zWo{>s^ueJmcJA!ebK;drk6stLmxazB6~$+r{B!-G#@Y z%L9s%k{7+0_vFYKTahR8DxdmYtgPlY`INU=YDJj#lb9RuGW&+cbS95K*Y@Zg-&2+^=&U?eAmoLpFmmbTGoA=vr!V<-s-}IME z=3BPTYL5TZ>6*uqO|R_E_7A*sA@|nX^MO*a`$d0l6~41g`{Mn1Pu%O$l9c!L7N=Vl ztyjwV{{GLy^_O#RyUrD!Z2B?B_ikb8#J8K`P3Fl|yxsMC<;9%M-YfT>U$1F&!|+Yn zvSZhzI)$Qg4=+tTZQDBeP}C%^Xfwf;lf!#db7y{eE%(UF=foddE6FFd?5WcCs+0bf z<#U=e}S1gN3*b+E*cILd-zcnP6 znKSLP)C|gbE4`}Zla$tp75iLOSeU5e>@YP z<6f3F@6?UHH+OTK)2(g3EP4~ZcqQm5AM&>>n?m*S{A$PZ0+Z_Ih*qPji>!y zzUa1L>b}>@7b&f&?^v90Ks=qibw~GcuRGEkU3WAx)*UfG0Bsj3GDUtURxcNODz>^- zZ+79koHvD?z2AB@CR}s&PL7sbZdFsLbn=;uXI<=;?(aI!=Sbh(qNs$_0%j+m&vMZrgr%sw~SEmvwID>3VAm9&T8waVt~bJ*a=>tZQ4Prlc)4 zmTKL1cUHO2w&%0%=6;srSaNB?Uzsxh?%eGYzWw=~y2qmU<(t#ScDH`+yRp0L<-4{2KkgE1Cl*dhH7|{LW*;apsc5aT^(w6xB1FL%Bui`^W!CvT?i;cb}) zDQ9P^UVXS(Ok3^G^t0L~+fJvwT;g*{-a(JKU@_Z6z5b;KGZ#5*ys>>^VodIww>%2Z zpGrpEc)OR+W~s{jeDUKUpB`Ov`?|v0Gx(JM9J^oFx6WC6x+*UEw(h0J9dlzZ3Qzm@ z_Imm1Puspm%f6epbLRZ>*YoFYeZO~m@v++9(RDsGdz)Twd||Tnn}vbPmsqo}el=UV zKi|J>Tyk`xUEZ0p+w8xOR)5%1&hhEzt$5}msqg>(jJh3nqp+*{Sm7UIhB`0F(hkeM zuo>b(u_yYBUsm7PVQ@c6@O8?5!7NAZwfl?f+Ee$Hd~=_B^+?GPU)}9@V=rI6yTs*3 z=7qiAJYPIM8@oI+=U%C#a{kjhlMVY-9?zLsd}*U`yJ$}5CN+z6)$g}OzfG)Fn^D>N zZsN~PUk~~e_u5n!OPW{L9a-?rCHlVkD>vWYcJH#4_@}+Re*L%P&HoGxj?cI1YgC(95*FHD_Hpb!`P^pB^Y0bk_rJ_5iByle zn`|a!UcZ&g<=NJK&iQihrW>@gPPI?gk4t@fXr=G#56X)EC)ZCDlKD1Mb;m6gqs!-& zicjx(xUHDw=bYkaUpIvS z@M4S0ov&YqH7l;#`62ak+J66eYIm;1n%xz?E-dWXud?4kI_%|wd*9C5ecbwFyV>nk zhtpyrb-!(Yd@?6C_2PqFH#_^KmR_6T@^|LOum85Mt~7k}jV-t9q39*Co4eZ7pO$aX zNV3`1>0vH(rSoOr@-49*yGj*_cJmZPe=C~ zy;?ha%k8puyJf$VGNTKU_Um4Zn-!)rW35{MlCq80CHfXzpOLrzz^j`}4}Y*J+bp?Y zU8<(OD$_b6<%Ku7y@HC=eWF6XOrLu7_!EomVrfey=RJI}rNZp5nyuKh8{7T6PHemJ z!KLc+b>qA9ra!wpb7z0~vww-#itYYRd-MC){=mAN?dQvWzneLu<6U(A)=f8FY`f8& zG*OT@ey97pNqHG&d9mw%^e)`k^Ihi1IvtIuTh)56Uf$ZXE;i-(gHxLq9w|)EQZej1 zQQ91%$$z`D(nnWMw~gmFvs~WaMTr-m@8;{5ogSHUrtrS8=ZyE!vgf{BU%r?3)SKrQ zP8U9lUCs9N%&xO;vSHP_`$~S*lzmLv_M)@9DD`B-=PC2kbCPFlOPUj2u4AYEZsN~g zrl7d<7CRRec|D5MEG(4H`Om;LXW1UvB}%17|J9w6F?xN`UD73fs=eFU?yc63-oM?L zxXXUBdGzbEXQuC{V#-{1GLn>k_HmV!=WmpT!ow)|$2ApQjzWr(4QQ-nk2N zt@iT8@#$2ZH!bJ!-_*HlvPbvYm#^O+U1Pc8i^W^^>6WV<->*El_UZikq|ZNf*6D0Z z=$UrTd)?8=H?HNZ)jd90=lah3SNVDR{?wH1G?FPi9(H|d(44@PvEmOsOYQj^+V;F& zx9x4{9lLAmQ+@`s2-GG>z6ri6W`6e==4eJ#)G?W7Z)lYPg%Bkzp_dD zp4py`D`x-hvAywO`O#a3bGF=FnOT(Bz5ddNyMF7f<)bTo_x@see@pkY8n4~o=O4p1 z*5rP7@vW-b``tFq?4pF7_uKPahd(nnm8MU9bmN~_>8gp(v(|kpTc)~v#;WiMz0cK! z&+VDH^U3YE->SX^UtgH&W2vmCU35J3+L2!y!y4aNS#SG$*skg4+8@U8eQ8tH+$_0m z>~+>^*J_jZTW>x&ze_s5?@sHTS)%J??mYLp68ZKS&$~$Bvg1p#zLs3FY2T!|JZ$NX z&_qvt{)v|U-)v&HRvh6kdH&Y!`ufugPd05&-j%ekNNLNv%T1ZDw%wkvSFpUV_Ngwv z>5J|8=H1avcjo1pl&3scTibJAs=H$4{fGTRNB6#)FZSAR>tAOhm7i|c`u1OAvi$OP z$>r$$e>)6D-2=KF5yA1mH=Wx2+h*|D{OIz2PzoSFVx<+Wjq zU&Nc^Qw!7kzl-g=vFmo;jKeu!jwUa9Gf&EYg{jqE|-)Uo{D^T zc)po*QQpj)nca`&JRTig+}Y*h=B;L&zI@y9GM&b&aco4sz{*NyjoOuTN)Z~jww!p{CJvES~tPy6WltFupMrryl$Vlt&2b7tl( zxpZUZ5*L@dCBLP0cU4IpdOq)E`=mu;-D_XG zO)(a{yLMHs?)w)jmT}9pY~EzHV>Qzz#cflbC#?7E>aD!y;8_Om z#M~_A^;xH-DId@Ia`~{Zol5@vzigJj>v2v|ib`w|SkJoYBEje<0)x|%S+v{TPzCGXc=9lhg z*A;7Gh0Anq6esOor>0puQ)i!zaPGzX8B_07A3Fak_@w5Kbyjz_o2ngdRW`q}S=Hi6 zyHc=T;_+RFQ%;w9mxcV%I(cN{?Wk$5H^_HG#F3LM< zeA#3DrcHbAalU%@;p}Ex)9Q^cw%(rpa{cDlrPf=oxm&*79^D+ByHV_z_m1rD;M|QD zbFy?hXD?FH-L5+`cbn3Qt$l^OIfo1PJ($bv*jiZjy>>sF_04&&&gi{U|We5A7IIVc|a-N)lL*f|_F{!$#5cYW^U0}ZFB)?b zawBdYn{-BEVzOq?bT0SY7f)JN7R^g~mTPw~cbo6L;^3Mvr7ay@m$v)+w@nnh?D;Ce z@91ytd)9I1=Lh!N@A+nH`myiN#=fHab)MV1&pz6;?Z}zv!{&EOFN(QdJL7uUBw?f6 zOa8e+IyO)HEIu9-X?wWR^u5c?<5@nEGna1Os@riTxTJe|=+B9Q|3dci)R$*jzTG!3 zpPj$@=Jl(Oew;mU@P+W!XP1s%TzhxVpX1x+S0CMP_-t9`gU6qiu}%N(E%Bst+a7PcS#EHp(#7VLw92R7{9dy=o=o^?`Qf3nvg(@0HzVw}l)f>^Qu2Cl#do>v z&Ue>cXM$6!x7`)5+Gv>bYqIf!S|Y)P&v5N!|C4JJZbf+WBu5A4`s$_pREsNRg-N zPWgrTyPJP=6#D-ZKm0FII`x$NY$^GjYrf8(m+$fZ`hK&z=qrEzY-N5w??1z=aAo_e zwW@yw9yW7-oB!eOy=Uj=v@e%yvR@@*?|Ww>-is>e7XM&75%T{)BZEO`8vNY>mvJI{l8HkFa+m2Um|FgGp?!R}@!EeJ3UzeZ0 zKP~0|aZSya75|#A{X3lggd@vt@r&=jSJriX%WvB9pTTSUwX#KBPZ$^&&iC*9erIWW zQFT)0&PzdO^PXMz+ORe?@0*`r{90A}!nnge^Vdf83-8=r>K3=7v+09msnMyqQ}XP- z-z(0&?yGYpaZUA};)wp4yMBH$;r`zIDdoNF%-lWCn{Mt7+?;2Z_p{^G<=460db`qh z`ux~(?Re4l^X2QUZ9i1yM$g}Uzy4sm%>BLBLki06?6w#`=QmUii!hvWzjC)r>{feg zuFgzB+xanZ#SdP8Tt4mRVaFfGr<+D7Y1i)f@p$*;^i4lD3d@Dht?S)$+h+D{zoWZi zO)jThJvLk2SGhe{xJ@m6Z=Uy>ec7M(p4--@vt#;`F*a<&R1&E-5&3 zW zUVTG#%c^D89pNsT+o!l+*_(OBk~`;5`dO)Jy{?Ccji*ut`J0tV%wjVBAx9#c6cRrcPfh9gAN3R{#ye@54e*gWnFX82S?_DZ&Hc!ke z(=JgnI($xuFMGCX{?XGja_!|F_hwg!=Pl{}WyhdzFN`QSCvoAsqVGfj8LUcP)> za&6z6Yt!Oi1CMsfg?+TOX9 zIX^kS?M_pu2^uXV$o4)`1G@CchUFh(~x0%kmhhCkY{MkG7 zNhJI1iqq#_KX~|I($)%I-E%MESXZRUo%kYCbvEvKNlEhYJnQtsH6LT2c5J#ot8)AA zqm}#b-PwNnPj}Og$5&q)XBXX;EzFyD;&9vkll$JfMY)$1hE*-BuD!JGRha$pSn=ak zC-=EsE_<6^)O}*@*Qg~Aqn7QQ{={vP>y??QfA;IFsNEdy9JOG@wj<0|IR${oeV3+4OL8?d*RUnR~Cr zf6T84f4TWT!;HJ{UrO=sDS5;2d!hf&?(F&B?GEf;`u3SZ?3xi2HR(d%*gQn;Ca=aFA4p3c9-YyNNIO=aUU$1l0{I}g8pQaSVY2|M1W^2^`Z zTQ2gDFPZe})NPx1P;C##(jn_Vu0eyWhWaZFPS- z@8)8&va;jLf~&U8I@vd=ptm^VQplRl9IJU7i*&vjF7;i#d`iDxhNq^wp0nrqzq5;$ zKl*Euzw3AX$DM2col{?Trub7F_xi6%r`%7*@+;Vy*DCyHxF`Me?&P9rb$a2qi^HQQ zo&07sH+8bVsj%E_zG>OQpUhubtXpzSC)~gMe)GMI=R&2~H5HepclxW9hZ>*x`8Q|& zzlf~d!h|C2=g-uZg+5JuYRNUbOjiDw?qu)Jo}M9TL0|gkSa#i=?`f4I9vnOA-u@|@ zcbE57t^IVqcsX~K**E>!Tk4Xw*WCSZw_H18(~*KRC0V6{p4<7`Wv6z3F1@C9r(WGS zZ-zvj$z9f}n&qd}PyWo=e)aXVrR%Rt`MO^@zi@v0Wy7^mZ)0z**=(;U>!1HKeENnr zR@^yDs$ae6+*M~%p{QhHcFtCJS83W!tB&wDukXB zzsqiJc~$dlww;e<{z<`h(V2#^W+|JBp3c_U^;)m9d+oNoUFtiItgC)E=f~rCwUFAt zV`m?42sqqla^%jk)BM*bEc?cDY5I+Cc4-IZ+)3Y6>bUE0-Z%g2W>ZT&-Arv4i=)`Q0Ud+)8im<*ED~pSwLz>MtMXE~PZX=-IZ{uJ1J6EV|k7?$XPmuV(g5 zwQc#mTsGhCly$Xodvvtmvgl5q**ew<$(3JTyp`Iec_sAD<6SSOpXK=Qt>z_Losw*g z?b5f?V|{+)ZL^J3&rya66VZ~d%XPoB;`d$FF!r({8zd?eff$T)%`WC zSMDsiDsk<_rJc@}ahy}kekGmxTq*j^bX!2I#kVQpSB0aqN^PHpOftLQ_le{5wY6;9 zrrqwEpHX@%_Oy52X7`%-rhhBHK1$wcc(-lg=XkCBKa=-8e|j$U^4(>3w|tff^Hoz* z)6TtiSG0T0F00&KYLg##c3e5WzqzO4SpSoGqT4>K+HqyZcNNV|+1aah2zGYp$`{-Lc^7$eIQb${Avx##k)PEXzc>e!P13|`L<8>FXz(^M4=z zXJ9Fsf7iPGT&A={>Yv=pKi_@07SncmqsR5##sSHdex?mK&Z|9fT$-&j*V`&~cj>z= zTlD^|4SAKvvN%x2#dlJM-tEpPW3k%pt}Cx4U4Onw@5+PjMJMOYlhX=Ivi|7T`7SIj z`)$noGq=@s^JJE8&DxZ3(>(fP?5a&CXQ%5VcK;~6TT=3K_p)D4Hm~}*>6~82l1I$* z{{FL4?y6jSZPuk5*?%V9k$7|bRng`(C!~*mT_;*Bc{nXqwJ%t1-@7#TiJ^PkIs;Ze zuH<+(X=Yh+kaX!3x9#UjFXUS4U4GDSyJA~rxv$Q)>W$_>*@kyJ`ubMRm{#~^{l(_l zyB#kj-81)@ye;SE+U||vGEc6gZL7-NcP1vxb;i4&(w}05OMGH;r$-x>JlePUuJY%^ za?P3cJ%4JZcK?jKwMt1p`P%(Cc}r3*rWhGpYjD8<{2MiC;PrBzUgPJmTeffvh&^Xwu!bs`nq0j&-vT-IX&t2HeI!!a@Cnv z3#;!3=Wfp3{^4@h>9;d?pMA1TO)dA)uA7}}x8L>Nkz-zGF0-oaJI^QC^;{dL8^5#i zO153O(K&Zn_6?Vn6IPq)YHtc@)mR_vg?D}4_-&*Bw+kC&6ymgPf`JW+sSMF@R=*82^Z)FzWjC}Zcukq5;V%O%B zJ^gn|?_K1qZ<9R(HC2|(4+<2V_$wv#O8*1iv{x^xXXYHeDDEDz-|=*1-^+VU7d}dR zTuHZVmF6qr&kj1c`|MhE_sr8WdVNQirC-gi+U~!tAZl&O?XoMk?KZ9X?XuP4O2v`h zSx@{zk8a4__Nr9u_~V>!N3WmxdQ1?N+^b z^WD{^H@0kxHWte=iZsssb^7t*uKZcYxQ>6T$n@CuXJ*>Fx{vF=+p^w$)gjTkHg?+W zd*83N=6bH!n60t3d+nN4+7*~}4tRTOPr7<)0= z;Bl8<^xMugzqNI?uX_C`O{qX%|E}6+zf+IT8{RW6{I^>oc*&B`n4KHn=G)xglK$k} zKeJ?Kmb)gB;`uiY>Ftv{z98baewO5#lNY;LBJX_*wp-)lek4!s{tM~tStT`*rnlGL zTG`jV=#Ipjk3V;>+4ri#=K0iV_ZYuFc{MNWS;(#Y(g*s5_X|^kqShV0Q}@?WZtMBn zc}6}}QFA8#5H&8mGwa~tH%HgcIdyB&zSBNu%A9*Qtc=(HeDCJoXT54(iC6EwP1?Hc z<$IS)ns%Ih^H$89*S5dx=!@CsZKvnnv}|`Z&x_gFr9JJ%akI38`DL%)bg%E;c>H9_ zrdPK`XRq0I<58;pls`$==Ipp!X*c)g*0r{5_l!3g-f3O&*1EhU)n~&i%}sYIzguf3 z9ozWawu;j;FDBJe_EE6jj>!|>SDSU$-F|=j>$PjA7vH%1DJ=HRuAA?CY9iM7yPPpt zpL%!MXZw^rkC#1{3p;I=wc)PdbdfVZ*ZOhJ_&lrT+VO42Yux)zFS;|$Cq8w%`}z3d zte)+zxwXy9jZds>pPt>b=(NO6=h(%)ss(dYowhbCov3?j^{MNTvjq<;nJb;hb#uMG z;L6|2xmR+f+hTWzik$8Gxvl#0y%`^3MP_{P{-S&$=Jn>X&Xd3EE#H{?-cEbCe7o*O zyIZH1FZxsdpFv;rW102Ki$`-VZM<~L`p&ofr763Lb3Q)0mAEr;jZw$WYZ|9d`Dfpn zR@EM{y_uJ#c5%P|)DTP6%SIn83+8iveKF_eO}m%Rzuo!m=lQL|sPOhXqtYW4>pN$D z_t*Q+P!XpZdFyPOd)DSl`D^(S@rB-2 zkDl@GTlG+Q`<~kKi@C?X@%vcTtG1cWr#_S#i~C(J z+h3m}_h*y#bl;lTKezYx-WPAH326Mq{rSzO?b(}8&zk+C?C*QuGOe&_KmQ1p#RQxF zXSnm-*jXGH)NZm~9)EHpAdkhT*(p zmu+9R-8_`EKK^>R<`>Hw&ipGs8!4MgzWL9f@HTKu(K*SJGM1Zx92@g>w0;5>)YVG+snGEl4{?VUYwQt@Wt-_(7HV7MVm|K$eMI? z?5uqrlWQ0JVRL?hse#vVv*WJ>H-DWJ>6~{uuDD_0>s_y2J++vsC{(m-%9*8ae^{BO z?T?u+8C$tJv-fqreT(#O!?(#9&#K=)xV<<~!qm3p z`@Z@&pL{RM7WQqNrTlc`?Th;Juar+zY@45R(xY;V#bkZKNgX{|sn^bK_uYJ5=r8ZX z(`hwk&o(bRy|%Modq%;ETa)j+eW`DB)cm}XPEtwLzen=}A5Dr$xLqpxMexR{&#K2O zQ?I@#3x4}b+Sq-KdiE8!v_(dKg>NS3KD_*Dd-daGzZZ+{)2^NR<%7@JebI3t|33Pa zfBt>!@XdR({xc*lJ2*Lho>I1OUG{Red3t?MuSNFTeEIU>S?7z+mz(5XX4m{y&p#HY z9DLSm&zjY~-{(8!UM;(Drf9>#uP1Fh1a3>z~uI)e4W?TyoUp#p~^6izeThon+wdUi5n5dO6*m zyQw$%EZZJ^U4Q#Yr0rQZy(nvdXVey^G4vdwZq6a2S#CwEWS zadqO}ETM~#bbZ)?jLjJ{PXYI z&)qhEcYEi3v)}9XtJ%dKtiAC?D(W|ngto`7+*fmcE>imQ{mYrV-byuhXT04m|L5=f zCl}_poXz`kY{lVcpUg{>H_cshYQdGb&3&)W$USW5Tv;-GXOZ@M)!R>|t~S;*(0;h% zHs3-YkEwD_Vz;WIpIg2#>zSVU(S6>P+izEzY`gj1_pYrSN9TK=BTM#9{blsIJY$zn z^tt^ixx2+O)@kmRd2)W%%~$*7v~CLay?gpof7?dG(rNc|j%+kKzRT^|o9>p=?ovBG zMO@tDZ8ddy%AyaCOaF4L@3;IcRCD^z^NnruKd|V%yHXrIdAS_F`MqzUU$gx?Zl1Ag zv@WZa&AFbparN?TGY*P{?|=5^zNn2{@u_q9<>uAbRy?m=eCyPI2HuUAq`!%#tS^5AnJoWDWMVWeLYTTJphI*II z_07_}nRdf+5~HxvMuhc-D(2e;@1Fnr)W3>#aNc-NS<`mxpdoI9XB{ z`}ge4+;>Ngb)SfeaguSIG-1o6NvV%aR_vPihjERtu(0Rr>iwzTo@~COI0TmQU26CRv@ zG4WBiQj-4JX)hlhZI-Qie|l2xChKX}@^?+UU2^R2AHPRtb03~tzxLX$d7W*sp9Eu1 zf41ECc(u;?{8<^7{yy_eX{ija+V$wqEv1mage~jUP6^H1yLRP`ZM^%ZZwY&`Ma-qd zUH0?a^}C<0n;&Jhwy&dt^Vad~IgfA4n>>A%mwP3)q%c;(#f!WWvTIRNkB(&z^r#aQ~&WHoc`c)O3HP zgkO2sA3J;bh3r}HF8@3uy>)up@{kvwT(^FYt4fTUlbu3q}MCf)j2!kMKfVvZM{?%DQo)|~YsTlcog1{l7QEaG`9wZ^;c`s9o|g&9su zqU|l-N?%)aSB=lwG(2qDUBSy9vzJZIIaA`|^X2k^!?sJSOuu#BoOXWtjO`JZUYY60 z$QA2pzw12y+$g&1oK9uV@sf`z`)=27{yb%E+C*VPE$h=Ndxdv@pYdt&n%i~uvfsMT z>g>rZl-ToC8F>z&7SsELcQH|_O(e#)t4pL z)O^vJSLB-`em6Yxda}u*tB+nSRp~kZ(I?9;JL$~!==>1xFQMC>?GN1k@a(kgNpA{` zA1_*ctZ?_4F3h4X*YB3nsm-`e!+SmPbA@v>cuZRbWJ?Oti?X*X!mZOyRb#(&tmOp+3gFD zPgyeg?V}&B=EX#vxVM!vQ>)VRbNl_MZ=0v?%=bQBow_TgPs7j|!T z^4`nWjg5c)di#0X-tXJqRh-|Soqw`_`i9stTefNYjt1$m<@sq7>#BdH<;~cn ze)eYH?S%gf73=H7`X0)~TYEpK=-K<9VZU~C_H91Hz>0JBZ3+A*o%J@d8=kt%^vZju z;IUf$YH>E{*G{%M(;w-2sFrSjmw(~S_H*-2eBQOAZ${_RZNFFVs;b`7F`w5;eBVi1 znab5$-s;Xiw^$|j&+bWShEL`cPu8mnQ!9A1cA}Zfah@mpekbj_q`%}czro&1_GWQA zH2Vsd_va<6z0bcfMeam*^|QYoC-8{nU{|w32_76C0zAc@0XWnTse)D^M zTEDg~{}S!re?dL}{GxTbWv``nRc9||XRVulP`uLS`P4c8-phUet9!0n<#qI$w8L)i zzb*8bb8Y*H+{bq>Jrj7aY5AMf*Jt+b2-VzM$C9G?)AW;)^SsL{+ofIFqAH*GRhG{& zJC`uuxUc5kHl;nnrfbU6ZoXJ+z0qSnt5wwM+vbb&ZOUx(AKRvGUh}kjeRu8W)X6!I zcco3cJzqBOb4~EY+>52(d@flmdf6Q$zel+xBHipu>NR;I(GuC^J%{I)t}srIaxT^= zYBBO#HY??l|1_Imt&kFzjj6HQE=^VP3dld6>bd@G%=V?vVz<3D^XRx1DQvO+-R<(K z{o3WB7oWcFn7V!g-|g-9j#NJ8`@VR;nqTyl_&nRXY5NYFab3#qu3Bs-b@oU8i&@uY z&d)wsyLo}^S=)8Ch57w)*H5n8d;D!q#(J%^#V37N?_4qCYw6OQW4q>0p3YQ~E>&n- zn{^?@G~AA7SI+g9pO4(0b$Z$DMOBZIG7X&E@yZ_Dp+ryEG!_bhqlh zYkw+ryFvE>L>n4DEKzT6OYZuqhFZ$2)rpOjnwZEb{c-`Nj-vtLU5 zE0YWUHvQL;`}Nvc{~3<&U3cB4{u%4u{a1T~|H?mJEcdzpQ1PSf&l7jX^~TS*R%@>R zW4iK*4l@e|#?Y60r}jPEGxM=4&(3AFjjyiGH zZmaImFK;J>Oc9#m<{F=O?cwG3Q99xN-)@>lEK;)imA_5f_C^1H2B*vCYPRlpZ#(0& z*?!R}x3|pZ+pqdl@5QzqUv}nq>&~CF?`20v$E!6ym!!*jeteSrYb)BX;OS&BQ-Ne==Uan7=AHXy-B|^RvEId%pf>u+_iFpRoOIeQLB${M*I3 zm;N&}_Dv5`cfT^8Cc^ zt=5~L6%|(}C(9gEJnhx#vg2~Gc89LTytXW-Gu?-h6U%dRa&PD5=DQX?p4s(hd+5fe zyOQM0ztx@=FP?9mJ7?pYJ=fNUr|wj{x8tbXdDDvzw~KDS`=sV>;fZPC!MdCG?5f%Q z=eWVvjVIpc>&}Zgt!B!Pi*9?oP06D0@wOY=PV4qPiOz9xuM%Cc zd6Uzk!=KLdGo1dI^PP9wRL2>K;a@B5469jVJExkLT$Y*}Z`vv;75Zd}QS1_p-t7Wu zt&=7#R(|v1>#Sb3WoP52z1(bPz36qC^~cNq8D93iI(lZ$_RYm*$5%Z)`=5bzR`2r2 zrazH6yR6>qQ&XFKU0Am4t_bK1VI}YPPF)_pNen^VrR7kNY(9a>DNVeK}Kdd{VZY`*Zy* zegRiLvD@a|nZ9~g{^@PmpA))Y`dg+>Ka+gY?@7w>!!;FpnYs6!S1x!Z_u=fkStnk! zhwd<}aV|gDaoZzz*|U@rn~oW6pLoN|^XRR#8M!^rL+W+EipWACM7K`5M zDfBiKi>{xRo%3sR&iTH$gH^o6>*~_pB=cQdvn%gPuGE@c5i@6}kZ|5RV<)9sx+N0%Ml{%y{Qw@*Eyr2C~dO-@RlR{X?nJFkYb&e5)| z8fQ*)s?@qTC!S54Uvn}2q{;EL^}LtuI8NrAKhk#m+t%$_+v`sKoSk_wy7brCaQ$}{ zg|}smOMjYFuGyxfyeutmmy(VC;@%}fTh?q`Yd)tZ%s|c2lIP2(Ga@_Qxtq^={oqq? zrQfC6pS=5bX$#B#sLTHt|7_FkNfT|%T`pB`nRW4V+MPLGxA&NyeP=57@W}EDcf)Q* zZV#NGCB5?a=3O3}uAGrsEwuH;ifvoI8TM|sQcU|2s(<2yv;V@}<-wKnbFROQUivGy zbb7R)-J#4k`P-kaowu^TTQ=CUuC1E$`Mkil%o9z1zt_$(OxyLMzb3hRQPIm!XTl28 zHZOXu*X84K#&!FV!kgxihQ?Vgr8Dp7yC*sM@^8Am(q1aYDJ1@`vdrz$YiDz3b_Snr z=F6@qj?TSyzE10jlhCc87L`dY6IC@mOH?LSbaY=(lJPlnHht~a)M<~m>1@)>DRn*} zA5yDpa{Qz1D*MSX;&0>D;{5e`3PxoDGLPg8TM- zUaews*>_2=cj3_$9Ua{(XZ9tjyD`kc#efBao16L$OYjJ}y4&sv(hxpqm2!hZQ6TVS=7k=)291|*N*S@H9MS{ zIYo8b1s6{zj!Bc0J_-u*gqr(aj^35}Ld+)O!%c~gF3~BjN{Y`?yp)xdjO-aFP7ksV z=_&XDTY(trfwR7F9 zUtTqjmiQDc`l@Go;IftSLCX4q(}Vs5uFWq{$`i}Z zziY6l+@AOS8~^Dy<&s-YZ}ri&3|(jR^Qyqzjpea-AN{n8E|)v?&!(vGhsD`9JZn|X zTy{L36p|kByLaV{CvT#+>aLHkXM4GP+v_hA`*io^c6|uSn|0TJ;yk^5D`vcW-B$aB z{rS0|OXpTk_&(Q7*4`lH>fQO?dC`k*T&X-$vGMGTWv^Usu9*}1x%BbA+lz9xRp`&S zo{;c-)%wFqfh9)D${#0A5BkBza>OU7D)G>jj5nHDsncc!FTZ*?m(z32>5Jh`dW&D> z?|Rq0EKSi}Za$mzvNvJTxz|fCX@*<;46Eh*y~BP(yU2fri8c1m1h>U3{JC-A?^)*~ ze?I%t_qY0U`qRDs=T8UN{e1s(X_4{Y@JsO*`6LYXXZ~m4zxyud=ZUJq7s|gD9{%#z z|GuQe6^W~R6nGEVo@f6ScIWlyzuBp2mBd|`O~ZSosm{lEEtZ@vG$cfZB<`~TdpUE8`>Lh^OChU}U9 zpVc4N|7S4ce<7a9xjwyqo|XNt`yY(9)?c>%&!8J~@;}2P&{3{dFQRkGXV;&;KJ)&& zr(5l==CB=k|DS;=>)-SJ&r=_Zr^v6hi~F;2$$ti^#bVE`ksGav5%C9IQsTU_mUhV8WXcjk+o z{neXyd)6Jp{|v9iqMw&sesU$UFa4lw;k92ncS5c_6)~Gq)?=9JJ~6~^<;I@H-V@ho z$2jC=yz>zx0jt?v}^y(r@L$lg$;$D_Dz5BdQ)H4(Q|v}<=UL> z%3ZeJxn1Sx=7?>t-)wum_Vv8kc{8^qRV5`QRb}1$e&^kb{|w0my)RG9wn&>P>HF4i z#ZeWTBYc1yUwWX?0NX+wB53d+5W!0 zkycZ_==I!IIln$*SLj>&q6eGB+HQW^cJ}k*-8XJO?daYc?ta03lI__+}@99m>S8EopZ*12xGmg9V zV5e>!zdGM)waM|eSszsvmD;lhNnD<|-TvsD^UF?`To#M|bM>CiykpuAx_{(-GOxe1 ze&XYKzd7%l{V{X>-PZ0e^+)!{e)qp?|JeRsfB9HWpzO{4iq|9bEe|bY|8;LBe)-aND!+>3uGw6-rX;nZ zq#0d*wv^nq^IoL-NIvz>{pk~aJKy}dUG{o(T6b*Un>ogwbIkqOs_W;ry?*;?U&)5~ zpJ(*gWCn$7yOiy8;?foi*NYiZAudbSYAGu#f0)?ocsk|r$Ox+yiw<xRn%#pdeWOJf_ zqnWq9s@5vwti0TdRgXS9XBkb3tC+fo|K@)Ntvb6qw!hbG+Z{IV#iPzwC+lM(A9lQ$ z{YPZ`lhxAxFB@Mn%TD^#{yTcw=7MjHdy;k;-p%=~t2Qe;%{RR6&UByHe&4Ha9{t&9 zf8)d5t@<{W^Vj|mJ#MqO^x3^^vt!zE*SAjNxHH9R_WbnAN&8muBrz&##Z-NpEL)VL zqR6dLdhuS#q^(PN*W2g)UN%4N!rj$py^gzX`&t-#r{nAMy@E!cxHtDX-m~_8w#R1o zwvVpc&&$v4?Yd@HanrAIV2tNm!|Qyu7pClc zb=Pi-dz11ay6|MIV@@iO_PexYp5wO59ZKAZXKx_`CVxFy@1 z^G>P7qd%8LmVB*v@jjwe$jFn&Epf^8hECpvwswrAveoPNy0W}7mz#7J4+(Z@?(ZThiV_Iu{L$&x+yCOkU3a;aUd ze06M?!M^kBHOgkN9{wEQSMqg5^wq*Mm#<%!^7zYG{?=P|`E&-L*B#IK&yZesTlB-3^y7jb^`@6M*Rt>tr`mQ?AppIGqivby-D zvs#<9XYXk;KC8Pu@uuUUjn+Ypifmr}Nju(6k2~&sa?Z_N@mteQ=0rQH@g z`mZ^;BF$@c$5O$GHR}ymte)VKlCspm_43MzQ|@m*Tjncnn)!BHX1}?Z_2T{F(Z=$Z zyHi)&&5T*OD-y>N3CjRuAMJi-Fv0dyz}sRi@PUe zl&U@J#NwBHTV|}ewB*IMe1q&;M<+`D5L%>Z>+vVkt}RY+Q`Mia=NFzGtoPmiXy46` zzMJ_4c6t|_-SRo?=B}5|+wEo-Tz7wf{{%2_M zd{NJl`E1oWUe|BOL*tj+?GChByV!qL+IByS^?jY6@9tjyFyAl#r7U~mPaPf_ir?r*1BL})b`$=i(6`~Q|lI0d@PvQ>m?61ERdvM+N{=FZ4GYuz4*3OE~+rCV_TYlc0iT56? zIda6i?riVez*m2(=f2r9_fdcE>oex+=ZZMlmMlIIloT>~{oA;=>#r?8d0>6PulWtT zcvqjDc19xq{N%;5)6QOg)Ujs2{p_^+EAMXCwY$2wPd9G4olTf~-Jj{M(~eJj*?wlR z-uX}O+;ZDimku|{Yf8$Ctmdx_x?Q+@R^hSuzSlv@9*IXc zE19&3O^=u;`|Zl~h}!l5FQ-c>OICE8IB}x(@yR;v$7+_d^E=o0l=yhBUw!dq>96cB zv(A*IUQXGTyX*EMy=|}4Gz|@HK{Jw_uiG#9@6Mh$EoSk*H}uX=IIsgnzi_hvl`^7In5-sIxq;+$RSUa`C8hRLr#n`7O1Zr1PK zRFPIc*JJmoKR>Hn%ktYdt-JocF8IPxvy9Vui@mRVTz;k7vn^8C*7#Z4>kVPqk;jd$ zhu`JS%CHF6GUdCyzOQ5Ld)fH(z``fDoV?1ySFCxx;Kb(2BTJ?{nZD8I*gW-h#xJgj zlzgb*7BAbpJ-R=3`JFXgelf+l_arwZFTb)&`6TbRzxU?6o*#MY_kNYEyxALHl$NC* zjr_JPD|gp67yppTGnV=>&TShK7c{bJg5totm;aDB7a(^F^h{ z@2oZ%IqMugxA4lo*WJoal9_3>lfE7mejFDLzhfOctUD46;a`v)&`&Qn4U;Qdd_w&+i%ch^K zQk$NU5a}jtkx)NA!z$ z%r!eofBH#Ih<*6ewsQ5BRe!oAwoLUbXZ3n9@6w`3$HL8at=Bi1{AY+?dUDaV)Jv&d zDaUKCo$phd^jGQAyuXW|^+jFy%y++Bt~+w+(ODK9p5gVzwz7f&F-q_k-L;b7hjBhrj%(DHD}A=WnKO; zmA~K2UcCH<>t)ZyC3RodZWZsZy)$R-$*ehAl}4r6zt#(9?dh`K@Mc>}ht;9=H@2AH zR1^1?R|%OSWmT#6SgQN6+xcR#Wp~+*t~i;$ahV=>=AGGlTY`^9{ge~g|+Y`5fPl zD{h^2;aRk|zr5V(Uy`$?#Lk(wEXt?ntf$e7v@|zsX|ZkQvh#h{bgsGIb?f(v7rTE2 zYKLdtSzoXEZQ|adv)9h<__Dh#;<)fdyR4s|cch>0`mKIAYRkg+`j4l7jeWN6>GiE2 z_8jLu`PMtFmVSN3b-kKf_9De% z**RUApZ(`-K3X1AsrRVkgY&I=mw6ZWd+hDaz4_Jr<9q3n>eGSuA0HGuIvq6XsU~@J z(#xOO&-XMbN!;9iVfOCj9{(A_&xvQ~mTO5ZjF%JSH#i+p(tR%KwDI$}GwT&k2UduE zby>aMQ2E0|b5TuYBPGLaHjB6Y(|meXukXdOcvJEF_aE=Sc~|(+%;gh*KL677y#JDT zuFSzRGuHRa;=CT)>~Hus-G6Dv0-^ZkvFI1;nmC8A~#oRwoW*?s_sVj%9-m9y4CXh661M(_wxPU`y#hx z_vt^}e&^ zf9dgFtKI#jEV_%&oyq!jO@D6K%Qec{x8i({2rXLo%<|g98{emzs+>N3Xxr(FmQBj4 zl@Te6UU>xauRHVYcj=zpxo-ED?r#s? zo4p}pweXugcRs!{x_q#7R=sI?Ou>^GuV>_1-t#_jT28Z|e!}lvZQ(Ohcf1oQsW92H z_|#5*t8;I&H~2W6TvmTx*7Td(k*g|y^C$N$4qvM*`JbWoy5H?B&#y&aoOBzsvLWeq z`blGx4}`+;w|%>bAY-bSmC$voRKVS@WvkmAs;4 zcvyGYp-*>@>!{!GD=b=OuM~CV_j!B8&(Y^SYOl_^6V-ENtK`g?Gkb&YY~5)p`L63c zkN;}ho6}!NPpV9I-<(^q>6o>0VCh6J7nkT+kHZnTQ4vwZXNS9pEq z+U?PXCxo_sJAUMo`;smD)s|j4yuByWhWZO$!zXR=l%F+ zO=Z&QxAUG}JN!~nOQ-T;iqo{yMM*x1FE%aSH7VNv_=H=tDyIk3v2J_qZL(sokl_wt zK|{}1b$M%dz1Hh~Gqd|qw(z|fucn_#``5U~S?}D3Y15WVAKZNAJWpnJ(6p_ayPuSW ztXY{IzbNxpoBzHlyJYsVTHAfs?o4;7R7?Ej{APdk=`%5{Ti;9m>!0u1 z_IpqH<83d$-nRKYcdumJs<-b?N^9ioPYNrYl`b@GTTouOv6N_C>YPgP&|5~K{hLBE zUrq8{s-v@Orp}2?=Tl~<&dU$o6EA4~(M>viuSfU$ui5DNYmU|{ z=6!CL#aB#>)jDl?dUcHRn*DNzc6ClU*sZwu(}w4f$0y9^cB(!5d+%+x%cVEc+XJUn z=+1k)(d%ycBrB!r$%eX4Ukctl_rIl{F=IoX#bdqm3y#0<+2$V>z39buKFt?1X6#lu zdi}Poc=D#-)oaBKW2{77O1x&=^xiV@(@P=wpIIl5+g9x@`ZaUKm0F+khtf=^N3TD< z;-sOlVc)*>t?%aR6!o>IU5c!W*4-Uxb~G(XGrviBr@%T+O{Eu}O8Ooh9s3xzhXreF zyV2$1Drx&JEpz{&;A2mJnv`Aso@lau)4YqN7iN2^UyQYy9%R>)d-Klu-^blWU;MlN zho?98%emwI-*TRL|48n$7r&Hw`NOi#ZOprDv|O-nJOA;Tl`FaQ^||ir=M}TKP5l|+0xBywucytf-E}X0 zv+l=elOO9&KUnWN?bqabk&5I4SN=2j`4yZ!^|vLf?62+}tGTaZo1G)(r%F8U51cmF zHav3qobb})d|stz%&t9WS2*3Z$MgQ~zxz$CeT&z1%0g%S-c2t(9tfUh3I=?lKO#6FKvTPu8@z>rbz`5-T2S{AO8N^=ISAnVCSt&?a~Tk z9<6`t)sN{Xtlns}?A@&7;MLDIELQf~Go{UYORM0vM?4oc1%;&4&XwC7xZujo)tBy? zr5`Ve%{g9YRsYxUZp6;%)4t{9-S`@_bN_?Qfm>c1#CPjXcaNQZw8}BTNVGDmMy?V!7#`WndFFntU3%*gk?TPE# zQoCi>1GiWEJxqJOE#Xe#QQfm$w^!bq**D{pZ}N#hPrr4ZlA7o6eC_Q?U(0=emYuE3 z5v0*Vp%C|7XaYUAjvzX?I|sX4<0D`Jc|_&JW9-`SJ7( zeaCgB=g-{jNxWq`-S<}S;?U{d!p4zv%04_jE^B+*@Y%N0Nmfd?6}tobZqI`(2BF!) z5X&EFp2|Tz9UVPq&ioP-tnfK={(y@MUy@qd#B1%pyQf_FaVjE*ng^JXvKt@|}k zH!(2eR$Szsz}K0pmq*>OTQ_%_Vz^sb%=Z436H9X2Le|SKFq`&z(e1R?yB2AEu;pMEyZRoi&>CR-WDXrSuGA7sO>s|aJb*6h; zW?AI)c=uzb+%;#ddXKARzTWk6epuFDnQ!6SqPG;q_2+F~E+-R~-1+{Pb<&CX9XBW6 zc^bOm+mWZDw60VZ?n^%0FE{VTS7qIMt7?8PcwPRWJnxyQ z&q~j1om;=^nxcXq6- zzU#Kzf*)lbKaF7Av%bjmO?TgW*+@R;?t+bLmS+UIo36N$(YNN;r?0#dSDg9HyXvFM zq>q9nN*@Gnt~a%UXgsu)9$I_Rb*#5{d$CRuD5>7l1=aYeomBc z=uN+TEJ^v+HI12O?Cz}}n~RPM=ERmm|iL$dDP?y~L3^${1mDbe%ErD?^fm8;)ppFHdzrhdRO*JedT5Wbd`R&!?LH z+Pk}K^CF{!lXcoJ?{0f1*{7Yp>b2h5%~uU|6pHlk{Ci<@Q%pRjF?RY75tz*r8E9c6!N^(J+TD8S%F5U9jZFv6hb*a3+Q{G0+dUDI?{<70|w!Kg9 zKYIDiwiYw&EGPWX-;BKkj<-qf2IKp{!tJx9(gsuhOF%yLs*! zU!G(=>++}m_UP~JGrKF=-X4x!k$2#JnCbM8U8{5C^?PM5KV6bMlRIbA<#(IBz25U@nwDL+)dx=Z_Ayx z-mmgnS@*}w=UaX%8NS-`**0)CZ(5T2lcGrTNBfeJ&P@05Rr;{WXae)g%w_hSZv+3# zdayt1YjV*R`GkaDzVog5&wRJ2D|l{GCw-o{i)oS<=ZWjmn?plS|n&3(O1f2q}eu4`Y{mDgHc)i{4_skOqHzdx>= z%RFsaKIgOjz58}+FY8};o-n(1c759HIBVtAj?1>$ge4r$sXEu<9yy0`cHV>4H$`Kf zZeE*tbZO6Q_w=nsvsC31j~v-^*obY)lCN)O%`Tg=OY(iV>BOsb z(|*iXy%zg%mh;QM3y-gQW6rniMZe{;`z70td{6G?TQ2fzWuG0t`})hp_tiTq ztA)HX3wO+_d-RhtC}@+AN!bHKUjN5ST15$;sO@-nk^cA|7OZAtq~EpGH2r9 zNw2Ff{S|t#sq(Ix&V1d}%^xKb-|c^|I{#qIv+J_w5^g@JslKuKk;mE9S<#O0_SYzIe$xe9nH)T)+ECn%>O) zte@ZH?tA@q*R&_I-`ouj%Byug5hKQT;PTCPnwtxvw@tZSF7dRb+M;Ev@{(D*E7C8e zx-KaST;wCUW}{|nsqxCLmN#OqdemkGzuV4cb9}e^HAi_@5$}pO{~4xzubeY4 z``)jaKW##`ZGO0Ea>|eNHnr-vop0`6X5V)1+?wNyzW?2Q>|~#kvi}a(n?G_pmblL9 z*mc);VvdXJv~$rLZ+rYZm$cF9d9n4**%S9fuiAb?!e^QJv85|BUrw8TV{OQ+H|NFI zWp8`D`BRO=lbicW3nld~Z_Zxom$^jM?}Sg<=@mz8j^4cXepB-9@TD`ZX6U}0xlK)f zoAvj|%NJ#DZcCe6EXeOxE&k>Fo9A0)lE^*yaYO+b` z_wrkh&!$=KO4B)B=Dn=Pwx{M!0{iG$KmYKa^~3N>@Ox2S@%hl9tCRGdH(A z6_U08b9txTzS2KxuVRk;b8}s@O5gSir^lqJf`S@tH$L?}{&9V}$*i5To_r2Wz57q6 z?$FEmGPmQkKc9aoezN|J+^wJO(+h7(daB8?z^(>KSOo?#x>h)+iD8!_%yy5zjis_`?7q2zs0fdH{JZA&(`>@&b;>IxY(cR zvrgL8onC%0X8O(iW?Adr4ZHW3R2JTEw-S!n>_5YK z`6Y2Tw*SjKUO(r;)9d%U{cTTP&Rk^jLrr<-(QeW0=Rd8RIdA67jLI`_@BU5SdGQqQ zvm^WMkH0lDou=OG>C!w|^o}%RZjZe1bdD2emql(}bbQ9FCFZYfwoF~Us@HAt0h`Y| z>kRH0-Ossp@}!~Mv-`>Us|Dk=udjEt^Z3t@QC7J9WpU);RogvtZ(3>ERok4)*;rnd zc6yVa)p=jtju#z^PP$H26PfWj@kEu%iT=%6IxEhtohi8Fc%j}##rD}IJ1(Eu)f5ym zSyk1=El!Yg+v~Nv^tPqxb*}L#J+iIeOeU%)JmGxq_6PfJZhM{AF=N-wE*~F%mm^0m zB~_`(yZ345dE9A!+&Asc8H-c*Z%BQY-L=D++v!&4Y%nDNQpeDBJlvbgiRUGMEQ)`>m5JxrOq$2 zdvE;o)eZIX-Y~h-zr0#$=DO?7st1jX?dC4Nu2+6b|6;LQtetdPvhByxiT6LxH57cb zEA77Wt$NpW7fbe>zhQTG&%4OA+y1WiF5~sR9G@s&?XtIv&dzV&eSGEF(vLYV z<;#9-Q?gRh6uj_rbINY1>*a5I&+dI6tSEN7J^k6t&u>napSI>)GhcDTj{d0WRx4GG z##CnXTnc_IaM{z#W0H$=*v{FpW&4Xy&U?4}{jT@oB4>_NDldG$Jn_!T_9;8%-M1!n zSCst9iBL+?6t7&ZyDjhI{Sx2HcW2I=`Et5I-)7^{)gOe82l6z(mwI=0_C5L8ADa%p zTOGf~&{qC?La}D?tvhpOEA9KeNI$GvTBu2VQ>f@ho4aeo0_~NYUw!hbTD$>P&psjoaQ_|z7=cSPn`GpVWrw+D_>o;dBd99%O3aV&OIK#w%2~v zwxXYN%KRj*969H`=*)DVaMR6Vw*@0Q`?RZ6O+M&mw|v;%v-aVv$?;DkYuOeY($!gz zcq2#awr=~zJO!7!OIKg4@to?<^w{)_&dKAvTBTDg6))v(^5Wcf>hppNnPsx8?#i{x zUQaxja_PpB`!!$Bd{@fbRaHIL_)eSgvwL~>tD~R)xpVq#)gFuOw&z20VkfKI&71F^ zawf9x#FF^Z83vKwNfS$sZo5{oZsyDj;dAbsz8CvQ`pM_B2R+{HKeYAowjcL)Up^Uf zslV~aH|PHh)6U$k{B5XmeaHKji%V{sbXwQww&#JG`)94@o)0vfWTAHI zcJ6%5%a`My`j@X>HKoh8T@suaI)6UGY-upRiakE}-$mRbG!X|6y1`NG0Gww%{`^$la6 zPl~c@S$2A5>4cm=Yxlk1cRKH2=?(2K-YawGo0ckN-tEpdyq9?HQg!W{`I{=|+FRz` zD9pQK+N-9q+iq31pka)~qL;_TU5?x?%RHWX@oKrVc7*-TTlcpWMpY-iU+drQQG8ub zPS=0x^Xx>nI+k5uTWUm`Yq}p#YL4Rg!?IPp#c#{qiSMT0j*VN*X1)8`?b3hy*+0D7 z>R$8r(Vo_&XU&S<>%ZG|Ch$|_rw5m=9~JXkm3eRGlJAeKrq`}7uKKv3_g{+H?fH|O zV`_p==m#EscTHsdxd}VmlRx{-J-+;<{GSxJ_xIdWV&7PrrQPRy>-p7Q?EJb@?q&ZO z%DHXt`@9o7ojdK;#BFj1uC3g6;XI2~m_bV#%awdnoAX9K?`?{8qjsk}mYuKWk{RA` zD*xo4`7+C;I=&yDzuV^K<%0+P`0Tn0LH9>XZGNfzQn7xCobSB%N9DT;bIo2Y(*1sY z-<~J0(*2`%?0viZ;lmz5k)>DHX3O3w_`Ni<({0+LsfAzOp1L>vb5LA=+J2UKhtBjL zz0h~k)^+)o-zzsIZ~xCwZ7+25pPBO){^RCl3)h~M4P3CzHs+iEU$NEBv2qv9h+WGv z@!v~_jvs-GJ5H~xkC|Kf!2U^oU1xu0{OpTge*9 zE8j6NMSqZT-dMT&$nq$=?rY z$8T5c)BVWfdi$TY(Kq?C+wNbL*}Z=E>Acyh7e6M+JIYS~6O+ULRbBf(gQLH6>g*Th zzh{1(KQDLtLs|RFZ+^b0IrO2~_*gd2e+I9YA9yma?SHfTPyVHT4WIM+nXf;sdHtQ^ z>c+%#*O%^U3Z7EspBUv9I8k!j?`suPm8MO$=af9QqtK3@-?b{%<@2V~O8?SlFJE`p z%=5=K_v2ad%df5aYoBPAv?(*M_OoZ|J&B&Go_YH$<}0V{`}%sPi0qx1qq8NmoF{Er z=IylD^NVr+lvQfRy6XS99^GE6{=Vl}@iXf`_l~aKWxsQmZN&29m7X`Y&AJ<(EwjJv z-TGq{d7o~U%hW_Ce*SQL@iJZAY)&O5pRiqDzJz2d8~+JhSv7mvU)S&cr@g<}Z+x)b zcgxEUw=W9z*`^n1=q=#gTYK*7o6eZDyE|_8=@!1+-g(>IX-e9(sr5}s8|Qncq+jF= z+W2Ml!U}7*^v8ztf2*7}&zUtR_-fv&jelP2{9Ap3|DNi?Bom)Re7bAHd}Uret*W$q5RV{+}x&o#SCHyhrcT^yNH zHLs{PZ1sm{-s`7})o|(`p3CMftazsD)s4wwG3h~HDh==DTzag(;S;Avkk6E_=`NI#2SMzU;j&c}!g0`e2s&eRIi-XoF8bIAYB*qi!yk6g%t8rfn%jA5?ys zKUDfCc0VV2>h5Fbm)}{twCGXita81+?#Cxfd@AMV*j=+!wojK`l5aD4mfnNgUw`Tx zH+NP0Bkn)v@{<|=8SW+Qm;HM`_qwk2@7E=UFa0W>&6F)sbvtUw+<*BUSLwD(fxME+ zN1mB(NZ9tsW6zrBMOMMvCSE@jcShmY{2&SSEpOM~i~hb}rz`2oP4Nng#W(KC*>&uy zy?ia-(XX~I{Y{@`esE3fjyJQqHw2|^ubjPq>*12?t8R3!JDO`fVjF?&%IL|v%%Ttm6(E7Z2)_F_L#&-5EJ`h_S{_bSiJe^r{ z->Z~F3wE8Cx%B$^Ng2U-p2I?QANel)xz?ZhX18no=F=tbtX6bYM^}8v%$@mq>2<$F zuh-6U%{gA~@2aU^vh>8)8~%^)^K3lLZ0bAZ-M5<;7w>uGv+!u>Jk7PQQzyqt7tR#o z`;@%KBK>BxpzNDJNv)r^ti5KCS@`ywzt8bGyC2<7sZ8&xnWz)|!v5yh-|K#_c`oZZ zb<^#&ml9`o%$xb}^om{DmxXipWu2Juy8HdMy#*8hJ>NXB^Mq;HnMY6WJc^yRd6VCf z1CRGSvRU+D&pIc?r=lNbDyvS3;@PWvs?aTd(Y-IPA1LXqPnABt&m{6&&gQ?%r1w0X z_vq)hK)GlCW`589{+{*C^^fi*Z)=ynFud%#Goe>*S(4hsm6xMq%wugsPcQ!_cBI^7 zv&p;j`R`hGJb%00<8_>0;K8?dUgk{L@aE>X$rt@z&+XTfkq}N@sS!0#r`|S=*+=E9 zrc<7Z&iMrHY~;+Q_|*s8Kc*d=s!&3E4rk*O>WS=sbz*#|)19R2Buj}2Od46^0 z(r=GvY`^Qjar>h)m2#ZlqEBrv-kxC{uXi`+{_^vyw!OLUc{FC{uJlEl`%W*?{uC_e zIdk#z@aC{;$-cu*-HSH~Ki8Z2tb32{}c+{S)6fxdBbnj>lY-$H%Tj%M!lJP<9MHK z&_x-duDkAgm=l0cB z*Uh$-To;pgRAjSR%xASsU2$0`|IX~zdyluLbQI6>p69bUugAsm;CNpE@!Sx-kXJ-Doa&&nBRBu@?I$3o>}@qkYmla@{^ZM z=gRwEF8*6MKljU-FOxUj*mN&t=|++MfAhC~t)E!=k1g+Q|KIKZ8NNQaAOF_F-o0k- zxA}k9)vw#PKj*z?{Ljh%8BYEVf1v&#?cI(447cn5GsN+J{dcALOZmzBng1DXJ^%Ic zcY2lAe}*&j|M}nA&zSO6(@SWI$}Uw-l_k4oegU~9_*MFa4&SK##>S@ecGevGY<=RV z-IcqRI_5!tblQt@ZlB0szC7{8wwrUWe3SK0zxFLA%TcoALxtOtV%={~?iD}TzUs|% z|J5b?UH-Pe+?4U#^wyS{Niz*IHbffUn_X}-=lE*gTh+Z8k3+uKJlK3ASEF40{I=RB zS5;LeSNYVe@-vw(miqCPM#X23SM?J;#TOVKPpeogulZ=7)%(+vUjE#<{n|D;uU|#4 zH@*6+Sk5DmJ>*nR#O_le)*>u;=a%Ph7UCq1px%(}O+pM;(VzXVptuLaD z=ln^LJ=2wrzPekz`TC|j>5Asm>&t_bzCW_PwXSlr+(Xey61__iJNBGMtv^hUtGr51d(T}`M_Dh97&dPqVaMAY2+hKQwulKVpdhzMe zuJchpGc!fEY?iY2)a%ThcF85K-9?Z$W?#j+ne*Q4eS7)wcCmS9%DzPBZj={1XBXNa zed@b%+=(6UK3<*h#9}+Q)Ty#ok>aRcw~klm*Xsw|l`>(l)#h1E?*85@#1>es#YuCBF|GiJdvzp>(uWf(6OuT$o z_UiH06aRGL7jBud`mW==3nxk@xhz+HJhQg6#q7$aucy5Ap1hwa_=DqGtxcMe?b@Wy zxq9)F9`3T4X!s|$>+juLf2Q5upP`n1=I0-Amx}!3lhiUF_7uJ{{VL)6$^bHB&1`d6 z(?kc%X51PtwSV)m-hZB3|1;d$nsCnA{Ge6-lH{K^D*bQ8zZS0jvv&1=2Dxv$V?O?8 zm?8EJw4B`kOMPEY^*MXa^IiAnwmq#ftxJyla%caem^N$n?1xsDBu|`NJE3!(S$4Z8 z_eQN(<^9Viw0L`Nxzw|(GJMKql{)75xE6(3d+TPq<`&1k**)#J&-uxZ&pYSrte*0H zU)tGc-_8VEBxROG@9nd$DGy#&KRGA1ys@u#?TIs|Q!0nmt*vW>1d7?Bv52JtHS-IDh?pY?5X)0 zC$D-%;l|u)Pu_*crhHObzi`J)i+AQ+#(EW#GIo6^>*?P-!&>cD-pMsr@*|ah>y%Zl zwlR zF-Knho@i@1`F-vEk3U}CeR*Qf!kx>7mCqS+O67Aq8wpAk|5Ur~^^w&+>d};`l~4I> z?P}Mr`TFE;)s^|20;m3*UE9lca=vM1?X`mF`)mIlUwl;9_(|o*8|m8dXYa1el`iLr zU3Pe7uV2*B+|O0@Z`1TX#FuV+^zy~pkHXh3*o(EkspZW{*6Z>q(M_pqnijkGM{-E% zOq+Mhe*d0Y*SxdX^S$hJ|K&55UQF@%@qFo~?>o=!>y^*?lq?avQggc0ZF_E-zZElIeXpZ&lj8Te;-%z?6i!Z zW^U2>*`oBisL7Vd4-kq8*+O8tUJ^vNYAtx!PIZ;Yt z_5R(S^&2LcR$81*WqaKI$T>5pf1%)v6L-FM6@5ClD7WkE9^=0n{e742yS%N_<^ACFRM$X&5uj1J@mmiAH_!qE! z-g|P#pILVA{(5Q!YbQqPxo-Z%7VwC7>nfvde2%`d?@o10y-~X>?-u`&Wml$(H=M}1 zpY~(j(Nk8HyEKoNdGDE5^y0^PZdpj|*S)%dEs%W>XYHQf(IRdhr*GW)Q>^CmCD~9`uVriS&X}KH z^!mh|gmvf7D_^@x_jp?Ly2J9y<(sz6edQniIZf*9E&E0DQ~xfAogBX6Lek-#Pu85v ziNEpm(aiNC_xt7*W&eGxm&B5g^vGIw< z_g=o-w)fPT<8_J8+jHvLY@VL5^11z8D}HjxO@kwM>om97e(pQ5=Iq6TZ;X#_lsnya zr~J=4>qVO-_dY3?E8VVX$``)uTd#9i#5ZrwL+!S_Myqq;elDA8Zf=ttYG)!fS|HhgZ7woT3AV@k);i`Qkvqs{K;Zg)R-IXAoet>soT zzs0AlZbQkqqXa-IE$${b-w#f&A#5Q_j?s5pDEQjeBA8Y)_v1HUA^HPxbm}AH2dAC zUDH!_x5}J3e?du{cd<^w-IAT}UTiz-X1)Am?WXp!?ggiJmDTQhJ3}e&?8=*4cdYGr zJ$qB;rkjFKXVz-4J=$-&ewNw0BTF9Gv_0wLHEdTtd8Cqc$HuQ)UWv4pX&e9kvGJ~_ zM)#I89dDN&yAroGcg2)gj}yn1eh$+-xIe2fR%BWB<6l94`O6r0B;B=EyJ>o3ncjA_ z+sk%sG<`Y8%;$KY+D5}WGiF3DluHX>%dc)M{AqUQ{+{i*Q&;KfF8Vy%QvVyzt<2(2 zGHPwsUd78(_4bslGFiS-YEr9Yg;28Ux6rQFKd1efD0l3v?q|E`HQOI=DgWM(C$VL3 zN9LF5v4Yb>_h+uzrhVBkO*YJPR{7#4ZQDR&*&jLH_g+sreB}4G%IZwZCkAKshWsJxub1t-~`6S#8bKZD!u{pNX6cHv8P z?=!P_%@%2z%$f0acU$_p+?jpadN2A@Q*M{LN1Mi^e0P*teD%_5jY|Kf$A4N6%?jr6 zJy)=!^oH22R*79pf4&cMcFC=uYIBLxw&P@{$8ynIrl&vrFseIyYg)vNqq`%;Z+^OV z>GqzIZ<`-2-DlSEZR!ib1tT6{huy|Jlym|JIcGGGyA4bw%W2OQ_d_op>^ex=a2I$Jr}lE z-Q01y*J97X1$RtlFPnBZt?S2r|MD{H$#*;Zo*XYzefHkGsNJwg?eFYqKNtJfO)o!a zYj*dl+4-&ePA^{cTkogz+F7N?U5*^dvcI2ySSP&a_HB_{R_B(^lFdIMwn>`Z@Yau) zNsC2q?0CKPeaeSbw=y-8cFk9AFO{qDSb9-+-^`ATNr!W{-D7#HKCR%b)NgZL-aS^f zzS%kMt}~UUF0az-T;pDp^r|FC`FgyQ-JR`v7c0F3Ps&`MSNvJ+q{L&f?04&YetEx^ z`0=bN|76o^b=m9ZeXqrKcWwU|TPD(Gl<)k)_wK%w8i7YMCr+GxCs{ymNo|d0>&?Il zTOp$tb$@cFYt&`GsC%~gT3zK{vGory0`rK(-rx(Chp1Qi}J6}QC5ja+!Yqh zmT9DF(i_|37&vi$qwCX!I=gNV}H&$TnYo&2Y4wQo-?nQbha`rI>Z)tYmAKK^O4 zF_G%cbzQUNXwsf76NPNnPF%6KXo~Unl-d1rE@o}p{d~EY$I1Mz9}jma9~92X_; zd-HC4+OB19q_;lxi8Zd8YBXJHYJX1VjA@RRoiD;e?1f~@_Ro5s>QX!H%6q4;rtJG>WwaJoO zetf#wl{@2Q_p(3Vj`);UR9`p|U#YK9znY)jQgQpEbG~(sf$MS&?`XNN3tszt=A#=2 zKWx95$>wKMV5HMzvvjGgmC>OqX`Y@dmPWtZ{;}-x{BU9Kx5o|hckRA$`(v8ae} z+UG6HI=6iKd+qG6oL#%~PRqvMc(g9&uI;JEn_l$u94R^P{5-QI?6+j!!Hmlnk57Dh z=L>i=X1|iu%=M?AmxlWnS;;Tl7jVJt{>H@PhHu_)@2Xj~qvTTBgL%(ymy0DIyW6`& zM@{v%ukpO!hW--2mij!b)}3iKaaOLDv3gBkVqnqZF8@ZklA9VGXL_TVZ@N8w-#c6H zcFli=%w?w|`k$n%IsWC*e}*tQ>wh2OJmyZ{a(DmSFW-DJ&G+taR=xYzuPgU>dG~(? z{<>L8>g(HH_N`pL^q%zM2dQ`8$zGo+v^u(Ab8E`S+*ohboAa*A=r4TxW8*VP@zgIy z=RCfLtX`kF*kpdlbf@>9{jT?ipRKmb?3-_G`r(-5=Z(T21LF=_{tiDquYd27+-WH@ zj!VfDri9$=tZN0h|W9?>}?_2+3jZ5a^bCD76V`mxOH2sNH zi+{Lgx7Uy4kgt(8@2b~-*zd5LuggT*jn~9gO{eR}^R@T5xOczoUc)nWZRw*)DJd0Z zYAGqT9w%OCpXuq@!{+9Ud_;kf%W=c(M^%4+&;JuW-{xPTOPRQ><+j5|Qnr3d&OD=J zGRyy@|H*W}gkSOtmZdB?@mI)hairxti^~3B;lFS1i)DQezG$twvs&b4-u6`{7Rje` z=NNxX3S8klTZ`dd^KiT9#@~H^{+yT%56`v>W$)O%N#XVNZQJkOzddW&!w9{E?)*&F zW#?ty%**V3Vt2fALy|yB|6`tB%H{E@#dFGbOD^4%_zI^7t+j<(?&;5RVF8pkKx@gVSdAGJK zchxqXJon<>hnIJ*TrPLi>}hL|rSa-T8?GJ5O$)ws+1(J>%3{Pwr(OJ~PX5)6b4O1-~m^J?eb5PkFCxu;0peEUW7mz6AAf}M!fqT+a`U`#u81dOQcm%jD4lw}!z&$6ZD?sv);?|3 zk>T3CMb7v5uFSl9W_Jpumuam1m{TiuqHkWu>wPy~cD~-Fo$vGEvQCxkFYjzi{Qs+?bX|T>t%7Qjiv6)2S;mePqWbde7S61N=k~G`<4Df zZgI+r>-|#}B_(aV!f?90M4k1;&fdLx`DG!d=PpadsoH*v5AZ6Tk|rs7WoE~b4bSi8 zT-Xxg^GzvcH*;?6R`)KSs{5Aeg0`Rqeul+-&&y(S!t*Y>#Fo_Ty=;6qy(`nWyh-y@ zXs_#+18=X#-*~R{;P%h7{|x5ms_*_ZOgMSbc=_Qz-Os-|I@f=j_}uXE;fN*iHBVlC zjxo;*-fFgP>Z5scx8Inp^jqqxRCDxY*UXo!f&yAv3C2$rgalj&ymBn~(zDZ*zDFBl z*{u8by_#@Yccq()nYmr9+|4C(cBb8l@+muBG!e8}P4JbAONEl0_S@=sqvG=hw-?-g zbACs$*mj-szL)EKrk~B*ujVuTeBYm$`n!~rw#SyZrmih}_}#DMXsOlm-kQ+8XEJ9L zeoIQL4mQje3%Q(o)a*{%hdD`$6-ou}d(|xBy*+K-n-!h8X6u$j{AY;2WjC4ia^7@) z(fPWycTE4~xcvHP$M*2k{Dt-gd9$jE^KZ{dy5g(d?b}rB5~givxqiP)nAP%j*=yHV zy=+OG`EG*cW7V&gfyeVq4z<<#Zqr#^*4r~>`32RJ{hPC-BY*WQiCF*EJ5cyd;mb!h z;phKqq~@A0aJyJ$@%h%-d#`_gw5nFVGROS<(RA}&@_Y2li@%H9Etg&&pS_3ccx3E@ zuO%n0_onnXZ%bEeoa8<4&$A+%cBRU#$BJey%9vf!z3A$#*AHG=Je5n^KeOQ3$=Yqv zW!h`|ljA3K&U-*hKmbaFE%)8li?(g;U zE5(iR0Q9{byJ$HTkdhe4djx z*>6hyXDIBxe&VzJ_x?YEr|L`I$y+Y*_|H%>|8G}G`R^yM&%eN!V7HIiX|Iy<`@PGR zgzVru3@jTSlz+SR$o=>6m;Eo<8sc|Gf1d96Jxzc9*3RnczaF2<|1+eU%kM4P*DS67 zW5*5oSAOCDn&z3EH@}eo-T1Y=O?CbutNP_PKVSISns7f@bpA^D!&0R?YNwX>{t9^V zpW*CV`4wa=h|*Iz9=YZ6y2AWzEkk% zW!n=q-?OH8uWefNQ6|i1zlC$)W>=%Ta*}o3+g>mF%O<^eRpIT|wjX`(GUWb#S5f%W z;K$ybMd34}3*VP7={nJ;%Qk63Pd&>K*~)7@C-yA%tom^Amfq6aPTj}c%$PUDghy|D zW$aTDyJ|-NvzzH3_tgA-B;BTScjcSgxzk;q9Ncib_M-4r%hIS>F5j2Uc$9hFv-8!A zNd1zXlU(}ORJ69Od?MQV?!nnj85e)o$`*;Kw;x(P=acm7tG=7QrORsB&0{X;z9`#w z#VA_ZPAB;7x|7DQqCJ1Ui2Tc361nMH|Bmdpou4hXRD3-1U8yMb(KhY-Gme%V?~2;q zTV8E;+x^a$_v>@4rssXUb}MVnhU=0hzO9`GpDy3B3AV^Tldo{dQ9k=@=BBQG%aSwu zU3coW)mEw7eDmE^`F4NcmX!JFZ9n$iFRYJo?|LzFe%UAI?`=gqxpSUwDeGLaN!fo_ zX5OXeGuGdfitIdId-v3ngOhISE-&`CmA(1???t&~jrGTDeRoH6w8m%2?i7}rYQ6dO ztwUvVV`lAc6WKC7_|wc%Ud|;`UkAnRn=(3KK7IP{+UKHg-p@>=x3#@ayZ7YT!IJpCmmiaN+tgc5TKDd*ZS?UxffqGi!Mc}y zZ7Z1*pS|}j+%{ca_1t2)?1^*dOr0g|zhU*(&vqB*r|$SDFmIXXE0sBmw?}XJbZ@$^ z;oO)tNc_GziNqIy24TjgEe`EF*>ZPVkWf90Ot>#mLHI^UN1dii4h^l6{W z6<=(T%;_$zDEat2ZDQn=)PI+4)2x2v@5imXnH(qtb|9j8pwz@lJ&lPF6oX5=_ zJ8OE(lceT)2ZlDL#m@4+SVq>Zg%~SUVruRzU)t7(Vj16U6*@VT&wZo z$MqwtGM5Dvy=gmL_PkJH@{_xH-I956s!baWTdH1)e)}#qU0+at5$CTd8l7IAQYv$o z<`pi#@c6=QyHhV`zx(L!y7hz4ne%oI{K{Tnsqv6HI>&RqR}`Ho_4nJNYc_3m?h=U@&IdfN9`ntH&k2l?^czZm5 z>oz4@w-a&Ct-hJmt~@y>)o;Pl+pqudeQooN6?>9XuDomglvjb*uPZJun&#>LLhAHo z$@)z)8>Q~%$xqrXX1y=%^`g2ex%_`0_wvQe*?3xdj?2$ER)6C(=RJv?EvEgpUngPL zJk3<~{p`lKXFYGQTvosIn_ltiqCL@xuZ}-`dh55^&Li&^2i|?U(a^F`G}qOL=TW0k zp0lK$`RzBlF7uYua-`fVypmN?%@-Rs?f0A0sn>jSXKu?hcPTyIyI8KbTJPkU+I1Ob zvi});mtV~=jo2#obI*;pC(}iDtUD=Qa93D#o6gM6rHRW{RaW0)S+X?#`tB+Bgp~i; zn8h!Ot=q}Q{-2>HKRzeRZe{t$y_wrDMsJqvn158--lukH^RNEisjn{$};f{$Flq|9P{2<;SVa_*>|kPesoDhYI!k%-3%-l@HndXC?JQNj z*+#cQ*H4s`TzI{Bc6F0i#~zimqpSEA{-}~)dLgGhZTrzXOPg-|l$n_fp4b$wwJ^E< z;7i9{qr0+_TdJfV9~NACwEz01h_>$@6`wDb|7Q^VbakPt)aQt|GKK9t{To(F?DOrp zdBVy6adk$%e#ZHWFBS>rU0X9_yZ7XsX7}Zm+_smU_n)D>Z{6w5?{{f_`<8n7{#S3K z+wu=j#~o~uTftz|c;_r#FI3K1{;qiaV)t8nW*ifF<&}DD-$DHuDOWG%xg9sMp7k?t zscnsB=AD(3jKA=vzUZlzx?P@{2P_t zI6vb^#~lxUOt=-Y_=QWFk-6=oIeRv*n4PpaAGD%S`SF(R7p>#Foo~;(m>1cddtUP6 zmoFthXTR_Gc;=>{?9Ul(lh)1;yO8=~q56j)=dkp(@8?;rooL5V+5CcW&-v+IPrmE_U0uyqcyk};XQl=P712!t!O=w%g0@E_!n@ujXQ&)rXsJitb)6 zwVirT>qxnpYTL`p&m&Jyv^$lun)A{e^QAts6>kPDv0C3(_>+Ha-mcAGuB0Uk-Yva; z*F4_X+&|{L&tB1k%MUI+oHyS$b;gHCk!`n=bhjz*6%^^{7rr8+wbWn8qH<^D^vw#d z&j!2vTCnL)c(Kj9noQ0k23qcOUc6oVw@b)ZX6lyKpG(B96g{_S_V#=+U99`r!PB?< z4YQLy7jCOiO78pFpO{kqZr*=}s(ZV4&%N0beCvHq&CDCeb?%?BxjyfHO>FMPWtVQ2 zR6h=#q`c@%Sn1J?CZA`f+1%5Zb=P!u?(RB0vyZ=-AHAD?@Jrv$o-N5YQWM?Fjs;2i z&T}u`bJ}fO6cm*+>2iiw+3fUNTXw76?asY;{F}wwrRnQl z&YQh%KJVqo`9W4na;)Db-eUWEtKBMl=lvP)I`5S3tk|Kuo=v9gIG>KiqpD;%ZKd0~ z>wPZe?Mi#SZsz6b`?F_%u#7yJQ{A)c*h8^h^}S}>@=~W=eZR;xEP7|0Somk@IXDhq;cxv_K6}x7t*#+GRzHaU;*y*XL>E*pprBfwt zqF{;sJ04x*$kmrm=XU3IC$CbR^6%N%+ss~{4@XTsvu(kJx3f;4HO(~q-Z|~&$*L0=7+nU+pq4soqXzQ zzRx?)^XKL^=Y?my*{!xa<7{`~rW;*nZZ~(G`TU^UWas85Ghcq2^6r{>=>1*Q@=y3C z-`eG_8Fh2ftq3{qma{W12|elB8h7*kAWxTVt-_2b-*S(T4*QZ%!lIKLx zZ+G;W+7`XLUA8>)PSFd~vJcOW*BtM&o-F%g#>>w4_HMEBiszla#jlq8=kA8op51wy z{c|tcif()HV!!N1VH-=syTYm8t}l8qBl=>V&(&)iuic#X@P+AcQ?rHtV z4u5ue%Zi(ix5WOlEYt06{&;Qoy*qZ-@BRCE`dLMdTz=a;wyxM0Vg_pEQ$8#1+PZB= z;5R;-OMfOVxiH(}*L%M1vdM2Iicj%9tUu|m+)eqo8A z=O?KyI9~CVWli>;;F(u9M+NJjxD&LAWnpHJ&!f~WAv;5>mw3Obo&Mm?wk`8JPP(K% zcwxGKi?rIg)GIE3w$?^;{&=5j%eOTw>$kuyqe#<^gJzY5PfqsL>2BsIQ+T_=#=)+4 zj@{i2mg2{3)ptDfN(-5DoN;lrqFS8#DY?{enU%#+S9e~Rvh>>1(#w*s7I{taP%Y70 zoWG6t)ZP1Om-Ecd_&hn9bN9hMEB$`ei-u3?3Vz2und_b&yDYzE_PpC`k1x7obh~S# zpRVoq%Cn|l-lrU_v;Osb-PEj&_vaqbe(QenD-pO+}_`8_l?VyK`XXmxe zvb8jxrqr2aFO({O9;&Q&7r)=rQr{HCAG^t-7a1>fZC z7O%@}Uf3nq++gZItj-Ish_^SFhIwbDGZYeIwPy8h1HaXWvj zw86fOg}!CGmcE#J@rn7>?UR<~u&2&eixs;)z5GhF*^{e2t`qI=-i}ZG^Ltt5{qEcu zFQ)hJn_s)~MdjkTTWsgPxtV)<$&K8TWy@ZtZG3;`kDr0yVDLmZcef>^#v*FZKo90^~msGC_@7Mpxo~jy?=A6C7cJbDm zr76pKdd_ZEtbEH}u-$vp?^_#>&w981$;~&*>ayD;E?;;)#rXZ*W#@h$F5hc*M_91b z%I4dm9c#Cr?mmBhlJ#4U#oM3ENL}=y(riNixh36?c++=fmz=MQd-7oO*~HBo)F2hrFA1NF{>IEwnJMWU7IRiFsj|68+{u0Js+q5pYW}EY zsO|dEy{_aJF7|y?I)FvzmFB>RQ#MgP2D?p;u-ObuaoD^ zyH!wmMsV4q50&R@3;r`$-uk`dwuGR?&tn$Pwp}h(pYVR2kk93(Q^U^fJauckiMZd* zEi;22mi?0VTQ+ZByZ8PqvD;-w`)+=_SGDoUwpV}BEWhxbp3k23>&%YV&+5f|x0kOj zTg=aYq!R?}3elIjn^SJuD(;-_UsEk}YfV&l z`cA_YmlMyLe2lHVcE0Uq_TzWWCSUJqo~bR}d71a{k!{aru0JlAG5r_1+4RR`kx$!$zgHF8 zO%6V7yUsJIged)1*5Cqi1pZgX$?rKSmr%9<%&g` ztY`A1)JWGgS~hiUi;SM$jE;`j*KuLN;l7(vb1J{jQPKyU19YO}Oz6R8v(=`va&0%) zRln=b-DZ`RR<%g%?fvrGX1wbI_vTxEe7S9|p7y4vrzch99Pc}^_Ij-GosNE)udb_!mZJcN-8g|xwQroT1Crktu9b47)aY^rs z3jq%&N}XxDRy6NuzTTT1TZBEYoZo!X@b1Y{?aOz&lay}EdlN16=g%+4ZyRTCi@Rca z=We>}Zrv@HU#!`+(Ja&8?8UycTjzOi=I#3PQ@3-*cD3lWoijQTs_z;I{w{f7v`aqa z@u!lGU-Hf-^O}s6>;-2Eb+2Eg@OMpZ=hFWSYyUIs&JBO}?a!n8^*`mKqpp2ONME~V zLAi1Lnfbl{8UEa`Ul6-QZSUNF6)*lXyskfR>gs<6pZ9;Z7OVef=>E^}=k>zejrVf@ zGw8>q*YBQo<#*@?Y2p2UI9LCk_n%?z^q$xWbz6Q`e>yh#Pqw_Rmi>aS`#0SD$t2ak z;+O5eSMiJX&VI1g{?gj7b5|_d3F=80t-W)6XWbK?f@^E9pvfndZN8-+gPp-Ifbm zQI%Pg{(Juh-_wC@H+RQwes*|Aa!1!$L!ZazFJBkTn{Af;{Eln&$DQ+@U%s$ypY!qC zk!LnNuF9`Gc>ApGx%0U*L##gpUcem?mB=b5yCH=U2ZLi$R@=85B&SU#@ zuJ{xhZR5+#-EOS$@t%sN#Wzl#k8k2szIFW0ciOS%`?50? zi*CNVtY4M7CfIlBvfG)e7j+kEc#1EXq@>?sdMj+jhi##b+72 zn=S9`?;c-ed9*Ldc+77w+DDe|YSq{sG-uoKb9YF9A zW>>AhoV@$AnQQV%TmG}>vu2z5#l1D3QD(F8&6e5swu@BcZVsNLyURvA+I#UqgG;CP z>HEjN%KI4mG~Gn6NO^mO!l70Z*p8`!j`3OOSa{% zbcx+0!N29Kn6J6P-B~aGoj2WBy7@`R{Fg3&+}G`EwmHA#zP0q>ZAtsoqqjXj-K@K{ z>&VBulVvWiZ!1jMHu>(1UCJwa4))Dnv}>2Q_ZvN@Tps6uSFg<1Z`L_?an`FJFV%(l zxY=rVeh(L#aC>R2t2d|iWFx0ZnW=48YI%OC{Jx!bd-dI|H@^K9-4oR_J;?gv{axuh zbKHH-7YX`RJkN`L^M2~qISI(!-4iC8g8+Vc0D-L(-~uXpjRy=#Y=zJzc2nl zUrukCtRK=Q^)~sTjJ?P9=bvo#|K8g_b9VpJoc|2f88>1iT3@_QlP~W48hF}%iB$ey zEBhnP~S?O=bFz*d-}Or~5W@Pv614=}so5>G+{qF|< zlkJ!P&rmV_wRh^D#{BzLOZ>n4)Q8qE{AYNxNdTI8qPGmRE|+Fy9dfAglQ#j{a(t!9jF%l%(YN~3ezRx&nY!l5 zzNAg+-YYl%wwWks{@`rBpU#hGRqKzJ`^UIm`xsf8v+KqD1?QzK1=sHkUb=P%yNmlB$YirltD)-g2b{|uY`@~?eLH+uZw&X>xxTSqI5ZrWOWPM-Pt z__UMVYv=7)&wEkasoT5em#`ulhG%FZfItC&}G>%;NApW^LKhcDSQQFP|Fn_oV9>;KgLSdj89 z+%0-ByR-QAliRoNyxYqtlXCa6wA$Y(_0>D2lDd~qwGcG@C-XK_|M2yb%Uo{O&acao z{Liq-WBW(7WiP&cUiI>$o3-Za(YtJkDHg|M{!y7r(FUJR2;juO+0fl4$ngu>3}|^BZmj%Zi=dvYdPKQ(2XX zlcupNo(7d|q$t-EcKr;w0K`h{Jk#xJj&Ikq$9WL@-*^)qKq z-)iM6Hr=_+ATwv%nX;o+itqT_Gk2UXNNYU*HC^_b+=a8N;});GH&f3tzd7_=-cBN(B?^qvl_}F{@b@fmGWxbWpf7&})cjxCfQ87EdTI$Z&b-MWZzSHXt z3d;)DNf+LJu4#Ad_j8#`f6ARie=jo%e7c8G*?*1FQ^85Qe)z`Dvn}g5y}WsoOPsv> z`hBu~SN|Qp1l}KZSH*t!J*CRYwd?;gtf;#6Y`Zhl-h!Ns?+X8|*%|$BO_u+cbv4H7 zDe@`Ve~;8 z=6_N6TlD15#L4gX3I{f>^)Fx$I^1~wc6O)yd--MdOQaaCIy^1~WmWPX%PJBYR>&a&p54Ut!^o7cW z$xinV>geARP&lV4`tIZx-fzl$PV}#g*%@EBJ@Xl_+PCbJKcZM?PUS$ z?pbP^XVmt8X4iO`JNxUex%+-^h!%|8AGmyWsa3V|-DihWx4sM8YwN%8?%dosci+Uo zbUE9ls&7+v-R9_%v=%zH?vnPz)Z>v0V`cjFlwWy%vF8eXV7P6&>-O7bcQ5B0UoG_K zUGmA-JRZ`+FkuUXct#jYTZ^S)o;UNvT+u#53f9)*q?a8X9c#{ELik(9F%C0jfD|Cr6Yak%T3zwhR0 zx^u2a+lHs?lG;?gp!X$nR`KSzmtB@U=hi$f+w>{?+39^D3!mRMbBUSuj%l|_?$W@I zR)1=)UO4Mnn(frlE6Zm1*1d4M+OoT%lOv9%s^5*jZ1~wQf7QMH4(oi+FS=>`*=*6x zZRNZncXN{$6})^@c(bJ9)BSn&vxP5*NxMl^C7qNnIrmeS`CP7ju3b`Mvb0q8uX3HJ zv!0ouw;2l;T(bDwk}@s%z}d$kr%JPxouU%mYPqkA9G|e=|7gtl<@_c3Kj z^s9I=pC3w5mtPj12tI$e_1&)=G2h?wZszXp<1by(z3#NfyR)~Vw~E~sylftut9{ja zYH@X+!OqlUXRbS+(>qgh>T{H5kyGsFa>b3^Z+XnM=c+D0=^5?inyY*=Jmt5S)09cC zvR+gx?|FMI?{=9ln}6oywte1f=l6Ux-yBzbwXF8sEW5mmzNS_lXU)EZspTJ>F5_yw z*ZlbOrF_5NSnAyu-@V@~C8jD$>vQadJF%<{hJr_r)fuL3SY|xUxAocH>5r=U*DFM6 zwokmFrn<_qtmDcg>vXd`vA473A~#hOrSzNUe_p(7o_12^!$tWozMs5l`FyJ{pRMcW z$?l8ymCk%E6KI$9VoqUcmEPm?Wfr^Cwr*xNkUTG=+H`O9?_4}OXKfh(K zTdW=UysPj(gT8KggiA(YR?f2>i@evJI$_8uy7^wg>FXX79ty6wlx8-6;`jdJHanY5 zKgarMe2%pK6BeYDezNKl=CReEgpF*ma5MZcb-bnM~D z3@`5!_TNKyp0ZLte08(;+`5RA@YwZPoAa-}E)_fCzOPiU-o3i%*7cvC>sK`t-?z`Q zJUqQJIqhuicfXUH?=Icly-NT4waV@72j6FxT#WnUQ|e;U_g?Sb@ssC1*110as3!Bq zJMR8+?}RSBuAVO2)Tf3gFC|!bg->lQpJtq%c4^nIC+A+dxL)XH{?@#!`g{55+|4m% zcMr;GTd7~&wfSk)^%tcl>fhF#E3quTd3g2t_WO}GmZm2A?u%Ya{2cMjdUBRhPuZPg zA=b0Dm+)$z`_A}^+LFL0yn=EPfWMAT(G*!C2f+v{;k&! zUKGzew_UsJUB+QaHD$3yw>O;mk+?Jmu|b?jNq;)^DCW|txQe+sp2s?Xx`kAWgOiLf4Cjbi_$jNWy@vr>n?gcJNw?uzRpj+>L)%r zPqJJbdNStj_TscYi_I@gD?S%on^ShXeDkJ_SH*80P5Gf$^X8k|#`7loN~dJ)o!x)> znDHK|Tdr*GzJ}bMn~l`{j;!d{)O2~ZTH}<!)qEyS(=D?b_)s$K74^HofT2 zuAT03bJEF|n||kQt4a!Sc(K%h@0zRV9jmT0O|iCXqNI0*O~_pLB>Z&JqInx?X+>$|z&An_*pC)Wk} z{AY0SIA1#{d+o`sugZSTe`}c5{m6duq#J$xx|8GOTc4!A7kZj=%dYmu&ts=Gmt22a zp1E$9_0E!+>-JUbzHIR|;?cc7ktW|Z?T`JrCt~jtapCN5e8M4rj};&1S^Bo`ZjQ#k z;?&IbYqajJxN$+jY+j%A1VuI3(=GE>70xPMs2OynNr>;lww~SV_3xL>v)C%3e$K@` z=C+{sBAa=q43tqYH@~~__hspKU!Bc5cf}L-y?nLgeoW{r z*L~$(X-cX~EhQxdr?>R%n)oZFPH|0t>7wk*vi=t&|1-Q}d7OJL^@Pp*N!zCOnYU%0 zDZ4LqTsJN?GcWJN+1Gtbe_UO!(Ybx9Z?oULVo$ZK^qUfUy%#S@)-DU({NzgB_V<>$ z{}~Ryd^0P}qVUh&E~`?YSQqaFufjC9U_(l;W{`A_ZMxw-7Xr9B_6EiKkvVPc)O z>9cQ?Pwk`BZ7ENmv(;(b{MNl;^W3=sp>8i0d#ax<+x6>SyV0BXMceb9^%zdd><-Mm zkyc|Kl>0S*+l^0K=U=v-RQ!2)!tJTIto2T=yJehoCuf_|X0r#6HrxDAI;)rSQ?06Y zsrA<0tL5+J9skL^nY@5bD>7j9&Ny|>9wc%Tf6rFdrwf;Ih*VFRY(v7!1 zRHg-AKVaq`z2x}1i%%~;{UsMu9&N{URQqw?j*8Axe-5sB>X&k%Sg&dFnhRMU(>JNF zdU?Di_OSiQUCM3mSx!H<-?~+-c43)b?DB7|##hl+;r_Xu5 z>09&3+4bf*lF53v*Id3`;_sTf%S!)vjmvpHpK_O*wOe28QWN_UJ=wH$P3gAO9c6s- ztG|9VnbT~1E`LGtj;|ppx?Xi9-#z7`oI9LO>DGvO7O8r~yDfIhJRW1Rkjv<8#+Ity zpYruyTP~kb9KHNziG<$SX+M{{ zZaW^j(d5y-pG#-F=})cw9-X?;JXYYB@e5tg;DuY}t-fs1UwO4|>%qb^uEu|6nymIL z6#$xTJy}w-5YBooH+Hdja z_t{ zY?*L>hs75y{ydZYbk^<}Tc_7)&+S5SzP_6`>b{G1TySOTww4t=znvMsP26#N&E5B# zPOhEtGNs=9cD+|#`?`BAcV^F@_S@=mR%zJTU2{|7SMO5O^tbmo`s%@E(R-17kJx&$ z?tun@85kJYD%*lGA{ZDL(p=oqYB~0(r9V(o`r;$AW?B9T-S}qVGd}zCUR_*wv6{cH z(mFEbQBCf?-+7C6NnNV7TKfFLrq>TVyYrTpUCgY~+u!x?>t5qOflsGgPkHlumiejp zc7KbK&Hov;oQ)~FykF4pcu7U>w&X)?JD=-*p3^d~wbQM??b`Y+{g#=Y8~2uO{<AT4W_nDW&rJQ-zu4m^Dt-@H z9#{E1Br9l2+ER@(XMXk0emZ;I?&&4svBu_p{XA#R$NXnV&py<5XJgXA+wNwGhjX_j zZl3X7I(OTRj_xGW$|NNvD-cp%q}VT)Qm&m4v+qe<>WSO3ucs$mzd6@T-Ctj}wf%B@ zh;zQs@db}B#`pdH_O)1SXU+ldKB4}Fnr^NSUMSx=eWEHaWQ#zJJi@Uo7 z?>5vqd!v5ox}P`Z>(*~8skWP3aLLX4{p0;+KH=AXKl|CAocisOw#N&X{|x{5I^?a%UF-A z&wY{&f~PE1zr0Y`oac+O-Lg7n?S1W=<~IA+#IHFyKhS^T%x>NJGyC*|ek8BU{QDqw zecrF?Eqit@x>eSvw`SYp{lW9@7hArcBWI^;dylKUSh4Z-TF>KuSS^n2JG$X+=(>+9 zHm#9s4;0!jyJ&stvfkI+voo_k>F)Y9JLAq&v*_;9b8XvWj9(=yzBGxF-Rvt>D`!(t zvhBNW$2R5t#t+}0`EtH2D)UUt*|RpE_uk#}S#NXr&i6Z?DHWyed$UvTU3BV3)1@1) zrdccLZnM(ero3=XebxTDy*j(r^!Lo+I?1ncB0plP^ZX*c)~8cdSxcs@)9uw;yfNp} z?(ChuD?Q4U@|Sqz%4hA(-?PQ5li}ICvV+SH*Gu)z+Gw2I>bU9l2q=(C$s-gk`R!`p2dVd2=~md~&>!GdfSv zWr+s(9>2)i8}ECj`5gUr#>c0`$EVcCzfNSURE^YL+h4Jv)1F*T-Sk?2(~Iu4yKXN^ zdY!i|TR8Wkv9Penj9K1Qb#MGW)|k(-+O=8ylwNk0rE=3{_wEfF#qXx6%vq-+vRzPG zS)^yN`zDd=avRHd4cu0(e5biwXj)9y>)*~N_grnB@$GlA>P6{g)=5Uu_m{iNZv3>p zye_QDYNhdm<4d+DNbgVD^LW-@Ih~o7+|kose~El)EarN3_r0BY?^2Im&fRS9dR(w} z-|4>F`sD_@_x^Zzw(Cav){QT(MsBt7H$48WPFzjbt}v8iPT`lU`}KUZxo+PIs=cbQ z=zOm#&+I{E_UIkxD=(w#c9;sx)mRa3JOcR5mWX|k#7Zn-aw zZ>2Zt#(w`aZLys1eA7FTTcW!2PA)rHs$}sa>9zjxNfQO18^)(zcZnANcv~=AF#Efu zgyo&evY)|Imo=aI`pvLv)xvT)=aqlf-#qf1_t2-k_UdoS{Xe)cRV!TjdFt41^;z#L zSFArqp0APnOpf{#0JR$a?DQ`K)Pn)m(3~i{Dz$D9qYAV^ieGUpX5sKLsTj$L6Y;+*tl( z-Tp;JKDGQZXD{0Xr*6+U+Yx%YIqu1B_xsZea}{rETTZ%H5pZ@zN(x3A4;4hE9G~dz8DRcB}4uCI7*^yuK>Jw^N4?Uv2E&9_;PJNupf;T5wg zEdH!CJ$CNVKb@C6>t&;NAyrE^tmc$4zkPh;b5TUrck9z}eV`BsI_4dq;T~ltVoSBq+w9n78;=*CQ zwZ^@t3oqwZd4HWXbLq6>F6DXio^E_Nzw^4Spl;}sKA(F#zt8ycXXnPpv$tBV>$84o zBT;zdxLnL+*|11iXj}D}ZP(wrhjlfRW2VQN`}e(E^Q->?fAXF6 z%b(i$U3wekopx7^N8)4hT5YqWO*-4srhE(bx@&uL=JZ`UIjerLmM6cnntSu$KHC)2 z&lk;(iyp|_S{HP2$J8^;lU_#ze$?!}p{SO2Wwu1<#^;N-Ubrro>{l_(IlI!h;P}p> zbCXRcN546mXTAGlnZ<)yKVFJgEK~jY^~>xhZ{t?T- zpWm$8^d`Jo>u%2Nqov8yR(-dv$v^sLam3r&t((4W4vhKKwRlx$=sJxY?xRm~_MCh( zS;@>w{y#(4O_$>J{_&Sr%Jw_ov^(4MV}I;?vx@$SUCG;ON*?XLvP&|2)_;bI_{{2c zv;LZEgL1gGD(Ny%bQgytk-5#u3h@D@ba|V{~0{4x>WJXanASA z2~&P|YQkd)H(w#S_~uP3i|0+$D|-B>{KBp1cNSZBJrY?ex#CRXzl>Y`@Zwt=a$>P{qfuH$r<6J-Qva2F@)}u|Qw>`QM^*;999KPpFH+EbVt8GaA`XcGlq?^;8UyVFmeDY+c zW_xs`?o1wwDfVI^7efrrCKPpL)I-GhTMS z?3+H>X8#%M?;80P=Ko@^JiqXMm(QGtPmgDA`>og4+0Ww>cKgjPwcBfFZhJ91EwSwuuxy;u!d23%=XP3<`-SnT~w0*`3e}yaUH!ImPW$&)ubhqDm z+MQpoKV_}ozP#;4cj5KJIbrEX&4a3zsfxd4zI=PDU-s=yZ)4Ujz4%6|=AzlTobdSh z;bLced?IK4*mS1Y(C*$D!AUol+^n4}ntDAykJtTJZ)ol2ZR-O2U)Lr#UfH&Cnz8SS zfF!q`OUc&)FNGa*pE^I?(8DD|^unzomv&!Xqgzu_CQdY!>eXxZwfrg`-S3-Hu}FER zpuCWhO~7T}*{Sy{_g5d^nk%t6+k9=9=MvYvU9XpAmwvx%8z^fYKj~-3Hto{Of{`_! zf37?uvw4s5)JnJi47*yby5j?n`$;b^c)4D<``8Anl|ggYeLiBcUFmn?zUi8;rB%(A zE;U**Tca>%(|O;*=YEO%%df@Ogc<&h*8Lf+y#L|ub+vvg+PB8_#P+`YZT0kwRrZde zY^9oai*?-HVqGr^8s?n$d3;<@EP1WA;88>I_!6CjhHYQ>x{L1Ky+!37M@FsT{;hnv zv!muoMNV`1`h?&7)QY0BJ==|T-u%vXk!{t!ha4qWZ*r@)-uP+S z^>Xc(Wp}Upr+NRmFMB8O&D#Cyn|3L^SbFVDc>AK{RdPb#mcJA{zhigB{hhZbnD>UY z`&!+ve%KQp&K7IeH^VS?GV8}OnQc#cil@!g*`+<{UB_BM|J2{}=9xYTUV84Db#Yd< zi)YlFym>dfWE(x>uj~>w5LTU&_v7*M1GOqQJWKxA>wGNPm|d-Qb91bD#^&dTaJ zR^EwizxCIxkDRSK_jS&;^WDbvYxd>O-;+H1t5xRl(|fjW&-fZFELd0T7aQX8{n2T| zmsPud<;{41*lL%(YgU|bw$<9$6@?WNVZ4sdgZ->jY?WM2e&W=NydQrj!sg5C=*X5+ zzAuerf;zV-a=zJeOJL62ZMjvlv)%LB^N&k>x%TDqy0r9lc{5+mocHE@_bSCjHJ{Jd z+`JWTl=f_0;nn+V?;BsbxhqL`+il%%Gd?D7QaV%dcFl*IDK24YFF}h0m;7g_wYM;= zOaJs(^nj`9VN0=@k9F%D9oaS3SD(I|X3ecMow4%lSDk4w7T+ZPs02E!ZB>|*SzGYL z?$mWTXYVlax6*Zo*PWJ%HN99ipT~Ej;nmX1ewuxMT$Pk+gbgq1``L0^tK6v!&fi^o zZ=;{?{lZ;mwnvr(y@@b9dN1wtqoi&3Ywp*1zg_PV+jo1B-nJJ#NjxrJayP%<`RD0W z5ssP91vYcHB}7NYdflAWYy9M!aNhRUNr%sEwEA4WspU-DRiEmJj}x+@PZU)znWQ!) zeYUm6eZylmyV@S6F zcg1$)Zhujn`#pB)`C6;Ydf6X(`;wGyZf2dj_9M@KhEMT5QsvWb9V=ULH{#~K$Lqb* zZY?_`(x3dvCRm~C@*AfUAFEroe0r_>XtV0IU$bNqzsVL(zg0S2?AE4r?>E0NKP!5R z_s}^V@sgufdfSp$y-we0_{t|tO-(KF`S*0&CB^xvH5c1w?=%m5X6_Scc30e8Oy|bC zb^VK zck$24NEV-clbGhc`J#7!W6Qjy*Ec?V5pnF_iIU=JJHGBz=C3NeZC-OFHmBZo@2vQH zmS@T`YVK{Hy2aAms#fT1T1>_2`=8AdPS@JV)t@@~p6~Z&i^GS?V^3|Ewc2KPs+LH{ zr*F#+Ph~rmu=)pGW1x2yKf zy=gjGWX?`CwHJMFqCL8E`$fW%7o|n*zb(JydgkA)H>K15&KB#Rmh@xSUA{@T*Bmar z=qJ6|_j>$v+lz+6f|Gt8&%JkA&RSJu>wkvoYy7)+Uoxzd&3rAjr{CM{z_(D=XNNmF zKE2-Tdox%_ERU(Ez>|4Dh_P&@;^*&p-`RX%g9eH^1$*zL4 zH*^1e){EJZ_i)BKoif)<^Z4A2{CBmIm;KW}EOUJ0YmIMgH;;up_wNmh>`fBubkDx< zskKe=%a>}qA8xxtj~?Cf;Pj`Rdi`Na^)EJ;zx&T{{pY+3+kIKiUo4qXRO_$$?LWhP z(<-T7-&CjYJhkJ1 zYxvIaw#RnS{+X&Cfs=z17sfFwf2cT`YqnTza&UiW`(i!qxBKqPZWfjo6WjYa!|4xt#LkeKy#_Kiwsmbe>zT$0cPmWw_+!<-% zwdUl@g?F8l0|iT?lFxc-A8_+hR#r0H@ypiFHgB@nW}fR}F=hAjyIyqmcj})FH+)ld zFXEYOx$e8L5AUSwHk-}XDc_WEvdsEF!_u5Bitn@Tu6*KNS@&&6yY9{#`=)5^c^7p)3!|gYIe^l%(~e(7$5=P@t-&1?6yS0c?`l@^w5`gOcK(Br7#pKG$x`l|r?}>-S4{FTL{UT4v#^4`&OW z9?$)Dz6la&dH)$Uz22E$d+pP^=Q%fbW|&r%{LG!#m2!B}oATq6UZ*aQuL^tmZ-edA zIa5w4`)b~JwsBYc62oBsP-7{xO&xQp74xjy()^8;t@G}Ah0TvzH1Vpf_riI5%DQ*_ zeqVVyb#t`N?k1bC68|qd=AHQ^QI!9?db2Oza?{Cq%Y(a0!>{iyTUN30eDiOPqr!50 z^QP!ZJl&PRd%U{SGSzjn#k+l`@pp{woxHe7=iZ{V)796!X%3IOwKp?9m1XXmbwP#M zr_EodnBC7<42-F&Z4?vG8z zmv?WLN1wX8)IDRDOz^)u_t$L7-*>yVPd86nScn?R z1;s9(%X!uu-OlRUQeBgIbJK=3-z6qX?KV21a>MMDj`X_OS}HG!wQ{+PbEcPDd%I=l9DFh?dU()Nc0b#(%zn|GJM;Gx&sgsK>|@ckE>NLfx-(t0`d^wsG`LJZT`yS?d$jNU zA90oK2NPTt1)KDrzcG7ya*RX0%5?Xj^Yi^CR!{a!+q78jxZ)!HIo49r1_`RZlh-Nw ziRbu#vx~Y}ne1QkV(rq;`I}GI9Jy~O`+Jv??z>Ajx~sRW_YT+{@^=50dv~|jn0>aZ zJh^yZKZGUSPAims*S+y_`x!l(r^os_PguN7>{)tl zzT6uBq$kt5+_Nu!N}W0J%NOgoKgsv5Z45S>ZC)>P{LEeB{|ufx=I=fne{|dX=#ujn zzD|3x{BptV{J*D}oq236b9moXZCfg*e`4+4)w-!$`3`4gcipzhm|wc>a(e!H-Bh26 zfs$H*x-Z`aJSk37)l~lJB0i^^1PSrG^Wp& z-(x*>>+SjJv&~I2b7p_J9rtvyT$amu)>&uDj_%ZZ=Q?pZn@zFtr^uYX*JQ<8tuzg@y@+=?Mlb%!s#3r z9<}A%-L}{4^Y$mVx0ZgkR99td|3F&yp=C13vWKR%deePT-QJ6XZ_i8j~DOT zBdL@w=dIVd?N9j;AAjC&XO1Q%y-u4RZCK*6VR~=%oV)R2H}0LWG@p0xVrAaSb;rK` zv+ar&skoZFcIP~=SEf7jj>fId*>>}5T7LhF zpVHTN)_q);eR^@XSzqMs57|Ge^3Se1J74Ck)nm~aU%tD9?|hzCJty|smN{M5OMg{Q zxP9CI>Q2jBZzH!GzY*Ga+jQI8p01p7)s5>H%`|-$(R2Ee`emcTucD-Lwal$11-W0? z@bBk#zstL`Oho3J_nUsZ9k+9v-i&SO$8%L*%BR-6PS1#)_vX*-nBvvf-tNlT`RK%q zO?SRO-1O#Jw6L*Z?##5`Nowhfte&skvL9s;a~5I|vpzYCn72J<+MAzRy{mlwri#>E zwX2_p<%`RGd)mVF=I`{F!om$b?TZwH-n{UsdXy{r(&X3eS z_-^O><1s#^zG`v?Mdyw3_e?x9D=zhh(fy_OxBYcVIbLg(yYJ-7ZLibU-CndUWz&nL z*Unyx6&5!5`LEc%bLMrP?fd+f7pv^G+uAz!8sqez{L1_m2h;6-W#%uQR2O#U*`KaQ zH{6x&&E_3m;kkBG?$KB4jXwQbKHc2=i{xsH+HKaqr{A;M7DUUc(IpLegLRQCBY$yQ;*=BziOc1r~-UmHwF@eG>Q zS)XS8Pj`FK$*r&6b(j2FRdD9KOUkw_{p>Qn+V{JYcU|ZAyLZBzui{Csx?Ryf>CO4l zEKfiGc(ZN$lZ&YjcdK6Xo4wq(cH-nV0q)jF*wRCRDHR*|BG38Q|#hf!rmoCio>b84rQWbmHyRJVn zCFOETS8UGr$jVNmIbejUM9WlST1_w-O-g@=VOj;kIqfMade|cr{;0J z$9YOGtxx^gZd0#*|E6m68}CM8Tdh}rgmiZN4Y@PPQsOs_SiiWCT`Lm?Acib%W@yj@F zY%F|H+|{8p56^jjQgCbEo4vC;b^ourODmxMrRA;%AH0|8-~nWiaPBe9P?lcAvk}?%k@^|FTuDg`a%B zPdi+2eSfm_kUbhMbn&vu=92FU-zy(8kK1+3V(<1%9#^X`$6YaYZT8tU!*|}TgD)2? z-L+}`Y~6F4i+hr`PU<&PTp5(+k|-SgY5DVc&Pls%pWTUG*K~GybdB5drhC%a_AZ;0 z7bWd2kCqj8k2z9U^5yc;_dfaVz4hsTZmxLCJg>|( zif-2Ze7xo(uZZ55gQ{Th3gKD^iZOi%2b~dvah>?t*)Xhn=jAW#1><`q}LJKKHb|i2K%ER{ERLcjw+c&*Pgr zuj|OgwYAgB_Me~IpFeqDk=yz+_a`YCC+@R(Ha{?Tv$5E-qsD@z+BW95%~CgQK3KbT z)DW381#Se46u#2g8G~a&AHhOeC?mxq< z-E7$_VW)??|eU>zydwYn#q#Fot2KK&2eFqZ=I^^Z9)*UiMtF z_3<`+Z@(+M6K}tN`ZxDi?fR)j!RInd3TyXODP;?;I9+=^)-_T_C; z(_Z&6@55f-yFZue8t1I4O?`Idg!c2pmv_xI4hpY4<~8k4x6sq0sqRMmxt2_NCA)QF zpz5|+`brnq1)ni``o8Agm)m-iil5Gy^I7;{YE|C+-kkFEosVa99^E_jTl~JVg=ZqZ zo!xi(<6DdO+e)M6N!@IhIq&20HFnyM&Ypu zW=?-{U9!!;(D+N`w(XneZ=CZ{VQ)&A$nR&qMonrrGbY{Q)bJF{`uBUslRKub%Z+mfSGC9iH&GMOghy~ZQ)*_G*%mD2;fye6eAS)U7-5;}(o%?G0q^oN0ewq1I_u7)5V&>djef;mX z$Md$GIa1rdeD<1cldsEEF4s9zQs}zl`SL{(B}y-1xsSv#NyNUq2U-wLK zo$_1zp6$!sDYuHwf3upcoqt)Ub6$UGx@h$uv%?O5?SGs9XDBEuU;LKexo>yh(G?HQ z8VW{U%38PWj-^SWR33QB!eZV(-)(({|k_zPR%-LD(B=g!aKxT0YKsIy>p*@l{uEN@|MEIGn%vZ29NH=-PYk=lI!LzGRs#IbC>t*-eWlKa1p} z?$&-^qH!mBz172&$7Kt>Of|iXjg4O=2W_{xJUhJP%(ecD?8N%5ICD{dm-) z%f-D&NqLo$)xt==ra0JwoRXaeItrdiIg%IVm+71cR@ycFv3I9xtKy4K$$MJXZWmY- zB;t~il47@J-<$HI-%uCiltLEd_=Zkwvrc}R_wLV{FQq~02j_d{yZ^nvF|Oe3WcO~hIHzk*cm0*C@;PR)YkT!| z-TTVZ#eKJ(y$@TGqoS_8L-1H$szXoobdI1;vu?C=O-@dl%q@F<<)W{p9$i;2`*`-| z#vJZnn|pY3zm;^JuD7?#W>fCI-=}_?8%7H5c(g7%Y1)%*75Uq&@5J8t5Gx)XH!GC; z&EoCzF8!9ga=%{n^^UST+drmWO5c7yv*^70ra8feX7PrC!jpM_Y&yG9?Cc*~9*2~D z&-G)yW-T}P7nrssblGMTmy@Mi#llT>|G8>ySbb{4F_BGQLIOMbFDdqaE^}VI>($Gz zJ99VhEwj#>AEvkYTAtX=-^VSdi}A@mpZdk}tI4+;r85hn;|uF#eSTW}S^a*=@1~0R z>vI+FzO`AOkS`f9?RMv)&2@T$ttU#iE<6--t0&hlC8%Rs|AniCPsEx{cHBB~^m6W- z&54&%dUoCZ^eV4^;;hK@X}aHnA3a`Pr^@_1-+$k=pWU8y?Nh((t~=iKW5(wlZ+8c; z?3giQ=}zPN)O?rU8J9mExsX7%2$x8fZ_%Ig=l-pHP7uI_dBa?FcYMp}E4c=ue2 z47>k2#%~t4uce-wYoAZ;7q_lcyUw;9J})Jedp!8=^Rv@)&z=@;yK%IwYe)cKy)Uargjp*LgK*|3=DXD*+4 z+MQi{IpTPkx9*y|f>ucjGYdJRczU%xHPzyjmGzb+M=jGdnYVq1SZwaMqu;*VHjMC> zdzY7Je`udivbEV!W7XHIZ}dNuj#?)aQ|JA|_sop`y}4{kJg0ou>1J}7c5A52?q6g* zanh2?QjMiCbI-`Xz5DKLoY(JjKOUSG{509{%_8e>XI$_8?3mHFjp@tOH+9zOZ}x|t zzGbn^a9v$y`|=d`yUEUY6fG^h@a%`0 zrp3C4i%zZBZt>6A({Q#__pF&`g(p5eJmu81%V#Z`U!;CK87LLvvdBnx+2PrI%XxQx zh|T?xzfJA-qHJN|tA_ea<+|GoZTbE1NZr}`$7?rxuibTX$&n+6 z`D&)W(|h#n!>P5!y`{C2GI*LkIe*U0D%5(l`)&r6aG;7jIs=GWU`1 z%{@&wBHxCj->!TWlPtXW`pS82cU0$imI=MxJTs%~m-mL}6F%ve`TXWHTi2x>HhGin zb~%sT(W}o+J27u{?snN4VPo^NHX-xA9I8DNzbAO^*InKpijM2Qy zeEehYv(hOyq(XLvP1El7c2|p?yXESd>#El#eLhv^?OCjvS&+NiOvXBG(rv?}U1@j9 z+{=>GUN7Ho>@joK%h&UEuG!LEf7kN_}m#A9(QcJos@K1>9pFk`KU|#HS_;7FlGIFzW;gZ{Wr~Dm!G~r&1C-Lh@US5 z|FW{>He%vvvJqK66^vo-X~R^JQkY(yP1gW44zY zJ$kwA=KMvEJNDgAJ)S##_l($ke+r%*%`v`pLR*d$QPki&ZUt7QeFY zPgfId&3&tB_i9RD`msrEzQ;ulZhG7m`F&^eRI|R6%B2;-S3~?f&FUdXT8(8rR%yq<#Nidi83{YrPCju^yv6JWBsPr zi*&nxyzSW9vGwbJz+(16|jidX)Hzj;*L_OLQ;{^W1g%YP^_ z+D^!uSS*F{gdOb3i=Us?*&6d~q0xgx+%`|v$J@|2G{+fJkk>lU_OzO{Lylh71B z+PrVeIX1%DK`|UTwPaEyk%d3=k#_jwNmi&Cfx?|hzF7Ip?TOHZ0I%oc} z)57yr)s#)IT}t-ts`GmNOIhXkg^y?M8Xq-_F6+6`8neUno%fd7pXFkgWH)V|sry{T zd$L~CmCxtBCVZOq`IB5}+S0XYSwTH#&YU^6G0$q{)vUB%XO5It{}bPBGj+qw4R3aQ z`Ix&czQpD1Mv?9$rHMH%B`z){F77U+S{E;PA7B6j$)~T3=1K`4)jzk_M*RZUsq3lL z>mw4EJks0rYw@(}L7}BS9{!f*^85t?&*Cg zIloeL`BcqYJB??V&+_YbpMK{2$@_A7r^+9_{*mxzg43I~go>`$%=Y|o;;JtD%jFle)fUfqyxP0}bood3kDJOa-Z=Z&XZE{wO4i#F zyZ$rWikI7F`Ek*<)SYE+l~1Ei7|>fipd<8h$;Z|}eJyuLqrz1r+QgL#_`ck-2z zjL9E8uV@r{n^#TW|GVM^Z{+GNU&|#;zm>bL*}xObyndHo`lQF#f?t2siYN(K>X&`v z_lc8p)pSI3FXw9JpOTyv)8b_cESar1<(n^j`jvEg^TV&MzwTWz@Q<5!f7RuGZ##{CvAx^& z+xNLm#TUWywX53`_Ls6x_!6kT`(2{;!f(DYGomKBUp|mF>G3IE7xx#Xdi!Rq{N;D~ z@7nyU`+wxEf1|qR`ts_t{~37a9}a7``|fSCe1FTAT>qo8k&S*8yLlthE!|=_o-)+< zrI~wlWpd<}?U&~5ZH`>KDcm_oByP*Es(F{+J^XiAOk3~$-IDtsm2^DK{2g_K=c$+9 zF_(3dpL(=iZeIG&>vvbYc>g8*uxyU|C-<3q9zB~hr~O3j(|TjBB2Ul!sAN@ff$L|! z$>iQRSucES=KA%!tAu+6H!58|zjRBj&)iq(*Z6mT-nPG}bF*3Wy5pZVzRCHjH1%I; z>Q>u1Rr*E!D)D)Xb1ytRxVmG>^OMH2gKbNfc|WVUo0MtTrL!%0ofucY^y&pEvzrci z9#&G9j})34`73R`q(EzyX=JH+xXPFE*|wYCSeKpbZgx*8{GK;I*DloYO6iKd;A8<# z8XK4FJ+U$RR?T|;6Yn>?*)22c?mWw>kFH%_u}Mo>tP~=9hQNIH%_Dvcs!x8{a-$XEW{S zw=)&FyVTSsd-i=f;!|?iAS!wP`?*qmyHw@QA1R%$nz>-Zw5UBh`t{@9gkQS9Hq%V} z#-`X~YLldtJa?>8p7g4F+vC-NGv|fg`WlB^af2?gFS`900-_+&dq{qxnfHam+P zpSr&NR>S?d=t9fG#an;M>t0{J_(dmA+5F`*UR;ijUta&=M%jM`N8V>=rtGddd-%ca zefIk^KMHbJS1&kMo2PYi$Fq3{zuuS8S|bt67k~Na%-L@^PLyA>el}As%=38Sw^^?| z3ul==H_>{OJ8k@G<#WdPh!UF{`B%m>5G4ve%R!$`it+4l&-00prpEr*) zpT?TWL~KmlEGM00_~>{_WVeia(e2!hj`v^O zu*nnAtNmRYKg;XA*>iLAvl~0xy_a3ft$e%m#^%SHbtm7OC;ce7%j)f{u$wPC zJ5#m&%RhZ@edTdcYx6eKc;y$5Ce04Hb6KWZ_}q0_wK~ToDG@5Ww9>^cS*hHc9%%U8 zW7pcW&8Biex2ps16h@0>=Wf<-C?yXLH<(G%pIBQr}g6c9D_qoezpDFLmtFeYMZkb6ww3!3tl)CmFZP z1t!~zhx;#ImgJtEB~`t6xo>XWZ2#Xo6Jz}ssLQ3aji*MSpDw&3z`?xdvt5wCk*@c;FF8lmvu=_Ks%f0@_ zwYkBU*LE%;>Rtvm5zE3;&IS;B2* zr@WexFn{Wk3oH4oHofJ^-}^aibIHl$vsJI(zw<6Sr(W&Gi~hLkt$F)X|27oeSIl_q zz3ru8rpabQ^Gn;Go-N&Y(X!~Sap~V%t`)g!K1ApEiagdeJM6pZlu+AkPel&T5|yQ@ z7dkpz^k(i#d%f%F#vf}o^I072QZl?P($TIT_}SG@)2C0V`2EB?GJCgdyY#JOyTv(| zFX5kg<7c}~Pi##&=c1IkT5KX)3bz(d?~Jxwb1Uh$vnJp0X?tRFOIkBs`*Ym>X`Ao9 zuk7A3Q_bSd?qxS;{M2}N^va7hrC-9-CR{&vZ?C+i^LE+wBJaM%HqY2H?XFa9m{#<( z+v&>+VtP$aXuEtvzXI2E%%9m(eOvCu=UJ6!+_g=%wO+MKS)zJG>)qeqXBSR%eyehFdv@HshIAC|;_qk8Jsd4) z=$*UmtnTFdk6xawIr5)DU3IeTH<{163wM97tDl%V_dmn@8*gG;rQ?T`l$AZv(dFV& zp}0SG^0&f;Z%(Jo?N2}0?Y*_o_u8XPdAp|j`(F3Ge)f87$@jF^%hLB>csa#o%StX! zO)X_rmD4LF^_-mhmV!|9b9v+bZVih zK&jlr^)sg@h4QGn{%4qWbWL*P<)=56m?&?3^2l*h+FtF*HIG-u3EJMU{9S(YrO1qvO5HHNAcjUmISJx8)awH}_pComsv|s(Op{yU5w=PcPeL7+ZV!?!KGb z-h`hy?{l|wPVv=aC)fJ#%DGuu7;rB7U{v>Mk%cN>&Scj{JiZWHF!`ca7Hiw0)AE^I z@hu%s)?A9?TmD%1jqS>WefLwBZ%co<vEHu5VLj%$nVPgO9!76Yq{|Gv6IJSr+2a6)5FaW|py=IRtM=qcF zq456XK*7((PZGT+?wRm3-K=QG%y^Bmt@}dx);V7?e4{1lzT}W$QT3Lo>T*Z4q`SS@ zJdX#O?Cj3H&B?o@^ZDJESCY@Zp1pPV(yM1{?i*f}4U2xX&B|u4@%?E}zQw?rlC|BHYq~K{I%%T7w_p8T);2+NrOfxr&)<`gCz`k8 z&daj~UEhR`#Afe!&24uq+32E~kK39}leNS$U0GWcE_H1Ec2Q}`lzQ#g7fzLLEPnQR z^P^sqCv$dHS1nfG+|l>N=e&qZxsqPT2UGK{{Vwy)T6kz zCt1Jes3)H2x^?xTSE%M?&kA1m$HI4HS3cf#@o(3yfA=u$@C(&lZXTb1pIh`=`)c0(!**+4 zz3cDPiTreaZ~Oc?x0i1|Xp}Q;x_6fJ5__ThaakFYKfbuh8-42KGs!&n#Pr;0PXy=m zzgBV8oVZ%G)Hud(?j#@g>gRv+9`+S{JUT;t-JQ~|<5jPhZMKtGl60r==CmLExtCMU_a&*>dM7@2&#-Hh z*}3}qlj}ukn?n~~jxRYsYe|;j&A3^Sx!;pd3d)~4UEkFG()zAlnpfYl)jzlb)5~}@ zCmK%-%2851cit&#k>R4(u~D3L!k%{Spt{2KTebf|vuk%vxBkli&%oQ6`$h2Xnv*`e zuT^f_dv@P^@%xkI1-t*necx4leD;>IS?^9A>vqlDy~SGSHS5*0kzt-ESKWOhw0g75 zzH>EiroEHyP+jY|1aH_)zZ&r@0^@?en*zh ze$g9xJ>MVBwz+%L@cvPsio&}`h5MAOGCg-M-pgLqlkN7t&|7ov>4G~`?>R4!chtBX z&7F6)degj%!r7O0^X=$Ozp|V2)8@+$Km4c?Uwp;S+H!OE9FxuR%982-j;qv^t^Sqy zO84lC`}-g7ntFP&V@}26!b|ZNpKOXwE1x}6efQ;=$I@Klub$5o4>nSIwI-@6C{Eth z%Sh?VnH;nK3?J0izpMUN7H3w5eDX)e`Tq=4pl9e#T+#m)G(;$pbKUw1+^xKvv1?lo-F-nGrQ^1I?@cJM&it!s70Qe|dQuYMji z?01@TMz3?uf6n`yUv)3<+&7(?y{BiCM0~8At-I}Z?xuOyPAlndx;Jl@i;Ig^ z-=ga-pS%1PI)icKsmJy8cHT$cnPu-4wC)Wq`?`-cu+-Imj&hc=WX9{*t()ifI?wL= zdv5);WrZ(-XSKx6Txq`enEx@2Gsh5~UyjT3pTVAYzh3<8^v>V6-En#TY)+r_`WY{~ z45WK@mnU_{^s7x&%JZIb=jIdh%g;(a@4U9{vfNy|l*vk-(wCl|i0*pf61!C5SoF4K zrB$aloxKxm90~P%-+41@%lc^_UKBq1Y!;mpojcd=*l8u*ZD7AUt$3wd;-iJ1IpoN7v_M*Du*#&DOQc zXGdoT`S0HT`fGIBy0dv*zc;?pnb+ALeOUNz=ZhIHrlilYbf5n7_4KbYo6r1;iP}3q zI9LDpByHIryR4SoUOR7g{(J_Tt+8*;C7P<3q`t8cur#t6N(JwK_V5MC?+0!)FX1tZn zZNHNhZ08oOHq-F7Y1srXr$xK%4PKYk-nx68o%g1a-nQIbdyI20dUh^3@}ztYl^yrf%1h+;rz!>fxIB+-qmQrEI?GE@r)B&HTjLiz2(G zyJnvG_hFt>dBanwS=UQn#|F2`E$*LvaLN2NuRq=To~x90`k3sjvky}xr$tP^-SkfD z(xRVC2^aGB-hTUS@{RqU!%fc{Wq!Op?@rm1qfrH}7vr?Tw(hE0dGTqI-+@|r-8bG< z*HUkNdR?6H^|S+e59Z>dAGDz-QCBh z{P8+9O|vtu*UtF3Y@WQf_TqEp4?I<}c8?#s3GZ3EU`xlpJ0E%8l`Wp1bK6s8%IRJ4 znY+2>yp4O2RT>c0DC%V&DZA+d&*^Pt%O@4M&iW%3KTmmC(mSpnnTJclk9vG?KJ%{P z3(LiuyHc)vn)h<$a+!RuZxU;6U-znA?Jr*HkF z^eRsN^&O$BSH3CVcz*L;;HE{#j6Y~zUcY4F)wIto?pI}(pHx}bwq(VwCBJ9&UEbUB zv&Ul1?){~o>yLD7zV2QY?`ZM;=>FdCx^;_Lt8$Mn+w5=r=l7>9CA+kmxj8avvz^oP z{?6RE-R)l4%0J)JQ`V>abFAkU_sX?bzg6ey=4pC| zDc%2WdH3u0?DaF|T>o;{V@aj*kBX|e?r+W~u6-*#Wnmfan|dwxR(3_<(eG!!U)pSJ z9&1}{Y-}qiC>wUf#l_|GqwuPDr3%@#MQhkSU*C0|<$QXx@|iVqH?CGrd3o{qx@qfr zeVmJ>&VI~z(Gr*y9jKbSW532y`RwIR+TS%l&s#t3L(0XZ&Ac~^;*T4b#2QDrZt02@ z^m4C0b!6X!eLZ*f-cEbHUvX}Y(W*1GdS$CVUfy_o8=EO#s4KTx zj+46b>@}`ll5b~8JF2Va$S%&a&byy>ca~v%n#R)Y@#4OBY)_|6ci;M|uWyyJ%kJ1O zI#1S>J^Sl#@wU?Rm#^D?^*QI;{mY~aD{p@LnY-6@-NI9-kN@Fb<|)bG)G(s_@M8XKp6yDKbM`t8f@+KUFIp57fn zVv~ZxCVNdvz0%XOOH$%^;6>BEZ7*U4C!O5%qjOvGGRcs~=C$r-6?;7+TW_wGe$uve zdFqa-A=Qq*Eq31J&E{RW<7!E@)Y_*J9*vS3FK*>Ny1jPUFSARtb2Xfb>JH!Xd%peQ zcHec&YQl~x<*gUBo_JLL%c7SbwzzLS?_}rx?C)W{->2pkXWlW6HIGl@*jC_s+1R*z z#;%FNrmv3HX;*K~IdkUB<*D!HeHME(o3}t@V(N`IQ{muTeUS)3%9Dk_`5D+HzytXVtikPpz|F?J9dYWlPo3Z;FfPwjiF?d2G!|NN%AsM$Zxy#=ZV=5H{t{*odvXK!B2s?(-Bj&zijhMhe; zo9W=I)4N`-KQ{Hr5~EMEDr2V$t?Sa@n?1vHmhO46r^}YlIb1K|a&7W;Vez1(OhaQ~ z&(4>*_rBlw&!GF+TaND1f+4;xI^tAJ~=^dYRTYuZOvs<@m z=NxxRE_UAAKV{GJ>!w!ud6|0!y}JY7NcsF)ta5Ob@d-=Q+`Tf=tJ>yuDl6Qm6wQj5 z892c^@yjZ$UXPOBYLk@=_3u|c`FSJ&4~h;4ck zyYp?7jPk(~R+T-SlqD zxhvPDi=|t`lP6^BJQhEnsSvwW_f_S#9ZSzxpAgKAY&6=Jz4iU6mMMFt#it(5IWuX? zd}qC9_t%`DI$-JgHw zi{+P{`p3S6BFQ%OTk4hA+PP+@FXlyGdSxPQCabsXp3Jq|m$~{^yt-KXXrgxI^2J`= zY9W#rQr+jrCo*|oc%!}iaHWvq`9?FN+mrcnEP0n6o15zyo$aZq=H`;LPUdFG&tx;{ zWp}2XO-f#rlz8FJx3_#B7oOan7qRB-qO&QtYo{NH&AoP4WX6nHM~)o1l$11CR_L@? z%li}0k2SAr>`N^&IOqHD>j`Hbxr@Dt@tc$nrE+=)&b|@xWk-J0u2`#ezDKk(^GZML ze)MumS>5IBwx-h_UO&2XZQt9w;x$*QJ`3B4wSJrULi5D!XRFm7p9)XEZ5(g<;ILtt z#LRi~-xRrAKA2}S<89y5m0kCDRh?0GS6lu;_?)_`ig%s7^88*w?+=rvb)3tnT(?lR z#?yRC-5;;DZ=L;1!tY(X{&LHIhTRD|{~B+f)0tzqH|^p2U-jZgdsEzxxa%H&*K4_c z!|RkwFJ+b2lmwnlz2>j7rRsdf)6!E>A=93O*q2Jn9+_1+?|S^7yE<1iPVCJT53(-X zz2(mLNW-O@#Wdev%b%|vQngWYy4EkA+=x=Mr}wu?{XL|VRH1acWXJRU;+NjcR8#*c znKPf8^JeR^Gk1P|U3UF`Y^u6(4Rzzcx#_=BPR=`EXy` zqGS2jOl}FdI7`0U{cm;Q=`!#4yZ%fsy<2jvCh%V07k3x)`4g%YZ&aE)ce^jW{NVD7 z4PS1yi*C%FXe+ww)HM@RQULGgx;?n{cYuV1ER zd^7au=xCoFcvJ>FJL_#QN8AbimowF4q6oLHa&Ism7bnmseE3~XWS?e&#meSo-99S_S@b4?QLpG+b*|N zX$zOf$DDSlRo^SJ?rrw$!s2&lceu4jTlrMg{8;R3xm@?gyZz1PBI(Dy7t3CIG~?m? z(RU`4? zrm)EFX3>o~K1XV%UU{^udb`h=FQ;$4(lJS$rwJ-x!lU*lJ*nzXelXizaPqUAc6(1} z7)zP^<|!`Tczn&{$m2==lcL0)XnOZPnV-Kt^;*~x?UfoQ%D!0bxm~wiY`4G3*>=_K z$NO%sRX=DOe7~iB*3aU+=W>yEEQ8Cpcjw$GsVw8 zUM9)+-tc|rsh>Yrys&ubx?s(gYgXq@EIza8_tTuV&uyP}y{TheU0U&L;r7NytxUq@ zV!HlOXP@`_JEe50xTIA^*FV1#{p|AlnuBzIwHa~mxTJzq%ck`C%MC9riUDi-i*>X$T zQ@ndokn2Y_g-8SXgN7pV7ObIdbnKbFjui0JKANx0}YDP`Im78ho)vNx%Sn>A7*QQpy zuDj-{evh1WbB&L$n$3m{#rnE$_T1f)cH?KWZ+qyr^zChbDs{Wx?6UfmyGu=d+2pGi z4TZ1s9C%sxpP{exmDY+Qm)8duV%n(e!?^~Rf?s^2=N4P}epPRxiJ^b{X$>3#LcQggo|au9;YUwzt+sOXEL7 zfvM$z*N-E-Y4hHE*tG*xCHd zoA0(I`{wDy%GR2npS;R8I@SDXy<_fTv5b@Z((jmFneoj~EVJ-TdD4r1%SlP~lc$~h z@O{I{EuV9rpVYbW&0f{)T>Ms}&2N`k|5V+4Svl0b&?D;gi>%q7M0Q*anv*m2+0=`R z-QNCscRbiw;&th>+_cA&icdA8_nBbJuj<&h$BD zx4UJMHfg4A^!Q|H)hb^TH0@5(^YeNZNuOU{s1~w(WUOjwcR4uy>$}vdbEmRbneH{S zwLH_9-s?YQKldliXV>?tFRV`3) z&Mjz`KDkz)Wtq<(>$2OALeKAVsok!8E$X$-E1$9}wLBA6=FP0w?fzI&ojt1}f1Ay- zc{g_-oRs@xa_YU^9^c~~a*zAZdtdq9s=FY3k>17I(=s3Ky6dL_n$ek3cI3OyoYoUs zst2#s*dF})^-0^6E75D-C#6Um>4@s|+7-;2)e|1R^!qI3SADmi-PGy0(z<+=FMO*0 z-(T=lz3%4g#hZR{`DDGF`?%{?u+r?&`wK?D1_h(l}$NS%M>sIz{DSx-;=AVwI z<<XStFbw-rZU3NPIjEcnXsmISZc(qk`X&a~z9sp#1@bMefhGfKTmdIj_tHx#`!bM z&f4k9X}wsx?Zn#aPfwQZ_ZE+zu5#_o^bf9=qnBk0dMD|2v|YdZ?3GvbUdvfoMxOQI zwoB$MOL4swrf;jM&%bD?q+nHAvi|%34A9l8&)HMt*V@G`|8;CS=t4Isy{qZSU{I=o4Z7*ib@>R3GENFO{=U`^ve};V} zSynHmRND()tC_m2=}=_Wr$;t>t2f4b*KJ*LBR=V5xx_4wj83&jEBd@w>D}&I>y}m- zp8eK4y6?pC9g%5~9k0J_uS~PDU;MQ4@A-X=Hfz^jxxeNquit9N)ayP!cg#57b>n?> znrF|%ubCa7vc|pk^1F!Jay~y;_S?Ss^6BYG_Nn6AZ+_4}d)i63t?&Ain(cA(`WLAf z-m06Iyx2FlZtj1E!-=>5vY5{{3VQq6oWD8m$G^YJkGSZ*eb;RHb;s(o$Fr*0uh$f; z+K}jDS?@2FmcKz+@qWbnSt*r~>ay*(vRA4e%eXz|;{43*6Bcn-ITc7(RdG6M|Cp%4-yuLl#Tm4sM=C!hG`6uTl>efzDF1)%jmZSTK zi(%X2J?YouORvY4oV|Rxq^ zQr>@2wpMHXip_zOEtdYiQV1E8hYil7(?Rc5o`sbsK9xH5B4gvR(CeGN^y^n9+<)rJ zZ~H93YWk1B(1$`ccMh-GznFL1O?gv$DLZBUw|jfuSXIUDOh3PJpY=qaF#kyw>%Z!^ zRG<9TclgYnMMXaQ-kof(`u5=Gtwmw-@$&x}v>r^!di0^fhPR@1x!Ly66~D~9*Y$nP zlv`3#NM0W9)Llc7dF8)gN z&}7f}Yp_J5c}v}lATGyS_CA`d3UB3?i8M_p>%Yw9=wa>tvQ=SJ1JAeL^WSPud|I>k z^!B9JDau?|rG7n|eRJuiM@f5Ur@d~Ej`kIOsxY(8x#D(Nki3e;@xFx?4Iy2)au{fNk;0a zem5%XtlNcsRj$mtxmoP#^=qz=Qm4*$et98HF7tdIZ*y?%-8(h*riS^)E7#r-yE?u6 zZGF<^r2h;zU)y~7q0Bn{+5GUPi4SLF`1?&Y507j9xJ+54evW>Pskg1V>E(yhU-)Mq zfA;N-n14+2_G@Lfi@zMza^6oUVO;t9uF*r2Js5iu3jV%}Rbh$jXkz1X^st)0_kt#? z!Yk}~@m1YNfq;h;WlzPRxWt=n#!O9@RgM<w8W&xzaT~m|1m2(x|#@4R|*)%Ai{aW`(m=#s>PwQ3V5tA77^b5rfqX^%GLb@WWzlzqQ{hxS(avUA^4 zfBG1gZw>B#`6f#Gyz11OH_|G3MB|S4xz%ou?QXgjefrIk{*~@_dxfu@R{31E?ylOw zd1@PUDVxrO-z}5gvTM!cl*-#i zuKUi*PA`lWyDwua?&5Rg-NdzD+jd>PF^5MuEYafJ{==_DUQgI~$8V9SZnXc2K)sNy z$6GFYPP9sHy;b?$I^Sl0%vOy*%1I?vx@z~EOm69vC0)LKHFu++oaB=7^xd|_cPn$J1q&qU_jHB6oM**8HVZ_<^{3%|a5 z`yMMe+r9c@4zuXtRj-Y>s$#ZF?p${KMdD?b89S!=L|i+sIq`9&bHT~l&5^5D&Yao1 z=knWK61NR=uSfRlb)5;jDOloq?M!rzONnn%w)?a170=^xcF)_+S9*BWwcI}!SKTpw zrGK(p%|~+M)6>)5Om~S*xmi2M+*k9WmrIaFPo#Xwe}?jD!MedYKMuCJR(hMxGCaNJ zIe&-SdP%kYLZ?^D z_dYB2dd*Vp*>bZ3%g??tNZoxpYL$)jZuLf~S2@`-+1=AaMpCwD`vh&TSd34*zN1xbZbh=n(a+_+XpW zvm_-O`J;kQl5|&R-1|AZczgaWgY;|fZoZq@owM!D^t;BF&Hdxu%U-XWEc@E+ShT_;I67Y z7w3-cHnT6?Pu(Ma?$6b{=jAgmUo)8&rqlUi_Ohz?Gv1YyLB{o;>jK$lR+x=7TtJ=h!*1c$B9xrxu>vq}gcbQIfs(9)%3JMBV zxwu|v(|Y}~N>C7V*KxpKb_EG}THXWuK%?D2}dzV(c| zhD(=and!9i4rSX-7MytH$-Qw|&-*8XpHPyQYG^mS$RoG*oIFFrgg`Qf%@@xuq_bEiMv_D@IB zFxF(d>c_+8zMGFmb{+8vjSkrQ%D z_4vz4`>A@1L|0#Xa@Bv+i_Lp(>BT**<=21w@AS=AX;yjjqpUBicK1~$K8*3IjNvWa zQ>nOQnao}B6SezSURr)<(px>%Iq}yYU7BBV*3Z&j#N}%8G_9yBS@!y(hu&7y)Cnrx z`Z>S!R!&b;%ud~-vL|*W*`?n)KTRTjel_Qt{|sAn{d~**Gi-lpD)nZf=*h{V(^Fo& z=t^CZvVHO5ML%A=c;#hb`}XgfEoaqi^Yv9vW^%q+8un|wTdZB`gC9T5qxKzgy88aC zTatHr#_v0>>bCa{`)aEtj6+}e-VF18_S$TZ@uMrRbAC*Fr6f1^dUbfUpR;7an#xiu zYd(bw+cmbXn{sUFB>!W%=Z<}y>+@{-OHDmh*B27c{$1QYd(q^1{~1(gJbrX^RaL&z zyfYh8y5HU^xqt4;YyJM9zpfWQ3dASH=J7tQyBE0MT<_@Z={YOEy3d@Odi`ebg+SHJ z!WUOp?VfKaS}dSH9Z9dMe<|M?7EwKCvyG1-@m`#H4i=-w_e%o)BMCe z>rdTCX1lxm(o2)SGGUn?BfGoi#uVqc+_#fnmX>X7eCgBrwXNZ@f(aYiq#OlHJS%+u zn#%W_asTx6w(ap;A+tNC-Y{F#i z_Zhdvt}eT2`0T>VEkBHoEz-95cr)cpLHtGI9G6R5W|f91cGhzKj(E#l^VU0Z+vl{e zd*0pR{?`4&@YUB{bKR_ss$Y8xPP%QJy6?t5-Pvoq7g_Ac+okO}ZS7+g+dRUtohN$7 z{1|Vj=dmM2L3y_RwOhZ5MNSPpdQ#`1+gyA8V}{YL7mhDn5Yu8+$`|S1^yg&0@sqn# zrq6UbbK!J~@qdOiX}xx_^FJQF*4-UD>-XZWq|K?@&hzu`eRam?%yFMvLV?_b`Z z`RD5Tw|ei+Zp<=HcXr8C7v&8|+0^GS=3 z`g5;*QsKIJd-dWhKTrP>z3lYtaI@&V{j7V+?h6W*TwZr`-W#8=iMGL>{d{I$+~2m( zs$}2FyL-CfE92Csytf0TYTc&2UiK!i%wxu8JL|NK{c6@f(q6CanEmnSwb+Y>W-qyJ zU3w+(h<}yXl(p(Fm%3i*e;{#fW@qP;uZQov*59r=aniZjd0oe+KC^(fhwVBl+Btuu zs|z1}a`KV8#1oH+eV6wAe*Ypi?DhFQZ*$URE1$<471=IZm<2n&CTBy@bA3N8XD;z$~fag)~nYKj^xhxI5U^m z;F3^_%A`q(YirIgIllOQX~l-4+a7*D7bl(D(Xq|u>6LBp`_kU&C(0aM`z-HdWp%-w z^`~bS{_$S$d1ul6GM|~7{3eUspRW4-%-!0bdTYPmEjfEV*4WtCXyc(nr=dH@38y~> z1_s_1>!vT;=G>`FS5wZt>$}!$NtH}__IMFQ@L-y}j-4VY_XnKMbCC=Nv!$TxZ*_u>7?ai!!5JGq1bP+c&@F z^|_eYTR$E13%I-8cD35#z;!*F7hg@k?B}uRtj45jA9L=O^TfunojGlZ^AXKHGGtpnIjrHmU8!Q76_+&F;N;?cC(BFRvob z>lxiKoA#P_&84hdwIIKXWxA_8R0(FF%z_ zH@;Oql7H@zeXQnmnM^&?Co#dNs;W=^dA;)K>HLdNwi&(9-`%A<^Wp5gS2Md;nshGr z2};^)=r`+?{F3#Ho}IiMmuqjFu~q!-pWDlhO5~kRvpAhsV`yBu?dehT$B*{Q+_jNZ zR^5EqIQ351(K)jE72-A9m45zbXjFF%%<4L4mwDP->bA_YMRLK$7AH3cFPn3AYHaGh zuz&WQF3HlJ>7q01GNra|mz#7r?eXheJD>M|j-KD1H_P(U<861Ms&}O+z0+Q|+{fjt z?vn6jQ`Wo3T1k{|?0508X+JY9f7hFxTYn$ZI;J!IQIEuikM6wJZ}*=|oxRC-v)R$h zwMuH4`J#F~xkr=FE;f|u-})rVxwh8skjJk73Sdw=?3t(nBZrZa|DQ#Z;j zu{?eX68p?A_qNu$J&J#Il>e8O!kxYLH@;PO*JjiuZ|`sY8ej7C=kNIz`@;S+-r*@pmEHp3FS*$r*nQwYH(>w1Sp95u+n2U8^%WIbKc*MJD6|!K5EWv)mt~azsyiN zYc}t9x|~;ZosHPd=ega>)PHB5v=zL3k=G`9_tP7x@8-_ex+U}SWm!l6@<*joA4>}E zntfmT<{i(xYTlhyJJxo7jXB&JfDx>0r{_KAe|385{a449{Acib{@Ae0^_$!7J4s(Z z*_{9T_&!U~{JYle=Q4%d?`r&KNa~gT_cQAKFPZy`;&1ss`%-IXfB3|;_fGQH)%;IN z+Wo$0DkOF1I}3&__yrhmUb+Q+O}r>*6o<;~B(etfG@ad6JzZp|&bP8Cb@ILG?F(df98cP&R} zviPQiGyO*%dm3t7{$y|ZYEAdYj7_eaKYdQK{Hnj}=8qoUy;WgVwr`|nZ<+NkAB{{ucCL3)1B=jg=Q!D zPkXdSPG!OQ2NTxTr~kR1QW(2)qb^J1_UJ*u!=`naL8F;k0 zp4YCP{GHGL&KK)>eYd~cX>Yl?@!5mfi}RPHbnDGLUUI3n_har|;fojb?%&n?&yaG? zwtjD!`CpOTi8XJvA8^;rm$$4I{l)ulhw(qJ{qNUm2Q{wa&pjY&C)=7P&9A)X@CTh} z#j{4cr|-G9T>9wBH~Q<|#J$KeabB~gUoH7ri{MJPDUzxxX|)_ZM|16F2d+MwH{Uz; zr}5pZxf{)Wek{_~j{Cg#&7Ixbp58P68#mu|%fqfGXXmTV*mzU^)V`nFZmbU}`EuT+ zWYhMw*1eSCdP67Hc^f?Fe3!C+`ISxjGd}vNAGpew`sMi>{^?)MGfS%G9xvT>Z}*m}$l2QW zy1$0MOnP6MayRF@-qiD(zT3szZkEhHdiKZtqF2FJ4OSP=ZMrg@|M2U8-L-+CJX8M} zpVY6j-u^B4%(SD)dVMe7yZ*GZ)9CN&$^6eyVV@Ma$#tfQ&B?Z#KefNy^6dCEZ{P2| z-l=`>Ts~+|tBFXxt$TL4k(Ny?|76Z{n$y{J4qjO<>utE_x%#oxsIV)RrrAoVGhcP8 z9{wO)>v3XH^mgt1-71Ceq^jQ@jL#R@bzb+{nIqvl#e-^iJKntBe(z*;$Uc)jv-iCG zoVPi*_VqNq%de`GHXm*`-4;8!P5EYQ_qj-UT^D;Xwj^*KE!uGS)BH4@u-M6J-fK6? zS@W)ae!uqV)%28HaeiTiyPL&=Z>c<-|J38|W!=rU^y@b1*XjLdSk#xiwB}p)vro0DeUHDlm1&z7oV$JIqwIf% z>Ws{f=92R}Hb!gjG~UA;=TcO|TiBCxBj;Q1*Vi$RW*v*pT{5M1+sjYENAuOodTluc z7wvf-tRMaOWzMy-!n0A{6>AQsW!HZ%KXQI$InVh?suoYz`<{3Imv~mf)Vgnd_G#O= zKbM|tyE*UsoP+Os%6`1xce_R><$2V5`>WqS8Tw9cc{+p5S73LLhOti7ZK)lZvRk+L z&8Z(aB;NKc(N!PQNmvGw0pmGd26qTG#Gg zubaJPcH7PJuvojC%8l2iE|;@jw{6ReH9ps@H%zLjcp$H98QpO^J&HSY^ZcYQmE1qp zZfz=dD@!aq_vG5F-S>W0_15S( ze(R>&KhkQRS!b3iWqQBgR<+D3)1N7_msU;-u>7nSARD>|E}@N$9C4XFV~$F zPulhSRY~|X? zGhd%sXS4dg!PJad&jVYY?o|E|SH>bf*YSk2N1?9%rnF2WJ@dTq`(-+2ugqiQvU$H3 z9QpWo*Y=>ad52!FyeMpI@+#!b>+S1K?vA+g`OTfi-ERAfFDHDyY54ngcvJ4t)TE>{9yuc3aZTUCCYAfF9v4*+Z&YW=ye|PV#UvA;$*qGe8$Ctz(+4{|1X_f9Zr*rkIjY`6;%TvYXZFq9+ zk>t_8ha#qCnohG>>25Y*dyrR9)r5WTV&wPvoT(BJ@Ii*S?r`=@hdJT9goi0_IgLf zYeQj=Sqd9^Hm_iwWmEq2M3PRJ>|`zPv+li8*4dRm`S)zucA96)P0i!6rALK=rc9jG zbE5l@WykDgy4$o%&bw$nIoZ!=y*X`{&e7D(=CQ_tf`XzmXU^;B=$kq7MMuh0+cSHg za(RWt#>dJm*p>x z@wLA**M9PM{{u75Y;06occ?VwyyElH%c>4jpKVsW;rh8Ff1UNeT)VwL1Jn(lM%x`e zWA#{X`JxF+RZg6fuHBsaIrYk;&Ka|Od`ilfX$wE@T=HGoc-fVtt1mac+VHV*&bH{< zJz;lK@0h#z6h_uW*KYQFx$Sk*>-0r0Iy>8!*@a&I+`sq6oNG_!=GM73yxi^8V|13I zPAq>z+M$DnHz&$?g`9bHfe-=#@4)E;C(yw_reZP>$ zo8>c}XQ+P<@yFD)wJt^S_tP0*Risk_UKWAjhD&35&FnI~9&#QpF7JA2RfdPb|g zoSW&pRV&ft^<|YTn`w4|38!-fS3i~5J0+*yU`uq1`%M?Cm)c)W^e@<&{oDFkFYDw< z2Dj&(=$mg^F7oHh(e39a-Sq$IeA#=0UGA0Ji%#xLzqK{|jO)hrhb?ku&ihwWo_6`B z;N3YhbNac(riD%m*(SV7Py2bu?J%!8-l?fm+#lQsKiBnW=48GSP2a6*Dl6VATzH(P zs_oQq;zUo2+Hd{iHIGjU=Xs}178aQ?<8^1}%g$W0>7mQ6XKs9L5^4DCQtBqXO~3WJ z-|V}+XxrV~YiDkkZk9DPG!~XM_|krQ1Hm%X}cvdPlv zcWnc0O%~m}c|U*eq;KnYKfAG$x$OJD*UK;aEmocP^;*Kiqq*ObXaCr0Rb%F>e=?=u z=;d;G$K>(*eUBtlrv)sRt-LPck-KcRqh_APqbn{`CQ8nn z@5IqLb4kgWefs;(l==Bg7JIx+EiElmQ1G%bct2p#$$69BH9l|qu(q?BIY>P=dGgIX z7wxq>i>28^+UDwA&h|6;q@MO7^Vpeb)5XK4O`ELj)xToq+dYkEeovh^?T%bJ&vBQh z^Y~wUx&K#eQ}Om?{0V<1uH5f9yKL_1!s8`JZ+!bxys~4)>wmYlWiCsqQqw(eEG#T6 zFy-WTTbnCporiDABzyg~U9Yg_cE-;j`%{w3eKq^8Kl@evvFfi#v8?vgt5om&b3| z>&{En#%+(^dcQp6waNCQn{8k2_bpp?yQci?w(swf?pt5q`E31(XAgfX^PDo!S+#rl zyvI9RMdw);%W?%>y1jbcwqCLD*?V&5PcE30yTkRWTIxfAwPBM(7oD}LO|$-(-nTn{ zTkiaz%val{CqC0{o>g|+yf5n7%W~e;>RZn)Kb@9SY%6SdyzlkmE^X0mX&bK^a@mw# zpMJTT>sRlQ{a3r>zl1pMtg7Gm=DXOh3xAI1%X7cl_ww}T?{>v^rYzlY;^*zNSu$12 z&i(pyf7YG}jiJ82OrcA+&UtA)+bGXQ>(>iid!wA4d>WJ5ZaYoeD(|FhxJKq~w_0B6 zm88SD*PreVoTQ|rmX>}l_M)Jyv7P!}xxT2kVz+P9o!yaVxiRyLL|LxrPotE5w+(OR zWE%S1t^Mv3ox4%i*xbjZJk@rqeUZNHx7LvC)iV0LS2iqLxP6i7Hlr_BqIMkaP!-;k zVVHI1(66PL#xItoyY(un#fkkYG2Zc_+Wc8>p2f*Jn+n}|>#b|mpXGKxvk4ZoV=TxG>{n}^Ss4B4`pYeo1wTvue)m;3xqMQL{8N5m`M$M}SLJP-WqIi;*LtJ% zb!?t3H$7iuXIWdi*=rqJC-YKQaP5vs*QJssOqHMXb=6COdzRT%HIdew|Ub*7pk`|Qful8B5-?MCY;L=@pb*B}^mWx>~-TTY+ zv%O$bnZ0M<;hmFb6cjBxz5l`a{javlC5!1BuHKY?+SpLc_4~`W$AyhWy6y@ZUlhK~ zv2B@D7??~^}>z4glDqb3$<8!`$@haur#usI;MLhFMe|pdVmQntl%WE&^{o>-H+qvCW{mP{vpUaQJT`O2V``)ZKer0&{r|tW;^qsYzjsG*G=YISc zHF@8!>N3GCS??~r*e{z`@pe|_S-nZ83-3PMe!ud|_RELOT&w5G>ZcpL<9(iI9IKRT zGFN#+iqWMzu72_xau?n>736VdX5XIAe2277Uj6bSF33CcRh_Wnxw_LkXY)=jv%H)- z<6ZQmr1WQRHrYl7-LkdY&3R|5*@J75`*MH0o6&i4#iit3r)!L*V*Qq@D(^m=a=x*v z_wb_a;_{!SKAgQcCbjCZ@*CY7ABwWJFWj6ix!Eb)Y|>e~uvNeIYDcO(ajJ8c-5-7X zm75d)j@;_DtMl*u?vwuT?0u}r`nH>|cG(yj^R9Vvuja|U3uXI{$4uRsX|B6#qj+rF zk6k%4*Xo{5xvZxBZ0dv4xzmG}O^GVJ=_v7Wu?%GKgrOi%Dno}bq`eOFN z$x`;kU(a!8A<>Pb7$_%fm@s;z^CaD=M6%Wom`nc-6Vnep$5B?3mE?+;A7AI(Q z{ARpSd~V*!C7Y@**M9xiXTA8**7?!D5B%o8^lVOr$(*ArH>ux#eCg$)n;(v(U3;|q z>NfQQOO4MxyjPWYb(4;!!YkidZ%QitlMQT}-c+kka=n@=E6px{;E~l9m0jOzHfqMH zOzL0ACAIF1t}I0I7unl zcTsIgtI2v*)mBT{M|vxwx(_Mby34jb@4QuRnfAx@{)xNP)Q^k4?)!2yse00_cM;F- zMLhRib@ua=ufJlCXYOBQ^x$NkcT%RX+1VmE&z&B|-TSO{C$B8tZ1!zA)$X4%W!sJ|TbA3tNpk8p>yYOYH|*`YKgs!3ZCv=4 zDN;e3ea~m!+^+jM*vfak{M;+iDfbPJ=I%SDrj)k*Zcgc4S<&_WL7cb5GixT_3_ICB z+dT>)G0wM$zeP^To0sZA&_76Pyz*V={YDno{xKyZU#}p4n&g z>C@(nyuX%j)mi)3Z>}<5Z}%c-Y=;IAtFZLZvvON0t(4L1rD|V;K+;;bmS@MG| ztZ_@r5Kk@tg`uxp1 zUT!+3UzNS#KSO$df8RS>x7lKLUB}&J({~D;&94lbd*k+hhUS=#%e(qzzun%rd5znq z^`ggXr!QLgEvTesyX@x5{?t#|R#_Uh9R{-TSw71GYWq$~t~k-J`TkbSueh<9g>xKE3#FLU3YYqRl|-}(LTXVx6Mxb*7LpG5`t>v{K>yH*t5uKiwe zrX)J&eB+8ec2EC(I=09y^PJhYu-m!|GkS+=6AmG(CcT( z?iY>!zT;nKJLOVU>MyfLmy?gz8wLH&>6rg-{;tv^wMRDIX@9`3XR);HY7X!3m9-0# z%qvZNtTx@h{cQ88n&--MLkr8rcAqiWb6#n4`l)LH-sPt)PD%JrdNb=}mQ!fP-JRie zH@XIX8KtcLyTiTZ8?(xA&-zr}+-jvU}eJ(EkiR|tBzxVO# z-s=AN`+9V9JMZ?#$4mcI&9#$OoBs58K2NN}Q`}2Hr5&FIHPTrM&l-K{4C( z@Uq!@nit=RyUtv@zv;EQ?k?|*KCX9#YvRqyD^_0Wuv#7XX79tE!F%e(gALe31$qtkV-be#{~b|mce`(5*n%TBvn zd--DSW}W@X`=0-vQ(hYQCTEkKeUi||;&hjDzAvWaxvd} z-t9p~k1oA@bb8U=LdmZ)ih`>CPP0y%TPS>?Rp#KkH&6UIR)6eXd+HviRF$oD zZK-ST8XKMCvA3Ua@Y;=oOHM@P?%22EUWihvTBg@DuOQCAyZ;%cl-EUXI;9W9aA6t z;i-LU|2ywL!|THf?QczZ|F7Tj@LT)eG4e6a{~2=LyY2ru`9H(S-^(AUKS+MB`Jdr- z`G1BuS-L;^UE6lXKxeVSVWU&^HjT+|!o0h0doSL*_M6kH zkXJkJC1UtID_sFF(8Z%9Bf3%I$$&zt`;27WQ5{bK8qGKA?T& z8;ynUOgr|b`r6Giv-SFCY>U}foqqjgVOBxP!+qy1+wH829_?>d-F81;bb53-@3-5v zTbEuta^%o-k#JYMUD2T!anlo1v`VQjPN>3;^ZmB$UUs<~gER{tf{yCbx8;*+xz zmMrP@db8lSrn2!1mo)9nFSmN*vP*tN>z|zW^2N3rvzOHbicVc$dGA|Y?CnkOrT?w= zUvz83(W12Tlg>n}>3ulFr>0Iba%W)Tw7EpZeU# zePb|qi2sb%Zu9w|A^vTrUw#R2Dqj5N@+{M`!Y7->IOaX`{#EO(^s`^&QVnn5vv|L} z13&A7%ci@px>Fv#_VsS}r876}eX&2dZr1I+S0|TlzOyUb@A#b`pR+_#?WHXrm+oHa zIn!y~IWy^?u++=fmX_U`wMkOrKf|Gl?)!ajF?$8S>hB4HdIf2|>_(5aKV5%0Q%(7q z>G!*@qK>~;`n`8&<fg)#P@eMdCsyAQ!^5Z`_ zx9wE||8^SHd7S)yuXBC5)bHJv<)?1+#J+7J&aRLcd#?CIxAvIz+jbXO z{}hra+07>!EIjSjA1==lyBXf;Pj&w@)NC_)QQ*IK`G1DYnxoSy)vEIT<-~k--?HB0 z+=*(9vt{kGzUS2Uz3uva*+2JIuTS_Y{mrtuhmB9&Rb#Dw8b?>Pp0M4wkDvM2ynX%t98>;vRra^-D|e6kF6Z^1q1C_Z zK=JQG)xtgd^349F&CY(i_wC|`AHTeliNCnMk>8T_Zur@A79rFT5>u(@rtT zzKxsu=Uh3^b3N2v@6@gxvrnx`aC0o1Gg)tE#|i(IJ9_Px?00>#H_8?B%lTpRY~GER z`(-{JsYp}4391Ng^m7}O)xM0p(Vy{aPj%Ym-ERGrr%QD%zg{!f^t;d3=+y5%FW>Ka z`C{8?F40$GN;@VegJ)te2{~JLlbS-%;qKJLUIB&NUDnz&qnEY&WtYwBda~?# z{Du0+xVpk;ma`w-{9IKdcE-)uZ_$gHn|UXj zcC1x%Hv2u#D^AYzaXK!?Tn#;fW z`hs__zW1(oEN5G9XKmzu;@b9_GhuZ~x~J#PE`D$Ju-9Kd*Xpj{q?b!ldy4ZkXT0t> zUC(DZEJ{+M;`Z7Kb@ zGHBp z6@Ha1IeXGJn_Q3V)1UY7yU&!an&rIvSDoB=+l_zu>4cceUbAC$S+5_;D2(Mlko2`% zPv^&DJ?XXkMZWrO78ZUq<3%!W-Tn2qwwAvzw~^d(>rJuu$ETa#l;5^}y=Irvi}^C9 zf4+Oozp0N{kmFDdTaa`6KZE1GzU!Z%^T2tFV=}&7?+Ul}d1dps_N|S)e|FWOZD);t zzqn#DF(ztO*QLAO{bx6CoG`_rP)l=lL{-Z1-CCavBMNKzH(w|>d%Hh)S9W3UFN;T4 zp6+f_-uZCmdl%QV^qqnl$E}L{PM)w?z3#bO%E@QjV)wH=J!vSqE7N1!X{C)vC#!zW zvnjh~v3}Q$HDPOiSa=__H9llp%rALRD=GTt61EwqNXM*YCYA7jAm_St?uGBeuS)m9ak1oW z*FWvvySwR*)rn^byMuFo8*j?qHFe(hYg;ZGuUR+ul5^gan3mTy^K83stXw`}%hApA z`GRgo>gvwo-=dvob9_r~`8i#`sONpVb31n>ANT9{=yT}m$=a^6-t)7f%X#}9&EA$* z$NXHkozHq#ns&PU=97YkhUUqeesp&E9QmRY#{90kdRMXaGOfI)`MmLx-)|>cvemA> zRoA<@&}GW5Uthm@&%3$dpvK>#t0JAM5A9mql5RH7E0ekYA-2q?PI~Q&e?52R<<)h? zu6z5d@=C(N#n*gXD+-={iygUi|KxjGjfRn~32yMu*iIq&`>Wp$g+W!?>u zuBx0m(@%YJu&?vP)Z@XuTCpWR&WY#FyjaQ_=SuPjO1di0P{rP?y-#CYvB8%zvt z?dh5EW@F=ThbMcYeg0Y8TKn+!`(4v-%0|4Kw{rX5)XNwBR_85ocRAv|_FwzF$-n+x z)cq?});#~*=f3$o_m^Ca_0!FhDUAO3^wpy)54TzDc)Z+BW7qG;=aTpRnZf_cFjxBb zQT2d@C|Gxqb#p~x$L$MGYL4D8F?hFLDdls)T4T9O#zDyezqzHfXS$VhPOn+5wSBTx zW!RybOVbm7E?Ml~`edc$@=fnzFW>L_mvA*wJhl7T8Pk^!ms+gv=Q;D?$k(HK@AvHf z^5gB|^2>Qrb;m2~1M6g2Z)KNS_uMqjc{*pZU9xx0QT4O8Q}Bs zX4XmhySClzm+{TCG>SL7nVV^2XneF(O}BGKQf=Hz``yoP8aLh3KiR&hGB{_w)U}G~ z8?ziGC))Yyr!IPaQhRxja)p_jiePQG^5fr2-oN~qY1rqMJfqIr@Wsc+k9QZb?pr*dXSi%#sTo*s5?-;=^1^^-;o#rg?< zSASZkc_lB}Zn4@VrL_FZA6_Xb-J3akvB=%piGr7--)_^qd}rFmyWjsbl;@XsK9w-l z?Jkq3>%F!^ja~A_xrM)8ickCcF30=ihuF;Q+^Z`q7aQCy*k>8Qu}5W+@!`G8Um3nC z@93CyPNwXp?7R8t#`30ucIr#-HQu({p7Q3_pXoPqx4nxxb8Gf$k$uw&UcTA(^7WF+ z+3U7h&ndPo){K8w^Zosndya2%8FQ^qhP=zMwd6CGef~G`xzv-T=VBrXuhmZ3o7r|V z(&pF1*HdO4>o{>zC3Ee~u$S*^FPmMh`OWKQr(Ju`>a3EDneS!0XJYs7@tz3YQ^a@k z7Tcs#ueQ~uJUDBZ@4t8J9J8a>WA7bbalGqxQk7EiT`!+6&*$&0cCtN@$C0-`2YtO3WnQWV*HhGGEkP58&xl_zk?%2vrdR@lzA4tZ}F57YU8?W26si(yX zZ{B~jd70+J8Ef~2&#UX(^LzT{bvMj%f1j(|%jWBnxmDI!>>RJpG3#Z&YWl2~o!K(4 z>v88h6YkU}`%e2SoVfH#Xv@qB??oLwSxc{dICJFd;V-h?CTU0WqOEdwDJ7qJ^2%b- za*=Jk-|g;HetWs^o48Wm0^u#Y(j|1VMJD`~jSj2c5IL34XNUjlRlcuc^i-b3dwFk} zv@JE(d!^8(^{LVR`^;^2@ALR~-anmp-@9K&&Q#Axr_YHpO{^q9;Gwo zTE5kM`*})LwXc`X*mXOv?^~?zjd$D97p41`1Xa%t$e-)n|NgH2mXd7&X?NAm9x{@# z3)!MF?Qin6ujk#@@9OaSAo9yvI4z~vzPGkTet~h@e%JQGi>Vi$cRf0ta@#KA^~WP$ zjT)7JNGnQ_M&kPXtVL!>F#B>mszi$-4@#Uq=GGS z>gzv;#5dk7W1W2eVPt51sK&ySh_!2WSY^W+|?Xjb2plpJpO+c3bT61=lkRpKYq%W2w{qXv@qcm#UKX3SW3p z)wfj0PBTS**JY1+zn+6#4 z>y^))U$~_Ot@FHHFZtPQI?vI<v-hD7>a$-I z%|7={`OL$JGdFr?PM=!VS9&v2XOGJn)0tnDjHG4vzpfX5EBV#XWS`EA?RR6}Bwv}i ze&VC_6q~g+PjA^>-gtITRQA@eC#Pl48@KQ4-iN!_DvVIX$ zanW<aW>!-qRf;#muZ)fAQfytDNKgw_fRQOZqeYW8&H!Z}y*i zetE*2ITvaI4~lQx$+~&t+{8}dbuNu+Z@{ecMW9D)(?{_mc%Wj>~XZ>#5t+QH(|IXj#`tD)6Oob+FKcizkWN23kn`~O{Ethbat zH~t{KX0!0J6-R$+_Fc7A=RKQjbhN72)FI)jJjZ#tT-`;dHl5_1EU0dKYhuX9g&Bdz zKYhH{S6r{2@w3~zEXVA2fBB~SiS^;4c258P_=os>xovBBF=Ecu7x!Q4pPAeB{zlo^ z(`LExX}@|lO3l?dbN89W^5wxxJHO4;SugtI?b4ZVJGZ^){$Uik=s_63n)=lUKBPkiP$TQ=9KRZx@LapDh;Y_}LogVf!88MBLS zmK?okTWDx9W4_4V^S8I_ioIQMa98fmoU_}r3L~eBd8=)^->e+d~rqnpDoY$-|z~4cDpY*dy{J=MP7?)tr{e(ibDj%|so+s=z`>qYi^ube3;9&G%=#r4XW^G96b zI%fntTJH1J-09tdcRP<%ylhVT{k-hahxL}?Qx5c32Qt0W4pz?G)y)?0w=^|GlOx(E zz3*^Tc(Tpqrw`X=waZ+XV)tZj`;$Dc%WtK!&23Me*j>KQVv(Bmvqe>ll%KwQyY6*= zwyfyvJ#k;weOY|Z+Wo$1Oy|j{)gQ`=m!7m(zgy<)<{eKqW!CvjclUXj^kSJz=);qO zlAB!annic3-kJVPT-dK&m>%`|EW;E?v|Mnb6;=Q<-6H`?)9eVzMHSs`<(B(vF7|Fsp+R``p?#UTsL?B z)Gd))E8i{`xh=f1wdZT<7TUAKSKZ=3P{!%;iki}r$ZO#XG& zu6cg>=g;0HRM^`W!lVP1)(lx1*`+ zHg2A+7qnY&!L`WL!o;NSVMelFJ9@bedB2KxQYj6px@%%{ep8;fn~mh#p3Qf5Z9DTr zxoe{FgU%`Jvvza7^`HD9cFok}7)`+jWpZ?UHby@jYryX6gFX!|0)LnK#+VZBxV&^BNDnC8%)_2Xa+dpsh zy^1Xs`CYf)ubG$ktD-P6&u5!|({J5*Z#CBcIDS9zKwi)@lUuJPZ%C?bKflRS=isrA zwI{n*^Tht0(k^f&Yu1@Ancr`8Pj~k3nD+Qc>@1bjr7mp(kM=OFyMMM?@98vy#FJ*v zcdxqrxNY;j&X?QvzF3>SV|#J`;_F#9lNX%aoo6LoDjlY=_GiiUpEow$SabGzq+wpf zCME6CfB9`UUhYbqoZGs7!`Zd1DYM=uKHj=BPJDW(=du$Tx{H^&Xnsgl-n7Wbt~<$_ zTV==Lv$N#-J_$X}^13ut^mFLa%dbnmzcek2p6oyAR&36fBS-!-@O8fKeAzcm>xTK? z=To=OH8=S5Z?WFw%1f!+)pT||Z+or3eN|HRM%(ac(`~QQa(AiSoKf@9a_aG&dqSSP zyLaJI{A4pR;fYJn#9d1An7`wYk%VE9j@j9#3po;Bb}!hRxH9cxrODaMC*pnwCuS`- zdb2&p`dIF+%@%8SZS(n_vwPWn9hXa)cRTBvt@++MvuDqp^>)wm+-;FN(vBWnc|1SN z)=zUzg={HD|MW_PTcU>_q8)g1V#nOTKxp&-!*>PTw^3e)^5x z$;)*Nyj3-NPVR_I6MHMtKKbU?lhL~8OqX1KJ!#3r=`9_3qQ7#g&h9FinY3fm!v`}y z#OA7BugfyIeQoo!pV!VM-d;D`^q1^8Q;BzdJNEO{Tjm^}cEeRp=i}l&+v{`EW6o^W zIBdAmG{p2;^zquK>klpbcCn^qq29MQYhu(NCa;M&Vew_F?piOsTOO0X9G_cw+wSDX zw=pZX`$U^XmugSfz0$d>rub@3X>@+^VPj)U?X7-Scm8L%Bs@3g}FHOh0QFz0B(E(bQ?Tc{cl(WZpg79b+HvtX`ROVvSwSZ`?>zdu&g?jy((+=}kJl^=~x$lI_9>LvC0kI29Zddka+|BV;LKhHHjhmPO8pYiAR&3xm;XZ!rF#xK89 z=u;RSIVbYtHMKXEAFnB^X}`Rj^X15;*J`)lZhP_bXVKz*$#RkJ_l{h&oYfWECz|K6 zdRLzH#6>ATw$A3gne@{}?T)FCTywkf9RbvL(4^Szv&d!^*; z{mATy4mLD5Gr5vvPVf6XW z#%ob?`I*;k=-c+hsp*V(pw>NaEuXeztJAttGE=7CocBpz@k$>k$ww`Z-} zmMtD{?s9YarWdpI_T7HJPj9=(&AJyyqLw?nHeGSGB}>+GorcKkbvt&|n6n?=chAy%kHh-4=Z1;(W9>Z1s%F z!?n9ZSMLwsSuD5PH0|}WKQ}+8?yH|$``zb@OUd~nD~ZyZbuYSi_cQF7>gig&z3lr; z&obq2xAsR@Mmd+ZuG}6fR#scvFt;aPqglmXlHcfMNpN-)&y>Qo{?<8G)jM+ct9kjy zZu?TT-FNH9!xlOFx?|Vo{m{LVa`~l6Vd+N0yqbIGCSMla&bxEj&G)y2wZcAS~|c&AR-jQ(j4 z#raKdr2Q7&9js>`Z8~)++hh0J-MXBgf}~0p2k~#-^QOA&@8Y>~4^v|EPu%?!=6^c6 zyr@p)tB+5KPVJ0utIy4y_*u;^^~v4X8^uSCq#ialZVv8K+uR-4wNd=0t;xLZk7qtU z-gWwsUN7s<^kX&8J7(WDxp?z=QplY$=iDkr((4}2j4k$#-sd^nV(l!s zlxfdrolX7mDr(B9p0D+FH%+bCo=?uZ^5yJav%7cpo&2`ly?<5mPD8`U#rN)=s1CWY zJMl@Zy49PwLw7Ekr5`pHuA3j2;y(9q$x-dY#^RBs%Kfs}QXX#anrQrcZl(T`iq)rh zj;FqV^R&0N#rxvUJYBi3zij3!I8VR)*|t1eh<(PRlI_H0M)S!YqB&3s<~? zJcI1ceUIIren0<8o~6w_=`GhIg}s+;_xMvWESbi0vWvg@F1xu? z-@R;i(ZRhBt~}Xflyuze;bz}8n_j=3t!AAzJ#~{sQrgQ$YoZN>4Y#hB`+cs$_|)F6 zW6Lf?-{U)YBPjE&{>9=#H@aJkO2YUQa9MNBz;LiRPA$TStk)@Fqmzw55M zRW5Vy`^B{G&p~N(%-vl|zup%3_RbLv-_9SmIlJxt(%Z?ZJAORZ<9^)t>cdgP zr~BT`@-LbzYc$omIsf%s_O(T4_iy{;_K~-^*&*$+)=Am5J9p$Q z(69D#a6O+*Vd=KB*MrjLgrD7Z+{Hik!g2kFr{1mq&v3Uk{B!8u`kNIS|1<2atbRM= zXV3hrsrEOYZ?pg6Ge7)NZEgFyUv(e-lt1hDRW*lwj4xcD^@eMo=cCBledeBxxm=OC zj{?4)yRv9zLjF^WP##I$?S&H@vrlY$bw6;Amx@%-RyFDK(c7-?d2?~uh4|;2Z_m1UCpTjy~rAIvFNUYBkAD!$s|ZSoeryWe@&XI?#5^TX_~ zoQ_4wx4Y)9HdjdfV-C{>?MqUtav^jQ^47f^V|t zB@2Gu>{Z=<`IcYg>^-5|POtelRbugb<0oPhp5J@&_-q54XMCl>KIrQr_u$cb99o z&QyoFS?HdYll#crGvnEo^WU_sUisv#*4vmi^-X#5lUGifFF#)M`1oPNgU3^jYI=Qet$MAQ{3FVG?|+8x{Mw9t!)w1>Zv4IDXYT$D zWB4ml*7$F3`PG8jl0Uk#_x>~dZg2f_Cy)PIjeNh^`uEAt^8T&-rSX>euhsii4}QH` zb;$Zmh4-eSTRg(dciyK)wgo30^<}g7Ut`WQn_KhzSCeg*xZ@{DXD++6T(gi|h9K&@0!=a?kAs?HG<<^f}5V>|<>0%`G1VQ%3x{)MWVO0UxD6pI}fXeX$@%e#Ir+k0-;ce%G!Hs6{zy{Oi|xy|>z zosZOCwVR6%nmyh0pCQ>|%Z)d)vvXp_j&9C5zG+s4cDHA}&5`#_mhin?xvjol zs;SF#Z_TS4nuV7Ne@-h_+bwZBYu3D7)|XZHH5JV2I^6xDc3zX^;#;P_-j?a^=Cj`W zdD=VaY+=ENGiQ~$gr!wa6gqq7>@9coPs_Ekcb+f4_Hgdx{LANJHut^G2T!%;cJC@m z*_V5~@8)vR@6n=NSNA^W_@TILhwHjU$rYv{-g6r>+05_qXWclMvZ?0KnMv&`MyFqW zI(I2)V~XGut!*-&bQW~xNna9q{VwOeUeU3;r>i^;FWshhHCFJs(V1%P=Z~XhPbV+3 z-a6~d5BJ;od3T=QE;qct^Zm{I!y6v$dta52v#aLVymL=3FEUEs1)gf%1)XZWT-3ey zdt;2}NgadS{vEeZY*Y2_+nC#s^(*t{KWAUfzVlPp@0%Lpd93hu*x3}X_QXW7$kJE2 z->PPY-m#pXemj3oRL@4s$Lnq<<<0nbd6D`-W1(%I$`k)CEj~8w?%}lC?>6V`n`628 zZl1J$=ewK74ePwC)NdwldR;wrmHI=u7ngUh*WH!2>c#hC+uB~Q$i6L?zdG4#amKWL z$EQ|Wu!YWzT{z|ItHqy{U&J+ROMJezUH6ap-O2K8udD1AoBJQ}+b-|QcfG`_@=E51 z7hB6+!khUjyZ67{_;6dzbYst!=TWCCvtQjg&3w|(cK%x9uH}8KS9MPPnJjT4YpLpu z;v|bDG98nmU-`LDmAvw8c2wBq6<(8;Oj#`#Yqyyt<)~T8<@>UQ-fL&f+t2cSna!l@ zfAiWapYFZ(R&BT3V%I${i(GSe=^dRe`|XVHX4&v)!;7Wc-J4#_Tba53zWRYEIpy4( z`t+=-{-iB+FQ%q+gan>Uk6-_dN9)%FCFD|OLNc+6! z{g%hul1=a34_`X-;db5s47#&LuN|jQw%vYdoGx-VSHC;2+x^tMkLyGW9J|&;7w5dH$yV0d z(Y4^p4_A{l(~YvG@~qr-b-Bo~$5z+$y&enp3d(Jatugo9?Cc%5d||*H^R>&?7prS9&onX*rBPqEg2%e`gKPSe|b{d&uJp6n{hD!MP0Jo{O8Y0=Xe zpJ!^9=5<@Vf4Sy(Df5T_3?;dDuTQ?WJuol&HABPWBj>mE><>FS)!~+JZPSFu6=vbH zQZ$p7ulvt%L8@a<=IaMyIWb>1JlWs$d(%zX-=Nh1ckKlyeZANDcil^qdp{1gyROsax~tnn$-UM;dqs>#ME| z4BN8EC;WD>|Au|1FWz&SUC0p?GHF`E`S##0B+B-j%?O$C!{DKpmh^6)=6t`uT(&CTeQ!smC-3>ba(CeDvp#QU&DrjI zQ?u{puD5dD&zJq!c4GFI@3A&vw^M&Cd%6A0?Yu2_-J};^_5y2Hcr_6+~MYD3`GKUiZ&(&vsv( zHO=a0Ud{I|-}O4Y^2w}>_W^sRR%Y#)Zoai$&nEMQzBZcgLg$mz$#-k3^rpl@g?K?{0)gRcX)7PqLH#%)E3b z_|uY;6Fy!0veHPt(7W*HO7EyMAdvlSb=j4)eQ76`_97dFK}UovWIQ~dxOTDSgo4M(}v7wyg=c)5`m9JFx{ytn;oq0>|X>8v8wlh^d z{~3C6_r2&?bG!duaO!5;l5IuthO&X?v4+>RAHSPwzbRgB|GnMP|GLah?Eg0T1M7bO z{yBTw|FYXh|NPIO8vp&;)Rh+3#kcj&s6F?tsX2Y(yLa9(PMO~~c6^;Rn{C2F&ARO5 zl2b-D&!RJfJeMuq9CFv2cgJMYpOWhrUt5}f>rCzBw`KRI2k%MgIy>cPdQ()2ioZoLw=GEnPpOY+cHf8CNsFS|i zGrl-Sg*BUKs}}pcEjz#E?rf3Efi)i@ZC}oqIeX7UVZ(=u-F`E_c`u$RyD;~y6vv#`q__X%$Tv-ah8mycH!?gQ(ubD6x}oZ&6_v6 zDYjNAD?iVTnOXGo%o(b1HSm{pQYB z>YHn;FR<N^H!t{1f%thac0(x=}2cFevg_X*}33oCd0 z+3BaXUi{{^y&V>5v7WL=r43YLZwZTvsr0LL@_1%mulDLVDdzF!`z+%Z=H6y&LqA)| z`ra{&{I*m5)|u*+OE-fSQM6yy-e9|Uwk3P;Eq48vZ;zj?){{J2b2BI0ZqoVGd8c1q zf41h)`IIkb3gUCzzfJZ%UVd->ar1xEZvKka$>d&iGa~k#w(3)bX}eyU8O(8wy%S`z zVxnE!O&#B!eeE|U%5uGYAo)6e(cv90HoYi5T9|s=?EEyVKZUl258Ef!EIjkOU-h%! z{j=4sm-8NPfA#VC=EG*O!e-~|Zoh>rWKduGIbrk4ZO7NX+qnA2z4Qr5-^+fS{iAn1 z`^g{)wZ|8(y6l4p7G7vKMq zd~_-6%a2btZGRUL;-5W#`tpSra;~S>*uUk~=Z`JAe*F2Snk*ajFPD1mZ)y9_@I3qA!37V# z+jno7y8QExJzKMXzU%pDbLsk=sJzRnok@Gs)>(%gJtSW+$4XODw5)p8iL;B`?3wM( zx@VnQTFkMxezvvnmfCqIMfA7I+?peG#{6iq=#9*r@7m(ANB#MIw|)rRyszPR-qGEk zo;_WD@?hE1_QKhpqdyh*6+G$@F8^e)_VnRDEB3aqtzKZ%<&;&8Vtcxt z_p;3;*N=TUEZ6MXb&scFigjk@;-NWwm|AEp^79JXI@dm6h~4er*n%FTZtH z;a3d{5xeewfCd?ORmgmu8&Ed@y}b&B=4YYs;5|S?vs+E zw@sFBtnA;bCG|)1YybR~J*hWue&_x+_qzX%n^6x>=U(=EyY*Y((`_4{MpS!0xoe&g z)42On*z)%F!V9TKQ|?AZPRm`#Gui*$W;dI;_hwfuU-_kN)s_{fG*;)Wdg8Wi;fYm= zx5B*~RbP~aihZ~}UC4>kC9}-rM3B&;SFs{fd3SI6ZS=Tjnvb9LA~p5>!lM0Q@^f^< zW(RM7ZItmf>~4Q#v+A|@oG-Dt-(t<~3g4TZ*V*~u@N@e!u>$WUEra)!L?x|Kb>rWl zE8cFFQK%8N_vD3hkqy$>@j;b7kIV}tOFfM}J#vqHeKlF>YF^H*{|qAew|Z4v4GYg+ z`#pQ_)O|~QZ3_M}|FSNAQr3M_?ED!^{m0kOO*2fNIb-JMAKBeHXRUUu-}HKs`tr6H z^In;A+&16-_}%Qs$G?_56kD-;W8*W+wi6xC9-N)Djn8J$wsVh<%=G2T_WoHM^s?Z@ z*MfOYe>Cf?{%{%_=`MVdyZocO?t|ks!GW`E-u^wg_REaU54Y2KH$QA|{5SRP!haKY z=ic3Vt7cwt`t9|-`+YqhZ9n@m?R8OX&T*I9(*rFx-8Q_Q`|+}E{=GN<;-?#$K36De zjS%^g{VwW#4zq0ash`F5F^g5)yw@(>_CB*NOn+-l%`;<@mB$|Jc$<+2KGmGOon`b@qm=~v=YtyF1RkMzq z-{MslveNs_ugifC?_DYDuX?vFZ^q-_x~_Ze-raKfwehf>yEQQQp2&<>}2jsoSbFbNA(GU*%EdiMoI6qTTag521+rcX~H=Gza%x z&Ya_wG|OJ=R+Nv=W$Ro%ja`-IQ@+_>-uzTkM#{Md{?J)K8Y&$H(ldnp;~EiHemUDRV0Qzf0g zEPK-X?%aKA^S(+vzED1K-CfJ}*t3;yW*$#xn=EpsBrNUD&6l<(x9J|1l|B7T{cua1 zVy66S{*$@#OMJDzSzDdYShc=)>W<529vQ?~*Bo;xm(cVTWvvsdOy`FyB*w{FF{l4F;jg7CH z$Cg}6-);1B`{(E>JC|4Zt8dL|kU!_IY_;HR zOZzEXe%ai3`~5iY_E+osbLR&dM!zmEJ5&1LxZp)G*UY1(m(AQveRJF{-Kj8~?c~wX zG0X7>_hn<{R|?zHPS;#}y=?84%Wr4bO*?VCna?`6pGEs^?7Y-p!6`}B<)Qby4ws4X z=Nvs|TOYPK^Vq$N-}(pU9rD$U47znR=&^6xN6pT{*l0ghkH87<-tOMEJL_uX>Pzuv zPd8=Dz8CrasA`$@hOW=s(_@yO|FeJP({o9el231cwejrs5|>zE+whwv-^_2C>^i-8 z+3iJY@~(F3?|dt8`ZF{3)`tmOF3#;&oenCto|= zck7yG@LIE}U-T~AT06bu=$^L~-yOxK9%zG^Dh77FL-l${&qjN zJJ0gYZ-13`I)BFUIY&#}d?YjPeBP12SykKQ(b6iZj_)sD%!sO-V{O{{C^Y;qByxNW z;3;LWCUB!IdK0*3V!3aIg-y$Iy~PXmv|Me|Y}{|3`?OF_Rd=O;fr_!&H0`&7QYtQU zXL+tpa?Uo&J@Ia>`mNVDLk>?Y+g%=)dazq3oK5TLE*r6u+fQacyD^_N>h{ab^E-dr zy)iGlo{>MNdfh{@41-wN!m?G{p3a!JW7l2No$t0KFVpW%)4VQyHZON|cg9)oP22Ty ze)l9r?Pfo@c~7Iy^epeKGmg5f&J;{Ee`vn^tWUhM>?Y;lehbiXEW9(XyfS=g^3yc3 zuC?#vu9`s63jd97ew|CaS2A1dzF^tz$Q8%iW&B+VQ+DZgoi9>K+iZJc&Au$_!^Lmj zWxYFddE)L<_d=JRi%k1?DNttm+@(hh%T#Pu$rwxZyiXM1WZ`^CXr|yL39Yw21UI|65WiaRN#%8T^4ygNPZ<=X2$=X*C= zl)dGfcaF!R@ODo5+V=H&ZS#smI!!;$Q5E;w=c^f5`o-f!_rm_wrjj4e=I#n9jW)Z! zW>e0UgySXtO*!zfeJ@$}wJ&ox*wqI+1=3en5I`q4r|NNcH)$98!_^P*lFWt|) zRn66^JtW&D^zZFwSG>x!zOj{?$z;#Zx>lsTl6!LJ!+@v9ohO`)^Kw17Cx2mGrljXl znZIYYKRQ`h8NF671toDDEp$Sb!*YF%UhGW4U@LL*?7J5V&u$nziS67I;M-xTWJ&|GDS$N zb;+-#8Bv^CP8U+I^z^TkSe#a~z^>ck_Fj&0B7Z z<=iVf>o)Jki*CcL!ke?t9x3@P6Mnx=yMA(tcWi!%W5-6GH!(O3Ldd z8ta|1W@S6H@6pDaqT(T+A4Oe`4e_YjbZ_3Zea=O%-)g;CsM|R~N5MOlZ_{UQ?_P_h zAfKL&;})e=bL~7%xBXtb?`9|Hc&)ybt-6<|Z;O5IKG|{S%MG9twqEORd#yV=Z`+F* zyKXN^nk+1A2m&Va+AnbL`aZR6&hAHYyc>*e_WIqlShMrj<#g{{U9&RFJgqb8()&xN zMW;?nd1`TYYVG6~xm%3x%*@+%Q%Jx$!_vNHUc!x!uZx23hn=}O`R;AM`Ol*b%bT`T zXuedx={mQ+Z0*{oy*#l$nr)}O`ciEATi)cZx3;mdUApeff+J_n+?9Cr^5rzqzZb79 z?+%|?IJxFP$LahhS1YH@JFTXw(k@@rdZV(BrL`>h)6>ae-=8ei`0eQ>;Cf}B8RxBi zcXMxSxjlEHOySYKm+vm$j(%0GcB}5aUCHV8_`RRh7X4oCJIOHX!|hLo<$gM!AIx6a zeB5noGpB7}t-ue?1q(i|?zrV1wv}^5d11k=JCn_WINhGC`K+HRDHrkh+>R-`emZa6 z5aSlIN!cgjtU{;CB+uM_?YCube)G+C7WA3er?>xb?Y&d)gVH8G=xBdlzkOZZ`CH-H z)%Q)~Ywj;Pxpu$Uto_PM589>s3kqHoJ)RO@YW05K>($1_#;e}%Vtr;8zk8?NJkiAR z&)Hkq`jRG{Pjy;fdu-9O=%8oYbU)cn3$7Km+s(dcQ@5Nl*Vo?2y@uJUx;(QZK5wy0 z*mveXLwBM7H;Y9Ui=VEavEIK^n#kTKi6-2r}=tL*-b%1@mTRhrp;2zR;BVBYdIe>QE=B5)jXZkpS*%P{-_z8 ziw&!}UKm@l*W&ii`mEc9Zn}2T+Je^&Bj;=1t6Il=tX0c6qj2fMV{sXKy3g#o)tS5N z^xAJ>m)EZ8xU|T~$mo^xbGe!u>$=zMN_z2Ox76ABIoBWVW?Ro@{V`TpSU9KT$QSR5 zc~AGHrPM5WT-ztU>D|2(X4hKghj!h)?>}LsxMZ4WzL570y}+X1%b%v+mC|~4-KW-V zyNYGpOuaRCCoJ6fr}<2!`P)^6ua@olYjbqFf7$Ca+t$kuXZiTo<*qM%WWMx!QkCC{ z-HylC+%P<67kF>u{rRjL<&N`Z>vdd7*#6V(?2k{8vNC2*yOlIk1GDc6zL*gn6(0D> zZ<`R;_sC~wU(Z>UoZ=DvL+xOe^VYmG@d;NxX>86qan{X0NJaMW^M`M_!?Ub?cdcD6 z_dKOOfBC-2_9ymVUwTpGeOM&-1^F#Dzu7aY&beNBGXH4xzS-v@bH2JQ_rEMG`_9HZ z<iO!m64=+#t}KPjm%CiXB2o1INwl=#NXrz~|-;ggQp zdR;#LA%_iZ4^5dGP<=piiF2cz_0g5vqH0$AP73h|iP{ucs_$@q!AaSf&(BVtx#;%0 zncL5#{5Y%p<;AVCv+{|N#xFNK-faFjS0zko^5y4RH&5^FYP57O?^iE;>iOB^cH$R< z>*^;fi&Od1XUtria(+t29J^Eg3(L9>8J8P8{(M_+v1sPe^!RCVq2J8c{)xU-c6Qyv z$DgD2=}BGMvgu#frOa2R+6O8s7iVg{R=t_bIyFL1C4J7snwRVBrv_&R{h3>$)XC{9 zIloa~^|8_ypM;(&9*ex0yYlwE`ZMKA)kKf4SzotDo|Eo-+;qF(@#U8reK%h0I`L>; z-`nqnvGKf{^E(w*l^$bve&RJ*aKQ?n)TPG+qobvyb9LpVmfh}ayD-^*;RD$h`(Ech z*uLoAmlCB&lO4us-;ZTHJ|CZ3a`y78v#C-2Q_HT-3Ho=o%KoS6(fW%$Joh*L;a~R4 zci-ky`>xhUT0ehk^Pj<9x8nD$GCt2emL1nxs!C4mdhDEhPE}2mHKP%-Zx^yofs#8mXeAn5&QK9Q zB^@;N!miSwDU*$j1++KCmt0GWE^c>Ta`~oM((#;VIriOhvsURW_3e!p?DTTnw)|Eq zN5O?UlW&t;9~d6FUvg9}t!rB5hsgRln@%VF`{R7<(xhcCdADcBOI7D;T)CyP%}a9+SmIv4^wMv~!*<(V?fR35vTF21((d05-5%oQn*`*u9))X3eU((4^{CB?nb&b!q2@QY=_`No|G zD_s_MYi4@IY>KYsJ^sriZQD(!snd2Ar_bH(EBV#d>dnN+^(T%O-T3fld;8*5a%E*# zZ-vfM|3i$(lH=bf5Z`dLuu_uZe{jhPqt3zfWG zbUyRVt}E)vx5KQ`)j1F7Mw?V~OrI4VF_SG@G|gMtUQ=qxm3^oDLdt_bpNZa*X>e}3 z$YtG&Z7Xm%)41u(&+ffikzdiwlDWhyexK? z$0$LfB}ZSjJLvqniWBo^J%2eVEN;(Vr;h?hB|n|ZnG<~Fi*nY5$nBZB2lKbRp3k#6 z^RE9IW#64QW>+0DiY@A$QQ>Cx>hdkMw8(8?GiBO-O;6pab0AOHGq5y#@{~t4EbDn5 zPy7;gce2^OA1}8}i+((B_C8hR)4IW5RzItmQBqy5k@;@McAL8^&&vMJna5*j`(yTU z)yuM>n{K}D>)w0s>B*ScP9K+AOxwA8i>0`?&j;XIyH1&xOjSCC?&Fc@C*s z^4-%>Uwp7%ag%zIZBi%iNLIyW`#Lq9@-B4KEssyqxjjyHfRJ(*(O? zKco4Lipy+voe4|3kg>?RsXWgueTrM`hPHE=GS6jY+c;5YX_u-GrSJm{k-1<6a z|K7|$@2=O)He6Sl6z+Sb{Igshdq{6>^0yPG7sc7_ z+j6E~<@2_#yXCrBIlGkdHYxr1;JaD$UvKiMOZ={V8Rt*U-I+6MPkC$}ub|I~tlwsumo(XZ-;eh_(_BAZH57ie zE&jVjd{_-u&VJnr1Db39gWc5>UPFNJq= ztK_XT^-`m~bxwS{cX$7mb7p+yg~lo;*1vzEmD)OYX?NS_PfypzPMIETVV$(D)wkBJRXK!)QtEYSJOq20nm-}qe zk{=#zmDgStzTQ$(ZkOC%cOmOz`lkA+T|f3I zRev;Day;b78Gq+zlRCZ$Ojq0XNP9w_R+`U>9Zm1kPaWF2deR$dj=pcco}VT@-LOS_ z;mlIS6;^x1UzVD`eBTwHdRbUbvu@(g^76~?Z_7=uxO7+iy2BN{Q;E(V5I@gz|O+N6z#OLr~Q?uPiA8(80IVlp+>zbdLrQctAxF;*Bf8|QI zw6wJ3g0i)?yL>nMFWr3W@xi_u|8h6VOa5H@{O@CPgU{E#?$1*1w%cBM_4%$E%i<^d z7w?rjy~ujvg^R*_w;RsiRDE%$V`idaP{M=Y4SNgw+#@H=Uc3I7flr>zi;I71r|g}$ z-!7jKZ>7WQeBbM7{g#-W+t1><@#3p9=cm3tztCPUbBpcN7p5Om+;X-( zJ6-Z;>rdm9j@>8wZtH%G=1?;{T;?EcRXzLsqB#fuHZHQuxc%6;%=zthelh;v*Js?{ z)BL8+|9kcFwcFRL?+W>MvZm@kL)Dx7UmCZS0&n>r5c_LqSM-hLi_G8r=YOWw-;WAg z@;D~$mU-zrm19Z)AJ}EL_MDQgHoGOQtu}AV#Ihw`o$127&g&#Ad_9{xjhg;5u(Fsr zZ?-Xe^fcQjTGrAyWmiq1joj7^AH^@PE;+mY?SF>QC8tZy&XV2i-ge@BbeZK9ANS8+ z#r^wIyYfr+Px9V&dyc_%cf~`immU3fu24-XEamj)ytNxnMHIzn?9J|TO_!Aad?pJ}n;F5j1_ZTuLkdp!TryW4fO>tl1`7hZX|U(CBM>ddsW z({DfBmL~68llOE@x9q|b68?#^Z$<5%7UX_q($zU)YTG8+yDySglAhSDl6o{R;?=Gj z^TV|MoXL~&-Xitqm-MgvgR}k=Ki>3mTW$Jz{yoeRovp>sXGWY+5e}TZ@3YR_Wgfp4 zE@Q--^crZ6;G-#*;~5Xz{=;l$dt_! zjzqi7$t!jFoO(=p`|))PEu|jI?Z})SGUZg;Z+#(=B~rayLH-8sqSKnoFP-ZzJf0V8 z^Id(X?e8?J-1$5{-e>(hpYO|i^Sti(nLRVton3Ix@Jr!ML$mw2N$GMieC7)7-?;8Om)PMm6L%~ZmD-$;y!G9-UqQF_ z%;q_>GUsn*Wn}s-(`l-Ae{0M-7uz3r@$bF(-r9|?Ty8(!`C@t6e}+BA@_e@JS-V|6 z9#tx>u2tJBvi6tH^`mO(%YJWszTD?SVwZ~_(@y52evTjW74l{7?b@$=P{q6ON@&#S z)NYx$-zTMdvlg7zlAGTbqsif)o4Zjp-(<4BMvLSZiQT0)zQ<11pLOTM{jT&?>C0~K zJ$o@a{itxnyCdeWH^003+xD$@{@lY8%YDsuomNs;vrfx7-?inJ9?!(IoWi({U9XjH zFWX}t)1P$dL;~;Y-!r%0%=^dvdezO(!P@GVE-lYo{X}xb92c3`9hWvtot$kPxnYjb zrCpYmS1xQ{Y~_04Ql{V8vf5pBMo;IM-8DVCe4Y0G*?#;leD_66Z}~UlPpeJ;?Pbqr zvrf*tx##HaKD{sJ7UlK2hr8B(P0L&!6J5IXb>|$n-;3sQzmYqA;m@p9?Khg|1V(1o zT=TBmxa5h&=E+8P1iuHl-YhFUDm(SCR(#y`i7RvMgp^+Lzm3mclli?`d4Jz~)x7Qh zrmy6k^7r1HpNGpn-n_Qz-`ibx1Rv~f=c}9d#V27#-{0^4{roZ_k3a93|Fmt|<#k7k zd|BVcid{E*v+dFBZ04gAo_WqteI9KxC3wDj#2dGmz)3aFygfh6>QwLfnVdEEb?xO0 zHSMl96U~2j*G~PXb;QTLEpgA^-QSw?(_|;Vk9nB-G3{ZyXPK?JkIT8$wgxYsDb;Rg z^M0&)QPxH*)>cs1aJPFUzskao+%47j3!KYrWSW+9PV9KyaneyJbpEq>{(^@t%W1n^ z+%320(naBUxoq<$JlvI%;`u7ta_{T4x6RhvTCpTHcgps={u{SnnYq48PT*VQshO4U zx9Dz9*r&IjFV`pKyy?r&7XKNxo;98Iz!QvW_HH&zjBsy)6TD$Q`P1EpP@Nh?R4(Gm+zCV zM0VXyn*Y0c*_s#M&lc{CX?^gmKG8p}xOlF_@96DQteeK?X%%lf*Hq@NaVdXsdA@7j#q`bd zZkC-*tNvj&_t5*wENw%$3U{>DC4+bEi_GJn^>;BSXj8LvPhasdGPC56HZTe zS#~8>Wa>moNy$>l$F-*|%5uZJ)26#||I_iQDW5oZa)#l%+GTI7bhaJ6vF>ikXG2>< z!!+;w88hA;Il5)Wd%N#t0`J>JhYA>&-q>T=g8}OoNml$xqjt$h2Fp$z!eC=cJ?{RO+{35#{!@Nf9!`<~a zKE_U}i&m5Q)e{pR)D!lf!Bl4Nr8Yysh;shVpB>e5?GE1D;XYOQMRx0q#}RKI-6~YQ zd`d_q;e<))k8_uH)f9HsuF70{a%;ks;F~umz36}L;{R8?`g?u8<(Aq7dAnVFO@7T4 z)0ytxF6O;v`=hj3-+x)3jXK6y&35zhoqM$+&#<1qAfNoHe)nD5+`W~ymzIC?etiA+ z_2l}CZa0PcF4Zw?fBEtA^bP6@p1-cQf3o`DuS;9ir5=5|xN-i@bH|jt@5=O@nRZIl zsyQNQ#+mdp-KR{&bx+;fGV2omF^|eSn$6++9eH-%RFlrTV>+v|KRr)cw_o(S&-ruC z=i=|_?|gRjLlvxQzoPCwgEa@-3%Ds{!j z{f=a}&o-~XnUkb4Ila7(Oj**ghsCsc&ih^EZ+$0UmFn4VUwp6L%~nsQc4AIdx015z zZM!!0#s3+u7WyBZIdk5hH5a#JROuuI>uPw_ZG1{K|LJJN0#M zr?j2E;CNz7Vfm{OL%*lEm}$G&26@6KR=vF zyZZR$r{s>0E{5CRP2Qzk{^71mtjIIQ9kT;}X?f{y2vt@8r@7`I$L6y2qDPl~jDLOW z}*;VCi{>^>f z>n*q5>imw@KUz}pzWY&KkzDA%k9!x3$-bXjemnE|SE<;tdGCvtpImk_{pgkZAH(DC z%7rL}bC=4#^4_d2`_zx)`IJw!i$7cE7H-RWviY|Dg-K7Q&xoA)gXgx=$C;esnHG!H z^{ziHj<&zJPa^t4d*N>9+wQaa*8EP3w)(wszJG0vt=O5$sO2yIB&p@@+R7$vyTqPd z@0Qhn28mgR=kjh}6rVcPG)O8^zInrAqci>YC9a>{%)4vuY5(Q>w9|Zkyqzz4-Nk?1 zH}84deQv9(@5mGW9QJd@dzndL zwWst#awv_qjE9Ob$<;ci)oDILp4bpHFbxX%D?l=L|28j*gD3{pMME z=l49HIqSOV=f9fESMpy_Up()0d&ZmNS;zZsY|Fj9W!o25t7O(W!H;*noH_5$nNw|o zWz`Jn^>==zZC+{FJ}+^}udd}57jJSsad~}_?@rQBKjq|5ozv@E3$vF-n8p44ENQ)I zt?!TTe|Ba4XGovyTkhU=d+m(*D!%ttJMXVBJGuPYH|Oo|gY*9xJMT-{c6;}Y&kxS$ zdDqXaoss@?!wvSm{}}|5P2b&l8XCPu^SjoEtU1SoqLs}jCpJEtaV(wJ=bOj%+rd{{ zCae4in<`b~WhB`>Ys<$~Pv3@VFWP@I{B+LIi?3}if2qIw=}qmXPyZfvy_5X@Cwb<) zbu!oD+g|-=F#GxPUFmnJtXF>8aj62U*Ka|mR$C6ja#D&n>!1I- z`Q7Eu)3e!`cFkA+9q9gbicN6;?eo2_+GfA0wmnmI?n2FK2D3Gfrhm)6_@CkAI_-Zw z32A@(AJm#(%KbVo^xNuRC-2*9KL7bMyZ!7T{X>eUmX_!(i7M#$E7!jG>-vV|efdAa z{xdxL^K|W{FNGa{AZSB=gZ^6C1D0fj)(qSyzJjM&5oC!_Z?TX zx%YIR?%}nH#T(ZKOIH5m3g+@_ixzoy814w=LfEw^L(lsZ}EP{w=<&Kz4JGno&41B$d}7M z!>gl}cb8nN?eRIbY=#TZYW)+Rd{1v)^Yn=|yWQ5=6QXY2l+^Ryv}RuLd)pgI-hs2f z9%+lr)yQlM0u2wgEZOkv@!FFs&z9UZHut%fzF*(lQh!>>Y_YrDay(^^kM_$%_ucp@ zo&5NG%$YA|uBC0(-lx0raMHfFTxr=Bhhr_52*sS(oU`kZQ}?mQXY7ULy{5iDWh*88 zO5k+N+&-O~NiSaSSN;4t`agr~^Y|s(HvJ9H{8*NI#7=)0k@+q4Sn=@-S5E(y&3LQ6K4kUskohe=JvH$+|IW;PaB^k$ znt4wit*P&LlWA+PwMypOtCDEhA6vz~#-=?qyDJxQ@yL(IyT0t$f9GgVVg8h;_meEz zzRb6?vJaQ@j82Rk9pd9n-{&aoUvTAYWb?UTz6MgrM;_NSr)(JTmJ4h5g(si zufE?N{(hhK#&f)WvaWeYrMz`dn!D+nN9P~)*p)X=D=4+T>drF7??uIeFJ?PYKG^IpDg@%HO%v)^;{SKEcx zua=tpS9?Cs?wjHlzup6%>HYn^><{%R|6bm)EB2Up?`71@AsB=|~YpS;)akf-Nf|6ROx z^D$YoxI@Knto2f#%un^T?tKz^U3b^yFT7h1DJy?JynVqHzsa%fp|Zl=y3_xhy=X5f z_w4Pwdx=kd&nN7&SbIJ9*Ib+9b;gPNWo`EOFY~w){;c(L#FL}NAu(H?elwS4xe`-6 zHKuuK$3>M(Ev}8*j81&)+%n&<;$fvk4bv!@)^5Xr@M#Tl-pu&WPQwfW8SYd;lHa(Et6^rYcJ~0`_EAEG<$08 zW0^~RpTefc-kGe!G3UqQqdqJC zlg{kzd~2!u`um>SpDm4|Umsccqs43m-@Us!@m8Q_X=UD(MuqNU?Q?FJZ_D)BqyEt1n})sff#lR` z^L=_xZ3N|&>mvR$Y}r+3ec0dkjQFE3op(3I${p96?p#u_*uCw1+{whlcNH(4NSd~0=@vTuD+?k-!;{>M4& z?>?XJd;R^a`M*nNe&~IQ?^kg@=N+HeDz~(O!EWZQLpxvfX0O*uQT3b{-kcPAerauW zW|b&wO?uF}CGNLWx761DxYH}UIc>7&8|1Hef4*riTOl*pZwX*r*vtq=@x}+D=uH?SQ7m3##xsw6+EZ6+*zUR`TLX9<6EK^ z%MG8;_?gikbfbM+UE7ZLhi|OAp88kxaOpko&8fTWR1QgUXy-IAFv#R>xqWu+@&NDL zBeTL<#e;(U52U16cFs=Qc@^_+N+`16S8M59-3(aDPo7w=ap&2dpwx#Hw0<*)cAcHz6*sncG5 z6?e#pyjcJJ#JcpEKFq_g0>??yi^b?zbfs z-o1R;I461E%bBy+&&=UGdcH*T$l0T2>xJ)|M5>D!cfRfyS)L{&b;{Ia=K4}k#kmth z`M9r~DVuyX|IXEGPN`aYn?fHNoto`$pR;?a&e`%AXYF-Ox9xjnwWr*5uNvxV!DPw*8IUX6fC@yDju)KAJZ_yIn1Mm->yvCXxU4T%G-&A?Ezy;y2Zj zH>+-&u1>wK=bKs8S0SDO(_Ve4vOVox zHa#+RX30+FW$Me+_Zr@t_r|B>c#L;!W%*3Y=@Y-diT;G+4SE?0OlTXPQ>Z7Fz5m|$_{W@a-xb$uyX)odq9^&stWM_~K6{IM?csGt^IbRB94&l)T-I1(^O0D? zoG&+Pcj~ICrD1pyj$5OV0aM zS>Gy&wtnC6`_sf3PrkXX-#FdeP2o|L`jV}cs{-DI>zSxXg{15K7Vk_An>SbVQsqRR z&1ZL)VAMr`K)QuiEA;H1D~;%aIx9-ah5+=H2s3l-Vb-UrHpa_jZ5itn_?Uub+{+&z1z5 z-MaYt(tMrCMyfOAtluoo>X;k$ev<7JpTzA4uY$H>*l8F4XQ+tJFn_W+@y&hrl4IN- z&plt!byRQ7{pFXAyZgJE1{>N68>f6d?mG3m=bzrN;Efi4569G%PigKoc=zSz##=#C zZr+Jnc3AxS)b}g3Rko{bnksHICo?l}dZZ&`c&Y|`=VH*Eutm-l7oPJGg* z`RS1O3+tP2-bwvUw|JHFOZDT@!}cdOx9csc2`-N`l+>e*<99%Zz=1sodTeBYL zJbWh|$+q?M#y{IuZmKN2HSMWrv(TN@Q?{M-`et{_*t=WRR>V8;>5>yC&h&HU{`zyf z>|uA|;V(InNCztQa6gDfoX?AXlU@u@qy$z%^hEtDQ+-4y0NhJ%^tJa>Z?At-L71@#nRVVjOX}l z*_171SB26i*G`?jHd2#IZ%K;Td+(Kp*Ii1!`e2@}T})x=KIy!!<45LAe=b~q)7&oP znQXd#-n4VN_w%nlIXKCB+tb4}H%ry;Mn|VvJ(|obnp5HYwtTP15BDcwd*a{y^^A|d z9Wp6u%Q}~WG8u7URk!V_zU!}U?p+?^^-C+KTqw(P;H1H)Hzi$p^>(+p zzt6)>JB!bz?|$}n|FWuQ$?MYk=iK9sD!uW=DN=sg6nE99@^P1@ykDmrIKSom!rs6; zMnCU{UcS@U{vv*I*^ArTbi#asen0N2*&8o7ukJzRnanKtdmzp0Zy&YJu3XVag(ZHXsys%4_TO?vs! zPd0Sk-VZm$_x4Tm{m)R&Z;)`*Yszb>ymv2CCcR1(m!2L!(JyfN(?G7ZhmF5*?CQCD zrtIu*v31Jp&)l_J68_j`?HhmFS#{TTR;&KIR_@B;)OS=khZu0&7 zXn*J|-|b4Y!X@+A=?G?-a|Ti}KB%T&(Xd zyDQ&Wc>C_0tzUKLKX&=cvhlv{ir2=s-{#(abo1lg`7+1Poeuf9?tR8=YEN^UMSQoI z9OYJcYS&|(EDuu zdzr(fx6QS(ly60^x_;Zvdd;OXHBXiw-^ICPV)otBQ~Xl3f-Uady?i~`SM{n!&%c0( zMn{I^iL{Cnj&{~6qO&B@VEjh|g< z_j>D$-DH1l_Ka8Gz3h*d^ZaMH;(PMnoC8N!Z_Qtrx%ce9y*-V; z_wEz8Z#Q%4&%4gCADi#30o_n)H%G$%N}BS&H39XD7V)0C{Fmu`Vg6eFGkqUFY+LSW|NE&Y`@fu=*&Fv<|D0_2ojWYvuOw+`cI$ zy_j!zpxw3C8>8i{lU2^2cRnqD&wA&>lRH1nJDc;LA-|pN;jH(?v;L}1tBDa`w|$q# ziP>u&hAmp))$#PH%*umO-nHwxK1=mhZ`E09`a7|6&W5Z0c%825(x$zA z-r_mGu6|sZCRf{kqSXDNKBMAhdr2O~P4Qy+QQps2nMN$Xax(kIyek{xSG_qrkBewM$nWs~9F!+Sp7>@@LRcz1Wyw5*WWscNBNrPZuo zR_u`#nI2)c^o7KgbE(^M?rjzGkKLKyAM~=W)0*#mfAGz=^DB?PHOl=}z4&OEw3?mD z%EqMB4QyGvTeRoRJ}+;XsTHL8W!sUBlQLgljl#%ZITZP zYBy~?A~LI^r}wvc(zRorf-|e0o}AXCUzcq2?y}&v^qK$O)oGuYcV1_=x=n7`?dwu! zia#4i{+Mu$S=`vBY|7P-_l~>1e)UtOM}G2)$&ahnF8VDjTNflL{qFL=E2i?V^5Q=W zGx?sp&+C5a{f{%^FSUPdIQ>0u{_~|%_28PKtA&<8nS1v2j$=o!VpMU8mv7dKeYrcF_s%Vqa zAs8FvyJ+X0!mWm)>bFe36h8KvaOy-{neB45_iK9$BQD>*TzmJ$d-t|?D?Xhsia5VD z?xIQUoKHu8PrYOQUh;LncUPUis#X3jt3UTNX6*X;?zgnIaE*6rx3vzt*Xzz{(}J`% z%q?8IF=*6p^c1>VTFcSt9VqxLqDRWto_EV;|GxVw zF3xApOnT7=DhDuqmF}WwG6zrZaVJ_jyMf-hA2h{qMcMX_Yfx zY_ihr`%?a=`0iKh-hXe}H}~4>=7uGm6f9emrhmTHcAr;u#Jqhxb=U5L4v&r9BrxsL z6h##fTB>?s(j>hW7uN?$N`herj<~oguYAIsqW4bI_r#-Ra+i2|1M)vdteaTpdi2TW zXA|Yyk3U(a^4D3idP-jBjgLpl_4e5>HU4<7pvvvhZuzWTr=PF-BbB}Q=(C*d*S7^8 z-;+M~PV=L>Q`aow<{T`Y7R_vVIQRWC`?=w%M$a~<1{Vd$^|Rj6*)7x4v9ja0mdV=f z;~ihI)NQ`gk9+t-T6<3XD&h>Opf}wwe!Va3zJB5YKhmO9mA#kxziC|D|92^Q&?su$)z zDe&>d2~EaPPhz87*QRPH85sx7ndB1pC+u?KT(`w?+_hW3-_BocC@-6R@4HO3-PzT5 zKb>*Y)tj!DxxQM=dj0&)?3c&PHGfX2x%$&OulrwevER$(Hfyr&qCN@5xc<7&V_vo{ ztl*cFN5@ISY8LkwUtZM-uKM%1T<$-^%H8|ttDisph4sb7rjon;Z)T)vn!T;E`tkQ| z-+r;x4oYu+5kKnn%cx*-;^wUtt;f!M+!eLy`fhfP zk*b@OKPFb^0ThFE3P`kNZ zZhqy}pF3tO`MLUY>|~z*4A!FGVr5Tut|>9qdVk}hSk>-%VZQ?f(~j4Cf0V!5bmP4T%PZR%yJvr3 zxb1xB^{ePT^}+dn&!?Q3an)K~|A@hvT>h<3X3aXbwRwW?wyj-D#j||Eb&A)Us4l-I zd||G8a8QWnxxJG!jFK*7ZRdV1mUc3A+K-w$vBri^_sz4IK3RT``|OhFcJmyWnagJ9 zUCo_k>$ceB$hF+v(Pi2>$IGi;Z1$Gaw6(F!nYXg*cic-~EjyKuZ)^EC&5KCZH2%Wr zeO0>PQryZ({13R#XWBDFfBEtA^o`ROiofokXa7$Wyb^P9Ox!KAm*1^#N9o>czFU>& za$YmPA?HQq9*cF7lWre36SL*oy2Vxbg`c6^XO0<<=gwPp>#2D5@?2({Z~p7H>s?)W z`&s>#qqFoo{`q+)*;Sq18!vof{XN-JJ4~BRjU=mw1+cSU9TWZqC!=`DOY0ZYOQlwQ}3BcWYh4)zYB-_GBB#pM@8 z(ap=0@~)=#n=adSZ^q1-XKN>$tU0=|^vcprzw{#fn*-y`E}ilg(AIi*a=u+k>(Ut) z792_}QuVAoTH@{F-gjx*Qu#(rWy5Wo4RgY(bUW%wb2k0CsVrwPd(+(#7nhPVXU-}q zA2#~gpTj$)dUJXH+Z*l*H*QxiPRZd=)tKgQ8aegpw(F%6efdg)JzJTweU{4ct4$H| z=;&T>RWJSOvF&B2S9Gq4pY(e1QFEW;N9tO3vp&7OGkNn_w)2yej54>(Fu3cta<`mz z?!GE3we2ov&X=X_z3!#F<_fqJcu;386p(u&b^C-xFER^R78(5sk`KFEx;Z*+(&E`{ zvaXZ+ZMWS``L3pQJNwS7+??x5mv=w+jf=c_D{)u5%7M3Ef90g?)!kDkcdUD6wR!iI z9Y0q*x^#HM;b7AhE9})SU*p&4vD^xnL^k()N}Qe<78BBQsGk#caxEB6b# z%B%w~KR&(b(P=}uqBD1e?=HD*Y`31Ls@s2o*~irv$`%{i737Ko1MIKI)%S zi;22By<|6Eb>7h(FHMDWubp?fIa&0}jCo&fmu{KQWB8xpZswAhNB#_^ecJQ)i!Hmi zjjeFQHr_QYb1Zt)jw|fioOLREimB!@g@*+XmSzXeUz5JRVV7V;WqfY$?3B&^(pSnvbC5yNBmG9ni@5)x|V_kZ?eV=XFl_M73mD$Z_t#;#kyLA8Jm*v-Tzv?~eXDK*d z`8a<0`gHlXeV4!d`Ml`(;jN$9W^F&?;^Ma6S1kGTMcJ5&2vPC-a7|xUZ2ykJA7Y8n(q2d zb0U@gd_UrT>h@&El)HvkEtAx0r#MUOds$z*a!+{gAMd4eQuQrPzA3jW742lXz2bPG z*pg(4n9Maxe&=7mb1x>!Zc?~QWmSpxp(WGP4&QQnDpkv8E4um3x|#dli|!RW@{@7kU1dil=x$LqY)jnAxH zZ}igY-OX%cpHkCJD|J3}J)X8+xG?E{ob!aGGbcrVQdugg(&M#LIX16(mdVWgS;_lV z9?$=EVz$!$b2H{E$M4nJ8Ln^sjr~k?*{pN6Y4bhvHp|zkyH7jo=O_2~a=V;&lGXFB ziI)xT%V#8r%ubHVv5lT={s;Q5pe$an@b*nOQxiA9jxVESy3yv zMe@VV6$k6)tNYnZ^WFStm!{qBgSm@~ue{m4ZF0TQ zXFf-!{))CdQ_5G*Sh{oB=9B9T_Vj7ZF6CWys4IIzUx{+%w&_aiE>63sCH*9}Q!p;~ zisaIi^cA=Fb(`JYnRYR~EA{xKq&k!1P07owKVJGPQ&xP|I^U|u?&g`_t{>}~BbRJe z-5fEq>$vaqptR{XOLO*Fz1?+lTUDZ0cUBI=eg2*IT_Q93xUwy_e?7JO=Z@SbUU8iMAMfX-n$La?CAR_;WukH<<0nBEGQSBY`4C3qg}(Ct<%rt#hjdU{>|oB zg^8Q0w_Lti`u+0m!^ZP&y!W~NXBu;xK-D^GuY{ca?!nsG(mc=h&J(mt&T+pzYqHL< z*U1*^PI{j-+_~lF5qY&*kKSi13}5@TzL?a1@r99p>aEiye~y;T`ne?iVChEL-)m>= zvtOKhR{qPcr*meXPr6Zl)^>84@8a@<(|#|0Qt)iM+N@VU)XidK?KpBB&;GNokIGZa z@8vq^`Yqo6z?$So>->x~e9}$)kDfBHG`d#5(6x7FkYnM|>8%`|Gb=pOV;?(9&$~X~ z`Qp*ZGDpH!cdxtoDOONl&D!+Y>7C;9%jV_u>6X^wT1VtdV4Uc57Touw2c<2Z48 zkW~MQ!;}5z{gF({J)L@4SopfIuxIB-d$-wo&lle->(zU^{mFK{_TXkYpYq$L+kWeB z)7$nseYd#Fkt5%e;&v?B*}%X+<$=At>~}Tw8`TQ`eX>0NrF!MDL*GJwZlC;a_rGG{ zWBKq{2@DK9wx*X7RqmuGmQc8C2En|l-KJci(=<`}yUp z__CBiFq|Em3rF@mksqg!xEYA8`%(Kn!ONq|5=sBO7YnngjM5lZEktzF@<@&E( zaxC5BQ!V#Xv9&9HeVcqq_g3A*oXBqHoG-U??%G-J(*3HWel`8Q!#&^Alf&0NJ9DjC z=H{A%UGJYf>^wOw^WLu4ACFf5cxFB6Kxt{qso5N6Q!mMMCPo{Xwn+L)3U6HITq&gN zk#nY}^H_YYmVTWxdt~j6_dU~m^|vJ@)fis+S{%Im;F`-Rm$GuZzue5(b^7hR)oXXD z-Ck59ENt*A>gC(sz#XP`TW@XA+xFJ&*ulb_ON`sEFV0DsvSIC>yP4tZGhcL1$+c)L ziOy5Fv`AT5aYq$zoNZk@-)`{>pOd!z_!ui_FZ*-Fvv;xAiuz6SV%Dzj?9IEo?)oucYgM7b>_tF39r{Ib=%@LUGk`q=aUK7*IoQ}`isoLvPDWWOa+hUeAl+SXHye8 zU*vf0oAV3xZC~!(zVVH;>rIR8x%2)rR6X66X0hmWRmu0@^-TpIZswc`$~#`;zIB>0 zn|+@4jZPt-pM?t!CEg5HJCUa1aYo@zmCH;%)nyWyoUfMdc)eO>N%x_&Js-n|i%qxhFhKbsZqcPOam`^|MHrDQ6%en0+gyGvyJ z%UHn&{mGAK?P>e+}zlLEMB@VIsf3Kzu~jryXqZoSN-_u`;lj}{I_gxQ(l*r z>R+?(Xn)6tdv!vcvfZ^uHx$IE?X%7{ny_Q4xzF=ympC=Q-plCtF-v*Zdhtk4&p-9f zvp%a;9Nv02=j(k#dAZvBuB+>gl&zWFZCAM}`)Tzfg6`?8E!LE^S^UpJhHFIzQfUSP1`eCIg%8LF&5 zQ$^UWrNqy4od1Z^UA@LM|I+)fGvqIYsa5NrHN0~z^IuislzX3c^qqZhUMVtFE9hd! zHSa)`-EO`Prweah5=p(XH%p>tF?b?v;+~^rd#?QS@8?x{bLz+D`DMG;z50H}eRb|d zd9kRAh;d@YdeAtrF73vNR}|_5{b#T`x#Gj0sI9+i+Lbr;h6cyW?AoamGj)>it-vqN zhBy7gWlPh1w_FO@I#X3GHJpuS*PLrFKe*hT_H&7QTYbCFcjcvdcfaTEPr7aVUV5E( z!P{Fo#dY4#SLtrEjhy*v+l`mIUUny`r73Pnm)auBF1xiiPB{FD+T9axqS7Lnq~GkU zow)Cmu;vq~Nq$P(xPp9~Gk%pxI7)TgiS7!^y7_HSv|ra<(Km4w<~2F~ zuS!?w?pe40&^xL6q7>2dvlgf9Yz=9OGBnw9YBzsSV$tlko}M$8{%-kVGJU3Ep4-m( z72B7)chzs+Ry)1z#k-2dyB~fuUY=+>>*?A#r*}M_aV>58Z;2VdAzLcfH2nAG{C*Wcrn=k`1k+!Q7i`6V*+scGOtp-ANqn#*(yk5Ab* zUuya3^~Y6G&bePX`b+0lvUhdnreOT_VPDIG3vqZc6Icfid%Y8_r<4vg{hi>8+kkK`UG#C;ORN* z#@dq^t8e~i*sXaw{@A3R-8PRG@3y<2x9r54N4uBbx$8Gyh-*UAMBVWR9b}sjNTfJ2NP2l4C``WSp8Jw%Xc<%Q2 zbFY8-@gJ2E`WL#to}B#2Eq>pZToGrQCF?AWUKjq5!QePul(dw9-` z*?E;yEN;YH)7hBy{H}^LpKa|-Q#MQYpiaM|pIawt>gsf*o~U;Hz1{G^ET5NKzPm*~ z-zg&;o&59qhojaT#hwmb@&iE|n-MHi2S7)KQ&T;1wzfa;jtiNEL zsz&E)o_yun*Q#dmx@D%byS;n`=LQuoPu=~_W|#Fhnae&umgOIRxasBEi*nL=Ywv0A z5&D#V`TM5axcg^r#a%Dk6I^z6N7C_S*Upsu-0LS@VUV(aZ(fer?Jo6I`UgE{%$auN znfJ^X%d0Urt^{q3JDcUhY4EJtvL)@RuECymwo_7lZ_;vK*X(y&<~&vQsiBqdGGCvb z#r|P;z4c8eY=7JBdd9l;7H?{jc645UZtBIWhOd3fldtxgz3JXMFYQhC9K+&rUEl3@ z#eVMjp}&6CmBd|1c}Hull9wsH*6*9G-!X5-+U;2jw^X<9JlhuM-QIBRfplBL5>3k`mNq2wKF){@rTgs)`t?-(Kq{zUVb{eE8^&iqj88ty~zI=FNUwPr?^cnhh%xVv}-+X*}`Nb@ z%WQ&eZ|lbL*_ShX3fDiGol+#McEpsA<4oJ!UG4pMkDT4c^5aD*R~fIdXwHcvtM5!X zsmW^O^8L?Ex2ZqZG$}j0dmB3~U-EOb_1YgFGP5s>otORmpsQM9eO=zHnl)dQWfxS{ zm*sEC-C6jpdg-;i+i$O(N#1Q{c{x*OW?%Ow-_MfoyVE8=dwVopCd}rYU1!ci--#bj zcNkjSJi4m$YJ~b-w$f$WFIjkJ75V(08L>^feAfLNJ_TosV$`G776#`mk^FgdZ#PF_ z+Mg|7&sJ5Ny`9ZBJL{lN#q%4<+jrX-n){qzX>9Hvd-?KZeckPI-L1-I?#z!}@b2>D z$Tgd0&CRP^;<~R~bw=UsoDvro-)pz~Mdyko9k($QOP-aad{_1Q$;pRx6>X+fCPbi@p)gaq75zDel|s zQZ?n{)k4x<#uF2}q7U~bv@GQ=eI{9DUCaB~Q2WW<{|tZk?!CG4wDEhJi3g|OIdgo| z^17QH^ZsfJUc0{EbKME`ZGNXqqs5wT*WbBi{Wx^t%q8J=)_I*r&HY1ne!N>}w_}_B zobtOS8~01|Kb&pP<^0Cdan9>Mzop(P9=po-S@N`@&9p5ieo0my;f~5)wX)4EZtwD$ z#S6bGOFIg;2e)lJJlTKJeU{s$+uc_h8rnrvsMpS(cXa33>Bn-_J}y4*+4<=BbiSPM zO1;gh({DeRo!9rrwEXGy0mW&erw*SX^xXF6rS zTxy!L&!s7u={MCAz4|Vya+d||_M0bm|F_s)NPTf}h+q>`1jL%10Ej~Z!Ub|n+t2*-Jb7z<#xxfKkL6R;bQu>U*A`+ z-0t81?^5sN-Mgwcn_g#r@pk?Eo%u=c-t61E>(1hYoiU*ovNAotEuE*@dfn>HOw%u` zXB^HuU3;C+xBJYtt&=@+mr0%ev-IRGzlft{k-N|5MJi2CS*oPGzU{=zCE?4`(zg4! zoK;d%KD*yzzGq+Z+xxNI&UuozcdENj%0IZI`^UTes%rP`SL{=|v0tC(?2fnFZfxe= z9-F%-Jht}x5x;-)>Ms|b?wt~isoHJofKf4D8)YMyP(v*^U)HFKMl zHQW4yLzmXJ+T?ppxH*63iYd=+Kg-?T9=qgt`9FQr&2rDqtzI|pYweoK^c{~cPT#aP z-==t;T;kP7yDF=5&gOod@#5^tuGntTtzEHVzD7@9cXVvKz4E!@vT2rKAzv;m`0`@e zP0yXb7Ikmg|8B;$wPEqL^WMxoIeq7DzWdT~SKHk`h26gVc;5C3tJen@7?{)FnUyPK z#r{3yYdY`A&9L}2=I5&W&YTyWa&=~k#p5rQAt%i&bfnMdUHy?!yW+>>3Gt>5)1yA_ z`rY#Au9CaY#m(RH7u>Zh_Fr|j&c}LLwAw$7Z()~S&fKK8Df4Qs`i--jBWIo2v;VE~ zZ)@?Ue?G{@u6KiOm-m~ra+|8yNbGLoC zopV*7EWIGyv{3TWX~s=gqtoVUhi`m;X5W*M7Bb$z1E!@w7_TB!>k}i1mIt z&u$uTdg`5{O)tN%y$~h}8<)#+ymHZM={tqXR+)S|TK#oa`SMj|li&S&a8LE1tg(7rNc`@ZPk;Je-`3kY zYd6cP+dFsqm?bzh21h;@y0d=4l9ua9#(6fcyGyUn3tV#dQ^whvwWlL2)AQ!4S?_sP z{qE7eUqPF_TwF>n-RN7f=6m|CPmj01yJKE=cjvi#$=6;!cHQ!_;AgMeEWO8{D|RgV zy>8#HXz`~fORoK1bUR5&XOq&ju+nqi-D2h}x)J@@rO=&!Yk%6inf;|3x6O1a-N|$9 z>CY)vH)c$;HO$?SE_H9ZXxE?XvyJ|;z3k`DnBvO%*1Y7nS>*OeL*qWR*L$zt6+7Oi zwE594>DU+QC#vp5t@XFc`gk{Y*6y{3m(T3%dUVu0cGiy zJq-6|?<}vayX=A8C_C*EEzyz*dkd(OQz zn+uQL{TBJ`b*Zi4-S5|Iu3uiKyYJo~pWFBT>G{gbRdCNr3NiMQD?V{sVwbs8X7h{R z7GJ+)3YVEY%H+;X<=IeSwAwe*eyYcogkSP;&3n&T_vHRo^VpU--F!p8$nX3YM~?R; z3V+FZvU}(8t-7*5b7ya{F8`%VwcJvG+ZM!XY*{^>p$YYE)d7uo;X{y8}^ zGV=Uq9qkO8wf3{WUE6ZZwJuvv+T!oz=eN`%^JbfLM=M^R=Kkc7;-^=W0%y!Dl6(JS z@r)05YcBiF|E>L>VZPyEJMTxg&KGH2i}&t3XYX;hD=*^9jvwFGF0+@&TY8^^mn5`0dT!(`j+DM)cHX(*%*hvJ zHy1`nY}xcdbLW!O2QN%dZ;?HJfA>D`+*yyez2o>8dC_j|o#3a{u`lvZ%zr!Y+!m{z zZw0TuN-PhZeD_sm={(KtEJ>S^cbc7&>8ZHOZW9@l=-F>3(*DS&<9E;^ub$UEp1o?; zou!?E_cJ|9r{64PS)!}v<<-&Czv9{Lb(>!7x;bN)+D60cLd$3K>AGoe`T2I+AMx8} zcXKZa=U%%jGCNIuQBqQ-p{=m2(EaDT^JhyuH?8>G|K!|FC%?Og62l(-o-XY*J1xa# zk&VCFwLmHUT)*YAXQTR7Zn)#0xx^~}=-ZVi&XwHi3wkCKb9Bqim20ZMo#-yQeQ%%g zy7}7WF_p>dRDb^c()lL4@J;fT*szn&-v4LF$y&eP?*6Q*q`$V;!wk<}>6o*t>gSq? z7mdA(f^<)&=7d-LXDE5ces(46<`2~;q>fJz(3V(JtTdhXrNpxOc*gbW;n8!BHME}Z zwc5H!EjjvF?oXa$N~zaWw%sY&nEmXZ$K_%bxAm+S+e@}-9yN^4?|9Yy$g0YEx@(&9 zqNJoL^QtVWLf+5qh%MKD_e1~APHww6>kYR{qG$Wo-n*|h>-FBAqj$?6?91KsdvVw8 zk9W<_{`!3PyIgtu)fla9Y?}`kMYz15tkX6*^TC?nwX*BZPxrQzJ!W6$Tk`cTAE*BE zCsjY#)KA{rZhCWa(;bWV+n+90o$_zW?eZg4@(aH_`cifE#oy2K3$MN09JDW6uRYk( zCiHMxOz68>v3XJ@o2(DjJ+zL=Hd%Dz&yf>_-mCW1sn-Xlk0?j8~6$C0SX2 zJK|ftJ!qrV)7$aOm(4D@S^VjK@~zys`N1nTvXSGyXl?ZNx#%I*PGrIzV_{NnD69uiY-fLz4D51S#~wC zveY!!d41dU(<-Mbw_S)0F?zN>boqss>#t_1=^pI6b^ch#hw~xsWmR&8pZ*=({W~GcTyu`^9 zRaN$A_kFtjqVL`9^=G$be|RTVzc}%vxO>~=%fb(4tnqIO%qxGYyLrB)bJ3H#kF>Yv zMfuFopV2XMbKlMGqUg9joA3`$HdRl*owKj=Px<{>zb98!bKbQ&cXsEGbEzR$Hg_$b zS#(@(N2bcvd%9JZwWE^mC12Bw$<+Omxl(qE)a)p+wOej|*VTK!;P{S=XFH6d<9Ync zZoc>3e9=z)dGdTq<+?Y|XP54oeP+gTxz`KNn)zHxx-;$T&FL~{+{J9R1^w20ciS+^ zH_0&jp7Ndh%|+LhHs6_5uCVIL??Y$hf>pE5$+Q>n_8QK3a;Eb8i#3_Ab@G*iqMhV6 zcOBVs!pUl{=y9KW0_$?0$eR6Um{$5r`t8A;XR5W1Z#e0?)Vq8qIT1lpWf~1&Aob5ELL#UCD+T*i+S!Fro{wD&Nx_mt>CWdX5DGmZXWph zyzqTRtM9A@4%Z~w{6+Q3xZd?=B?P_}n|D3^wCb8^ujO{C{i=G`E-?M_C)*lk@uzQY z&o;b&FiocX_WkYPjB78rZG!32Pe(63?Y}Vf!mG6Z459^(&-U#-zbN?7 zw3w>zwzron?PyIs={vdWb&uzAsiHK?^{U#2=iWr=E&F1$c{-DxYQJW!_eM?a?JrVl zlYjKQ-yNQ6-4-*k?&GX87S`Jye=9%Vv{^8BpMCnHq`V9JE9}+Y{<8jZch=ikYmb-B zn6ce#(~Zk7*UWo*FYord^RstHtKa*3{;kzRrs``I#r*~QC$D)p>({PxV$05LsFFDz zr*$f4cleADv&ntWL@wp2?Rx$B&7+ji({momr_Ab4msOeMpW^oO@wAVh-n|yfR7%b} zo#H!n=FHBHj$LZ$>nav^A1!e<|D{=Wf6d$Z6ZEeXi}{p)o_Bxc$?nj@xjWwOyZvs? zteR<$H!0oDofBTU?#`?j7btzIhscz0XyVavT|{~6+rIsCnM zpCf<1&!s=_7Owko@O_vAgWMGl;pMA0vWe{MetmhPkntta>zCeaYMmeWHFtaL#T=jW zjqZAj**G4ZubmeCXJyCNry)nKOLNsbw>CW!npCH{u{UPNeSe=jKE{sXtCF_v@{PTB zUCi@e&VL4>>$7M4tY*Ks^_F$|;n_0&E02a>+RyDZu{|jx%2(UX)Mcuw>qXC?tVfe3 zrPK)-8A-P;|HV4*k!?m@*7wTJyIX^0<9?j{{N1$US%1N{>!-i#-MuGMe6!+Q(7h)& zBbQx0Q6Ss%dB@SKe6I7Jh(+4IkttSMyKb&$x!>$=_nNE1((9^B@(yR0d0om|FH{_# z9`*NleBI-%smIIb?0UU!)6dyyYA`#6vrd0}wCPS+<(=^RY2JDdw^^(^ZkhCYwPEVS3&*d-J<0o+DdySq zZo#pKuEBGgcTL^;b=K>E`Ru2sT+vw+dvN>1k0Q?TKa|At)BfBx|8S05>E55G$Nf7? z&L7DYi}yY6o>LWH6S+HU{b{eCt4plT*^A~K&a?W@a4q=I>G#aPyH}Qci*?=hGkoIX zYI)7$smHb*D=pKxa&iW5>JfJ@7j2(aj~>a^?AiIkZz;D6%i(@j{_R(a&+PC$W3Zi%U;gt+&A}?OZfUOspi|qmz(XLv#saP;+tu+gSWl4 znyq(ycJ#d5?ctMUFM6*z+%J3m_VVsU8!c^~{!F|1&9Lp&nP;;n$Mjv_6MA`O-jf@b zVnWkwSsyJwzQ9ucHe2?jow83aC;m87$!B(F_Ux6sWkOjdn`IY8zhAjcs_@8@yLp?% z+I`EG>!#`Ub@c6CzEkkw{C_`RWK7robnoHW>U+GC^OmHZt|^Q!tuTy?cyw}7l3LPf z5@`5S%BIoR^#M5$;>+k%V9SJSTN zJ`G7W5qNan<*neF$HyGkTv@luHs@K+?rG20?zi(P_x*l1a!J_S6CEF1f|QSZ=ijiF zUHOx`cILLVa@+mWc^M7v-6d`bwhf?vksw-)>Cle|G+(88^S-r*HKOUT-P)Z#J`>AKbNe zd3EQ{rF^H^i(7X)WpBB;PUh>;Z_{IM+VV!)$ytk*j8~ab4*Rgcdr{$N|Z#*-L zFM0bmz35GMcFR4K`1tzIUA-Qw)w(?upJT;-$5i!{-ORab+Haq7_IhF3CUw0zS01`8 zdCs;*w{p|0$-%|mYOdQDH)!5WJk!m#ueN2wml>Hg7p_jVo$b4DH`n)&X=!FHlA6nJ zC4Nh>%RwG zf?~98uPHZQax~4Jdt063Ypa}JVdig24(Bi2b=oLxTWhJxo`>QYAKJEWmP@_-WOm8M z?!d0S!nq%FE*}>EaH&Sn`0?~rG3#GGyixXf(Pq8>43i6Pe*I&3ykBp&T6NO9H<6RQ zCDVRqUoE}y@yv0boB2UrACB+1JmG>Fi_GPT#Rh*%`>$-u>huk*a&h%y-^X^gV6&+F2{EfqkMdC)4q0!;Ze&77PGThc=d|VyzI_UMMIn!d=M5jKTDB}KP z-un4k`)oY4m4jkCIrW#ESR&;uTkQ5aZ?*pHqo#+`T`JOd+vz>2SbaBddcvH>`AHYt zwij&5y|dLg&u60H<qiP3e)lhi%Q)cC?r+G}s|N`Pk8&!K>%bcqQ3c zto2@^FgsAC&(EI=vOVM4-^-H~x-XiR=<_?)KdrggTyxO8B)a5o{@G|ld9fb* z+t+SRE_t)QWHXQN&4SzACc%5VO{b^K7fJ4ZR^!{fZQY(_x2w+EUH!>5H*a!6k|djA zs$$F1pv2?*S5J;AULQ2{VEvYTH#-vCJuj14e}=^plKYc?$oqboU7J3&cGbU4<>yaT{;P|6^f~`u;+@t18J=1G zWq%#m_jCWl?Eeh2KTq54fARR&>ZSh~*8P5NbgW}>f`jDYcLy%+xMSmVyynK_GRx4j zt=shbRgZPtKK4rc+HJG`W2W^#{a!isau;;3E{s-DIWf1QU*%KW&9=KX@1}owzANo^ z{ba%GPv=K3-mNSDW#03-r_Db0Px$in_}0YZ{dQ6QemT>RoSkTY;<&7#?Cs}W$v18q z>Q|Qc6m7P=*8eaj_{7&~oRd>p)!1A&6u)WKTDASy$~n0jQ3f3|?g>xbR=$m8tMd8# zg;O1ze0>!Cb@|<=y?%2&BN<^w55Vl{fCm+S3c#vZ~OK0tUCG9`mfT(n|^tGE8g<*&z+3# zou_S!B}%S*bpNMkrC79|HD0l9&zAEy`SSmrJ0AUa;_mv&%07M&RB`cFAmY3=ir@ZITsQKy&Bd!nA=-lWk zrSasSx)ta1D{vEB9+?2jkQfKy>*B#xVIWN>2%BOZoP2&&zs1r*9=mszpUkwoc&wZO@HEk-fur1B_%&Pa`?>pKXn&(g#V7U zd%o=S!_8_oGv0lQ&AoP4jOJ`nDwA<&r>g)0T?|NSQiu__X{jN}dqQBm~>)os$+Ws=z*(cR% ze7TmXbK&!~={m30boAG}d~~z><=vBQY3C&0-L-hPORZ|-ZH`s@-tCK67C(F1zBPsO zZmOTZI43bxp!?I`)_aS}6ZQwbt$vvNpCL1UPsr!6%lnU~+E)E>3+wlock(&^oVkZ} z;{7w<=emn`ZR~FU72^5V{%(BDpBK|+?>1W37gC1_c@(mFm?B*#0^0Y zY03tcZuIXKnfK>xs==4)x8||uqT`mQKI8d3yZ+MC-74`V$Hjas^JXtzr1{1A*=tQf zvD+z+wkatoN&FEMJ8tyyuC8Q%?(R*ACQXwno(W3&3wg|mW=)@D)i!OD-lYk*y8@T= z{8G8LZl1C5IhT&lzh>{=BUbg@RQl3+)&C4#+k8Ujo4@b%xx7>OV4GT!^=FawbrbJ- z{`>rnGqSwt<9F#RA+x#ow(mQ%?VRm)P2Jp#C2?1xZzTU%R@fzGo6#}(q0gFjE3>@E z`zlVQtevjBWKVO;;+N{rYWvl`7xUbAa(3Rfyw0P7hs$|AF{39Z{LA(ox-~9!8_l6KT~phzWbz?{d&_%4KF?py)}7<`>e{fN7S~Z z^p-FE__$>6lnq-?DW;2Gd|YZ2v}#4c^f#+@o=$H#x&5uew$#TZ{Rc|F$WH$(wp_(+ zQ^Cs*-_!EC-+hWsO-esry3cg+>{{F35;sex-#u-XXMOFle`4;8yvs>5|HZ|+L{Bx*|k_l!TjbIZoh2lb z&68NWOIxpR_OlnWi?TB96>~S6CC#eVUbpMVa@Ngd+e1HGWD?29ohYQdsqOUg#Wy_# z=RcZp{m=AsK9g&{p4r=V;bqRnOv9IjzoT_KzRJD$QFef+RU#loqGHN3QfK{V&{%NJ zz^CuNz?qHF7S|*0`8w;KFuQVX!`0jUMl#dRuaqn`S<9tr_Bty#+iSv7mETsraf_W- zZVq3%FXu|~u5EW^3+)dts{VLUTix)}yR&C!%PpU7+3epRy7|>dKbsw!TyuBb{JKnS za_&X%wY!vFr>QALt9+b(S0e1vm9V5e7q0x2db`N%jO#mHW2SxQRz1~JRavuXZe?;} zs9sZ`B4ca2MTmE6W^lRr~#XS&=sP{>{7g z`M8{zev;d&{H*Qb^&2l)zbzJ6*H-82z2;h2fOYDl4|bW~AI0Wde0qB^zNX$;{n)0c zhtn@E-!>=wL!EkO-=C~4h4PoKMB57r?v#BudB@_GOXt={T5=a$VobZ=7L zj_ZP|nsJ`X-!6;ab}!#xrfFroS<=EqwVH2arirY(l{>rLE;p)L{a#^N&XyN5`?za1 z+nv6${WRxs^Qrp%u_@bQ zr{(W>vOK=>dTgA^9n1aU)60(TxL+?9Q>nXq@uC~sZZE3H?R(-AroKOJ=Jdre^IzOP zJ-a-8)<3Vy54QVnf4#->!9<(3`?*R=H@7LB&h6;v*;Bsq z`_V$-Su%+`FI4^Jxj!{p$nMbfpLM3mGap98=4svOsd_Pco8`2U-%9_EHkV6pnl;T= z;Lh7UnNGVo1J@e&r9OK*zwSm+=9Z1KjP81`eYEXHU+2rUdh?!E_XfPNzj%7fx)Z;n zFTS61aB|-M{KJxlPd`f*$Cn)a=FiU)zx=qcT#?SqHAj^;Up91OnNYiAY5X)#`GZP^ z&FO1j%WgiJ<6kG|+-$+BQF{C(EZR)vV2( zZYp)mPvgn+Yk9W3FD|c^DfKQioLzfe-lp-?p6}~!tnHOs{5yC5&YbhU`<}g<<=!+| zj$`J`%==6D7sYFpZJqZo?Uwq-e2csJo6q*$m~DJXQ?6b#xBFd3m+QB?XZCl>tW&EM) z`J}i%<$BNMVmsEP&-|Et^5dJ9Z1Kh6IY0Fu?9bSC;{Dy#7cc*^>R$fHu>REilI`(! z%gzfu)SGtV=@VmtKN`Qoi;t{tj`mwBK1o|kw%R>C=k4XYBH4XU=lsasvSrD=woksk z9rs?}5}PkNIqh!B$C`a!F79o*oipd_9B)&dz1#ka@xAZ7aW;QmuH1g_Yv)|M$z8AC z{qz0#e%tMwzW)rfx2q;?*?040c4TSxMzduHPJEYpefr(zzcXjtu*|KVm|`qybtq&z zr-plGtiX|ojmisoj&&W9>J_riNS$^&lf$Xt*!w-t?-a+@e!pA$-8XMn)$<>V_X=JV zyeP}>|J(e{;mjvzCAj0 z8g#e{Z@b0IcO9S3CVKZL-06C}yK&ByOm}NA=NnbcK9{uASwHKyoX)*`bJ^XE(MMA^3YOU?Uz8PmqrPa%`&hvTmHD^D z7i`P9eQtTpo6qsn3|<+S@QmpR?D`xRTs&>8JUk`(w)PWod6F+g92g`Fp{? zEX;c$7q|NK zEjsDt+0uQSn_m9BvCB?7xLn?K-_0+Q>yD<~?zV|Gd31c`!5sfKo3B6Cea-FsprxJn zpF!@`s~3Hq?I&J)f1fZ_)AXyAfAwa=$4aj}a?5w!n#QP^{y^{cOTB%@N}_qlX{g z*y_P`*AqGK^*{GK`*d34T+wgO>pRt)OU+#8Ze6=~&2+V!5fL}Mqc^4b&(?iv@wz*3 zWme$K9`&8?EKPr=yj(Z zbvs^kbi8;GvgpbQ1)ekC&5MtReK?=|cGuaTGfo`(^6tpt>@~7`T=}A>ZjYXu_|0vW zk(P~BztRrxuq)x$eD{0~?Ae`T;3uEbae3lzt7o=qC)b@{ekcFI#q>>TYSUwVrk!_p z-DrF{_j*|7ovtnOFNbfmOMDwVwQTR>$tDw5KdW6GI_dVB$A`P}E~RhUseUf)WZ%ut zk%dXKa~`cVN|~Lsbxr;I&gWr!pP$$I`pKj&a*PGC)4g* z?nqj!w`$@3uG2XVtJWw@=4=k0+GlZd?Q((5JIWf*NSNzPyS;dSw|DB4ZJCDA>t624 zEOGhjy798?NvFMhyJhe0)OKBQ{>-n6gZr~eZ7OpfAD`STCNaCEH^tkS zpLhLs|V`nQ)$tiMXCQ8UVVG8 z^jg9F%hQzR))?pN%~&7r;_vV8e3Y;3i^uc5)3?s~T{qd$@0`)QJrSjb^L^ixm_O-$ z`E0rA&Sifr-pvV?%Ts&(X681vo88O(dgN5vGJ}n>*L!T(T6tS?(~=$Amz}BI9+xjQ5>&~v9{^9Ya8=JedJ-S@nLtI=y zJK0^d74v->#H-!j|2=uEwljR|mb6@Jj(vH$mUq7yRuF-MktV-&IUsC6)Z*KV(?*H64 z{z0F_r?XdPe2Ugg*ZrmXZT9Y0N_QXMn_V_*W8|(M=O@j*$8As;S#rGU%{KSeHR&ch z-=6aOcxM}H+oO&Bt*>H=swZzaYu>4s;^Q>+snAW=wVj@&#YKBo2HY{5nrw3Zq-vg; zc3@O#uAIg*zrri;rWf2VakKcg-2?vM{Fg(={X*LzU9XH-O-bj zjI%boRKA%gGIP_3zMhC>RTa7~=k-~ypPf6S@1v3-n{{Ba!tB&3LIRWY=5lmDoN;{n z{W9-mzn5+IF8XpS$I3_S4u%_nV!}`MX}2mA=WHC?09* zbZ_f|IuqvV%(I{P$*X$%&El;$Ud+4Z_U8Lcvw!iYS8k5Y zi=6YZzr9H*^WgEQYp*lkE}F8wbgA6T+K%G(9P6^_Pj+2@pv*-MrpL=gxe|4s^O3HS1 zk&mt$MIP?5p6>6PCZT?@eZ#!6H^;YRZ$Fp3+r6yYtgj&YS^nwTi?ug5q;$^M&u7tH zQFu3U&DqS0*A3eaw%l9Rpr+4X`TRs3@6%16WUcer9t-cAEcxbnaO%ENb&fN^vMQ(2 zmI}_zO0%4@QDiqylygw*iz!M@DjWJ0iuOf3J6o^&Y{p@mD(h$4lXu@b-)4P1c(+`{ zj4spH+xy+;`M=$rv+eDNd5_2WzX0k{-SMT>jPPu32pAb>Fl7 zU-@?#JWLCYm7ROP`|UjYCvP`h-;{Ii=>3}#<#SeapISCq`QYrC6C&I*V{2 zyr@>kbhf%a!&+>!Ozf=u!?jjP$z3*+bJJ?J9X_2`@WtY7_Oz|jlWwoMoM#nvp7&b3 zME;Ue-)m_PH>p)$d%Dj?lT~^D@?A@3ysDI$Ggb4-^q{t56P_rgX#8i;n(B2maM7f_ z;U0T`?5f{mSvK|i@xSx@UnvB>xOv;p62)Zq&WHTN|S7 zzHU~F{{7io_iNhrde;e-(HEJw$lf=dy#M*77bcg>eYX{66$c;8onx`9YFBYd>E-=v z?`!Tne@d_V&92zSy~_fwBu6xx2b%udb99y0dg;Rp;&(Hic5w=so^~(l#?7fd{#Mhi zf?pTh@HF!^^USqqpY?OL-d{th&TSQH6}sDOd$%sFs(O|-F>>a+a=D4WY`=*wc+)QD z{jJ*Qw$<$1@5f@UhwD{t(tGgD&|7EQ&0X)LbGK<8HJ!bDX`+kbR^DAn)r<4E6R(!+ zcsg(2Q|`~JGP4$(EZZOVdix{Y7ZW1-UT%85yR=>G=Gx6K(pqLtU*Mc#QoHa?q{%g( z=oMYjf|qmWo>>09U*PBT3zxU9<@>r~vs&)FcQ)Ja3+Ls!9M#*EX7y#`WzUyc^;@=u ziao#oXWE^LE#4It+ipG4dw6rl8J{Md3iF8@-+Z<|Q8X(}Px0`~WIo;1rq|XkbIv(Y zyTr!JD<;ZgN`><*Q;DzD$8y88ey*9Rzf1eN_qv%~m-d>>n>T&c+@_pe_hR1M&b?tS zCtshjB`QZ!?bg}Nbuwbf`*LS?r{zA{R*{z5Ib&&()szkW#?D_ggRV?b)QY;2GG(bs zR?w8iFFd`xSI(UIqr>Ws&(V#MFFJD4?-t(ETvOqA%=>QPwypAtdh7JR^SRD;*mUs2 zoG@R`%Xc2lu+<6Cs!N>rFkdf8HMvM+%eK?KlSG{_378&>R{8kh1@bl2qzXAPno{bkc%OuAh-JCbGcmr1Yu@AuU9Pycf5uh{Q*^I4UD z{4IO(+B)UlrfVivv3An+Q_Y{u_;lo^+}hO(Ly!Hn489puDE3Cy-*0`?&8YKlOa5#r zPn)9OaFOrnY`6RA|ITfGICFl#e@FML-yY9pW0OjY`_6r{*4h5(=$`mXF;;hLn}Wa9 zb{{s(;PUT0u|+gzPu*XCHBGCn)t>`ryuG>fa`LwsZ~8?y{_*&>e1`em^qWz4!#w6a zy_rAbtHp}d(Yf0u_-<)2yH&&KoarSn=}V`kl9K2nB`f8XnY&)EpQpVn?d7}k-e-z_ z=Bf7l^?m%G!BcBrLZ2Bk|An0IhOccZ@9Y!2Qfv30Vcs;IJMUW_FEiX+wru^a8~ctQ zP|xO_J@57Mq8TNvvmTk-UD~udCRZ$Xztf@<4?H)!=Fid6S{>t3cRyi%`Q}^JDxbxg z=?PtW5vxth4jI_r4Ww4_Ak3N^*er|ZX zp66pV=fg)!lYX7mJ}m3?HTHe%y^|StY(FcX5-k0kztio7`k7y)DuS!yRQoRe*rToV z{n7r%ZdVBTjuqxp82I>?fmMa*YDn+pDZuF{844l z-tG-~sn?%wE3etHWrz0V-1)bjd~)4#T=f0Nvvy$-(YIzZPmnorUg=Gp%M-8A+{|4O z$9Tg|Po1&Okn`)pd0(da-EzN}&9cF@SNb~MMGJ}@O`CQ!ZR?(hHBNnJ zBGxL-cw;tgRxXRDm%yYKE-rCD+|$z1HeWky7MW+QbXsZJkrLa+!!Li`-n7_WEVt(7 z*0Rt~k0Y+$x^}9HcWUeu^@(b{Q%hc)&hxRnuw>hGsnV^g8Brc5PMoNHbh=Jv;&hR- zJ9TFrIqq^~*RHpG(~B-Xxsbi__H@r_CpZ1p>zJLl?ZuKKN51&@lpfjSyZra<&3Cie z)a*~Zt<2t>xo{zm;pVTqv>vDNx#vu3(N;UGBfo0VmN_YD+0(gVt9&)}|7^OJw)sSL zy2a6JZnlSR-IrI*)wZ*E(I1q2|Fk&J6~6y6iYwc?w|7YZe6rq$ETz@lRru{Kh>|4SN=Jht#0e}ir2sFy>5Mb z6t_|A=*yX9@ey0gWI883S<%lbxbo>1*QePDTW-mCO}Wy()TDNz=-r*O)fSyR+W*_e z_)h2A%a7+hsZc&`bVKjFHTR{QUvsMaw(Z(`?q+BAyY1~_mhW$-T+7>KJ^ik&tZ?qO z^IrB3C1Uf0{jR2nOuB2NdU{fd%TE514>RXK^}e9UesmR+d%o@0B;|I5{dDXE_O*wH*^z&kiT+enZ=@XNMLdt_*&#tq6yEG%P!qdgg zZq2?o<;T3$l76SDsqZzsEVOXd<%DZ5H)VVci=ON|?ev;`H(z#x4memlAg zOP7hQiJW#itx9KC{_LFH?W^><7v(KYyAkVc_rvb}4#8_*Vy~x`eDXN6Ff42Dwkykd zx>u@d?Kq^BBsBF!*<8=6G^f|r|E>x~oQ{8X_v2d!!*7nac)u6iUAXPU`*XFn_KT;z z{L#U9^4`xk{OJ!Y?=8J#C9i+xQTmLt|0I(qz6oEPJayvh_pen$z2?UEU+~~4F zsnv$hEyDec`{_d{Ri(Yi@d$H|yRr0clHHMda^|D@M`5j$qXtLnA&$Q_uPn7CT z3UU9yrhn4U^5Lu1wI;=rO14$rSmr0OzIR3s_ukokQruy$d2?qxyuIzxcgaI9GuNml z-I%AE8nm-?qjb-&MJMOZ5A}@JisHGDoyukOabiWA_btom`G>bBUA`|_^US6&=S#HL zk#gJV!EV*=Z_MYE%N5-*Uuzf3zt?ovo}Ftt_v?#9*IqUhcS)Slz4E%Cv7BU5eNMhi z_@tUO_oMf-tv>n6Q0DQw$~QJPhjxj^{*Jr0^_XJE`Ohy(x0M@6eVSInue)Ad^WJ4G zr>QpsX9){EvklYD+f{0j{p{URZLcrUf_G-VH&fqe+Z=mZW_5qcowSozAAX(_oO0&2 zP35MPF5hdnjo;*TeR21#$@g)eIfHSsp4ImWFZQWt{PGb`PL_^)^4;I_|IVSIo#s@nb~>1G8sk>kEXbOf71OZXWQh6?V{H%?TtHC6R^9!-M!;KL-jq6 z+NOm2Zyh}9?@H%atFO%eIwSuJ@45Z=GV1d6ukjyVe58KwdlkEb2KnC>$iM5|zIXDK z?Z1w{ke*w==faOVu}!k>HgN7(cA3;z4QXToomgZpna)bBF8 z_su`({%iRKd8Pk8JAbaM+i<9+=GFd;H*>#k)?9qYWxA?#>tM*E{_# z|JC9fN0UNcY+P>0c5us{+x~kl$tbI=%~T3}Z2Mey=GULbkH1a7UwZNWk~8Q1TldP& zd|_%GuJPjA-k2k=Om5{^tXrCPPp9JTri!#A^|p-{Bl@~ZoEC{KbMW+KKP&t6=;6;i zksa0Q5j#~+7H>`Sv~m$%SNfgz=cEljz01-(j;Wj}b=w{hE%f?Mp?Cc3rO!oPOn$TH z^vc^x1}Xn8d*7S)ysLVi-i!|h=2^DwZ)(0ydVAmfKSRs?XI4d#f`*gk3O?6a==(kJgWk_vs` z-FK|#(VjYwme2lYe#d2JmtK#wlURT5>dNT-i7~&orOl}*OuTaQ&TJ#sd23Q1Ecvl4 z`OrG`@&n~HM-uKPSDf2a(!J8Tb=9`tMIrT5J#RcH{a78hx+U&US$h4gMcR_te{TP0 zSheZqP5un?*u!OQx_y71U;dM`*_UccO5@I+Y6f9*v)W% z>rUO>6<3lEcU8STDm-1iYqQwR{64k+3?ds1=j8GE7d0n_zuEh7rqzs4u9}Z~X zO^SF^>EiNPWX9+GJ-7L6CaLVy@}88wXUbB&eVe>I7VO^ld3xcjwB6l%1uy1QEPnju zeCsybx!=;ae@fk0cf0${nd6)Gy?k_f^4+^0FWyJzMCX(q-Dnz;WOpX}{!&ZJtrkbk z6;6CDEinDf-@fv;mH{7IWVm&wIj>tt``_elYOsz zH`lntMyILWemhS(TUgLm?%3;W)BU&l@2VFrd)ZM?{;vPdth}$eUuGxvZ1>*sp)Jn7+dYl<-aBOf)?U4I!+X|`qtc8Q(~=l zDze17>fCv~A!%FQX4RkSdvm9|{Acje?eBX3c3=114cVV>cLy%I{8DG;%l&%Gd9NLB zOJ=>f{;TfHMClp-URY0x=~%hrx{Uup)sN>ncVxc$&D))rarfH&jcaRJZXXS{(-wTO z_0j#zY^UqoH@Vr)OnOpzM#riA+=Wjm$IE1SDtn4A9*uf3U(`zXQ&{z7-sNvrUpVc) zjw{^Fb${5ND3W^Vb9LM8>u_e^m~ zsqd&`c=f8#P~26o>+tHTzPVqe=B@2`)PE>#S@8As2SnFiN#CZKd)=kt+MC^W*Jo91 zdigQ7d}q5()~pll*GweV%wKj}L-~g-yZE!y_1kx)pIX_RbNkEYSUZ_A|0cy7Tz;QB z18)TF&PrUWfBaT(hH0t3c+2S(zq;3TEb+PM^+qCZch_s(*}K2AYy1qYYhd^q-!2qb zGEsJV_rH%@RzI8`_&xXg&9`ca*Uv7!oRu{5Iq+tAA~l z)sA;xW95%Tn`Xby3H@&HCZb(Tvn=^|>LmS3x4r6jxn2p{_51zHU1_mztYXdPSrkO( zPJGbOzR4~YG(X0`{=7%VR{XX0lK%{^6y3`Iluf7?2-&U|ZM*g|-?H5O&MRJ??Uud# zaGTuB2yv%i;L~VPwN;MK12z;61m-}x-ca(C?wX?(_T`tN+o&5 z%+58X`|>y4nRa&i5#PxoGv>X%(is`gaBW4QL{DB#<)$Xb)ytP(K4$m+^kntzyVB-< z5BJ{wVoR{`lA~#syVtjAhVRkb-N3-_7Moi0*=d>Bo6L3g@>k zy}HxU>(y?*Fz2ZLi)Mn?A97t>c|PAIzSJf=&v$y}X`4usAIshs^Mz@?dNe=FhGVV# zvbF&C5AA1fevZFbdRc2n+1}m$HW3EN+iJuPZ&XtHAl}e@LDBPGN5_l4pC|O{JZqQ5uU4&atDCuDV)*^2j-S?hL-&>G&P&_8>}Y&3e__|HANzk* z6wdn3Ah<;EkKA1Mqc@A<->#ckw&8_IRQ-aaqpdA{N{iI(D2yG^;% zqI!x{Y&QS6Vs=YlyG-OS7MC=;x3iyBb+>>0zT)F29(2skez-49XZgvTL_B zCe3SmQWp9~HE6G}<5tn*Yo=cKBfDry-_oB#U-Tu+cunV8uG{tVtMa3gKVe39tK;vN zhHlP2+U?!H)A;Y&e`_y_Ra&SYn;7wowe^vPSK*$xNpmy&)6XS2BrMn2Rr0g6>C(>g z^Zi}(G>+aEo9^HI!Yn$!%c?eRoAsUYx39}*&OIGE-^9P@_44+UDM2?rxoAy~Nc}P? zK6Uvd_bZcLXBMi|%@jIudc}HS!z-Kb=5BY@>zGlvoljazb+eeUx4zKr#4Q^8O{Prj zt5{a`^s~gq+os!Ybbhp*c=!zi0|VoZX~tj8`~Rw}`q^Z0gU8-+^PS^sK0Yt{;U4(q z_rI#B${dT0ON+Fp_nu6g$va=m{GgOvE}#1HyT%${MBEIn{bw+iUYAv0U4P#DvfqiE zP5;h+JF!nG`JPnX{v{DhVh$OKhh!Jau8QhEmM*$)KSz|!w}_vbDUr8J#C_96r+&1S zi1;g;`L!{WO>=t3&7NC6yDE0crysCOSN&d{IWz3|lFNy|M5o<;)ShP-dVc`}gFR2D zOG=8H`vW7RS8j2C`j4^4M=zS${dgOfsqfNtlNNtmd19^P{72tBYLEF$`|7jnrb(2~ z=9n38W`49SGq@9`b+Yh<)~!hSprEAfSNiXlD$AUU*?iI5`_bL~&MDXKgt`2fDx7O_ z%9GcuZ9<&NwkZo$e{?D-`fYt(_UOho&72^ah9?Y+uTOT0C3~gCl%;H0&$#V#W}*6z zE@hb`XG)GoKl@Xb(kC-fIKS2JxBC(6y5L)H!}Hh2U7xl6`ugRMSf^A2=E#{+yS(G6pQ9J4#jiQmFTeGPMC!cje%B{u@_yS@ zvFn>qY!#ncTGi>CP3N-(<gmUt{}!hNCn8Gi;CvFMsmc zVqe((AXFWNvG*sRdGs^7*2A`U{eOlR67_!~=l^CrT3+XG-2F87tKu7z!#XM#4*MES zwp%uB!n8~2FJ~%r?CMiXtGZuyJ9ndZl9J4VCyXzA)~ws$xhzLx)1*41$|?HmAI&V4 zIeI<%sxeok!Nb!cCv&&Ex5>(H$#J-P``gaYTd%LLpJo2|2lM;$sXsGI_lv!-`g3;P z;+^gOp>eT_;m+Nck3LD>)~q-Gp-@%-%zdwSJxjfDeEGrd7iH1;U9ugZ>hwgB(h5ou9yG3uRuezO9>#=(0_RRciuRmmbJeq%c z)@kMAr5E#$Cp^vF_OL9*NzDC)uF9f+FC~r(8q50L-7h;+Y5EbLillWLPf4ZsZ+V+y zI&*&9s#H6B|07z*7TfL(zbhBIU+wJH)LBn1Kbra7z}(U6;~eKGw02G8IyB7&EnxECFO%6 zm3{IF#I|?HQOEbHU1r~@9H~{uv(oR}uzu(hA$X@Y(>+MJ^s#4|@`h&nm`7(dJS%)o zwE9F8J>TCfy1DcpyLbGK7iN2HUVWFj@!{p;C+lYPtCXizUlg7B&M7Iu#%`|4jQJb& zYWs73YlpH5-Kxv?m!CW{=TS_@p^npwCLPY7IPr&!XD8eAgk70s>t4B^x_$lWy!Ao* z%w+HXPB_??clpyhdCT(fxu+wxAJ4N`dilZZW%qeE&A8FG>rjCk=bUKSb*m#6pWJP# zE7NVs`Jq%(tZ2%Y?~~GEtF?+ZxYaQ!)*oDQ`Q@S+I^8w4_ruq=m)9lT`+jFm^}6M1 z(b*B(wrsKqi}p@FE*SS`b>huPc$i6dCff&B{Aal2wSI4&8zUS`|C_j=l>ISmkE967riLy#J`-de|;;vv#%Ws zXgABiVk=aL@rT8u20jgjp+LyxZhO2=aoL3Jv89>0+irWVJuVZ~so^9r$y7HxaH61K zsWHc_v&w6aUXM=QTzXkB$2Bc|mGXYg+EqW6mrqbLy>_t7%`#x$;kALAJbnLM`@^L) z{i)Elm$xEIUU_*vDS74Ac79Roe+K7GDW?S|hejLzS%1>MfA8xbGn!}Z4!fB9xvYEo zqq~0VtkiY>a^3vrYgOb^{wV3(+q_r)KGA%~3|3va^61Njl@G;J?)apgxj$*k^pttC zbuSl%T>n*JowqjY<%8E3ybLlwynOSyBDXvDpKS4UyD+x9=Dp{uuAEz6a<(q#?m5jD z9q*%af^H`t%yH35jLd;X5{UAt{`V~|FVH(_Iq%guwVM|;a;bQ1dTY41?a6Ur*(pYD zpB}xf@R_w+LvOFNXXzJ~*X)*Ak42&<-7ze2wOxDn{PV5WrC(B?-u`;i=%sO9dD6a@ zyEac}k2#zEpW)!*MVl`)M*LltI^{{Ual-ShQ@2X`oxSn1?8weWpHAN3V_VMTJ%1wR z6KZIb+H*`hVs6qFgZ3qMucA~Y-HGbBQs{d+Sn6!(t-h}N#>RfD&Rom5Vdr_{{nNAU zeCG|zXI*~0S$1;Ck-KJ(H|cE4o6*rZv!m;hlJ-?Wt{o*p4?sS{gIV=wJpEFkXK$}^ zB6XQ=jo6u!sy8i#RaQ)W_94+^sruSg4q>FOM~;^@+&mYdG%^mjk# z=X$yM&9ArL3yyDl`>ilbf4=I*ySrY#i_R~rnHV{v^N8A!^SayY!jq>&%TJD(Dr}Ib znzk)lTf$Vtf=6;v)zT#^u52ywpHi9~?_?^;!M8rVZoSR3lXqYBeJNM|Q661+dN<$X z>1J!H<0dcDeYxvZQ2xH!t)Cyi>Ug$g%f;tdq!&$Ii#Qx(PO0P{P3Kb#&J%4gJWwk&dg@^~J`|PE?&SarVbAsy4qa z^j+Fj;#KuE@CQfF@nb$SK1Q2AnX&D}yEB($=c@IGuRotR-L>z}uI^oHH{INoeo|hn zx}$j0&*ErKBdx7#oVHAVJuA#J?Qn0{rh2LDb?b^xo}9Dk_3N;YCO0*9eUtI*__n=% z)2+uBkBi>dwT<(5_cQa+wB)DjPJFdob~oJU{Gsv!jUFG*m!(y2Hl6wI%&tV=J18MSbxx(KR@9^^ zORg-HRMqs9T)cd~mLz$4UP$KYq$q&0Nay(&|=;;NpWvYw92Acb#wEn?HH?!%wFETljMK z&n%BTxNKLwNanlQg-1%`ZNpRN{bvvl-TS)wvU%8lhVIq!q@)dtyQRydqtEZSt!p+p zx^LH(ZMQS^rKWA2sj8{(bAG|2G$n0YfnS?WuivG!NiBcgioTiimCmPH{|#Ewk{;*)#)e|h& zm(7@C75y=B{^Zkt=Ty8b-#p{H*(rmxm}5Jp`5ir2cugxRJX2%qzNqx`Z{~L%Tb;bp zAZge94|k?Ce`%c@c*auin^m;ZjrVsi+bs{N3G=_XTjt`U8K?KX(mPxJy<%_gKFxi# zQ!hU1RzKAF(=L5#+T@!544V5k?wa7XIQzW3algdWk0;uBH|5Ewo%zq8bUDL+pP0_C zo?o+fe7Z=N#Mem+4b@`Ud*U}zt_m)k4zhq$$_xeUxi4%X=^rh9NnM$3r zUi{mp?)2$9Kla+WS-iEc+nxUO=H-N4v-YN(vv_}W$~w>fXP3^i%U1U+?K~VtLaLCB zJ)}21USZ?+SC4N^;(4_0k;=}guL?STYfQMKxgljCw>{%pt-$5SZ-#f&qzVfB&9$BdeqST*0?aI4% z+g;Dp+_HJ5>9+I7KP{VInQJuZ3#W>U)6waH^G&Xsevf@Tb6VJix6*Mp^ZD*BJJ@7D zF?HLSAJ3H3YF3p5#-K$EEx3|8k65|1zn-0XYvLt8=Lsk6HGgK9`fTMh;=lZ<=&H(p z1{1ZI{oT!;WpQu6|M7V7_0_d~*S~(xvg{UXQ~zyiH_ys`>ZG)n^L6*gEeh}cEKEZ5 zGT2rYJc@9u6Zx_6+2JX-W=d0RL4UcNC?_qpLpKlzP9 zS04s0+ZJ@zFLcl5*Ee(1c05aSaXaO`qVM%KY5jG+@*DR*Od6oVesnPmk-Sq?2twk55y({dlL&*G1PezU!LqI?Lv5^fJG%d+n?v z{~1J%m#Iw_zGx`)%GDfCmzx0$7=PKl&S1@DSi3-U3)8lSunSzb7^5Au2Zzw9?-FM> zU)s^1{J8T?$J~zr2c1k(5qCuIrw9lRlWA}rK@b0yWW2v8!sNtCsncMoPB@j zA8{8Ju-}L!81ufVtv|9YH}LwC0`GG(olb3grm46(YP;yew{DX%!*g4;4{eK4HQ6t@ ze2dGXS6N@8YIEmUF23m=@;&+JpIA?Ez0YoMPg||8$-VxcA+_YVob_sp_x(KO>U&Fq zUcA4w(PICtsCJF3W%KfLuFt#dRhqf-MADW`&6cWHJyRbUM;_eZ#l7lA|XJ5_1=e}&y&iE94@YT|a z{e~8}EW$3%ynO$H<)^gLF2*|~om+KqaaxEc=c`unUTvpInT6ADMGDO>WShEeld8&z z6FtGFyX9(%yLDWz`4`@~kSBF^eR$e#$4PIZ))YtQ^+#1t7QSj|+S%9HWth9Wq;=Wq z&6*R={u&jZKCjg`&D?V?PbT`9b?w}_rx!o{czs#!`{O>hZG|Id%-pc(+C1z& zqMoQqyM*zv4}ZJP#yszwHRtHGmnxcBZ?>GBX^|InBJ%f7?U16^4?I1M?HRd`om|yx zx4G%%zw_!FKYh2;cc0p4?SCWho@H67h3>lb?#7d>Kc{L=QvSJR|KWpvuQihjt}YU?i>=ypHPY&} zta<9i8Bk?OGtnM%240=${dC-vrfT-v1Mb)t)PM@IgI=MU!13BH{3 z{qc{-yI*a)JbCA8-?Py%SvgB*y(!tQXFqlKPQ$woc1_(@Q+DReZEX)LPW&U_j91$A zwAq80Hk2w1UyA?AnhQ%-YMHE5^YWUM=H=D#Ytp3D3nxyTK9G3HpXaFhGS#X3?A~rO z3)8rwEvfnKe!sz)=w;Iusplv!>0EKWSLKhMTBM-xUppiBxFu88?%TX}dA!sa8T0f1 zluj)9QGNO8yB{^Z!Ec$Tynnj)T5;yu`A4O?m%S;L4fBt^v3&30>-lxJO3%c4|I=GR zVzOgky7ShyJbH5>H&0Ri!llms=d~3Pv!ocDaT|g%~#gDd{UgK$<~q=>rPJh zk6p4kdifml>bxEEzWit4>-?Znv-V8XyvTco?<}${YS($&#mjs>-e-$oRq7M@1&dS{{F1ET*`xZvuz&sWI_u}MAHCns z^6!&wUV8QA*IhYPXLT>u&DWh+x>@#iUe}Smd`s*?U(+WceU#ZpYCvMB7d4Zg9{b=X zZ=HAlDT`~S@4j_Ry%kdFqkrv0tKp)cnmwMrzpgG{DZgm4s!&MimY<(8Hyz6f_I~{6 zhx$S7y!TsPY~Qo7qsvdqMW^p9-F#=)&6k~@e3R1Db*0v4CI9wo6q}l-X1XM0 z+uf(qeL_pGo(h!T=eeKtv*&DmL7}ioFKVYQ&G32eyzc0_qsP--KVHu-Q~$C1(pA39 zr@4oxZvDLUs>|J_yV44uc6>9x{c&CYr0wg}mucr5IeT9A3jQ38;Z+94{&NZ0R~$F4 zys`C+kmR-?%_4rad981zl!@#*x%!1$+RB2+Xzjo+N}o%rv;=+sGkA*K&s%rm#qLG# z<%?=IUVPG4|E7C}y4ievy;pi`f9&6KG=9p=rQiNDn7!;?WIw&UNMMS)%#LF*a(d;JcG$w>2uy3*&HSO>G+HLg|YFff@OVH=TC2ot*Ufca>sJs{ap{Qxg_tu@yhz{ z$&dBo@%?Mp%G^I8JzY1xY&E-B?YzB`O14wyzBny-_1@$DWLvpw>8%P!Z}t;^iU~N_ z#J*=e@;GPuEx1qG<;~2}eEY};ua?|)RGJ-;X)jeBEa4=2`A|ks_mNum;MgWpEAJ2A z)9&@llpH_mVHsVvJLMU#-s7m`%{s3C8N7Gjxc^sjW zN%ysXPPE}MQ&%4=RrEBUIl0uWQb?>%CN+`8Itc$zrk;zguBs{U++*?wGQBwWiH+ETg}4Et$XVtUVYVkl=$}dCLT+*H-GldK7052vrX4>KSoc|E~!v@vHNg| znw#Rr4RhW$Rg0c@y;jWQ?QTxKIn@>~zxcVPEZJ;3W#SKOubc^Kam})^gQ}H>{V$<#18}GV&d|ZwkuS%*?RVdi!lbe(3<6L!g&o22)UUP26)SH|6x1>yR zHY>c7cJcW1E1hDNC8|?QXw~Y}s6%<%&bdgezY)Gw;puj^mhI}0-evPFW=v$y4+E}P6V z_4-NmK`>?Z>xR%WaX<<@#o2Z zhD+_6=1FD0o3~r_OwV7F6H7cxzVc0Ve*JgvlAks6g?~(WzD+OTUFMd$W&Z0d_pjWx z?bm~I_CNmee<&&bckkk#eeq%UU+uH^i8=mlU-z@3zojSt`hM+STs`;euk`-u{}~pu zS^j6p&)65OzdHYGy!|q{w11DCKTFo_`S5Sqt=q4gE&ek+{$hXd;PKzp?w@|vM%Shwpa|RvsZfk>L>42Oa8rBZnLxg#M91yxpp?YD}HAjw0FJzzF#b3e!T3u zN$xzwDqlax?3S#)^tmlJx%6wzoXA@HU7F|hUfH>;&KLi&^zQN7YUk};FJ&bkHS=Fz zx~?mne_OY#?`#>X#447vOBZL`hb#>;m}GxeVrjYl>*Q61=cm=#Sl`$k_q6-(KHJoJ z);ja&p0wLEXX??pr{&jATDWfR<)hEGf8}^vHLqGr{(BXddCu&f(n#S)yX%*CY}7x;C6e;k+Y0D7JU8mLw3_|+p3?luU@m$_rCFS)9(1rD}lSS?&!Wg zT0Uv=YoB!$mA@x{{_R_)@jbA1zJ2bhptLPFw*Fl_yYZRer1{c)kIPxkHy^+F-q>tP z+`=yLjIU+YIg!dgH~;ZoCzty4uKR`3U)Ia_N^ZP<<RkL~XW-qw z{p|hMtXi}WSbdK!-R!+6sYZL7&X3~TN85hqZ{MGDDP&9s%Px|5wK+LqVEr#CY5#HZ{->l9u#5Xm{esPhCq|tF1iE%Tqdg zs_3=bD-+KATE3-BZ{fX@e~Kgnx!0Xt`u*58z1_DW-z+~a8!x{6#PPdJ^UZT*HcuAQ zT(&yYF74i*=n|hN^JjE!+k0}CWaL}%{lc?MlSbp4R*C&XA+Jqy?z0Q8vp#5U7nr)x z_5GzqCNm!8t_jLCcy@E&$w!;g^xhwLn!4e@2JfK2$cHnwd=Bpo`uJ=5^(%jc3Qw$x z3Vna##8K`qv$Fs0vnhVO&Azkr;J){};x}&HwWjX5o=1O>-lCR`kMGUe{8svh4V%ci zy`r&t*Vb=Jf3Z~b^JCKoUwYNzew41iW%m2mN0*9a$=9ZS_P@n$@pA97-KrP=?9SQ$ z=zhxiqXA(xu2+kz-MRdN{nqoR8tN*YOzHol5^?=Zsi%I;L;3x((Ld{5%eT&c`_Z?y zV(M?-Th~np#w(&)9L&_;18`>*L2uX8B$FnQf~an6{kvp0w_+`(d}2 z)i2s+_DeZGsO(%EXUVU?E5AcEdn?>rf2u5-IzS4+PK)-M+PDC^WNctxXd1W>|FJ{gxKLn;erOgZ$2JIUL3->K7=g7cPog!f-m zJbLYRNzjYVe(v{jH8b*iW~|$FXW~^uW8qhaZr*)q8#v+Hx#KJgox5M(s@i0=Qa-5v zQ&!c?6MVY0wW5+UepNSXH)&D(4zo9f;%xz!`?Uv_i5>c+?O6U$fT ztm$)JTDHvacIZ06vK;d(*R?jb+;#Ed{_}W}=5@<$0jV$6T)upymM6OC?XEX=_hqlV zKkifGwd{7ib~3u zw(~#v--C^p zCMnmgysauJ?i{ps`RUDXHU6a4&P<70C|J?*J8N@u{!!WA*{{x=Kb~c8pOqeZ_Sc)q zpDdHkue_Z*|4VpBi~z+`cF=|)`;yYF$1Tm$<2l|;x-`SL@o4h-Nr!&3Z41^v`SYO3 z=3Lw0TQ6!SeQ7_>Iwz*2&+e~PZD@YYE1Tnc_dNagZRUD*kq_6b_n0oNN?$hj8uu~d zd;zGrlv2#bw-##pt-tOvU+}??Rs9DqU)P(&HT^%s{T0VtF8pn6e;M}c!sWcIne)=` zWM6;(=0C%unDxgqNgdI}?aG9XWU()}rAd=97GC^Z?Ql?nkkGn|=6z00>HkF2^R{OG zIrT`gPT_=f>YXZ{;6EMx!HXZ8GSA)MH-EP2kLSBr?s`A_Tm6^m0p$~^<}EgkHp6_R zJ^^XoKvT`EUgNRPciCF2srsvLTzxx5DChjD$zoL#^A5MfHOWl0d@_B%W9PiX)B9bY z{oWR9_+;Mve%;i!>5f);8Q<@?Z@BVc)2sgsTIb(9vndq2{pwI4_iYJM#)!~dgUU5< zG3>5F6~f9Z_`|e;F@j+YLl}cLgJ=WS0oDYH1UQqA#2giw`Q}et@R2({`*v@XnX<0) zThg3)(|K(}YNz~+&^zT>r4^sBNBu&4nXLP)tA5gZ*LnQdcv)U(P4KO27vJCQmV4f% zJ>7Hi@|TsGx%ZY{O!=X->14)?t=p*TPOxA32&V)IC5fYZv4$K>kpJ9*M;rdU6?oP^ z&%AMm>x))-h-)JfFM%%&&gH&N6S5Glavyd*h1zvt6^JOCuE? z-v~L^oy_^@!%s_td(LlGoIZHVQ%6`H)9%m5v_G7>{5;p@ul+Rr^AZIoN0|c?4s}0&+3Wwk|Gu4PUfK1De(q2A z@BaH?@#}NW6PBreI{IU;{XUDu^DK(g0;^K$zCU7>IeIRrrvK6pJN_<<#jiV0_$~SS z{ur0#qsmDghx#h!Ik%fO$l$9_2vresYKiVg?tCzvSfxD6F70K(%6rYPltR{>%&Cam z^hB`AUZmEw%lwt*gR0dtTwhE-_{#3l@vy%k?xio+Rf<2^$N0}Y@Vms*tNSAb?^dna zpzpKm_q{*0$IRp2mbV^Qt^c9>-XF)W&!*^IKVEyJEdJs2ga3Z=uQ>8!Zmsot`IOV2 z{xjUQ|Lyo}zI>1JzCYjm|Jc9#&roA?x&N4)`14KmAmu+EpZQ_mzM{_H!@)Q6f24k> z-zS%T@QZEe^_%~G_-x1j@RfXzjX|~gKgk;T_w6%3)bj`YNqpFR)BeNh z2OuNQH~*+=f6UJ#ck(|&TRi*khtF!{4_~pDs7Uzc|HtTu{e6Dp2mj<2{y2P?9cpjo zeD)7t`H#s-*iQb>z_XA4`{7ZC42KYzY*TR8^U!*kqwAI~-IK38;pUd#tKV!6F3I%P zITh6NTleU^mZj5s{%{6GN6u8$Hr|`_Ykqa=XGy!}nqQOu1YfmtGkGhX@~3oR?`2of zJ6pb;O|trw{CakcdGzJdz5f|fWsMC^9N&EZd*`3;-;eBWl6wDsKj)k8e;?J`{{8Tv z`F@@7&G)~L{Hy-`@F4rXKk870hnx6ofB2{Ge=q#={rh$nx!)h=ov**A{`vlWJ`UUO z4{hiDXV~NaeE&Wff$H~%s%`%>RLnnLUt^*0{eH{0>VF^Y=l%Op;5cd#O@dBe=>+%1 z;{Oc$_208|zTeM%X8q+~nKkmq`8eNOe!o3sefOuQAL?Z+~%d7U-t?&Q+_<3vCT^DPywU_EA|B0`$m>s(IyzKY1tCK>1Dt+0f zzsfG{YIbqx4Rc+smk+|bg*Yj5c;%Z^oZuOHoKzU)bp-ah$b zqDt3;)$0E2dcI7s^uzCa3s#C*NtOo6UU#*7rDHbb%g(?@o90VzlFOZT`Tf~EO%25x z$D4k?d$>t0?}KYtZr0 zPCK$;QXI2g+ifHMggA8jge7g2_-7aN5=|}3jOMKjqwy8ZkcgNcLsZH?Y;=3l- zmRRcGpb)!qGgQCjTzJweia$`Yx?CwhK!&G!3sDgDZ>QnP&J3ZA`+Migu0CC>=e_3X?R1lJbv5qgk8ZEnn2}cA^7L5xvyzBQ-RqlAU%FHM zpW#&MO7Yd!W*2Mb`E30Vn}6-b{?M0)&wT!-*PlPXwAudHwOyOvvz_n%&v5pS%U-YS z^A9Ul|1!V5_&-DD{AX)^-MVWx`_60ID&6(3r1}rXq~BwoUw0wNe#iIvLyu+t^?rN* z-ni!K{^**z+chu0O}qY;*Ztx8^M_dH*XBP0D|&eT#pAqxpY6{^f8A7T_VZf(AMWg5 zZHqr#fBum1{Qe9>{yWwC9~RX0nZ18+{O9Wa=)&K*#p`cH$6qm(Z=2u3ZufV=k@~`Q z{~1~r{<65efA9IvVYNAbx9zm2wa^M^z6`&&Hj-=*IFh>~C2yZiT@{|u(-*UsP0o?CbM*1v@-{+Rqx zu>Ag(P5F0k`5#^Wi^uN%eOEtg^Xv4tThHy!d|MxIrB13&K<4+iX2HM5cK;J=2ZhRa z`?HZ>H-EeJJbuf!{VTHUdF?s)YJWR+{CgbxpMl%?OX2qVYET^91cyoWXqb$K$!Izm z4tXcbHRtk)RWKGr-$44&PyX1JURh{(|k2z0DDx|W!*SwMFDD^SF$QikO%aVy@ zJy)-sd)q$6Cc*ZYxiHV&sdlEJKp`P&i(e*3pF2)@Gwy*zHWId-nuidj>=dRT!-OT^(&HruQ^rxSyw*6-a_`7Il``cRi zE1Uia)k)Q!{W^EezoVP(f14)%)>i-Yldrk|7XEfE=D+pJer4((l|LrGXTP?N{M((n z|E-Swt*ZFxCtuzE>-??jnf%r-^+Bh9c%pcxe#@8r`jfA2|JD9h^o)J>i+@X}f0+E? z^1J*sZ_~f&PW#WWWy61l%$IfX>Z|j=^54>)QFr~~UvK?~>JOLSxgUA!{F`Xq{|uRl z@Ia9t4U*9y8BHZr$~dt&%aX;AvZQAB-(`IDw`Rpp1LbmedqnPw^L)SJ&fGdAa7ppWN%dCjVOZZ~i6yqV@lj+2$$l_Nlb9Td1>jdG)<1 zdq3r-ZCZZmRQaY!pM5G%e7v;Tw5Dpwli({;Dq1%Op8B=hs^ExE#eat13$1SMu6cUa zSNBfZoAUG3vP%16rW^4$7A^LB!@=W!?3 z!5=kD$7knWP1xP8X1(~NNowr+xj(B*k4lzQoe>Y;X?|P0YO-nksXyCnrroaWsQtH^y@4_I;%AUZW=^M1v$%~snSIq6PROxW4$ zu_c#uw^=<)?Z12Q+#6@HDqlZNS;>-5&b?Zd7H={HmsEX`>bNpxr}D`a9jBN3Ei2#f% zDPK-IRbJjc@3Q5i{KLE6MXtTQZdaPYP2=2&!gpT0{->E*jKXU^|>OoiP&Xb~v)hdWwp`|YW*b}^c~ zy4ubgQ>;#1S|X{b=5}jR9kb%+(rtG|b}1!>i`CrF>;7=Jbo=o#wL~*h{)%*!t=?BB z`kQVzWw`69LRZtrryeOc{NvV`E1W;QrTO&>i7l_T*|IHDt5CW#`EHy04eN+!fBRnR z%=P{GrL3m)bHwthy#;5>Wqw~NwYywqYFD)E>oIS|+|5!Z$K$8Qntol&J1KHT+tnx4 zUf~VXuU{3^t=G#cxp=hww@rUP7x3g{= zM$CJ1ytYt#{e^w!*MIo6pMQP#5slcCL+{%|Lvy)qOuc-)^iO=9#@W?!bN$DY}^GLwYG z%*CBvFYKl)t94)Ydau>Y`QMM<-L~sy(RbyQmrqXdeEsl4*R|--)pm;%lgsYCJp5Hx z`nsiUlhD4CbG(klINtD&oHxr0@>|FIBC5CC zyH**!S$E#s>oYdH#QG<;-R!rXRDJFC-4EwO3})~CX*}nhw0Lw;@|GXBwMzxE67^3= zEnXYzeSS{%hN4)bk6&NKwRfcVHcu`4J6XghTKv`WbuVAO{7^p6y=?DG)^oNiv)^r2 zi{7%Ecd}tWpXI}~o9%ylb`|>9?b~EJbLPyM^MmaI{-V${rkU$~zTz9pM@y%~ zb8RMU-L_@NttqVwU6$ywWd?;ze&yxWy>Q~hX3zn_B|hrw#Vy}&*}~f6wc49AGLG#_ z$G;O-{R^I)@0MI2{h#5~&LYmM8YcJ!vu*dZliSUUk{@qsS1nt-_tUoQ zg0y{ae#e|Cj4t=RDEMi!>GIA^$6B9UW8S@S#Y{EPvLi<K=VsS9I&=WcR%Fxu?Zlj{9!?7WR9^JJq9R z9@9B(W0YUHzUWT<@%!Yn`H{kRV@};Jic~pSTlM8j)$ei%=OMZ8wbkmb1K~{53R@zRo=UAINHL6tdCCBSM-^=WmZ;T8t>)-aadu6n# zXv>z_m!3(9_kRBc*Br4g0L}cJCCt`)NaXPVBljbEkc} z=X<|!-|em6U2eCFCgtt>dbtm@~vt@sZExmj& zH7)0O&Ux2uN6x!A-RYji!La{N#-sJhJ11^=RkB>%WZ!{%)@Jw5$bZ|~5a6}_8`r!# zcjwOEd1v#gO#5H|t&g0LD*ExwChMD}S3={;Zaq8Qck|nU+`R|h7dD^#yE4{$Zt?f> z$A7|B*fh&c)^~d?QStB9oozSP$gKLuSL!<hJa;KC9!2FN*$LoLR9PC-%mrnm{@`Ld|1KXd{{|xC0@=fKt zPXC)#!|

dx+% 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