Geofence
This commit is contained in:
@@ -6,6 +6,8 @@ import 'package:geolocator/geolocator.dart';
|
||||
import '../models/home_config.dart';
|
||||
import '../services/api_client.dart';
|
||||
import '../services/settings_service.dart';
|
||||
import '../services/geofence_worker.dart';
|
||||
import 'package:workmanager/workmanager.dart';
|
||||
|
||||
// ─── Сервисы ─────────────────────────────────────────────────
|
||||
|
||||
@@ -683,6 +685,37 @@ class AuthInfoNotifier extends Notifier<Map<String, dynamic>?> {
|
||||
bool get isAdmin => state?['is_admin'] == true;
|
||||
}
|
||||
|
||||
// ─── Геофенс: управление фоновым таском ─────────────────────
|
||||
|
||||
/// Синхронизировать состояние фонового таска с настройками домов.
|
||||
/// Вызывать при старте приложения и при изменении настроек.
|
||||
///
|
||||
/// Если хотя бы один дом имеет geofenceReady -- регистрируем
|
||||
/// периодический таск. Иначе -- отменяем.
|
||||
Future<void> syncGeofenceTask(List<HomeConfig> homes) async {
|
||||
final needGeofence = homes.any((h) => h.geofenceReady);
|
||||
|
||||
if (needGeofence) {
|
||||
// Сбрасываем флаг "сработал" -- при открытии приложения
|
||||
// считаем что пользователь снова дома (или осознанно включил)
|
||||
await resetGeofenceFired();
|
||||
|
||||
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),
|
||||
);
|
||||
} else {
|
||||
await Workmanager().cancelByUniqueName(geofenceTaskUniqueName);
|
||||
}
|
||||
}
|
||||
|
||||
// ─── Утилита: расчёт расстояния (Haversine) ──────────────────
|
||||
|
||||
double calculateDistanceKm(
|
||||
|
||||
Reference in New Issue
Block a user