Files
ignis_app/README.md
2026-05-16 15:50:40 +07:00

5.9 KiB
Raw Permalink Blame History

Ignis App

ignis_app — Android-first Flutter-клиент для локального backend-проекта ../ignis-core.

Что умеет сейчас

  • хранить несколько домов с разными URL и API-ключами;
  • переключать активный дом и проверять auth/me при выборе;
  • управлять группами света: on/off, яркость, температура, RGB, сцены;
  • ставить быстрый таймер на 4 часа;
  • создавать one-shot и cron-расписания;
  • смотреть stats summary и event log;
  • управлять гостевыми API-ключами;
  • показывать состояние geofence/permissions/notifications;
  • включать Android geofence для активного дома.

Архитектура

  • lib/app/ — bootstrap, build info, load/error helpers.
  • lib/features/* — feature-specific providers и domain logic.
  • lib/models/ — typed models для backend payloads.
  • lib/screens/ — экраны приложения.
  • lib/services/ — API client, settings, credentials storage.
  • android/app/src/main/kotlin/... — platform channel, geofence manager, worker, notifications.

Ключевые точки:

  • SettingsService хранит список домов в SharedPreferences.
  • API-ключи лежат отдельно в flutter_secure_storage.
  • CurrentHomeNotifier переключает активный дом и переинициализирует IgnisApi.
  • MainGate делает bootstrap и отправляет пользователя либо в HomesScreen, либо в RemoteScreen.
  • GeofenceAutomationService синхронизирует активный дом с Android-side geofence.

Технологии

  • Flutter / Dart
  • Material UI
  • Riverpod
  • Dio
  • SharedPreferences
  • flutter_secure_storage
  • Geolocator
  • Android Geofencing API
  • Android WorkManager

Запуск

flutter pub get
flutter run

Release APK

flutter build apk --release \
  --dart-define=IGNIS_BUILD_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \
  --dart-define=IGNIS_GIT_SHA="$(git rev-parse --short HEAD)"

Артефакт:

build/app/outputs/flutter-apk/app-release.apk

Без IGNIS_BUILD_DATE и IGNIS_GIT_SHA экран настроек покажет build info unavailable.

Настройка дома

  1. Добавить дом: имя, URL backend и API-ключ.
  2. При необходимости добавить координаты дома.
  3. Выбрать дом активным.
  4. Для geofence выдать Android-доступ к геолокации, включая background location.
  5. Для подтверждающих уведомлений выдать permission на notifications.

URL нормализуется в IgnisApi.normalizeBaseUrl():

  • если схема не указана, добавляется https://;
  • хвостовые / убираются.

Geofence и Android-side логика

Что есть:

  • platform channel ignis/geofence_automation;
  • нативная регистрация geofence;
  • восстановление geofence после BOOT_COMPLETED и MY_PACKAGE_REPLACED;
  • delayed exit worker через WorkManager;
  • локальные уведомления о фоновой обработке;
  • Android-side шифрование geofence config и активного API-ключа.

Что важно понимать:

  • это самая рискованная часть приложения;
  • поведение зависит от Android permissions, OEM battery policy и фоновых ограничений;
  • после изменений backend-контракта EXIT-поток нужно перепроверять вручную на устройстве.

Хранение данных

  • список домов, активный дом и тема — SharedPreferences;
  • API-ключи домов — flutter_secure_storage;
  • Android geofence config и активный API-ключ для worker'а дополнительно шифруются в native storage;
  • legacy apiKey внутри JSON списка домов мигрируется автоматически при чтении.

Проверки

flutter analyze
flutter test

На 2026-05-16 в test/ лежит 74 unit/widget-теста.

Покрыто:

  • IgnisApi и нормализация base URL;
  • сериализация HomeConfig;
  • миграция и хранение настроек;
  • bootstrap и auth/load-state;
  • provider mutations для групп, расписаний и API-ключей;
  • widget-потоки для GroupCard, форм домов/групп/расписаний и error/retry;
  • geofence sync на уровне Flutter-side provider/service логики;
  • permission/status providers для geofence и notifications.

Не покрыто как следует:

  • нативный Android geofence path;
  • MainActivity и platform-channel flow;
  • реальное фоновое поведение WorkManager на устройстве.

Ограничения

  • продукт по факту поддерживается как Android-first клиент;
  • iOS, web, desktop каталоги присутствуют как Flutter scaffold, но не считаются поддерживаемыми продуктными платформами;
  • apiProvider конфигурируется мутирующим init(), поэтому переключение домов требует аккуратности;
  • крупные экраны вроде SettingsScreen и SchedulesScreen всё ещё держат много UI-ответственности;
  • release signing в репозитории не настроен.