# 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`). Для показа удобно включить на сервере демо-режим.