diff --git a/lib/data/repositories/base_local_health_impl.dart b/lib/data/repositories/base_local_health_impl.dart index f4622fa..8153113 100644 --- a/lib/data/repositories/base_local_health_impl.dart +++ b/lib/data/repositories/base_local_health_impl.dart @@ -160,12 +160,17 @@ interface class BaseLocalHealthRepoImpl extends BaseLocalHealthRepository { preview.activityType == ActivityType.running) { return null; } + // The distance is in km, so we need to convert it to m + // We multiply by 100 and round it to 2 decimal places and then divide it back to kilometers + // This step is need as dart does not provide a way to round to decimal places + // After that we multiply it by 1000 to convert it to meters + double distance = (((preview.distance ?? 0) * 100).round() / 100) * 1000; success = await Health().writeWorkoutData( activityType: HealthWorkoutActivityType.values.firstWhere( (element) => element.name == preview.activityType?.name), start: startTime, end: endTime, - totalDistance: (preview.distance ?? 0).toInt() * 1000, + totalDistance: distance.toInt(), totalDistanceUnit: HealthDataUnit.METER); } catch (e) { log.info(e); diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index e8b9e66..9174819 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -50,6 +50,7 @@ "common_theme_dark": "Dunkler Modus", "common_about": "Über", "common_version": "Version", + "common_version_copied": "Version in die Zwischenablage kopiert", "common_error_version": "Fehler beim Laden der Version", "common_error": "Fehler {error}", "common_unknown": "Unbekannt", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index f6a76df..9c4ec29 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -52,6 +52,7 @@ "common_theme_dark": "Dark Mode", "common_about": "About", "common_version": "Version", + "common_version_copied": "Successfully copied version", "common_error_version": "Error loading version", "common_error": "Error {error}", "common_unknown": "Unknown", diff --git a/lib/presentation/profile/screen/widgets/about_section.dart b/lib/presentation/profile/screen/widgets/about_section.dart index 09e34b1..dd6f7e3 100644 --- a/lib/presentation/profile/screen/widgets/about_section.dart +++ b/lib/presentation/profile/screen/widgets/about_section.dart @@ -1,3 +1,6 @@ +import 'dart:io'; + +import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -240,6 +243,27 @@ class VersionInfoTile extends StatelessWidget { Widget build(BuildContext context) { final l10n = AppLocalizations.of(context)!; + Future copyVersionToClipboard() async { + final data = ClipboardData(text: packageInfo.version); + await Clipboard.setData(data); + if (!context.mounted) return; + + // Determine if we should show a snackbar based on platform + // Don't show on Android 12+ (API 32+) as it has its own clipboard notification + if (Platform.isAndroid) { + final deviceInfo = DeviceInfoPlugin(); + final androidInfo = await deviceInfo.androidInfo; + if (androidInfo.version.sdkInt >= 32) { + return; // Android 12+ has native clipboard notifications + } + } + + // Show snackbar on all other platforms and older Android versions + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(l10n.common_version_copied)), + ); + } + return InkWell( onTap: () { hiddenLogAccessNotifier.incrementClickCount(); @@ -249,6 +273,9 @@ class VersionInfoTile extends StatelessWidget { context.go('$profilePath/$profileLoggingPath'); } }, + onLongPress: () { + copyVersionToClipboard(); + }, child: Container( width: double.infinity, padding: const EdgeInsets.symmetric(vertical: 8.0),