import 'dart:io'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; import 'package:drift/drift.dart' hide DatabaseConnectionUser; import '../database/database.dart'; class ExportService { final AppDatabase _db; ExportService(this._db); Future exportRide(int rideId, {bool asGpx = true}) async { final telemetry = await (_db.select(_db.telemetrySamples) ..where((t) => t.rideId.equals(rideId)) ..orderBy([(t) => OrderingTerm(expression: t.timestamp)]) ).get(); if (telemetry.isEmpty) return; final dir = await getTemporaryDirectory(); if (asGpx) { final file = File('${dir.path}/ride_$rideId.gpx'); await file.writeAsString(_generateGpx(telemetry)); // ignore: deprecated_member_use await Share.shareXFiles([XFile(file.path)], text: 'My Motorcycle Ride (GPX)'); } else { final file = File('${dir.path}/ride_$rideId.csv'); await file.writeAsString(_generateCsv(telemetry)); // ignore: deprecated_member_use await Share.shareXFiles([XFile(file.path)], text: 'My Motorcycle Ride (CSV)'); } } String _generateGpx(List telemetry) { final sb = StringBuffer(); sb.writeln(''); sb.writeln(''); sb.writeln(' '); sb.writeln(' Ride'); sb.writeln(' '); for (final t in telemetry) { if (t.latitude != null && t.longitude != null) { sb.writeln(' '); if (t.altitude != null) { sb.writeln(' ${t.altitude}'); } sb.writeln(' '); // Extend GPX with our custom data sb.writeln(' '); sb.writeln(' ${t.speed ?? 0}'); sb.writeln(' ${t.heading ?? 0}'); sb.writeln(' ${t.leanAngle ?? 0}'); sb.writeln(' ${t.longitudinalG ?? 0}'); sb.writeln(' ${t.lateralG ?? 0}'); sb.writeln(' '); sb.writeln(' '); } } sb.writeln(' '); sb.writeln(' '); sb.writeln(''); return sb.toString(); } String _generateCsv(List telemetry) { final sb = StringBuffer(); sb.writeln('timestamp,latitude,longitude,altitude,speed,heading,gpsAccuracy,leanAngle,pitchAngle,accelX,accelY,accelZ,longitudinalG,lateralG'); for (final t in telemetry) { sb.writeln('${t.timestamp.toIso8601String()},${t.latitude ?? ""},${t.longitude ?? ""},${t.altitude ?? ""},${t.speed ?? ""},${t.heading ?? ""},${t.gpsAccuracy ?? ""},${t.leanAngle ?? ""},${t.pitchAngle ?? ""},${t.accelX ?? ""},${t.accelY ?? ""},${t.accelZ ?? ""},${t.longitudinalG ?? ""},${t.lateralG ?? ""}'); } return sb.toString(); } } final exportServiceProvider = Provider((ref) { final db = ref.watch(databaseProvider); return ExportService(db); });