From 508839f64c3960c6f72ac2d9c91da3d5f8254aee Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 9 Apr 2023 16:18:01 +0200 Subject: [PATCH 1/5] Removed some duplicated code found by the compiler that was not allowing to build tests. --- Apps/Wikipedia/Wikipedia/Code/WikimediaProject.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Apps/Wikipedia/Wikipedia/Code/WikimediaProject.swift b/Apps/Wikipedia/Wikipedia/Code/WikimediaProject.swift index 44b1920..6200fed 100644 --- a/Apps/Wikipedia/Wikipedia/Code/WikimediaProject.swift +++ b/Apps/Wikipedia/Wikipedia/Code/WikimediaProject.swift @@ -113,8 +113,6 @@ public enum WikimediaProject: Hashable { self = .wikibooks(languageCode, localizedLanguageName) } else if siteURLString.contains(Configuration.Domain.wiktionary) { self = .wiktionary(languageCode, localizedLanguageName) - } else if siteURLString.contains(Configuration.Domain.wiktionary) { - self = .wiktionary(languageCode, localizedLanguageName) } else if siteURLString.contains(Configuration.Domain.wikisource) { self = .wikisource(languageCode, localizedLanguageName) } else if siteURLString.contains(Configuration.Domain.wikinews) { -- 2.47.1 From 292f63c5120a998deed92f379dcdb447613bcf3a Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 9 Apr 2023 16:21:22 +0200 Subject: [PATCH 2/5] 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]; -- 2.47.1 From 7b5ad459afe0f2267bb7d0fd8624a73ebc077522 Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 9 Apr 2023 16:40:04 +0200 Subject: [PATCH 3/5] Implemented the "wmf_locationFromURL" property in the NSUserActivity+WMFExtensions extension. --- .../Wikipedia/Code/NSUserActivity+WMFExtensions.h | 3 +++ .../Wikipedia/Code/NSUserActivity+WMFExtensions.m | 12 ++++++++++++ .../Code/NSUserActivity+WMFExtensionsTest.m | 10 ++++++++++ 3 files changed, 25 insertions(+) diff --git a/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.h b/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.h index b50d03f..cdfc5ba 100644 --- a/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.h +++ b/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.h @@ -1,3 +1,4 @@ +@import CoreLocation; @import Foundation; NS_ASSUME_NONNULL_BEGIN @@ -46,6 +47,8 @@ extern NSString *const WMFNavigateToActivityNotification; - (nullable NSURL *)wmf_linkURL; +- (nullable CLLocation *)wmf_locationFromURL; + - (NSURL *)wmf_contentURL; + (NSURL *)wmf_baseURLForActivityOfType:(WMFUserActivityType)type; diff --git a/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.m b/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.m index 9cd7460..b547216 100644 --- a/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.m +++ b/Apps/Wikipedia/Wikipedia/Code/NSUserActivity+WMFExtensions.m @@ -291,6 +291,18 @@ __attribute__((annotate("returns_localized_nsstring"))) static inline NSString * } } +- (CLLocation *)wmf_locationFromURL { + NSNumber *latitude = self.userInfo[@"WMFCoordinatesLatitude"]; + NSNumber *longitude = self.userInfo[@"WMFCoordinatesLongitude"]; + + if (latitude != nil && longitude != nil) { + return [[CLLocation alloc] initWithLatitude:(CLLocationDegrees)[latitude floatValue] + longitude:(CLLocationDegrees)[longitude floatValue]]; + } else { + return nil; + } +} + - (NSURL *)wmf_contentURL { return self.userInfo[@"WMFURL"]; } diff --git a/Apps/Wikipedia/WikipediaUnitTests/Code/NSUserActivity+WMFExtensionsTest.m b/Apps/Wikipedia/WikipediaUnitTests/Code/NSUserActivity+WMFExtensionsTest.m index cafb12c..66ae5a0 100644 --- a/Apps/Wikipedia/WikipediaUnitTests/Code/NSUserActivity+WMFExtensionsTest.m +++ b/Apps/Wikipedia/WikipediaUnitTests/Code/NSUserActivity+WMFExtensionsTest.m @@ -64,6 +64,16 @@ XCTAssert([activity.userInfo[@"WMFCoordinatesLongitude"] isEqualToNumber:@4.895168]); } +- (void)testPlacesURLWithCoordinatesButNegatives { + NSURL *url = [NSURL URLWithString:@"wikipedia://places?coordinates=-34.603722,-58.381592"]; + NSUserActivity *activity = [NSUserActivity wmf_activityForWikipediaScheme:url]; + + XCTAssertEqual(activity.wmf_type, WMFUserActivityTypePlaces); + XCTAssertNil(activity.webpageURL); + XCTAssert([activity.userInfo[@"WMFCoordinatesLatitude"] isEqualToNumber:@-34.603722]); + XCTAssert([activity.userInfo[@"WMFCoordinatesLongitude"] isEqualToNumber:@-58.381592]); +} + - (void)testPlacesURLWithCoordinatesButNoLongitude { NSURL *url = [NSURL URLWithString:@"wikipedia://places?coordinates=52.370216,"]; NSUserActivity *activity = [NSUserActivity wmf_activityForWikipediaScheme:url]; -- 2.47.1 From f9c5cbb2c369784fa2939df3940e440e36268f38 Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 9 Apr 2023 18:02:38 +0200 Subject: [PATCH 4/5] Implemented the "centerMap(onLocation:)" function in the PlacesViewController view controller. --- Apps/Wikipedia/Wikipedia/Code/PlacesViewController.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Apps/Wikipedia/Wikipedia/Code/PlacesViewController.swift b/Apps/Wikipedia/Wikipedia/Code/PlacesViewController.swift index c095c27..ff0b01d 100644 --- a/Apps/Wikipedia/Wikipedia/Code/PlacesViewController.swift +++ b/Apps/Wikipedia/Wikipedia/Code/PlacesViewController.swift @@ -1126,6 +1126,10 @@ class PlacesViewController: ViewController, UISearchBarDelegate, ArticlePopoverV viewMode = .map } + @objc func centerMap(onLocation location: CLLocation) { + zoomAndPanMapView(toLocation: location) + } + func selectArticlePlace(_ articlePlace: ArticlePlace) { mapView.selectAnnotation(articlePlace, animated: articlePlace.identifier != previouslySelectedArticlePlaceIdentifier) previouslySelectedArticlePlaceIdentifier = articlePlace.identifier -- 2.47.1 From 327cb880c5c9786c4c19abf8d13d0ae5785e47a1 Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 9 Apr 2023 18:04:36 +0200 Subject: [PATCH 5/5] Added support for handling a location coming in from the a places user activity inside the "processUserActivity: animated: completion:" function in the WMFAppViewController view controller. --- Apps/Wikipedia/Wikipedia/Code/WMFAppViewController.m | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Apps/Wikipedia/Wikipedia/Code/WMFAppViewController.m b/Apps/Wikipedia/Wikipedia/Code/WMFAppViewController.m index 4fa02b8..3a5fb6c 100644 --- a/Apps/Wikipedia/Wikipedia/Code/WMFAppViewController.m +++ b/Apps/Wikipedia/Wikipedia/Code/WMFAppViewController.m @@ -1187,10 +1187,16 @@ NSString *const WMFLanguageVariantAlertsLibraryVersion = @"WMFLanguageVariantAle [self setSelectedIndex:WMFAppTabTypePlaces]; [self.navigationController popToRootViewControllerAnimated:animated]; NSURL *articleURL = activity.wmf_linkURL; - if (articleURL) { + CLLocation *locationFromURL = activity.wmf_locationFromURL; + if (articleURL || locationFromURL) { // For "View on a map" action to succeed, view mode has to be set to map. [[self placesViewController] updateViewModeToMap]; - [[self placesViewController] showArticleURL:articleURL]; + if (locationFromURL) { + [[self placesViewController] centerMapOnLocation:locationFromURL]; + } + else if (articleURL) { + [[self placesViewController] showArticleURL:articleURL]; + } } } break; case WMFUserActivityTypeContent: { -- 2.47.1