Files
tech-service-portal/android/README.md
T

62 lines
5.7 KiB
Markdown

# Android-приложение «Чек-листы»
Нативное приложение (Kotlin, Jetpack Compose) для техников и инженеров. Работает с API сервера (`/api/v1`),
описание — [../docs/API.md](../docs/API.md). Распространяется APK-файлом (Google Play не нужен).
## Возможности
- Вход по адресу сервера, логину и паролю; токены хранятся в шифрованном хранилище (Android Keystore),
access-токен обновляется автоматически.
- Список нарядов: фильтры (активные / мои / на проверку / завершённые), поиск, прогресс, срок, признак просрочки.
- Выполнение наряда: все типы ответов (статус, список, число с контролем нормы, текст), фото с камеры
(уменьшается до 1600 px), комментарии, «Взять в работу», «Сдать наряд».
- Проверка для инженеров: «Принять» / «Вернуть» с комментарием.
- **Работа без связи.** Наряды и чек-листы хранятся на устройстве (Room). Ответы, фото, комментарии и сдача
накапливаются и уходят на сервер сами при появлении сети: сначала фото (с `Idempotency-Key`, повтор не создаёт
дубликат), затем ответы пачкой через `POST /orders/{id}/sync`. Неотправленное помечено «⟳». Если на сервере уже
есть более свежий ответ — побеждает он, а приложение сообщит об этом.
- **Регламентное обслуживание.** Наряды этого типа показывают пункт «⏱ наработка машины» и пункты «🔧 узел — обслужено?» с остатком по каждому узлу. Инженеры, модераторы и админы
открывают экран «Состояние узлов» (значок гаечного ключа): узлы со статусами Требуется / Скоро / В норме, остаток и прогноз, внесение наработки и ручной сброс узла.
Отчёт хранится на устройстве и виден без связи; внесение наработки и сброс требуют связи.
- Уведомления о новых нарядах, проверках и возвратах: фоновая проверка раз в ~15 минут и при открытии
приложения (WorkManager). FCM-push можно добавить позже (нужен проект Firebase).
## Сборка
Нужны JDK 17 и Android SDK 34 (путь — в `local.properties`, `sdk.dir=...`).
```powershell
cd android
$env:JAVA_HOME = "<путь к JDK 17>"
.\gradlew.bat assembleDebug # app/build/outputs/apk/debug/app-debug.apk
```
### Подписанный релиз
1. Создайте ключ (один раз, **храните его и пароли в надёжном месте** — без него приложение нельзя будет обновлять поверх):
```
keytool -genkeypair -v -keystore keystore/release.jks -alias checklists -keyalg RSA -keysize 2048 -validity 36500
```
2. Создайте `android/keystore.properties` (в git не попадает):
```
storeFile=keystore/release.jks
storePassword=...
keyAlias=checklists
keyPassword=...
```
3. `.\gradlew.bat assembleRelease` → `app/build/outputs/apk/release/app-release.apk`.
## Установка на телефон
1. Соберите подписанный APK (см. выше). Чтобы он раздавался с сервера, замените файл в `release/` (и передеплойте) либо положите
его на сервер в `DATA_DIR/apk/` (без передеплоя; в Docker — том `appdata`, путь `apk/`).
Скачивание: `https://<домен>/app.apk` (также ссылка на экране входа веб-интерфейса). Либо просто передайте файл.
2. На телефоне откройте файл; Android попросит разрешить установку из этого источника.
3. При первом входе введите адрес сервера (`https://…`), логин и пароль, разрешите уведомления.
Обновление: соберите APK с большим `versionCode` (в `app/build.gradle.kts`), **подписанный тем же ключом**, и установите поверх.
Ключ `keystore/release.jks` и `keystore.properties` не хранятся в git — сделайте их резервную копию.
## Безопасность соединения
Релизная сборка работает **только по HTTPS** (`network_security_config.xml`, на экране входа адрес `http://` отклоняется). В отладочной сборке
открытый HTTP разрешён лишь для `10.0.2.2`, `localhost` и `127.0.0.1` (`app/src/debug/res/xml/`).
## Тест на эмуляторе
Адрес сервера на хосте с эмулятора — `http://10.0.2.2:8000` (только в debug-сборке: `assembleDebug`). Для показа удобно включить на сервере демо-режим.