50 lines
1.9 KiB
Dart
50 lines
1.9 KiB
Dart
import 'package:workmanager/workmanager.dart';
|
||
|
||
import '../../models/home_config.dart';
|
||
import '../../services/geofence_worker.dart';
|
||
import 'services/geofence_runtime_store.dart';
|
||
|
||
/// Синхронизировать состояние фонового таска с настройками домов.
|
||
/// Вызывать при старте приложения и при изменении настроек.
|
||
///
|
||
/// Геофенс работает только для текущего активного дома.
|
||
/// Если активный дом не готов -- таск снимается и runtime разоружается.
|
||
Future<void> syncGeofenceTask(
|
||
List<HomeConfig> 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 недоступен.
|
||
}
|
||
}
|
||
}
|