diff --git a/android/src/main/java/com/aloisdeniel/geocoder/GeocoderPlugin.java b/android/src/main/java/com/aloisdeniel/geocoder/GeocoderPlugin.java index f7cf971..9e87151 100644 --- a/android/src/main/java/com/aloisdeniel/geocoder/GeocoderPlugin.java +++ b/android/src/main/java/com/aloisdeniel/geocoder/GeocoderPlugin.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.ArrayList; +import java.util.Locale; import java.util.Map; import java.util.HashMap; import java.io.IOException; @@ -31,11 +32,11 @@ class NotAvailableException extends Exception { */ public class GeocoderPlugin implements MethodCallHandler { - private Geocoder geocoder; + private Context context; public GeocoderPlugin(Context context) { - this.geocoder = new Geocoder(context); + this.context = context; } /** @@ -102,26 +103,27 @@ public void onMethodCall(MethodCall call, Result rawResult) { else if (call.method.equals("findAddressesFromCoordinates")) { float latitude = ((Number) call.argument("latitude")).floatValue(); float longitude = ((Number) call.argument("longitude")).floatValue(); - findAddressesFromCoordinates(latitude,longitude, result); + String language = ((String) call.argument("language")); + findAddressesFromCoordinates(latitude, longitude, language, result); } else { result.notImplemented(); } } - private void assertPresent() throws NotAvailableException { + private void assertPresent(Geocoder geocoder) throws NotAvailableException { if (!geocoder.isPresent()) { throw new NotAvailableException(); } } private void findAddressesFromQuery(final String address, final Result result) { - final GeocoderPlugin plugin = this; + final Geocoder geocoder = new Geocoder(context); new AsyncTask>() { @Override protected List
doInBackground(Void... params) { try { - plugin.assertPresent(); + plugin.assertPresent(geocoder); return geocoder.getFromLocationName(address, 20); } catch (IOException ex) { return null; @@ -143,13 +145,14 @@ protected void onPostExecute(List
addresses) { }.execute(); } - private void findAddressesFromCoordinates(final float latitude, final float longitude, final Result result) { + private void findAddressesFromCoordinates(final float latitude, final float longitude, final String language, final Result result) { final GeocoderPlugin plugin = this; + final Geocoder geocoder = language == null ? new Geocoder(context) : new Geocoder(context, new Locale(language)); new AsyncTask>() { @Override protected List
doInBackground(Void... params) { try { - plugin.assertPresent(); + plugin.assertPresent(geocoder); return geocoder.getFromLocation(latitude, longitude, 20); } catch (IOException ex) { return null; diff --git a/ios/Classes/GeocoderPlugin.m b/ios/Classes/GeocoderPlugin.m index 3106fe5..82cd084 100644 --- a/ios/Classes/GeocoderPlugin.m +++ b/ios/Classes/GeocoderPlugin.m @@ -27,14 +27,25 @@ - (void) handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result if ([@"findAddressesFromCoordinates" isEqualToString:call.method]) { NSNumber *longitude = call.arguments[@"longitude"]; NSNumber *latitude = call.arguments[@"latitude"]; + NSString *language = call.arguments[@"language"]; CLLocation * location = [[CLLocation alloc] initWithLatitude:latitude.doubleValue longitude:longitude.doubleValue]; [self initializeGeocoder]; - [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { - if (error) { - return result(error.flutterError); - } - result([self placemarksToDictionary:placemarks]); - }]; + if (language != (id)[NSNull null] && @available(iOS 11.0, *)) { + NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:language]; + [self.geocoder reverseGeocodeLocation:location preferredLocale:locale completionHandler:^(NSArray *placemarks, NSError *error) { + if (error) { + return result(error.flutterError); + } + result([self placemarksToDictionary:placemarks]); + }]; + } else { + [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { + if (error) { + return result(error.flutterError); + } + result([self placemarksToDictionary:placemarks]); + }]; + } } else if ([@"findAddressesFromQuery" isEqualToString:call.method]) { NSString *address = call.arguments[@"address"]; diff --git a/lib/geocoder.dart b/lib/geocoder.dart index 33a277f..eef98a6 100644 --- a/lib/geocoder.dart +++ b/lib/geocoder.dart @@ -6,5 +6,6 @@ export 'model.dart'; class Geocoder { static final Geocoding local = LocalGeocoding(); + static Geocoding withLanguage(String language) => LocalGeocoding(language: language); static Geocoding google(String apiKey, { String language }) => GoogleGeocoding(apiKey, language: language); } diff --git a/lib/services/local.dart b/lib/services/local.dart index 8d924ab..21dfdd2 100644 --- a/lib/services/local.dart +++ b/lib/services/local.dart @@ -7,10 +7,18 @@ import 'package:geocoder/services/base.dart'; /// Geocoding and reverse geocoding through built-lin local platform services. class LocalGeocoding implements Geocoding { + final String language; + + LocalGeocoding({ this.language }); + static const MethodChannel _channel = MethodChannel('github.com/aloisdeniel/geocoder'); Future> findAddressesFromCoordinates(Coordinates coordinates) async { - Iterable addresses = await _channel.invokeMethod('findAddressesFromCoordinates', coordinates.toMap()); + Iterable addresses = await _channel.invokeMethod('findAddressesFromCoordinates', { + "latitude": coordinates.latitude, + "longitude": coordinates.longitude, + "language": language, + }); return addresses.map((x) => Address.fromMap(x)).toList(); }