52 lines
1.4 KiB
Text
52 lines
1.4 KiB
Text
import 'dart:convert';
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:aves/model/activity/activity_track.dart';
|
|
|
|
import 'fit_activity_parser.dart';
|
|
import 'gpx_activity_parser.dart';
|
|
import 'tcx_activity_parser.dart';
|
|
|
|
class ActivityFileParser {
|
|
static bool isSupportedFileName(String name) {
|
|
final lower = name.toLowerCase().trim();
|
|
|
|
return lower.endsWith('.fit') ||
|
|
lower.endsWith('.gpx') ||
|
|
lower.endsWith('.tcx');
|
|
}
|
|
|
|
static Future<ActivityTrack?> parse(
|
|
Uint8List bytes, {
|
|
required String fileName,
|
|
String? xml,
|
|
}) async {
|
|
final lower = fileName.toLowerCase().trim();
|
|
|
|
try {
|
|
if (lower.endsWith('.fit')) {
|
|
return FitActivityParser.parse(bytes, fileName: fileName);
|
|
}
|
|
|
|
if (lower.endsWith('.gpx')) {
|
|
final text = xml ?? utf8.decode(bytes, allowMalformed: true);
|
|
if (text.trim().isEmpty) return null;
|
|
|
|
return GpxActivityParser.parse(text, fileName: fileName);
|
|
}
|
|
|
|
if (lower.endsWith('.tcx')) {
|
|
final text = xml ?? utf8.decode(bytes, allowMalformed: true);
|
|
if (text.trim().isEmpty) return null;
|
|
|
|
return TcxActivityParser.parse(text, fileName: fileName);
|
|
}
|
|
|
|
return null;
|
|
} catch (e, st) {
|
|
// TODO: sostituire con il logger di Aves, se disponibile.
|
|
// debugPrint('Failed to parse activity file "$fileName": $e\n$st');
|
|
return null;
|
|
}
|
|
}
|
|
}
|