import 'dart:async'; import 'package:fforte/l10n/app_localizations.dart'; import 'package:fforte/screens/addCam/services/geolocator_service.dart'; import 'package:fforte/screens/helper/add_entries_dialog_helper.dart'; import 'package:fforte/screens/helper/snack_bar_helper.dart'; import 'package:fforte/services/tracking_service.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map_location_marker/flutter_map_location_marker.dart'; import 'package:geolocator/geolocator.dart'; import 'package:latlong2/latlong.dart'; class Tracking extends StatefulWidget { final Position startPosition; final TextEditingController weg; const Tracking({super.key, required this.startPosition, required this.weg}); @override State createState() => _TrackingState(); } class _TrackingState extends State { final TrackingService _trackingService = TrackingService(); LocationMarkerPosition? locationMarkerPosition; MapController mapController = MapController(); StreamSubscription? _positionSubscription; @override void initState() { super.initState(); if (widget.weg.text.isNotEmpty) { for (var element in widget.weg.text.split(";")) { List posSplit = element.split(","); try { posSplit[0] = posSplit[0].substring(0, 9); posSplit[1] = posSplit[1].substring(0, 9); } on RangeError { // ignore because the double is short enough then } _trackingService.pathList.add( LatLng(double.parse(posSplit.first), double.parse(posSplit[1])), ); } } locationMarkerPosition = LocationMarkerPosition( latitude: widget.startPosition.latitude, longitude: widget.startPosition.longitude, accuracy: widget.startPosition.accuracy, ); _positionSubscription = _trackingService.positionStream$.listen((position) { setState(() { locationMarkerPosition = LocationMarkerPosition( latitude: position.latitude, longitude: position.longitude, accuracy: position.accuracy, ); }); }); GeolocatorService.alwaysPositionEnabled().then((value) { if (!value && mounted) { Navigator.of(context).pop(); SnackBarHelper.showSnackBarMessage(context, "${AppLocalizations.of(context)!.locationForbidden} ${AppLocalizations.of(context)!.oder} ${AppLocalizations.of(context)!.locationDisabled}"); } }); } @override void dispose() { _positionSubscription?.cancel(); widget.weg.text = _trackingService.getPathAsString(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(AppLocalizations.of(context)!.tracking), leading: IconButton( onPressed: () { Navigator.pop(context); }, icon: Icon(Icons.arrow_back_rounded) ), actions: [ if (!_trackingService.isTracking) IconButton( onPressed: () async { bool delete = await AddEntriesDialogHelper.deleteCompleteRouteDialog(context); if (delete) { setState(() { _trackingService.clearPath(); }); } }, icon: Icon( Icons.delete, color: Theme.of(context).colorScheme.errorContainer, ), ), if (_trackingService.isTracking) TextButton( onPressed: () { setState(() { _trackingService.stopTracking(); }); }, child: Text(AppLocalizations.of(context)!.trackingStop), ), TextButton( onPressed: () { setState(() { if (_trackingService.isTracking) { _trackingService.pauseTracking(); } else { if (_trackingService.positionStream == null) { _trackingService.startTracking(context); } else { _trackingService.resumeTracking(); } } }); }, child: _trackingService.isTracking ? Text(AppLocalizations.of(context)!.trackingPause) : Text(AppLocalizations.of(context)!.trackingStart), ), ], ), floatingActionButton: FloatingActionButton( onPressed: () { mapController.move( LatLng( locationMarkerPosition!.latitude, locationMarkerPosition!.longitude, ), 16, ); }, child: Icon(Icons.my_location), ), body: FlutterMap( mapController: mapController, options: MapOptions( interactionOptions: const InteractionOptions( flags: InteractiveFlag.pinchZoom | InteractiveFlag.drag | InteractiveFlag.pinchMove, ), initialCenter: LatLng( widget.startPosition.latitude, widget.startPosition.longitude, ), initialZoom: 16.0, ), children: [ TileLayer( urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'de.lupus.apps', ), if (_trackingService.pathList.isNotEmpty) PolylineLayer( polylines: [ Polyline( strokeWidth: 2.0, points: _trackingService.pathList, color: Colors.red ), ], ), CurrentLocationLayer(), ], ), ); } }