import 'package:workmanager/workmanager.dart'; import '../../models/home_config.dart'; import '../../services/geofence_worker.dart'; import 'services/geofence_runtime_store.dart'; /// Синхронизировать состояние фонового таска с настройками домов. /// Вызывать при старте приложения и при изменении настроек. /// /// Геофенс работает только для текущего активного дома. /// Если активный дом не готов -- таск снимается и runtime разоружается. Future syncGeofenceTask( List homes, { required HomeConfig? currentHome, }) async { final runtimeStore = GeofenceRuntimeStore(); final activeHome = currentHome; final needGeofence = activeHome != null && homes.any((home) => home.id == activeHome.id) && activeHome.geofenceReady; if (needGeofence) { await runtimeStore.armForHome(activeHome.id); try { await Workmanager().registerPeriodicTask( geofenceTaskUniqueName, geofenceTaskName, frequency: const Duration(minutes: 15), constraints: Constraints(networkType: NetworkType.connected), existingWorkPolicy: ExistingPeriodicWorkPolicy.replace, backoffPolicy: BackoffPolicy.linear, backoffPolicyDelay: const Duration(minutes: 1), ); } catch (_) { // В тестах и на неполной платформенной инициализации // не даём workmanager уронить остальное приложение. } } else { await runtimeStore.disarm(); try { await Workmanager().cancelByUniqueName(geofenceTaskUniqueName); } catch (_) { // См. комментарий выше: runtime должен синхронизироваться // даже если platform plugin недоступен. } } }