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