Files
fforte/lib/services/tracking_service.dart

83 lines
2.2 KiB
Dart

import 'dart:async';
import 'package:fforte/l10n/app_localizations.dart';
import 'package:fforte/services/notification_service.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:latlong2/latlong.dart';
class TrackingService {
static final TrackingService _instance = TrackingService._internal();
factory TrackingService() => _instance;
TrackingService._internal();
List<LatLng> pathList = [];
StreamSubscription<Position>? positionStream;
bool isTracking = false;
final _positionController = StreamController<Position>.broadcast();
Stream<Position> get positionStream$ => _positionController.stream;
Future<void> startTracking(BuildContext context) async {
if (isTracking) return;
await NotificationService().initNotification();
if (context.mounted) {
NotificationService().showNotification(
title: AppLocalizations.of(context)!.trackingRunningInBackground,
);
}
positionStream = Geolocator.getPositionStream(
locationSettings: AndroidSettings(
accuracy: LocationAccuracy.high,
distanceFilter: 0,
foregroundNotificationConfig: ForegroundNotificationConfig(
notificationTitle: context.mounted ? AppLocalizations.of(context)!.trackingRunningInBackground : "Tracking",
notificationText: "",
),
),
).listen((Position? position) {
if (position != null) {
pathList.add(LatLng(position.latitude, position.longitude));
_positionController.add(position);
}
});
positionStream!.onError((e) {
NotificationService().deleteNotification();
NotificationService().showNotification(title: "ERROR: $e");
});
isTracking = true;
}
void pauseTracking() {
positionStream?.pause();
isTracking = false;
}
void resumeTracking() {
positionStream?.resume();
isTracking = true;
}
void stopTracking() {
positionStream?.cancel();
NotificationService().deleteNotification();
isTracking = false;
}
void clearPath() {
pathList.clear();
}
String getPathAsString() {
return pathList.map((pos) => "${pos.latitude},${pos.longitude}").join(";");
}
void dispose() {
stopTracking();
_positionController.close();
}
}