Explorar o código

chore(mobile): ios map launch, use OSM as map fallback, use dates as labels (#3772)

Steffen Auer hai 1 ano
pai
achega
4ee8a30a5a
Modificáronse 1 ficheiros con 40 adicións e 26 borrados
  1. 40 26
      mobile/lib/modules/asset_viewer/ui/exif_bottom_sheet.dart

+ 40 - 26
mobile/lib/modules/asset_viewer/ui/exif_bottom_sheet.dart

@@ -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),
                   ],