diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml index da8f8bd22..c3b7f1c92 100644 --- a/mobile/android/app/src/main/AndroidManifest.xml +++ b/mobile/android/app/src/main/AndroidManifest.xml @@ -70,5 +70,9 @@ + + + + \ No newline at end of file diff --git a/mobile/lib/modules/asset_viewer/ui/exif_bottom_sheet.dart b/mobile/lib/modules/asset_viewer/ui/exif_bottom_sheet.dart index 1a20ea35e..6bace49af 100644 --- a/mobile/lib/modules/asset_viewer/ui/exif_bottom_sheet.dart +++ b/mobile/lib/modules/asset_viewer/ui/exif_bottom_sheet.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; @@ -17,6 +19,33 @@ class ExifBottomSheet extends HookConsumerWidget { bool get showMap => asset.exifInfo?.latitude != null && asset.exifInfo?.longitude != null; + Future _createCoordinatesUri(double latitude, double longitude) async { + const zoomLevel = 5; + if (Platform.isAndroid) { + Uri uri = Uri( + scheme: 'geo', + host: '$latitude,$longitude', + queryParameters: {'z': '$zoomLevel', 'q': '$latitude,$longitude'}, + ); + if (await canLaunchUrl(uri)) { + return uri; + } + } else if (Platform.isIOS) { + var params = { + 'll': '$latitude,$longitude', + 'q': '$latitude, $longitude', + }; + Uri uri = Uri.https('maps.apple.com', '/', params); + if (!await canLaunchUrl(uri)) { + return uri; + } + } + return Uri.https( + 'www.google.com', + '/maps/place/$latitude,$longitude/@$latitude,$longitude,${zoomLevel}z', + ); + } + @override Widget build(BuildContext context, WidgetRef ref) { final exifInfo = asset.exifInfo; @@ -42,6 +71,18 @@ class ExifBottomSheet extends HookConsumerWidget { exifInfo?.longitude ?? 0, ), zoom: 16.0, + onTap: (tapPosition, latLong) async { + if (exifInfo != null && + exifInfo.latitude != null && + exifInfo.longitude != null) { + launchUrl( + await _createCoordinatesUri( + exifInfo.latitude!, + exifInfo.longitude!, + ), + ); + } + }, ), nonRotatedChildren: [ RichAttributionWidget(