Техническая карточка

Как это работает?

Заглянем под капот UnTime: из чего он собран, откуда берёт пары, как переводит их на разные языки и почему напоминает о них даже в метро без сети.

Android Kotlin Jetpack Compose SQLite offline-first
Аннотация

UnTime — нативное Android-приложение для студентов ТГУ. Оно забирает расписание из университетской системы, раскладывает по локальной базе и дальше живёт само: показывает пары, шлёт напоминания и обновляет виджет без интернета. Сервер UnTime нужен для новостей, объявлений, настроек и умного перевода расписания.

1

Зачем это всё

Веб-расписание отлично работает, пока есть сеть. В подвале корпуса, в метро или когда в общаге «лёг» Wi-Fi — уже нет. Поэтому у UnTime одно главное правило: данные должны лежать у вас в кармане. Отсюда растёт всё остальное — локальная база, ночное обновление и напоминания, которые не спрашивают интернет.

2

Из чего собрано

Приложение — нативное, под Android: никаких обёрток над сайтом. Четыре участника: само приложение, источник расписания (система университета), небольшой сервер UnTime и пара внешних сервисов.

Общая схема компонентов
Здесь будет схема: fig1-architecture.jpg
Рис. 1. Общая схема компонентов: приложение получает расписание из системы университета, а новости, настройки и переводы — с сервера UnTime.

Таблица 1. Технологический стек.

СлойЧто используемЗачем
ИнтерфейсKotlin, Jetpack Compose, Material 3Быстрый декларативный UI, темы и анимации
ДанныеSQLite, HTTP + JSON (gzip)Локальный кэш и лёгкий сетевой клиент
ФонWorkManagerНочное обновление расписания
НапоминанияAlarmManagerСрабатывают в нужную минуту, даже без сети
ВиджетыApp WidgetsБлижайшая пара прямо на рабочем столе
НовостиFirebase Cloud MessagingPush-уведомления об обновлениях
СерверPHP, MySQL, Yandex TranslateНовости, настройки, кэш и перевод расписания
ОформлениеOpen-MeteoПогода для эффектов в сезонных темах

Внутри приложение разложено по слоям: интерфейс ничего не знает о сети, а сеть — об интерфейсе. Между ними стоит локальная база.

Слои приложения
Здесь будет схема: fig5-layers.jpg
Рис. 2. Слои приложения: интерфейс, логика, данные и системные сервисы.

2.2.Новая система переводов

Начиная с версии 2.2, UnTime полностью перешёл на собственную систему локализации. Раньше иностранные студенты сталкивались с тем, что интерфейс переводился, а названия предметов, преподавателей и аудиторий оставались на русском. Теперь переводятся не только кнопки и меню, но и само расписание.

Интерфейс приложения использует стандартные системные ресурсы Android. Клиент поддерживает русский, английский, китайский, корейский, хинди и филиппинский языки. Язык определяется автоматически из настроек телефона или через встроенный переключатель. Даже типы пар (лекция, семинар, лабораторная) имеют свои иконки и цветовые маркеры, которые не зависят от языка — они привязаны к логическим кодам, приходящим с сервера.

Умный перевод расписания — это главное изменение 2.2. Теперь приложение не ходит напрямую в сырой университетский API за переведёнными данными. Вместо этого оно обращается к серверу UnTime, который работает как умный шлюз. Сервер забирает оригинальные данные на русском, кэширует их и автоматически переводит через облачный сервис машинного перевода. Чтобы не тратить ресурсы и время, сервер запоминает каждый переведённый фрагмент (название предмета, ФИО преподавателя, номер аудитории) в своей базе. При следующем запросе эти данные отдаются мгновенно.

Если автоматический перевод оказывается неточным (например, специфический термин или сложная фамилия), администратор может вручную исправить перевод на сервере. Клиент при следующем обновлении подтянет уже правильный вариант. Кроме того, приложение умеет отслеживать смену языка: если вы переключили язык в настройках, UnTime очистит локальный кэш старого языка и при наличии сети аккуратно перезагрузит расписание на новом.

Схема перевода расписания через сервер UnTime
Здесь будет схема: fig6-translation-flow.jpg
Рис. 3. Как работает умный перевод расписания через сервер UnTime.
3

Путь одной пары

Вы выбираете факультет и группу, приложение запрашивает расписание на окно дат, приводит его к единому виду и кладёт в SQLite. Дальше экран читает только базу. Поэтому открывается мгновенно, а пропавшая сеть ничего не ломает.

Жизненный цикл данных
Здесь будет схема: fig2-data-lifecycle.jpg
Рис. 4. Жизненный цикл данных: от запроса к источнику до экрана (принцип offline-first).

Обновление — раз в сутки около полуночи, плюс по запросу, если потянуть экран. Справочники (факультеты, группы) живут в кэше две недели. Если запрос не прошёл, приложение повторяет его с растущей паузой и не мучает сеть.

Политика синхронизации
Здесь будет схема: fig4-sync-timeline.jpg
Рис. 5. Политика синхронизации: ночное обновление, ручное обновление и срок жизни кэша.
4

Напоминания и виджет

Напоминания планируются прямо на телефоне по уже скачанному расписанию — отсюда и «без интернета». Тот же источник кормит сводку «что завтра» и виджет «Следующая пара», который сам перерисовывается к началу и концу занятий.

От расписания к уведомлениям и виджету
Здесь будет схема: fig3-notifications-widget.jpg
Рис. 6. От расписания к уведомлениям и виджету: планировщик работает без доступа к сети.

Есть нюанс: Android любит усыплять приложения ради батареи, поэтому UnTime подсказывает, где разрешить точные будильники и отключить агрессивную экономию.

6

Характеристики

Таблица 2. Основные параметры.

ПараметрЗначение
ПлатформаAndroid, нативное приложение
Размер APKоколо 4 МБ
ХранилищеSQLite на устройстве
Фоновое обновлениераз в сутки, при наличии сети
Кэш справочников14 дней
Поддерживаемые языкиRU, EN, ZH, KO, HI, FIL
Сетевой запростаймаут 15 с, 2 попытки, сжатие gzip
Напоминания и виджетработают офлайн
Рекламанет
7

Ограничения

Мы зависим от источника расписания: если университетская система недоступна или поменяла формат, свежие пары не подтянутся (но уже загруженные останутся). Push-новости опираются на Firebase и могут не приходить на устройствах без сервисов Google — на сайте они всё равно будут. Пока приложение есть только под Android.

8

Данные и приватность

Расписание и настройки хранятся только на устройстве. На наш сервер уходят анонимный идентификатор установки и выбранные группа с факультетом — так мы понимаем, сколько нас и какие факультеты нужнее. Имя, почту и телефон приложение не запрашивает.

9

Источники

  1. Jetpack Compose — Android Developers
  2. WorkManager — фоновая работа на Android
  3. Firebase Cloud Messaging
  4. Open-Meteo — открытый API прогноза погоды

Готов начать учиться удобнее?

Установка занимает меньше минуты.