48 lines
1.3 KiB
Dart
48 lines
1.3 KiB
Dart
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)} км';
|
|
}
|