import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:map_launcher/src/directions_url.dart';
import 'package:map_launcher/src/marker_url.dart';
import 'package:map_launcher/src/models.dart';
import 'map_launcher_platform_interface.dart';
class MethodChannelMapLauncher extends MapLauncherPlatform {
@visibleForTesting
final methodChannel = const MethodChannel('map_launcher');
@override
Future<List<AvailableMap>> get installedMaps async {
final maps = await methodChannel.invokeMethod('getInstalledMaps');
return List<AvailableMap>.from(
maps.map((map) => AvailableMap.fromJson(map)),
);
}
@override
Future<void> showMarker({
required MapType mapType,
required Coords coords,
required String title,
String? description,
int zoom = 16,
Map<String, String>? extraParams,
}) async {
final String url = getMapMarkerUrl(
mapType: mapType,
coords: coords,
title: title,
description: description,
zoom: zoom,
extraParams: extraParams,
);
final Map<String, String?> args = {
'mapType': mapType.name,
'url': url,
'title': title,
'description': description,
'latitude': coords.latitude.toString(),
'longitude': coords.longitude.toString(),
};
await methodChannel.invokeMethod('showMarker', args);
}
@override
Future<void> showDirections({
required MapType mapType,
required Coords destination,
String? destinationTitle,
Coords? origin,
String? originTitle,
List<Waypoint>? waypoints,
DirectionsMode? directionsMode = DirectionsMode.driving,
Map<String, String>? extraParams,
}) async {
final url = getMapDirectionsUrl(
mapType: mapType,
destination: destination,
destinationTitle: destinationTitle,
origin: origin,
originTitle: originTitle,
waypoints: waypoints,
directionsMode: directionsMode,
extraParams: extraParams,
);
final Map<String, dynamic> args = {
'mapType': mapType.name,
'url': url,
'destinationTitle': destinationTitle,
'destinationLatitude': destination.latitude.toString(),
'destinationLongitude': destination.longitude.toString(),
'destinationtitle': destinationTitle,
'originLatitude': origin?.latitude.toString(),
'originLongitude': origin?.longitude.toString(),
'originTitle': originTitle,
'directionsMode': directionsMode?.name,
'waypoints': waypoints
?.map(
(waypoint) => {
'latitude': waypoint.latitude.toString(),
'longitude': waypoint.longitude.toString(),
'title': waypoint.title,
},
)
.toList(),
};
await methodChannel.invokeMethod('showDirections', args);
}
@override
Future<bool> isMapAvailable(MapType mapType) async {
final result = await methodChannel.invokeMethod('isMapAvailable', {
'mapType': mapType.name,
});
return result as bool;
}
}