feat: harden geofence and distance diagnostics

This commit is contained in:
Artem Kokos
2026-05-01 09:13:23 +07:00
parent 872ddf9513
commit 91a494adf5
20 changed files with 1639 additions and 260 deletions

View File

@@ -0,0 +1,47 @@
import 'package:geolocator/geolocator.dart';
const double geofenceThresholdMeters = 500.0;
const Duration geofenceRetryCooldown = Duration(minutes: 30);
bool hasForegroundLocationAccess(LocationPermission permission) {
return permission == LocationPermission.whileInUse ||
permission == LocationPermission.always;
}
bool hasBackgroundLocationAccess(LocationPermission permission) {
return permission == LocationPermission.always;
}
Duration? geofenceRetryRemaining(DateTime? lastFailureAt, {DateTime? now}) {
if (lastFailureAt == null) return null;
final currentTime = now ?? DateTime.now();
final remaining = lastFailureAt
.add(geofenceRetryCooldown)
.difference(currentTime);
if (remaining <= Duration.zero) {
return null;
}
return remaining;
}
String formatGeofenceRetry(Duration remaining) {
if (remaining.inHours >= 1) {
final hours = remaining.inHours;
final minutes = remaining.inMinutes.remainder(60);
if (minutes == 0) return '$hours ч';
return '$hours ч $minutes мин';
}
final minutes = remaining.inMinutes;
if (minutes > 0) return '$minutes мин';
return '${remaining.inSeconds.clamp(1, 59)} сек';
}
String formatDistanceMeters(double meters) {
if (meters < 1000) {
return '${meters.round()} м';
}
return '${(meters / 1000).toStringAsFixed(1)} км';
}