From 2b61e883c5f36fc8e34b1d2f89c1f4c0bb79c602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 17 May 2024 19:45:53 +0200 Subject: [PATCH 01/13] Bump sdk to 2.6.8-SNAPSHOT --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 01f3b1cf..2658fc66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.6.7' + implementation 'io.github.wulkanowy:sdk:2.6.8-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' From 1c0df6c145f06508b73f71b502e6783e96ed68cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 17 May 2024 21:23:29 +0200 Subject: [PATCH 02/13] Version 2.6.9 --- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2658fc66..e5deb1dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 168 - versionName "2.6.8" + versionCode 169 + versionName "2.6.9" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.6.8-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.6.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 889591fa..17630e52 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.6.8 +Wersja 2.6.9 -— i znowu aktualizacja, żeby wiadomości działały chociaż w piątek. Później już pewnie nie będą -— a i jeszcze naprawiliśmy dostęp mobilny, bo prosiliście +— naprawiliśmy obsługę eduOne (w piątek wieczorem, więc jak widzisz to później to może już nie działać) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From f69816fbac735631c76a85d385c5fb35e92a2293 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 20:21:52 +0000 Subject: [PATCH 03/13] Bump coroutines from 1.8.0 to 1.8.1 (#2560) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e5deb1dd..3d8f6d30 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,7 +187,7 @@ ext { room = "2.6.1" chucker = "4.0.0" mockk = "1.13.10" - coroutines = "1.8.0" + coroutines = "1.8.1" } dependencies { From 406024036849908c79b5d713f20971de282829af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Fri, 17 May 2024 22:22:43 +0200 Subject: [PATCH 04/13] New Crowdin updates (#2551) --- .../main/res/values-ru/preferences_values.xml | 22 ++-- app/src/main/res/values-ru/strings.xml | 112 +++++++++--------- 2 files changed, 67 insertions(+), 67 deletions(-) diff --git a/app/src/main/res/values-ru/preferences_values.xml b/app/src/main/res/values-ru/preferences_values.xml index 6c7a74ae..63ab4fc4 100644 --- a/app/src/main/res/values-ru/preferences_values.xml +++ b/app/src/main/res/values-ru/preferences_values.xml @@ -1,10 +1,10 @@ - Alphabetically - By date - By average - By attendance percentage - By subject attendance balance + По алфавиту + По дате + По средней + Согласно проценту посещаемости + Согласно балансу посещаемости уроков Светлая Тёмная @@ -52,14 +52,14 @@ Средняя из оценок со всего года - Don\'t show - 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 95400f93..acce9f83 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -13,7 +13,7 @@ Просмотр журнала Отладка Отладка уведомлений - Clear webview cookies + Очистить файлы cookie Разработчики Лицензии Сообщения @@ -38,14 +38,14 @@ Логин, PESEL или электронная почта Пароль Тип дневника UONET+ - Custom domain suffix + Пользовательский суффикс домена Мобильный API Scraper Hybrid Token PIN Symbol - E.g. \"lodz\" or \"powiatjaroslawski\" + Например: \"lodz\" или \"powiatjaroslawski\" Войти Пароль слишком короткий Данные для входа указаны неверно @@ -56,8 +56,8 @@ Неверный 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+ Данный ученик уже авторизован @@ -73,7 +73,7 @@ Discord Отправить письмо Убедитесь, что вы выбрали правильный тип дневника UONET+ - Reset password + Сбросить пароль Восстановите свой аккаунт Восстановить Ученик уже авторизован @@ -81,13 +81,13 @@ Другие места поиска Не найдено активных учеников Введите другой 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 + Помощь + Полное название школы с городом (обязательно) + Например: ZSTiO Jarosław или SP nr 99 w Łodzi + Введите правильное название школы + Дополнительная информация на польском языке (опционально) + Например: \"Ostatnio zmieniłem szkołę i…\" или \"Jestem rodzicem i nie widzę drugiego dziecka…\" + Отправить Включить уведомления Включить уведомления, чтобы вы не пропустили сообщение от учителя или новую оценку @@ -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 снова Поддержка приложения Вам нравится это приложение? Поддержите его разработку, включив неинвазивную рекламу, которую можно отключить в любое время Включить рекламу @@ -113,16 +113,16 @@ Комментарий Количество новых оценок: %1$d Средняя оценка: %1$.2f - Annual: %1$.2f + Годовое: %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. Расчет среднего арифметического суммированных чисел @@ -167,10 +167,10 @@ Новые итоговые оценки - New descriptive grade - New descriptive grades - New descriptive grades - New descriptive grades + Новая описательная оценка + Новые описательные оценки + Новые описательные оценки + Новые описательные оценки Вы получили %1$d новую оценку @@ -191,14 +191,14 @@ Вы получили %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 + Вы получили %1$d новую описательную оценку + Вы получили %1$d новых описательных оценок + Вы получили %1$d новых описательных оценок + Вы получили %1$d новых описательных оценок Урок - Additional lesson + Дополнительный урок Аудитория Группа Часы @@ -217,10 +217,10 @@ Учитель изменён с %1$s на %2$s Тема изменена с %1$s на %2$s - No lesson - No lessons - No lessons - No lessons + Нет урока + Нет урока + Нет урока + Нет урока Изменение расписания @@ -270,7 +270,7 @@ Время окончания должно быть больше, чем время начала Итоговая посещаемость - Attendance calculator + Калькулятор посещаемости %1$d over target right on target %1$d under target @@ -347,10 +347,10 @@ Переслать Выбрать все Отменить выбор - Restore from trash + Восстановить из корзины Перенести в корзину Удалить навсегда - Message restored successfully + Сообщение успешно восстановлено Сообщение успешно удалено ученик родитель @@ -396,10 +396,10 @@ %1$d выбрано Сообщение удалено - Messages restored + Сообщения восстановлены Выбрать почтовый ящик - Incognito mode is on - Thanks to incognito mode sender is not notified when you read the message + Режим инкогнито включен + Благодаря режиму инкогнито отправитель не уведомлен о прочтении сообщения Нет записей о замечаниях и свершениях Баллы @@ -748,8 +748,8 @@ Тема Разворачивание оценок Показать группы рядом с темами - Show additional lessons - Show empty tiles where there\'s no lesson + Показать дополнительные уроки + Показать пустые поля, где нет уроков Показывать диаграммы в оценках класса Показать предметы без оценок Цветовая схема оценок @@ -790,12 +790,12 @@ Стоимость минуса Отвечать с историей сообщений Показывать среднее арифметическое при отсутствии стоимости - Incognito mode - Do not inform about reading the message + Режим инкогнито + Не сообщать о чтении сообщения Поддержка Политика приватности Соглашения - Show consent to data processing + Показать согласие на обработку данных Показать рекламу в приложении Посмотреть рекламу для поддержки проекта Согласие на обработку данных @@ -813,8 +813,8 @@ Главная Видимость плиток Посещаемость - Attendance calculator - Settings + Калькулятор посещаемости + Настройки Расписание Оценки Рассчитанная средняя оценка @@ -866,31 +866,31 @@ Авторизовать Авторизация прошла успешно Авторизация - 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. + Уважаемый родитель,<br /><br />для авторизации и обеспечения безопасности данных, просим Вас ввести ниже номер PESEL <b>%1$s</b>. Эти данные необходимы для надлежащего доступа к и защиты личных данных в соответствии с действующими нормами.<br /><br />После ввода данных мы обеспечим проверку, чтобы доступ к системе VULCAN был предоставлен исключительно уполномоченным лицам. Если у Вас возникли какие-либо сомнения или проблемы, пожалуйста, свяжитесь с администратором школьного дневника для уточнения ситуации.<br /><br />Мы соблюдаем наивысшие стандарты защиты персональных данных и гарантируем сохранность всей информации. Приложение Wulkanowy не сохраняет и не обрабатывает номер PESEL.<br /><br />Напоминаем, что предоставление точных данных является обязательным и необходимым для использования системы VULCAN. Пропустить сейчас - VULCAN\'s website requires verification + Требуется верификация веб-сайта VULCAN 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 + Верификация успешна Интернет-соединение отсутствует Произошла ошибка. Проверьте время на вашем устройстве - This account is inactive. Try logging in again + Эта учетная запись неактивна. Попробуйте войти снова Не удалось подключиться к дневнику. Возможно, сервера перегружены, повторите попытку позже Не удалось загрузить данные, повторите попытку позже - Your password has expired or been changed. Please log in again + Ваш пароль устарел или был изменен. Пожалуйста, войдите снова Необходимо изменить пароль дневника UONET+ проводит техническое обслуживание, повторите попытку позже Неизвестная ошибка дневника UONET+, повторите попытку позже Неизвестная ошибка приложения, повторите попытку позже - Captcha verification required + Требуется подтверждение капчи Произошла непредвиденная ошибка Функция отключена вашей школой Функция недоступна в режиме Mobile API. Воспользуйтесь другим режимом Это поле обязательно - Mute - Unmute - You have muted this user - You have unmuted this user + Отключить уведомления + Включить уведомления + Вы отключили уведомления от этого пользователя + Вы включили уведомления от этого пользователя снова From 52c1878f6b22d24b78e958a1d077be17b952393d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 22 May 2024 08:14:11 +0200 Subject: [PATCH 05/13] Bump sdk to 2.6.9-SNAPSHOT --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3d8f6d30..f0e0c20b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.6.8' + implementation 'io.github.wulkanowy:sdk:2.6.9-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' From 24abe473323ce255700f39041c3646be9172b686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 22 May 2024 09:05:30 +0200 Subject: [PATCH 06/13] Version 2.6.10 --- 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 f0e0c20b..ac485b3a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 169 - versionName "2.6.9" + versionCode 170 + versionName "2.6.10" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.6.9-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.6.9' 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 17630e52..659fd73c 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.6.9 +Wersja 2.6.10 -— naprawiliśmy obsługę eduOne (w piątek wieczorem, więc jak widzisz to później to może już nie działać) +— naprawiliśmy obsługę wiadomości (w środę rano, więc w kolejne dni może już serio nie działać) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 859c6ef154382aa7eaaf542541436563cb8bb24b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 22 May 2024 20:23:57 +0200 Subject: [PATCH 07/13] Add auto refresh to wulkanowy repo --- .../data/repositories/WulkanowyRepository.kt | 16 ++++++++++++++-- .../io/github/wulkanowy/utils/RefreshUtils.kt | 4 ++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/WulkanowyRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/WulkanowyRepository.kt index 5b563b35..d961a638 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/WulkanowyRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/WulkanowyRepository.kt @@ -6,6 +6,8 @@ import io.github.wulkanowy.data.api.services.WulkanowyService import io.github.wulkanowy.data.db.dao.AdminMessageDao import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.networkBoundResource +import io.github.wulkanowy.utils.AutoRefreshHelper +import io.github.wulkanowy.utils.getRefreshKey import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.sync.Mutex @@ -18,10 +20,13 @@ class WulkanowyRepository @Inject constructor( private val wulkanowyService: WulkanowyService, private val adminMessageDao: AdminMessageDao, private val preferencesRepository: PreferencesRepository, + private val refreshHelper: AutoRefreshHelper, ) { private val saveFetchResultMutex = Mutex() + private val cacheKey = "mapping" + fun getAdminMessages(): Flow>> = networkBoundResource( mutex = saveFetchResultMutex, @@ -38,7 +43,11 @@ class WulkanowyRepository @Inject constructor( suspend fun getMapping(): Mapping? { var savedMapping = preferencesRepository.mapping - if (savedMapping == null) { + val isExpired = refreshHelper.shouldBeRefreshed( + key = getRefreshKey(cacheKey) + ) + + if (savedMapping == null || isExpired) { fetchMapping() savedMapping = preferencesRepository.mapping } @@ -49,6 +58,9 @@ class WulkanowyRepository @Inject constructor( suspend fun fetchMapping() { runCatching { wulkanowyService.getMapping() } .onFailure { Timber.e(it) } - .onSuccess { preferencesRepository.mapping = it } + .onSuccess { + preferencesRepository.mapping = it + refreshHelper.updateLastRefreshTimestamp(cacheKey) + } } } 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 e43654b8..4cce4be4 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt @@ -30,6 +30,10 @@ fun getRefreshKey(name: String, mailbox: Mailbox?, folder: MessageFolder): Strin return "${name}_${mailbox?.globalKey ?: "all"}_${folder.id}" } +fun getRefreshKey(name: String): String { + return name +} + class AutoRefreshHelper @Inject constructor( @ApplicationContext private val context: Context, private val sharedPref: SharedPrefProvider From f3afe7fdb7d6e321904f881ecea527a2494d216c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 22 May 2024 20:24:27 +0200 Subject: [PATCH 08/13] Bump sdk to 2.6.10-SNAPSHOT --- app/build.gradle | 2 +- .../main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt | 2 +- .../main/java/io/github/wulkanowy/data/api/models/Mapping.kt | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ac485b3a..ece69b0d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.6.9' + implementation 'io.github.wulkanowy:sdk:2.6.10-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' 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 2931db35..b24700bb 100644 --- a/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/data/WulkanowySdkFactory.kt @@ -59,7 +59,7 @@ class WulkanowySdkFactory @Inject constructor( if (mapping != null) { endpointsMapping = mapping.endpoints vTokenMapping = mapping.vTokens - vTokenSchemeMapping = mapping.vTokenScheme + vHeaders = mapping.vHeaders vParamsEvaluation = createIsolate() } } diff --git a/app/src/main/java/io/github/wulkanowy/data/api/models/Mapping.kt b/app/src/main/java/io/github/wulkanowy/data/api/models/Mapping.kt index c4667a47..fda5334d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/api/models/Mapping.kt +++ b/app/src/main/java/io/github/wulkanowy/data/api/models/Mapping.kt @@ -14,4 +14,7 @@ data class Mapping( @SerialName("vTokenScheme") val vTokenScheme: Map> = emptyMap(), + + @SerialName("vHeaders") + val vHeaders: Map>> = emptyMap(), ) From 4a585fc56eca48b52251d3a12c24c24297bd0c90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 22 May 2024 21:00:09 +0200 Subject: [PATCH 09/13] Fix mapping refresh key --- app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4cce4be4..8f4ceb50 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt @@ -31,7 +31,7 @@ fun getRefreshKey(name: String, mailbox: Mailbox?, folder: MessageFolder): Strin } fun getRefreshKey(name: String): String { - return name + return "${name}_refresh_key" } class AutoRefreshHelper @Inject constructor( From c76ace40ebfd6bdfcffc062d8cecb16a8d841b59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 22 May 2024 21:05:17 +0200 Subject: [PATCH 10/13] Fix mapping refresh key --- .../github/wulkanowy/data/repositories/WulkanowyRepository.kt | 2 +- app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/WulkanowyRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/WulkanowyRepository.kt index d961a638..815f8b75 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/WulkanowyRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/WulkanowyRepository.kt @@ -25,7 +25,7 @@ class WulkanowyRepository @Inject constructor( private val saveFetchResultMutex = Mutex() - private val cacheKey = "mapping" + private val cacheKey = "mapping_refresh_key" fun getAdminMessages(): Flow>> = networkBoundResource( 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 8f4ceb50..4cce4be4 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/RefreshUtils.kt @@ -31,7 +31,7 @@ fun getRefreshKey(name: String, mailbox: Mailbox?, folder: MessageFolder): Strin } fun getRefreshKey(name: String): String { - return "${name}_refresh_key" + return name } class AutoRefreshHelper @Inject constructor( From 5ca9ac397818e634c53d44fa3c5f76d99df7ce7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Wed, 22 May 2024 22:05:11 +0200 Subject: [PATCH 11/13] Version 2.6.11 --- 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 ece69b0d..05fa295a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 170 - versionName "2.6.10" + versionCode 171 + versionName "2.6.11" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "app_name", "Wulkanowy" @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.6.10-SNAPSHOT' + implementation 'io.github.wulkanowy:sdk:2.6.10' 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 659fd73c..1bed6d14 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.6.10 +Wersja 2.6.11 -— naprawiliśmy obsługę wiadomości (w środę rano, więc w kolejne dni może już serio nie działać) +— naprawiliśmy obsługę wiadomości i ucznia plus u osób, u których działało na wcześniejszej wersji Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases From 87fb1916d844136358483af94bd4cf374a5fb2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 23 May 2024 07:37:49 +0200 Subject: [PATCH 12/13] Add panic button --- .../ui/modules/dashboard/DashboardFragment.kt | 7 +- .../modules/dashboard/DashboardPresenter.kt | 19 ++ .../dashboard/adapters/DashboardAdapter.kt | 28 ++- .../viewholders/AdminMessageViewHolder.kt | 11 +- .../modules/login/form/LoginFormFragment.kt | 1 + .../LoginStudentSelectFragment.kt | 1 + .../login/symbol/LoginSymbolFragment.kt | 1 + .../layout/item_dashboard_admin_message.xml | 168 ++++++++++-------- .../layout/item_dashboard_panic_button.xml | 28 +++ 9 files changed, 184 insertions(+), 80 deletions(-) create mode 100644 app/src/main/res/layout/item_dashboard_panic_button.xml 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 b7a0796c..bc6a991a 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 @@ -125,6 +125,7 @@ class DashboardFragment : BaseFragment(R.layout.fragme mainActivity.pushView(ConferenceFragment.newInstance()) } onAdminMessageClickListener = presenter::onAdminMessageSelected + onPanicButtonClickListener = presenter::onPanicButtonClicked onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { @@ -208,7 +209,11 @@ class DashboardFragment : BaseFragment(R.layout.fragme binding = binding.dashboardErrorAdminMessage, onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, onAdminMessageClickListener = presenter::onAdminMessageSelected, - ).bind(adminMessageItem.adminMessage) + onPanicButtonClickListener = presenter::onPanicButtonClicked, + ).bind( + item = adminMessageItem.adminMessage, + showPanicButton = true, + ) } } 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 3fec6256..8b9de996 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 @@ -11,6 +11,7 @@ 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.onResourceSuccess import io.github.wulkanowy.data.repositories.AttendanceSummaryRepository import io.github.wulkanowy.data.repositories.ConferenceRepository import io.github.wulkanowy.data.repositories.ExamRepository @@ -23,6 +24,7 @@ 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.data.resourceFlow import io.github.wulkanowy.domain.adminmessage.GetAppropriateAdminMessageUseCase import io.github.wulkanowy.domain.timetable.IsStudentHasLessonsOnWeekendUseCase import io.github.wulkanowy.ui.base.BasePresenter @@ -44,6 +46,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import okhttp3.HttpUrl.Companion.toHttpUrl import timber.log.Timber import java.time.Instant import java.time.LocalDate @@ -282,6 +285,22 @@ class DashboardPresenter @Inject constructor( url?.let { view?.openInternetBrowser(it) } } + fun onPanicButtonClicked() { + resourceFlow { studentRepository.getCurrentStudent() } + .onResourceError { errorHandler.dispatch(it) } + .onResourceSuccess { + val baseUrl = it.scrapperBaseUrl.toHttpUrl() + val urlToOpen = baseUrl.newBuilder() + .host("uonetplus${it.scrapperDomainSuffix}.${baseUrl.host}") + .addPathSegment(it.symbol) + .build() + .toString() + + view?.openInternetBrowser(urlToOpen) + } + .launch("panic_button") + } + private fun loadHorizontalGroup(student: Student, forceRefresh: Boolean) { flow { val selectedTiles = selectedDashboardTiles 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 7c74cae8..e5197570 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 @@ -59,6 +59,8 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter Unit = {} + var onPanicButtonClickListener: () -> Unit = {} + var onAdminMessageDismissClickListener: (AdminMessage) -> Unit = {} val items = mutableListOf() @@ -86,35 +88,46 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter AccountViewHolder( ItemDashboardAccountBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.HORIZONTAL_GROUP.ordinal -> HorizontalGroupViewHolder( ItemDashboardHorizontalGroupBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.GRADES.ordinal -> GradesViewHolder( ItemDashboardGradesBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.LESSONS.ordinal -> LessonsViewHolder( ItemDashboardLessonsBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.HOMEWORK.ordinal -> HomeworkViewHolder( ItemDashboardHomeworkBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.ANNOUNCEMENTS.ordinal -> AnnouncementsViewHolder( ItemDashboardAnnouncementsBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.EXAMS.ordinal -> ExamsViewHolder( ItemDashboardExamsBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.CONFERENCES.ordinal -> ConferencesViewHolder( ItemDashboardConferencesBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.ADMIN_MESSAGE.ordinal -> AdminMessageViewHolder( ItemDashboardAdminMessageBinding.inflate(inflater, parent, false), onAdminMessageDismissClickListener = onAdminMessageDismissClickListener, onAdminMessageClickListener = onAdminMessageClickListener, + onPanicButtonClickListener = onPanicButtonClickListener, ) + DashboardItem.Type.ADS.ordinal -> AdsViewHolder( ItemDashboardAdsBinding.inflate(inflater, parent, false) ) + else -> throw IllegalArgumentException() } } @@ -129,7 +142,11 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter bindAnnouncementsViewHolder(holder, position) is ExamsViewHolder -> bindExamsViewHolder(holder, position) is ConferencesViewHolder -> bindConferencesViewHolder(holder, position) - is AdminMessageViewHolder -> holder.bind((items[position] as DashboardItem.AdminMessages).adminMessage) + is AdminMessageViewHolder -> holder.bind( + (items[position] as DashboardItem.AdminMessages).adminMessage, + showPanicButton = true + ) + is AdsViewHolder -> bindAdsViewHolder(holder, position) } } @@ -240,12 +257,15 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { root.context.getThemeAttrColor(R.attr.colorOnSurface) } + attendancePercentage <= ATTENDANCE_SECOND_WARNING_THRESHOLD -> { root.context.getThemeAttrColor(R.attr.colorPrimary) } + attendancePercentage <= ATTENDANCE_FIRST_WARNING_THRESHOLD -> { root.context.getThemeAttrColor(R.attr.colorTimetableChange) } + else -> root.context.getThemeAttrColor(R.attr.colorOnSurface) } val attendanceString = if (attendancePercentage == null || attendancePercentage == .0) { @@ -336,24 +356,28 @@ 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 = currentDate updateLessonView(item, emptyList(), binding) @@ -461,6 +485,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { firstTitleAndValueTextColor = context.getThemeAttrColor(R.attr.colorOnSurface) @@ -468,6 +493,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { firstTitleAndValueTextColor = context.getThemeAttrColor(R.attr.colorOnSurface) 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 1e0f0bdb..94a7686d 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 @@ -13,9 +13,10 @@ class AdminMessageViewHolder( private val binding: ItemDashboardAdminMessageBinding, private val onAdminMessageDismissClickListener: (AdminMessage) -> Unit, private val onAdminMessageClickListener: (String?) -> Unit, + private val onPanicButtonClickListener: () -> Unit, ) : RecyclerView.ViewHolder(binding.root) { - fun bind(item: AdminMessage?) { + fun bind(item: AdminMessage?, showPanicButton: Boolean = false) { item ?: return val context = binding.root.context @@ -48,10 +49,14 @@ class AdminMessageViewHolder( dashboardAdminMessageItemClose.setOnClickListener { onAdminMessageDismissClickListener(item) } + dashboardPanicSection.root.isVisible = showPanicButton + dashboardPanicSection.dashboardPanicButton.setOnClickListener { + onPanicButtonClickListener() + } - root.setCardBackgroundColor(backgroundColor?.let { ColorStateList.valueOf(it) }) + dashboardAdminMessage.setCardBackgroundColor(backgroundColor?.let { ColorStateList.valueOf(it) }) item.destinationUrl?.let { url -> - root.setOnClickListener { onAdminMessageClickListener(url) } + dashboardAdminMessage.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 1c492069..2d1a4824 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,6 +238,7 @@ class LoginFormFragment : BaseFragment(R.layout.fragme binding = binding.loginFormMessage, onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, onAdminMessageClickListener = presenter::onAdminMessageSelected, + onPanicButtonClickListener = {}, ).bind(message) binding.loginFormMessage.root.isVisible = message != null } 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 4eb60265..586c395c 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 @@ -118,6 +118,7 @@ class LoginStudentSelectFragment : binding = binding.loginStudentSelectAdminMessage, onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, onAdminMessageClickListener = presenter::onAdminMessageSelected, + onPanicButtonClickListener = {}, ).bind(adminMessage) binding.loginStudentSelectAdminMessage.root.isVisible = adminMessage != null } 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 a813e7c0..824d8d22 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 @@ -188,6 +188,7 @@ class LoginSymbolFragment : binding = binding.loginSymbolAdminMessage, onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, onAdminMessageClickListener = presenter::onAdminMessageSelected, + onPanicButtonClickListener = {}, ).bind(adminMessage) binding.loginSymbolAdminMessage.root.isVisible = adminMessage != null } 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 407e1292..0d519b7e 100644 --- a/app/src/main/res/layout/item_dashboard_admin_message.xml +++ b/app/src/main/res/layout/item_dashboard_admin_message.xml @@ -1,87 +1,105 @@ - + android:orientation="vertical"> - + android:layout_height="wrap_content" + android:layout_marginHorizontal="12dp" + android:layout_marginVertical="6dp"> - - + - + - + - - - + + + + + + + + + + diff --git a/app/src/main/res/layout/item_dashboard_panic_button.xml b/app/src/main/res/layout/item_dashboard_panic_button.xml new file mode 100644 index 00000000..5f5936cf --- /dev/null +++ b/app/src/main/res/layout/item_dashboard_panic_button.xml @@ -0,0 +1,28 @@ + + + + + + + + + + From b622c09e564c8923a42a7e767403bdd6295eaab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 23 May 2024 07:55:02 +0200 Subject: [PATCH 13/13] Version 2.6.12 --- app/build.gradle | 4 ++-- app/src/main/play/release-notes/pl-PL/default.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 05fa295a..dda12f37 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 targetSdkVersion 34 - versionCode 171 - versionName "2.6.11" + versionCode 172 + versionName "2.6.12" 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 1bed6d14..16c7a0ce 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.6.11 +Wersja 2.6.12 -— naprawiliśmy obsługę wiadomości i ucznia plus u osób, u których działało na wcześniejszej wersji +— dodaliśmy przycisk otwierający stronę dziennika w awaryjnych sytuacjach (ostatnio cały czas jest awaryjna sytuacja) Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases