From 7042a5d405a8aba7e23bae1c5555ccce9db051fc Mon Sep 17 00:00:00 2001 From: Aleksey Belouosv Date: Thu, 25 Apr 2019 18:21:44 +0300 Subject: [PATCH] [iOS] add 'guides_page' deeplink --- .../Catalog/CatalogWebViewController.swift | 21 +++++++---- iphone/Maps/Classes/DeepLinkHelper.mm | 3 ++ .../Maps/Core/Bookmarks/MWMBookmarksManager.h | 1 + .../Core/Bookmarks/MWMBookmarksManager.mm | 6 +++ map/mwm_url.cpp | 37 ++++++++++++++++++- map/mwm_url.hpp | 11 +++++- 6 files changed, 70 insertions(+), 9 deletions(-) diff --git a/iphone/Maps/Bookmarks/Catalog/CatalogWebViewController.swift b/iphone/Maps/Bookmarks/Catalog/CatalogWebViewController.swift index 233bcc37f6..04092140ff 100644 --- a/iphone/Maps/Bookmarks/Catalog/CatalogWebViewController.swift +++ b/iphone/Maps/Bookmarks/Catalog/CatalogWebViewController.swift @@ -31,8 +31,20 @@ final class CatalogWebViewController: WebViewController { var fwdButton: UIBarButtonItem! var toolbar = UIToolbar() - @objc init() { - super.init(url: MWMBookmarksManager.shared().catalogFrontendUrl()!, title: L("guides"))! + @objc init(_ deeplinkURL: URL? = nil) { + var catalogUrl = MWMBookmarksManager.shared().catalogFrontendUrl()! + if let dl = deeplinkURL { + if dl.path == "/guides_page" { + if let urlComponents = URLComponents(url: dl, resolvingAgainstBaseURL: false), + let path = urlComponents.queryItems?.reduce(into: "", { if $1.name == "url" { $0 = $1.value } }), + let url = MWMBookmarksManager.shared().catalogFrontendUrlPlusPath(path) { + catalogUrl = url + } + } else { + deeplink = deeplinkURL + } + } + super.init(url: catalogUrl, title: L("guides"))! backButton = UIBarButtonItem(image: #imageLiteral(resourceName: "ic_catalog_back"), style: .plain, target: self, action: #selector(onBack)) fwdButton = UIBarButtonItem(image: #imageLiteral(resourceName: "ic_catalog_fwd"), style: .plain, target: self, action: #selector(onFwd)) backButton.tintColor = .blackSecondaryText() @@ -45,11 +57,6 @@ final class CatalogWebViewController: WebViewController { fatalError("init(coder:) has not been implemented") } - @objc convenience init(_ deeplinkURL: URL) { - self.init() - deeplink = deeplinkURL - } - override func viewDidLoad() { super.viewDidLoad() diff --git a/iphone/Maps/Classes/DeepLinkHelper.mm b/iphone/Maps/Classes/DeepLinkHelper.mm index d13b69f9b5..6f16488529 100644 --- a/iphone/Maps/Classes/DeepLinkHelper.mm +++ b/iphone/Maps/Classes/DeepLinkHelper.mm @@ -91,6 +91,9 @@ static NSInteger const kSearchInViewportZoom = 16; case ParsedMapApi::ParsingResult::Catalogue: [MapViewController.sharedController openCatalogDeeplink:url animated:NO]; break; + case ParsedMapApi::ParsingResult::CataloguePath: + [MapViewController.sharedController openCatalogDeeplink:url animated:NO]; + break; case ParsedMapApi::ParsingResult::Lead: break; } } diff --git a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h index 4b31640415..cd156fd9a2 100644 --- a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h +++ b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h @@ -59,6 +59,7 @@ typedef void (^LoadTagsCompletionBlock)(NSArray * _Nullable tags, - (BOOL)areNotificationsEnabled; - (NSURL * _Nullable)catalogFrontendUrl; +- (NSURL * _Nullable)catalogFrontendUrlPlusPath:(NSString *)path; - (NSURL * _Nullable)sharingUrlForCategoryId:(MWMMarkGroupID)groupId; - (NSURL * _Nullable)webEditorUrlForCategoryId:(MWMMarkGroupID)groupId; - (void)downloadItemWithId:(NSString *)itemId diff --git a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm index afe4cdcaa0..36ca8fc28d 100644 --- a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm +++ b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm @@ -545,6 +545,12 @@ NSString * const CloudErrorToString(Cloud::SynchronizationResult result) return urlString ? [NSURL URLWithString:urlString] : nil; } +- (NSURL * _Nullable)catalogFrontendUrlPlusPath:(NSString *)path +{ + NSString * urlString = @(self.bm.GetCatalog().GetFrontendUrl().c_str()); + return urlString ? [NSURL URLWithString:[urlString stringByAppendingString:path]] : nil; +} + - (NSURL *)sharingUrlForCategoryId:(MWMMarkGroupID)groupId { NSString * urlString = @(self.bm.GetCategoryCatalogDeeplink(groupId).c_str()); diff --git a/map/mwm_url.cpp b/map/mwm_url.cpp index 7258f10537..e3a70f217d 100644 --- a/map/mwm_url.cpp +++ b/map/mwm_url.cpp @@ -102,6 +102,11 @@ char const * kId = "id"; char const * kName = "name"; } +namespace cataloguePath +{ + char const * kUrl = "url"; +} + namespace { enum class ApiURLType @@ -111,7 +116,8 @@ enum class ApiURLType Route, Search, Lead, - Catalogue + Catalogue, + CataloguePath }; std::array const kAvailableSchemes = {{"mapswithme", "mwm", "mapsme"}}; @@ -132,6 +138,8 @@ ApiURLType URLType(Uri const & uri) return ApiURLType::Lead; if (path == "catalogue") return ApiURLType::Catalogue; + if (path == "guides_page") + return ApiURLType::CataloguePath; return ApiURLType::Incorrect; } @@ -284,6 +292,23 @@ ParsedMapApi::ParsingResult ParsedMapApi::Parse(Uri const & uri) m_catalogItem = item; return ParsingResult::Catalogue; } + case ApiURLType::CataloguePath: + { + CatalogPathItem item; + auto const result = uri.ForEachKeyValue([&item, this](string const & key, string const & value) + { + return CatalogPathKeyValue(key, value, item); + }); + + if (!result) + return ParsingResult::Incorrect; + + if (item.m_url.empty()) + return ParsingResult::Incorrect; + + m_catalogPathItem = item; + return ParsingResult::CataloguePath; + } } UNREACHABLE(); } @@ -473,6 +498,16 @@ bool ParsedMapApi::CatalogKeyValue(string const & key, string const & value, Cat return true; } +bool ParsedMapApi::CatalogPathKeyValue(string const & key, string const & value, CatalogPathItem & item) const +{ + using namespace cataloguePath; + + if (key == kUrl) + item.m_url = value; + + return true; +} + void ParsedMapApi::Reset() { m_globalBackUrl.clear(); diff --git a/map/mwm_url.hpp b/map/mwm_url.hpp index 6718d715a0..02252dbec8 100644 --- a/map/mwm_url.hpp +++ b/map/mwm_url.hpp @@ -43,6 +43,11 @@ struct CatalogItem string m_name; }; +struct CatalogPathItem +{ + string m_url; +}; + namespace lead { struct CampaignDescription; @@ -61,7 +66,8 @@ public: Route, Search, Lead, - Catalogue + Catalogue, + CataloguePath }; ParsedMapApi() = default; @@ -83,6 +89,7 @@ public: string const & GetRoutingType() const { return m_routingType; } SearchRequest const & GetSearchRequest() const { return m_request; } CatalogItem const & GetCatalogItem() const { return m_catalogItem; } + CatalogPathItem const & GetCatalogPathItem() const { return m_catalogPathItem; } private: ParsingResult Parse(Uri const & uri); bool AddKeyValue(string const & key, string const & value, vector & points); @@ -90,11 +97,13 @@ private: bool SearchKeyValue(string const & key, string const & value, SearchRequest & request) const; bool LeadKeyValue(string const & key, string const & value, lead::CampaignDescription & description) const; bool CatalogKeyValue(string const & key, string const & value, CatalogItem & item) const; + bool CatalogPathKeyValue(string const & key, string const & value, CatalogPathItem & item) const; BookmarkManager * m_bmManager = nullptr; vector m_routePoints; SearchRequest m_request; CatalogItem m_catalogItem; + CatalogPathItem m_catalogPathItem; string m_globalBackUrl; string m_appTitle; string m_routingType;