diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index 3aa09aff9a..4448aa785e 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -424,8 +424,9 @@ BOOL gIsFirstMyPositionMode = YES; - (void)openFullPlaceDescriptionWithHtml:(NSString *)htmlString { + [Statistics logEvent:kStatPlacePageDescriptionMore]; WebViewController * descriptionViewController = - [[WebViewController alloc] initWithHtml:htmlString baseUrl:nil title:L(@"place_description_title")]; + [[PlacePageDescriptionViewController alloc] initWithHtml:htmlString baseUrl:nil title:L(@"place_description_title")]; descriptionViewController.openInSafari = YES; [self.navigationController pushViewController:descriptionViewController animated:YES]; } diff --git a/iphone/Maps/Common/Statistics/StatisticsStrings.h b/iphone/Maps/Common/Statistics/StatisticsStrings.h index 10f3b77e56..a1c66efc0e 100644 --- a/iphone/Maps/Common/Statistics/StatisticsStrings.h +++ b/iphone/Maps/Common/Statistics/StatisticsStrings.h @@ -252,6 +252,9 @@ static NSString * const kStatOut = @"Out"; static NSString * const kStatPedestrian = @"Pedestrian"; static NSString * const kStatPhone = @"Phone"; static NSString * const kStatPlacePage = @"placepage"; +static NSString * const kStatPlacePageDescriptionLinkClick = @"Placepage_Description_Outbound_click"; +static NSString * const kStatPlacePageDescriptionMore = @"Placepage_Description_more"; +static NSString * const kStatPlacePageDescriptionViewAll = @"Placepage_Description_View_all"; static NSString * const kStatPlacePageBannerBlank = @"Placepage_Banner_blank"; static NSString * const kStatPlacePageBannerClick = @"Placepage_Banner_click"; static NSString * const kStatPlacePageBannerError = @"Placepage_Banner_error"; @@ -415,6 +418,7 @@ static NSString * const kStatUnknown = @"unknown"; static NSString * const kStatUnknownError = @"unknown_error"; static NSString * const kStatUpdate = @"update"; static NSString * const kStatUpdateAll = @"update_all"; +static NSString * const kStatUrl = @"url"; static NSString * const kStatUserInterrupted = @"user_interrupted"; static NSString * const kStatValue = @"Value"; static NSString * const kStatVehicle = @"Vehicle"; diff --git a/iphone/Maps/Common/WebViewController.h b/iphone/Maps/Common/WebViewController.h index 31b6dba50e..e517b44c87 100644 --- a/iphone/Maps/Common/WebViewController.h +++ b/iphone/Maps/Common/WebViewController.h @@ -10,6 +10,7 @@ NS_ASSUME_NONNULL_BEGIN @property (copy, nonatomic) NSString * _Nullable m_htmlText; // Set to YES if external browser should be launched @property (nonatomic) BOOL openInSafari; +@property (nonatomic, readonly) WKWebView * webView; - (instancetype _Nullable)initWithUrl:(NSURL *)url title:( NSString * _Nullable)title; - (instancetype _Nullable)initWithHtml:(NSString *)htmlText diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index c8c9a5bcad..ccb10b1124 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -379,6 +379,7 @@ 4719A647219CBD7F009F9AA7 /* IBillingPendingTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4719A646219CBD7F009F9AA7 /* IBillingPendingTransaction.swift */; }; 4719A64E21A30C3B009F9AA7 /* PaidRouteStatistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4719A64D21A30C3B009F9AA7 /* PaidRouteStatistics.swift */; }; 471BBD942130390F00EB17C9 /* TutorialViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 471BBD932130390F00EB17C9 /* TutorialViewController.swift */; }; + 4726254921C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4726254821C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift */; }; 472E3F472146BCD30020E412 /* SubscriptionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472E3F462146BCD30020E412 /* SubscriptionManager.swift */; }; 472E3F4A2146C4CD0020E412 /* MWMPurchaseManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 472E3F492146C4CD0020E412 /* MWMPurchaseManager.mm */; }; 472E3F4C2147D5700020E412 /* Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472E3F4B2147D5700020E412 /* Subscription.swift */; }; @@ -1411,6 +1412,7 @@ 4719A646219CBD7F009F9AA7 /* IBillingPendingTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBillingPendingTransaction.swift; sourceTree = ""; }; 4719A64D21A30C3B009F9AA7 /* PaidRouteStatistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaidRouteStatistics.swift; sourceTree = ""; }; 471BBD932130390F00EB17C9 /* TutorialViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TutorialViewController.swift; sourceTree = ""; }; + 4726254821C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlacePageDescriptionViewController.swift; sourceTree = ""; }; 472E3F462146BCD30020E412 /* SubscriptionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionManager.swift; sourceTree = ""; }; 472E3F482146C4CD0020E412 /* MWMPurchaseManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMPurchaseManager.h; sourceTree = ""; }; 472E3F492146C4CD0020E412 /* MWMPurchaseManager.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPurchaseManager.mm; sourceTree = ""; }; @@ -4019,6 +4021,7 @@ F6E2FC9B1E097B9F0083EBEC /* MWMPlacePageProtocol.h */, 4716EACA21B01C270029B886 /* MWMUGCReviewSource.h */, F6E2FC9C1E097B9F0083EBEC /* PlacePageLayout */, + 4726254821C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift */, ); path = PlacePage; sourceTree = ""; @@ -5264,6 +5267,7 @@ 34926BE71EA4C2A700DCF14C /* SearchBanners.swift in Sources */, 34D3B02A1E389D05004100F9 /* MWMEditorAdditionalNameTableViewCell.mm in Sources */, 33C558E3217F6CF100299E70 /* UploadActionCell.swift in Sources */, + 4726254921C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift in Sources */, 347E039A1FAC5F1D00426032 /* UIWindow+InputLanguage.swift in Sources */, 340475711E081A4600C92850 /* MWMSettings.mm in Sources */, 33046832219C57180041F3A8 /* CategorySettingsViewController.swift in Sources */, diff --git a/iphone/Maps/UI/PlacePage/PlacePageDescriptionViewController.swift b/iphone/Maps/UI/PlacePage/PlacePageDescriptionViewController.swift new file mode 100644 index 0000000000..165b814df9 --- /dev/null +++ b/iphone/Maps/UI/PlacePage/PlacePageDescriptionViewController.swift @@ -0,0 +1,37 @@ +final class PlacePageDescriptionViewController: WebViewController { + override func viewDidLoad() { + super.viewDidLoad() + webView.scrollView.delegate = self + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + if isOnBottom(webView.scrollView) { + Statistics.logEvent(kStatPlacePageDescriptionViewAll) + } + } + + override func webView(_ webView: WKWebView, + decidePolicyFor navigationAction: WKNavigationAction, + decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { + if navigationAction.navigationType == .linkActivated, let url = navigationAction.request.url { + Statistics.logEvent(kStatPlacePageDescriptionLinkClick, + withParameters: [kStatUrl : url.absoluteString]) + } + + super.webView(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler) + } + + private func isOnBottom(_ scrollView: UIScrollView) -> Bool { + let bottom = scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.bounds.height + return scrollView.contentOffset.y >= bottom + } +} + +extension PlacePageDescriptionViewController: UIScrollViewDelegate { + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + if isOnBottom(scrollView) { + Statistics.logEvent(kStatPlacePageDescriptionViewAll) + } + } +}