mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 10:37:11 -04:00 
			
		
		
		
	chore(mobile): ios map launch, use OSM as map fallback, use dates as labels (#3772)
This commit is contained in:
		
							parent
							
								
									6243bce46c
								
							
						
					
					
						commit
						4ee8a30a5a
					
				| @ -16,16 +16,32 @@ class ExifBottomSheet extends HookConsumerWidget { | ||||
| 
 | ||||
|   const ExifBottomSheet({Key? key, required this.asset}) : super(key: key); | ||||
| 
 | ||||
|   bool get showMap => | ||||
|   bool get hasCoordinates => | ||||
|       asset.exifInfo?.latitude != null && asset.exifInfo?.longitude != null; | ||||
| 
 | ||||
|   Future<Uri> _createCoordinatesUri(double latitude, double longitude) async { | ||||
|     const zoomLevel = 5; | ||||
|   String get formattedDateTime { | ||||
|     final fileCreatedAt = asset.fileCreatedAt.toLocal(); | ||||
|     final date = DateFormat.yMMMEd().format(fileCreatedAt); | ||||
|     final time = DateFormat.jm().format(fileCreatedAt); | ||||
| 
 | ||||
|     return '$date • $time'; | ||||
|   } | ||||
| 
 | ||||
|   Future<Uri?> _createCoordinatesUri() async { | ||||
|     if (!hasCoordinates) { | ||||
|       return null; | ||||
|     } | ||||
| 
 | ||||
|     double latitude = asset.exifInfo!.latitude!; | ||||
|     double longitude = asset.exifInfo!.longitude!; | ||||
| 
 | ||||
|     const zoomLevel = 16; | ||||
| 
 | ||||
|     if (Platform.isAndroid) { | ||||
|       Uri uri = Uri( | ||||
|         scheme: 'geo', | ||||
|         host: '$latitude,$longitude', | ||||
|         queryParameters: {'z': '$zoomLevel', 'q': '$latitude,$longitude'}, | ||||
|         queryParameters: {'z': '$zoomLevel', 'q': formattedDateTime}, | ||||
|       ); | ||||
|       if (await canLaunchUrl(uri)) { | ||||
|         return uri; | ||||
| @ -33,16 +49,20 @@ class ExifBottomSheet extends HookConsumerWidget { | ||||
|     } else if (Platform.isIOS) { | ||||
|       var params = { | ||||
|         'll': '$latitude,$longitude', | ||||
|         'q': '$latitude, $longitude', | ||||
|         'q': formattedDateTime, | ||||
|         'z': '$zoomLevel', | ||||
|       }; | ||||
|       Uri uri = Uri.https('maps.apple.com', '/', params); | ||||
|       if (!await canLaunchUrl(uri)) { | ||||
|       if (await canLaunchUrl(uri)) { | ||||
|         return uri; | ||||
|       } | ||||
|     } | ||||
|     return Uri.https( | ||||
|       'www.google.com', | ||||
|       '/maps/place/$latitude,$longitude/@$latitude,$longitude,${zoomLevel}z', | ||||
| 
 | ||||
|     return Uri( | ||||
|       scheme: 'https', | ||||
|       host: 'openstreetmap.org', | ||||
|       queryParameters: {'mlat': '$latitude', 'mlon': '$longitude'}, | ||||
|       fragment: 'map=$zoomLevel/$latitude/$longitude', | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
| @ -72,16 +92,14 @@ class ExifBottomSheet extends HookConsumerWidget { | ||||
|                   ), | ||||
|                   zoom: 16.0, | ||||
|                   onTap: (tapPosition, latLong) async { | ||||
|                     if (exifInfo != null && | ||||
|                         exifInfo.latitude != null && | ||||
|                         exifInfo.longitude != null) { | ||||
|                       launchUrl( | ||||
|                         await _createCoordinatesUri( | ||||
|                           exifInfo.latitude!, | ||||
|                           exifInfo.longitude!, | ||||
|                         ), | ||||
|                       ); | ||||
|                     Uri? uri = await _createCoordinatesUri(); | ||||
| 
 | ||||
|                     if (uri == null) { | ||||
|                       return; | ||||
|                     } | ||||
| 
 | ||||
|                     debugPrint('Opening Map Uri: $uri'); | ||||
|                     launchUrl(uri); | ||||
|                   }, | ||||
|                 ), | ||||
|                 nonRotatedChildren: [ | ||||
| @ -151,7 +169,7 @@ class ExifBottomSheet extends HookConsumerWidget { | ||||
| 
 | ||||
|     buildLocation() { | ||||
|       // Guard no lat/lng | ||||
|       if (!showMap) { | ||||
|       if (!hasCoordinates) { | ||||
|         return Container(); | ||||
|       } | ||||
| 
 | ||||
| @ -207,12 +225,8 @@ class ExifBottomSheet extends HookConsumerWidget { | ||||
|     } | ||||
| 
 | ||||
|     buildDate() { | ||||
|       final fileCreatedAt = asset.fileCreatedAt.toLocal(); | ||||
|       final date = DateFormat.yMMMEd().format(fileCreatedAt); | ||||
|       final time = DateFormat.jm().format(fileCreatedAt); | ||||
| 
 | ||||
|       return Text( | ||||
|         '$date • $time', | ||||
|         formattedDateTime, | ||||
|         style: const TextStyle( | ||||
|           fontWeight: FontWeight.bold, | ||||
|           fontSize: 14, | ||||
| @ -306,7 +320,7 @@ class ExifBottomSheet extends HookConsumerWidget { | ||||
|                           crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                           children: [ | ||||
|                             Flexible( | ||||
|                               flex: showMap ? 5 : 0, | ||||
|                               flex: hasCoordinates ? 5 : 0, | ||||
|                               child: Padding( | ||||
|                                 padding: const EdgeInsets.only(right: 8.0), | ||||
|                                 child: buildLocation(), | ||||
| @ -336,7 +350,7 @@ class ExifBottomSheet extends HookConsumerWidget { | ||||
|                     if (asset.isRemote) DescriptionInput(asset: asset), | ||||
|                     const SizedBox(height: 8.0), | ||||
|                     buildLocation(), | ||||
|                     SizedBox(height: showMap ? 16.0 : 0.0), | ||||
|                     SizedBox(height: hasCoordinates ? 16.0 : 0.0), | ||||
|                     buildDetail(), | ||||
|                     const SizedBox(height: 50), | ||||
|                   ], | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user