From 292f63c5120a998deed92f379dcdb447613bcf3a Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 9 Apr 2023 16:21:22 +0200 Subject: [PATCH] Implemented the handling of location coordinates from a given URL inside the "wmf_placesActivityWithURL:" function in the NSUserActivity+WMFExtensions extension. --- .../Code/NSUserActivity+WMFExtensions.m | 27 +++++++++ .../Code/NSUserActivity+WMFExtensionsTest.m | 60 +++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.m b/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.m index a1db457..9cd7460 100644 --- a/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.m +++ b/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.m @@ -62,15 +62,42 @@ __attribute__((annotate("returns_localized_nsstring"))) static inline NSString * + (instancetype)wmf_placesActivityWithURL:(NSURL *)activityURL { NSURLComponents *components = [NSURLComponents componentsWithURL:activityURL resolvingAgainstBaseURL:NO]; NSURL *articleURL = nil; + NSNumber *latitude = nil; + NSNumber *longitude = nil; + for (NSURLQueryItem *item in components.queryItems) { if ([item.name isEqualToString:@"WMFArticleURL"]) { NSString *articleURLString = item.value; articleURL = [NSURL URLWithString:articleURLString]; break; } + + if ([item.name isEqualToString:@"coordinates"]) { + NSArray *numbers = [item.value componentsSeparatedByString:@","]; + + if (numbers.count == 2) { + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + + latitude = [formatter numberFromString:numbers.firstObject]; + longitude = [formatter numberFromString:numbers.lastObject]; + } + + break; + } } + NSUserActivity *activity = [self wmf_pageActivityWithName:@"Places"]; activity.webpageURL = articleURL; + + if (latitude != nil && longitude != nil) { + NSMutableDictionary *userInfo = [activity.userInfo mutableCopy]; + + userInfo[@"WMFCoordinatesLatitude"] = latitude; + userInfo[@"WMFCoordinatesLongitude"] = longitude; + + activity.userInfo = [userInfo copy]; + } + return activity; } diff --git a/Apps/Wikipedia/WikipediaUnitTests/Code/NSUserActivity+WMFExtensionsTest.m b/Apps/Wikipedia/WikipediaUnitTests/Code/NSUserActivity+WMFExtensionsTest.m index f6ab751..cafb12c 100644 --- a/Apps/Wikipedia/WikipediaUnitTests/Code/NSUserActivity+WMFExtensionsTest.m +++ b/Apps/Wikipedia/WikipediaUnitTests/Code/NSUserActivity+WMFExtensionsTest.m @@ -44,6 +44,66 @@ XCTAssertEqual(activity.wmf_type, WMFUserActivityTypeSavedPages); } +- (void)testPlacesURL { + NSURL *url = [NSURL URLWithString:@"wikipedia://places"]; + NSUserActivity *activity = [NSUserActivity wmf_activityForWikipediaScheme:url]; + + XCTAssertEqual(activity.wmf_type, WMFUserActivityTypePlaces); + XCTAssertNil(activity.webpageURL); + XCTAssertNil(activity.userInfo[@"WMFCoordinatesLatitude"]); + XCTAssertNil(activity.userInfo[@"WMFCoordinatesLongitude"]); +} + +- (void)testPlacesURLWithCoordinates { + NSURL *url = [NSURL URLWithString:@"wikipedia://places?coordinates=52.370216,4.895168"]; + NSUserActivity *activity = [NSUserActivity wmf_activityForWikipediaScheme:url]; + + XCTAssertEqual(activity.wmf_type, WMFUserActivityTypePlaces); + XCTAssertNil(activity.webpageURL); + XCTAssert([activity.userInfo[@"WMFCoordinatesLatitude"] isEqualToNumber:@52.370216]); + XCTAssert([activity.userInfo[@"WMFCoordinatesLongitude"] isEqualToNumber:@4.895168]); +} + +- (void)testPlacesURLWithCoordinatesButNoLongitude { + NSURL *url = [NSURL URLWithString:@"wikipedia://places?coordinates=52.370216,"]; + NSUserActivity *activity = [NSUserActivity wmf_activityForWikipediaScheme:url]; + + XCTAssertEqual(activity.wmf_type, WMFUserActivityTypePlaces); + XCTAssertNil(activity.webpageURL); + XCTAssertNil(activity.userInfo[@"WMFCoordinatesLatitude"]); + XCTAssertNil(activity.userInfo[@"WMFCoordinatesLongitude"]); +} + +- (void)testPlacesURLWithCoordinatesButNoLatitude { + NSURL *url = [NSURL URLWithString:@"wikipedia://places?coordinates=,4.895168"]; + NSUserActivity *activity = [NSUserActivity wmf_activityForWikipediaScheme:url]; + + XCTAssertEqual(activity.wmf_type, WMFUserActivityTypePlaces); + XCTAssertNil(activity.webpageURL); + XCTAssertNil(activity.userInfo[@"WMFCoordinatesLatitude"]); + XCTAssertNil(activity.userInfo[@"WMFCoordinatesLongitude"]); +} + +- (void)testPlacesURLWithCoordinatesButNoCoordinates { + NSURL *url = [NSURL URLWithString:@"wikipedia://places?coordinates=,"]; + NSUserActivity *activity = [NSUserActivity wmf_activityForWikipediaScheme:url]; + + XCTAssertEqual(activity.wmf_type, WMFUserActivityTypePlaces); + XCTAssertNil(activity.webpageURL); + XCTAssertNil(activity.userInfo[@"WMFCoordinatesLatitude"]); + XCTAssertNil(activity.userInfo[@"WMFCoordinatesLongitude"]); +} + +- (void)testPlacesURLWithCoordinatesButEmpty { + NSURL *url = [NSURL URLWithString:@"wikipedia://places?coordinates="]; + NSUserActivity *activity = [NSUserActivity wmf_activityForWikipediaScheme:url]; + + XCTAssertEqual(activity.wmf_type, WMFUserActivityTypePlaces); + XCTAssertNil(activity.webpageURL); + XCTAssertNil(activity.userInfo[@"WMFCoordinatesLatitude"]); + XCTAssertNil(activity.userInfo[@"WMFCoordinatesLongitude"]); +} + - (void)testSearchURL { NSURL *url = [NSURL URLWithString:@"wikipedia://en.wikipedia.org/w/index.php?search=dog"]; NSUserActivity *activity = [NSUserActivity wmf_activityForWikipediaScheme:url];