feat: Android client v0.4.0 — enroll, UI, ack/resolve, FCM

Kotlin Compose app: подключение по коду SAC, списки и карточки,
действия оператора, биометрия, push и deep links.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-10 15:34:34 +10:00
parent c9fb5eefec
commit 23eb1ba64c
35 changed files with 2147 additions and 34 deletions
+33 -33
View File
@@ -17,61 +17,61 @@
---
## v0.1 — Каркас приложения
## v0.1 — Каркас приложения
- [ ] Gradle-проект: Compose, Navigation, Hilt/Koin, Retrofit, DataStore
- [ ] Экран «Подключение»: URL SAC, код регистрации, логин/пароль
- [ ] `POST /api/v1/auth/login` + обмен кода на `device_id` (когда API готов на SAC)
- [ ] Secure storage: `base_url`, access/refresh token, `device_id`
- [ ] Экран «Ошибка / нет сети» и проверка `GET /health`
- [ ] Базовая навигация: Обзор, События, Проблемы, Хосты, Отчёты
- [ ] CI: сборка debug APK (опционально — позже)
- [x] Gradle-проект: Compose, Navigation, Retrofit, DataStore (DI-фреймворк не используем — `SacRepository` вручную)
- [x] Экран «Подключение»: URL SAC, код регистрации, логин/пароль
- [x] `POST /api/v1/mobile/enroll` + refresh-сессия
- [x] Secure storage: `base_url`, access/refresh token, `device_id`
- [x] Ошибки сети / `GET /health` перед enroll
- [x] Базовая навигация: Обзор, События, Проблемы, Хосты, Отчёты
- [ ] CI: сборка debug APK (локально — `gradlew assembleDebug`, JDK 17+)
**Зависимость:** SAC **≥ 0.9.0** — `mobile_devices_allowed`, enrollment codes, `POST /api/v1/mobile/enroll`
---
## v0.2 — Паритет с веб-UI (чтение)
## v0.2 — Паритет с веб-UI (чтение)
- [ ] Списки с пагинацией: events, problems, hosts, reports
- [ ] Карточки: event, problem (+ связанные events), host (+ inventory)
- [ ] Dashboard: виджеты как `GET /api/v1/dashboards/summary`
- [ ] Фильтры events/problems (severity, type, host) — упрощённый набор
- [ ] Pull-to-refresh; polling в foreground (SSE на Android в фоне не используем)
- [ ] Тёмная тема (как веб)
- [ ] Локализация: русский
- [x] Списки с пагинацией: events, problems, hosts, reports
- [x] Карточки: event, problem (+ связанные events), host (+ inventory)
- [x] Dashboard: виджеты как `GET /api/v1/dashboards/summary`
- [x] Фильтры events/problems (severity, status) — упрощённый набор
- [x] Pull-to-refresh
- [x] Тёмная тема (системная)
- [x] Локализация: русский
---
## v0.3 — Действия оператора
## v0.3 — Действия оператора
- [ ] `POST /api/v1/problems/{id}/ack` и `/resolve`
- [ ] Обновление списков после действия
- [ ] Скрытие admin-only API (403) — без попыток открыть settings/users
- [ ] Биометрический замок при возврате в приложение
- [ ] Certificate pinning / «Доверять сертификату» для внутреннего TLS
- [x] `POST /api/v1/problems/{id}/ack` и `/resolve`
- [x] Обновление карточки после действия
- [x] Admin-only API не вызываем из приложения
- [x] Биометрический замок при возврате в приложение
- [x] «Доверять сертификату» для внутреннего TLS (self-signed)
---
## v0.4 — Push (FCM)
## v0.4 — Push (FCM) ✅ (частично)
- [ ] Firebase-проект, `google-services.json` (не в git)
- [ ] Регистрация FCM-токена: `PUT /api/v1/mobile/devices/{id}/fcm`
- [ ] Обработка data message: `kind`, `id`, `severity`, deep link `seaca://…`
- [ ] Notification channels по severity (critical / high / default)
- [ ] Actions в уведомлении: «Подтвердить» / «Закрыть» problem (operator+)
- [ ] Тестовый push из веб-SAC («Проверить push на устройстве»)
- [x] Firebase-проект, `google-services.json` (не в git; пример `google-services.json.example`)
- [x] Регистрация FCM-токена: `PUT /api/v1/mobile/devices/me/fcm`
- [x] Обработка data message: `kind`, `id`, `severity`, deep link `seaca://…`
- [x] Notification channels по severity (critical / high / default)
- [ ] Actions в уведомлении: «Подтвердить» / «Закрыть» problem (operator+)**после первого APK**
- [x] Тестовый push из веб-SAC («Проверить push на устройстве») — на стороне SAC
**Зависимость:** SAC worker — `use_push_mobile` в notification policy, `push_notify.py`
**Зависимость:** SAC worker — `use_mobile` в notification policy, `SAC_FCM_*` в `sac-api.env` (включается после первого APK)
---
## v0.5 — Полировка
## v0.5 — Полировка (позже)
- [ ] Refresh token rotation (`POST /api/v1/auth/refresh`)
- [x] Refresh token rotation (`POST /api/v1/mobile/auth/refresh`) — уже в v0.1
- [ ] Виджет: число open problems
- [ ] Offline-кэш последних N событий (Room)
- [ ] Экран «Моё устройство»: имя, сервер, версия, «Выйти»
- [x] Экран «Моё устройство»: имя, сервер, версия, «Выйти» (базовый)
- [ ] Минимальная версия приложения (проверка с сервера)
---