Зачем это всё
Веб-расписание отлично работает, пока есть сеть. В подвале корпуса, в метро или когда в общаге «лёг» Wi-Fi — уже нет. Поэтому у UnTime одно главное правило: данные должны лежать у вас в кармане. Отсюда растёт всё остальное — локальная база, ночное обновление и напоминания, которые не спрашивают интернет.
Из чего собрано
Приложение — нативное, под Android: никаких обёрток над сайтом. Четыре участника: само приложение, источник расписания (система университета), небольшой сервер UnTime и пара внешних сервисов.
Таблица 1. Технологический стек.
| Слой | Что используем | Зачем |
|---|---|---|
| Интерфейс | Kotlin, Jetpack Compose, Material 3 | Быстрый декларативный UI, темы и анимации |
| Данные | SQLite, HTTP + JSON (gzip) | Локальный кэш и лёгкий сетевой клиент |
| Фон | WorkManager | Ночное обновление расписания |
| Напоминания | AlarmManager | Срабатывают в нужную минуту, даже без сети |
| Виджеты | App Widgets | Ближайшая пара прямо на рабочем столе |
| Новости | Firebase Cloud Messaging | Push-уведомления об обновлениях |
| Сервер | PHP, MySQL, Yandex Translate | Новости, настройки, кэш и перевод расписания |
| Оформление | Open-Meteo | Погода для эффектов в сезонных темах |
Внутри приложение разложено по слоям: интерфейс ничего не знает о сети, а сеть — об интерфейсе. Между ними стоит локальная база.
2.2.Новая система переводов
Начиная с версии 2.2, UnTime полностью перешёл на собственную систему локализации. Раньше иностранные студенты сталкивались с тем, что интерфейс переводился, а названия предметов, преподавателей и аудиторий оставались на русском. Теперь переводятся не только кнопки и меню, но и само расписание.
Интерфейс приложения использует стандартные системные ресурсы Android. Клиент поддерживает русский, английский, китайский, корейский, хинди и филиппинский языки. Язык определяется автоматически из настроек телефона или через встроенный переключатель. Даже типы пар (лекция, семинар, лабораторная) имеют свои иконки и цветовые маркеры, которые не зависят от языка — они привязаны к логическим кодам, приходящим с сервера.
Умный перевод расписания — это главное изменение 2.2. Теперь приложение не ходит напрямую в сырой университетский API за переведёнными данными. Вместо этого оно обращается к серверу UnTime, который работает как умный шлюз. Сервер забирает оригинальные данные на русском, кэширует их и автоматически переводит через облачный сервис машинного перевода. Чтобы не тратить ресурсы и время, сервер запоминает каждый переведённый фрагмент (название предмета, ФИО преподавателя, номер аудитории) в своей базе. При следующем запросе эти данные отдаются мгновенно.
Если автоматический перевод оказывается неточным (например, специфический термин или сложная фамилия), администратор может вручную исправить перевод на сервере. Клиент при следующем обновлении подтянет уже правильный вариант. Кроме того, приложение умеет отслеживать смену языка: если вы переключили язык в настройках, UnTime очистит локальный кэш старого языка и при наличии сети аккуратно перезагрузит расписание на новом.
Путь одной пары
Вы выбираете факультет и группу, приложение запрашивает расписание на окно дат, приводит его к единому виду и кладёт в SQLite. Дальше экран читает только базу. Поэтому открывается мгновенно, а пропавшая сеть ничего не ломает.
Обновление — раз в сутки около полуночи, плюс по запросу, если потянуть экран. Справочники (факультеты, группы) живут в кэше две недели. Если запрос не прошёл, приложение повторяет его с растущей паузой и не мучает сеть.
Напоминания и виджет
Напоминания планируются прямо на телефоне по уже скачанному расписанию — отсюда и «без интернета». Тот же источник кормит сводку «что завтра» и виджет «Следующая пара», который сам перерисовывается к началу и концу занятий.
Есть нюанс: Android любит усыплять приложения ради батареи, поэтому UnTime подсказывает, где разрешить точные будильники и отключить агрессивную экономию.
Характеристики
Таблица 2. Основные параметры.
| Параметр | Значение |
|---|---|
| Платформа | Android, нативное приложение |
| Размер APK | около 4 МБ |
| Хранилище | SQLite на устройстве |
| Фоновое обновление | раз в сутки, при наличии сети |
| Кэш справочников | 14 дней |
| Поддерживаемые языки | RU, EN, ZH, KO, HI, FIL |
| Сетевой запрос | таймаут 15 с, 2 попытки, сжатие gzip |
| Напоминания и виджет | работают офлайн |
| Реклама | нет |
Ограничения
Мы зависим от источника расписания: если университетская система недоступна или поменяла формат, свежие пары не подтянутся (но уже загруженные останутся). Push-новости опираются на Firebase и могут не приходить на устройствах без сервисов Google — на сайте они всё равно будут. Пока приложение есть только под Android.
Данные и приватность
Расписание и настройки хранятся только на устройстве. На наш сервер уходят анонимный идентификатор установки и выбранные группа с факультетом — так мы понимаем, сколько нас и какие факультеты нужнее. Имя, почту и телефон приложение не запрашивает.
Источники
- Jetpack Compose — Android Developers
- WorkManager — фоновая работа на Android
- Firebase Cloud Messaging
- Open-Meteo — открытый API прогноза погоды