From ff2fd50f94c94c037eb277c2c7d3822f0c14b869 Mon Sep 17 00:00:00 2001 From: Michael Abadi Santoso Date: Sat, 6 May 2017 14:43:37 +0700 Subject: [PATCH 1/4] Add language --- ios/RNGeocoder/RNGeocoder.h | 5 +- ios/RNGeocoder/RNGeocoder.m | 155 +++++++++++++++++++----------------- 2 files changed, 84 insertions(+), 76 deletions(-) diff --git a/ios/RNGeocoder/RNGeocoder.h b/ios/RNGeocoder/RNGeocoder.h index 98ce8fa..560ff09 100644 --- a/ios/RNGeocoder/RNGeocoder.h +++ b/ios/RNGeocoder/RNGeocoder.h @@ -1,5 +1,5 @@ -#import -#import +#import "RCTBridgeModule.h" +#import "RCTConvert.h" #import @@ -9,4 +9,5 @@ @interface RNGeocoder : NSObject @property (nonatomic, strong) CLGeocoder *geocoder; +@property (nonatomic, strong) NSString *oldLanguage; @end diff --git a/ios/RNGeocoder/RNGeocoder.m b/ios/RNGeocoder/RNGeocoder.m index 20b80f4..bdea183 100644 --- a/ios/RNGeocoder/RNGeocoder.m +++ b/ios/RNGeocoder/RNGeocoder.m @@ -2,17 +2,17 @@ #import -#import +#import "RCTConvert.h" @implementation RCTConvert (CoreLocation) + (CLLocation *)CLLocation:(id)json { - json = [self NSDictionary:json]; - - double lat = [RCTConvert double:json[@"lat"]]; - double lng = [RCTConvert double:json[@"lng"]]; - return [[CLLocation alloc] initWithLatitude:lat longitude:lng]; + json = [self NSDictionary:json]; + + double lat = [RCTConvert double:json[@"lat"]]; + double lng = [RCTConvert double:json[@"lng"]]; + return [[CLLocation alloc] initWithLatitude:lat longitude:lng]; } @end @@ -26,27 +26,33 @@ @implementation RNGeocoder resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { - if (!self.geocoder) { - self.geocoder = [[CLGeocoder alloc] init]; - } - - if (self.geocoder.geocoding) { - [self.geocoder cancelGeocode]; - } - - [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { - - if (error) { - if (placemarks.count == 0) { - return reject(@"NOT_FOUND", @"geocodePosition failed", error); - } - - return reject(@"ERROR", @"geocodePosition failed", error); + [[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"]; + NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; + self.oldLanguage = language; + NSLog(@"OLD LANG %@", self.oldLanguage); + [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + if (!self.geocoder) { + self.geocoder = [[CLGeocoder alloc] init]; } - - resolve([self placemarksToDictionary:placemarks]); - - }]; + + if (self.geocoder.geocoding) { + [self.geocoder cancelGeocode]; + } + + [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { + + if (error) { + if (placemarks.count == 0) { + return reject(@"NOT_FOUND", @"geocodePosition failed", error); + } + + return reject(@"ERROR", @"geocodePosition failed", error); + } + + resolve([self placemarksToDictionary:placemarks]); + + }]; } RCT_EXPORT_METHOD(geocodeAddress:(NSString *)address @@ -56,67 +62,68 @@ @implementation RNGeocoder if (!self.geocoder) { self.geocoder = [[CLGeocoder alloc] init]; } - + if (self.geocoder.geocoding) { - [self.geocoder cancelGeocode]; + [self.geocoder cancelGeocode]; } - + [self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) { - + if (error) { if (placemarks.count == 0) { - return reject(@"NOT_FOUND", @"geocodeAddress failed", error); + return reject(@"NOT_FOUND", @"geocodeAddress failed", error); } - + return reject(@"ERROR", @"geocodeAddress failed", error); } - + resolve([self placemarksToDictionary:placemarks]); - }]; + }]; } - (NSArray *)placemarksToDictionary:(NSArray *)placemarks { - - NSMutableArray *results = [[NSMutableArray alloc] init]; - - for (int i = 0; i < placemarks.count; i++) { - CLPlacemark* placemark = [placemarks objectAtIndex:i]; - - NSString* name = [NSNull null]; - - if (![placemark.name isEqualToString:placemark.locality] && - ![placemark.name isEqualToString:placemark.thoroughfare] && - ![placemark.name isEqualToString:placemark.subThoroughfare]) - { - - name = placemark.name; + + NSMutableArray *results = [[NSMutableArray alloc] init]; + + for (int i = 0; i < placemarks.count; i++) { + CLPlacemark* placemark = [placemarks objectAtIndex:i]; + + NSString* name = [NSNull null]; + + if (![placemark.name isEqualToString:placemark.locality] && + ![placemark.name isEqualToString:placemark.thoroughfare] && + ![placemark.name isEqualToString:placemark.subThoroughfare]) + { + + name = placemark.name; + } + + NSArray *lines = placemark.addressDictionary[@"FormattedAddressLines"]; + + NSDictionary *result = @{ + @"feature": name, + @"position": @{ + @"lat": [NSNumber numberWithDouble:placemark.location.coordinate.latitude], + @"lng": [NSNumber numberWithDouble:placemark.location.coordinate.longitude], + }, + @"country": placemark.country ?: [NSNull null], + @"countryCode": placemark.ISOcountryCode ?: [NSNull null], + @"locality": placemark.locality ?: [NSNull null], + @"subLocality": placemark.subLocality ?: [NSNull null], + @"streetName": placemark.thoroughfare ?: [NSNull null], + @"streetNumber": placemark.subThoroughfare ?: [NSNull null], + @"postalCode": placemark.postalCode ?: [NSNull null], + @"adminArea": placemark.administrativeArea ?: [NSNull null], + @"subAdminArea": placemark.subAdministrativeArea ?: [NSNull null], + @"formattedAddress": [lines componentsJoinedByString:@", "] + }; + + [results addObject:result]; } - - NSArray *lines = placemark.addressDictionary[@"FormattedAddressLines"]; - - NSDictionary *result = @{ - @"feature": name, - @"position": @{ - @"lat": [NSNumber numberWithDouble:placemark.location.coordinate.latitude], - @"lng": [NSNumber numberWithDouble:placemark.location.coordinate.longitude], - }, - @"country": placemark.country ?: [NSNull null], - @"countryCode": placemark.ISOcountryCode ?: [NSNull null], - @"locality": placemark.locality ?: [NSNull null], - @"subLocality": placemark.subLocality ?: [NSNull null], - @"streetName": placemark.thoroughfare ?: [NSNull null], - @"streetNumber": placemark.subThoroughfare ?: [NSNull null], - @"postalCode": placemark.postalCode ?: [NSNull null], - @"adminArea": placemark.administrativeArea ?: [NSNull null], - @"subAdminArea": placemark.subAdministrativeArea ?: [NSNull null], - @"formattedAddress": [lines componentsJoinedByString:@", "] - }; - - [results addObject:result]; - } - - return results; - + [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:self.oldLanguage, nil] forKey:@"AppleLanguages"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + return results; + } @end From 42fd58c8664cadc9348ed2101b1a260b27fe031d Mon Sep 17 00:00:00 2001 From: Michael Abadi Santoso Date: Sat, 6 May 2017 15:32:57 +0700 Subject: [PATCH 2/4] Add language to set into device to get result with selected language (only ios for now) --- .../devfd/RNGeocoder/RNGeocoderModule.java | 33 +++++++ ios/RNGeocoder/RNGeocoder.m | 87 +++++++++++++++++-- js/geocoder.js | 22 +++++ 3 files changed, 135 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/com/devfd/RNGeocoder/RNGeocoderModule.java b/android/src/main/java/com/devfd/RNGeocoder/RNGeocoderModule.java index 642ebfb..1627979 100644 --- a/android/src/main/java/com/devfd/RNGeocoder/RNGeocoderModule.java +++ b/android/src/main/java/com/devfd/RNGeocoder/RNGeocoderModule.java @@ -30,6 +30,39 @@ public String getName() { return "RNGeocoder"; } + @ReactMethod + public void geocodeAddressWithLanguage(String addressName, String language, Promise promise) { + if (!geocoder.isPresent()) { + promise.reject("NOT_AVAILABLE", "Geocoder not available for this platform"); + return; + } + + try { + List
addresses = geocoder.getFromLocationName(addressName, 20); + promise.resolve(transform(addresses)); + } + + catch (IOException e) { + promise.reject(e); + } + } + + @ReactMethod + public void geocodePositionWithLanguage(ReadableMap position, String language, Promise promise) { + if (!geocoder.isPresent()) { + promise.reject("NOT_AVAILABLE", "Geocoder not available for this platform"); + return; + } + + try { + List
addresses = geocoder.getFromLocation(position.getDouble("lat"), position.getDouble("lng"), 20); + promise.resolve(transform(addresses)); + } + catch (IOException e) { + promise.reject(e); + } + } + @ReactMethod public void geocodeAddress(String addressName, Promise promise) { if (!geocoder.isPresent()) { diff --git a/ios/RNGeocoder/RNGeocoder.m b/ios/RNGeocoder/RNGeocoder.m index bdea183..1a0894e 100644 --- a/ios/RNGeocoder/RNGeocoder.m +++ b/ios/RNGeocoder/RNGeocoder.m @@ -22,16 +22,83 @@ @implementation RNGeocoder RCT_EXPORT_MODULE(); -RCT_EXPORT_METHOD(geocodePosition:(CLLocation *)location + +RCT_EXPORT_METHOD(geocodePositionWithLanguage:(CLLocation *)location + + language:(NSString *)language + + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + if (!self.geocoder) { + self.geocoder = [[CLGeocoder alloc] init]; + } + + if (self.geocoder.geocoding) { + [self.geocoder cancelGeocode]; + } + + [[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"]; + NSString * oldLang = [[NSLocale preferredLanguages] objectAtIndex:0]; + self.oldLanguage = oldLang; + [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:language, nil] forKey:@"AppleLanguages"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { + + if (error) { + if (placemarks.count == 0) { + return reject(@"NOT_FOUND", @"geocodePosition failed", error); + } + + return reject(@"ERROR", @"geocodePosition failed", error); + } + + resolve([self placemarksToDictionary:placemarks]); + + }]; +} + +RCT_EXPORT_METHOD(geocodeAddressWithLanguage:(NSString *)address + + language:(NSString *)language + resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { + if (!self.geocoder) { + self.geocoder = [[CLGeocoder alloc] init]; + } + + if (self.geocoder.geocoding) { + [self.geocoder cancelGeocode]; + } + [[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"]; - NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; - self.oldLanguage = language; - NSLog(@"OLD LANG %@", self.oldLanguage); - [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"]; + NSString * oldLang = [[NSLocale preferredLanguages] objectAtIndex:0]; + self.oldLanguage = oldLang; + [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:language, nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; + + [self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) { + + if (error) { + if (placemarks.count == 0) { + return reject(@"NOT_FOUND", @"geocodeAddress failed", error); + } + + return reject(@"ERROR", @"geocodeAddress failed", error); + } + + resolve([self placemarksToDictionary:placemarks]); + }]; +} + + +RCT_EXPORT_METHOD(geocodePosition:(CLLocation *)location + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ if (!self.geocoder) { self.geocoder = [[CLGeocoder alloc] init]; } @@ -120,8 +187,14 @@ - (NSArray *)placemarksToDictionary:(NSArray *)placemarks { [results addObject:result]; } - [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:self.oldLanguage, nil] forKey:@"AppleLanguages"]; - [[NSUserDefaults standardUserDefaults] synchronize]; + + + if(self.oldLanguage){ + [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:self.oldLanguage, nil] forKey:@"AppleLanguages"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + self.oldLanguage = nil; + } + return results; } diff --git a/js/geocoder.js b/js/geocoder.js index 3a4563e..3e702a1 100644 --- a/js/geocoder.js +++ b/js/geocoder.js @@ -10,6 +10,28 @@ export default { this.apiKey = key; }, + geocodePositionWithLanguage(position, language){ + if (!position || !position.lat || !position.lng) { + return Promise.reject(new Error("invalid position: {lat, lng} required")); + } + + return RNGeocoder.geocodePositionWithLanguage(position, language).catch(err => { + if (!this.apiKey) { throw err; } + return GoogleApi.geocodePosition(this.apiKey, position); + }); + } + + geocodeAddressWithLanguage(address, language) { + if (!address) { + return Promise.reject(new Error("address is null")); + } + + return RNGeocoder.geocodeAddressWithLanguage(address, language).catch(err => { + if (!this.apiKey) { throw err; } + return GoogleApi.geocodeAddress(this.apiKey, address); + }); + }, + geocodePosition(position) { if (!position || !position.lat || !position.lng) { return Promise.reject(new Error("invalid position: {lat, lng} required")); From 10663908a96e08f17cf4f156aba1f213d65beb3d Mon Sep 17 00:00:00 2001 From: Michael Abadi Santoso Date: Sat, 6 May 2017 15:42:03 +0700 Subject: [PATCH 3/4] put back React/ --- ios/RNGeocoder/RNGeocoder.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/RNGeocoder/RNGeocoder.h b/ios/RNGeocoder/RNGeocoder.h index 560ff09..116d2d8 100644 --- a/ios/RNGeocoder/RNGeocoder.h +++ b/ios/RNGeocoder/RNGeocoder.h @@ -1,5 +1,5 @@ -#import "RCTBridgeModule.h" -#import "RCTConvert.h" +#import +#import #import From cc2ef4fcdd3c3aca6e14b69009fd5011f8e1526f Mon Sep 17 00:00:00 2001 From: Michael Abadi Santoso Date: Sat, 6 May 2017 15:42:46 +0700 Subject: [PATCH 4/4] put back React/ --- ios/RNGeocoder/RNGeocoder.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ios/RNGeocoder/RNGeocoder.m b/ios/RNGeocoder/RNGeocoder.m index 1a0894e..9a3070a 100644 --- a/ios/RNGeocoder/RNGeocoder.m +++ b/ios/RNGeocoder/RNGeocoder.m @@ -1,8 +1,7 @@ #import "RNGeocoder.h" #import - -#import "RCTConvert.h" +#import @implementation RCTConvert (CoreLocation)