From bed9ee8a932a636969fa0481310824aa7366a54a Mon Sep 17 00:00:00 2001 From: Adam D Date: Sun, 3 Mar 2013 22:30:49 +1030 Subject: [PATCH] 1.2 --- .theos/packages/ws.hbang.mapsopener-1.1 | 2 +- .theos/packages/ws.hbang.mapsopener-1.2 | 1 + .theos/packages/ws.hbang.mapsopener-1.2~beta | 1 + MapsOpener.plist | 2 +- Tweak.xm | 56 ++++++++++++++++++-- control | 2 +- 6 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 .theos/packages/ws.hbang.mapsopener-1.2 create mode 100644 .theos/packages/ws.hbang.mapsopener-1.2~beta diff --git a/.theos/packages/ws.hbang.mapsopener-1.1 b/.theos/packages/ws.hbang.mapsopener-1.1 index 13a5393..8b2e0e6 100644 --- a/.theos/packages/ws.hbang.mapsopener-1.1 +++ b/.theos/packages/ws.hbang.mapsopener-1.1 @@ -1 +1 @@ -1.1-1 \ No newline at end of file +1.1-2 \ No newline at end of file diff --git a/.theos/packages/ws.hbang.mapsopener-1.2 b/.theos/packages/ws.hbang.mapsopener-1.2 new file mode 100644 index 0000000..c004a8f --- /dev/null +++ b/.theos/packages/ws.hbang.mapsopener-1.2 @@ -0,0 +1 @@ +1.2-1 \ No newline at end of file diff --git a/.theos/packages/ws.hbang.mapsopener-1.2~beta b/.theos/packages/ws.hbang.mapsopener-1.2~beta new file mode 100644 index 0000000..54a1811 --- /dev/null +++ b/.theos/packages/ws.hbang.mapsopener-1.2~beta @@ -0,0 +1 @@ +1.2~beta-37 \ No newline at end of file diff --git a/MapsOpener.plist b/MapsOpener.plist index 10dc654..79c04a0 100644 --- a/MapsOpener.plist +++ b/MapsOpener.plist @@ -1 +1 @@ -{ Filter = { Bundles = ( "com.apple.springboard" ); }; } +{ Filter = { Bundles = ( "com.apple.MapKit", "com.apple.springboard" ); }; } diff --git a/Tweak.xm b/Tweak.xm index 4c084ee..7257537 100644 --- a/Tweak.xm +++ b/Tweak.xm @@ -1,17 +1,67 @@ /** * MapsOpener - open Google Maps links in the new app * - * By Ad@m + * By HASHBANG Productions * Licensed under the GPL license + * + * The comgooglemaps:// URL scheme is documented on Google Developers: + * */ #import "HBLibOpener.h" +#import +#import + +#define PERCENT_ENCODE(string) [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)(string), NULL, CFSTR(":/=,!$& '()*+;[]@#?"), kCFStringEncodingUTF8) autorelease] + +%group HBMOiOS6 +static NSString *HBMOMakeQuery(MKMapItem *mapItem) { + if (mapItem.isCurrentLocation) { + return @""; + } else { + NSDictionary *info = mapItem.placemark.addressDictionary; + + return [NSString stringWithFormat:@"%@%@%@%@%@", + PERCENT_ENCODE([info objectForKey:@"Street"] ? [[info objectForKey:@"Street"] stringByAppendingString:@" "] : @""), + PERCENT_ENCODE([info objectForKey:@"City"] ? [[info objectForKey:@"City"] stringByAppendingString:@" "] : @""), + PERCENT_ENCODE([info objectForKey:@"State"] ? [[info objectForKey:@"State"] stringByAppendingString:@" "] : @""), + PERCENT_ENCODE([info objectForKey:@"ZIP"] ? [[info objectForKey:@"ZIP"] stringByAppendingString:@" "] : @""), + PERCENT_ENCODE([info objectForKey:@"CountryCode"] ?: @"") + ]; + } +} + +%hook MKMapItem ++(NSURL *)urlForMapItems:(NSArray *)items options:(id)options { + if (items.count < 1) { + return %orig; + } else if (items.count == 1) { + return [NSURL URLWithString:[@"comgooglemaps://?q=" stringByAppendingString:HBMOMakeQuery([items objectAtIndex:0])]]; + } else { + return [NSURL URLWithString:[NSString stringWithFormat:@"comgooglemaps://?saddr=%@&daddr=%@", HBMOMakeQuery([items objectAtIndex:0]), HBMOMakeQuery([items objectAtIndex:1])]]; + } +} +%end +%end %ctor { + if (IS_IOS_OR_NEWER(iOS_6_0)) { + %init(HBMOiOS6); + } + + if (![[NSBundle mainBundle].bundleIdentifier isEqualToString:@"com.apple.springboard"]) { + return; + } + [[HBLibOpener sharedInstance] registerHandlerWithName:@"MapsOpener" block:^(NSURL *url) { - if (([url.scheme isEqualToString:@"maps"] || ([url.host hasPrefix:@"maps.google.co"] && [url.path isEqualToString:@"/maps"])) && [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"comgooglemaps://"]]) { - return [NSURL URLWithString:[@"comgooglemaps://search?" stringByAppendingString:[url.scheme isEqualToString:@"maps"] ? [[url.absoluteString stringByReplacingOccurrencesOfString:@"maps:address=" withString:@"maps:q="] stringByReplacingOccurrencesOfString:@"maps:" withString:@""] : url.query]]; + if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"googlemaps://"]]) { + return (id)nil; + } else if ([url.scheme isEqualToString:@"maps"]) { + return [NSURL URLWithString:[@"comgooglemaps://?" stringByAppendingString:[[url.absoluteString stringByReplacingOccurrencesOfString:@"maps:address=" withString:@"maps:q="] stringByReplacingOccurrencesOfString:@"maps:" withString:@""]]]; + } else if ([url.host hasPrefix:@"maps.google.co"] && [url.path isEqualToString:@"/maps"]) { + return [NSURL URLWithString:[@"comgooglemaps://?" stringByAppendingString:url.query]]; } + return (id)nil; }]; } diff --git a/control b/control index 4efbbb8..f99ab72 100644 --- a/control +++ b/control @@ -2,7 +2,7 @@ Package: ws.hbang.mapsopener Name: MapsOpener Pre-Depends: firmware (>= 5.1) Depends: mobilesubstrate, ws.hbang.libopener -Version: 1.1 +Version: 1.2 Architecture: iphoneos-arm Description: Open Google Maps links in the new App Store app Maintainer: HASHBANG Productions