diff --git a/iphone/Maps/Common/Statistics/StatisticsStrings.h b/iphone/Maps/Common/Statistics/StatisticsStrings.h index 40149835d8..eaebf8fb93 100644 --- a/iphone/Maps/Common/Statistics/StatisticsStrings.h +++ b/iphone/Maps/Common/Statistics/StatisticsStrings.h @@ -27,6 +27,7 @@ static NSString * const kStatApplication = @"Application"; static NSString * const kStatApplicationColdStartupInfo = @"Application_ColdStartup_info"; static NSString * const kStatApply = @"Apply"; static NSString * const kStatAsk = @"Ask"; +static NSString * const kStatAttractions = @"Attractions"; static NSString * const kStatAuthorization = @"Authorization"; static NSString * const kStatAutoDownload = @"Auto download"; static NSString * const kStatAutoZoom = @"Autozoom"; @@ -76,6 +77,9 @@ static NSString * const kStatDeleteWithChanges = @"delete_with_changes"; static NSString * const kStatDestination = @"Destination"; static NSString * const kStatDeviceInfo = @"Device info"; static NSString * const kStatDeviceType = @"Device type"; +static NSString * const kStatDiscoveryButtonItemClick = @"DiscoveryButton_Item_Click"; +static NSString * const kStatDiscoveryButtonItemShow = @"DiscoveryButton_Item_Show"; +static NSString * const kStatDiscoveryButtonOpen = @"DiscoveryButton_Open"; static NSString * const kStatDownload = @"download"; static NSString * const kStatDownloadGroup = @"download_group"; static NSString * const kStatDownloadMap = @"Download map"; @@ -98,6 +102,7 @@ static NSString * const kStatDownloaderOnStartScreenError = @"Downloader_OnStart static NSString * const kStatDownloaderOnStartScreenManualDownload = @"Downloader_OnStartScreen_manual_download"; static NSString * const kStatDownloaderOnStartScreenSelectLater = @"Downloader_OnStartScreen_select_later"; static NSString * const kStatDownloaderOnStartScreenShow = @"Downloader_OnStartScreen_show"; +static NSString * const kStatEatAndDrink = @"Eat and drink"; static NSString * const kStatEdit = @"Edit"; static NSString * const kStatEditTime = @"Edit time"; static NSString * const kStatEditorAddCancel = @"Editor_Add_cancel"; @@ -151,6 +156,8 @@ static NSString * const kStatKML = @"KML"; static NSString * const kStatKilometers = @"Kilometers"; static NSString * const kStatLandscape = @"Landscape"; static NSString * const kStatLanguage = @"Language"; +static NSString * const kStatLocals = @"Locals"; +static NSString * const kStatLocalsProvider = @"locals.maps.me"; static NSString * const kStatLocation = @"Location"; static NSString * const kStatLogout = @"Logout"; static NSString * const kStatMap = @"map"; @@ -177,6 +184,7 @@ static NSString * const kStatNever = @"Never"; static NSString * const kStatNext = @"Next"; static NSString * const kStatNightMode = @"NightMode"; static NSString * const kStatNo = @"No"; +static NSString * const kStatNone = @"none"; static NSString * const kStatNoConnection = @"no_connection"; static NSString * const kStatNoSpace = @"no_space"; static NSString * const kStatOSM = @"OSM"; @@ -220,6 +228,7 @@ static NSString * const kStatPlacepageSponsoredShow = @"Placepage_SponsoredGalle static NSString * const kStatPlacepageTaxiShow = @"Placepage_Taxi_show"; static NSString * const kStatPointToPoint = @"Point to point"; static NSString * const kStatPortrait = @"Portrait"; +static NSString * const kStatPosition = @"position"; static NSString * const kStatPriceCategory = @"price_category"; static NSString * const kStatProblem = @"Problem"; static NSString * const kStatProfile = @"Profile"; @@ -300,6 +309,7 @@ static NSString * const kStatTable = @"Table"; static NSString * const kStatTags = @"tags"; static NSString * const kStatTaxi = @"Taxi"; static NSString * const kStatThor = @"Thor"; +static NSString * const kStatThingsToDo = @"Things to do"; static NSString * const kStatToLocation = @"to_location"; static NSString * const kStatToMyPosition = @"To my position"; static NSString * const kStatToggleBookmark = @"Toggle bookmark"; diff --git a/iphone/Maps/UI/BottomMenu/MWMBottomMenuViewController.mm b/iphone/Maps/UI/BottomMenu/MWMBottomMenuViewController.mm index 2955826275..fa0e04e10b 100644 --- a/iphone/Maps/UI/BottomMenu/MWMBottomMenuViewController.mm +++ b/iphone/Maps/UI/BottomMenu/MWMBottomMenuViewController.mm @@ -7,12 +7,16 @@ #import "MWMCommon.h" #import "MWMDiscoveryController.h" #import "MWMMapViewControlsManager.h" +#import "MWMNetworkPolicy.h" #import "MapViewController.h" #import "MapsAppDelegate.h" +#import "Statistics.h" #import "SwiftBridge.h" #include "Framework.h" +#include "platform/platform.hpp" + extern NSString * const kAlohalyticsTapEventKey; extern NSString * const kSearchStateKey; @@ -286,8 +290,41 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) { - (IBAction)discoveryTap { - // Log event + auto mode = ^MWMDiscoveryMode (BOOL canUseNetwork) { + return canUseNetwork ? MWMDiscoveryModeOnline : MWMDiscoveryModeOffline; + }; + + auto const connectionType = GetPlatform().ConnectionStatus(); + auto connectionKey = ^NSString * (Platform::EConnectionType type) + { + switch (type) + { + case Platform::EConnectionType::CONNECTION_WWAN: + return kStatMobile; + case Platform::EConnectionType::CONNECTION_WIFI: + return kStatWifi; + case Platform::EConnectionType::CONNECTION_NONE: + return kStatNone; + } + } (connectionType); + + [Statistics logEvent:kStatDiscoveryButtonOpen + withParameters:@{kStatConnection : connectionKey}]; + auto discovery = [MWMDiscoveryController instance]; + using namespace network_policy; + auto const canUseNetwork = CanUseNetwork(); + if (!canUseNetwork && connectionType == Platform::EConnectionType::CONNECTION_WWAN && + GetStage() == platform::NetworkPolicy::Stage::Session) + { + [[MWMAlertViewController activeAlertController] presentMobileInternetAlertWithBlock:^{ + discovery.mode = mode(CanUseNetwork()); + [self.controller.navigationController pushViewController:discovery animated:YES]; + }]; + return; + } + + discovery.mode = mode(canUseNetwork); [self.controller.navigationController pushViewController:discovery animated:YES]; } diff --git a/iphone/Maps/UI/Discovery/DiscoveryCollectionHolderCell.swift b/iphone/Maps/UI/Discovery/DiscoveryCollectionHolderCell.swift index 87b264db60..4c471b19fc 100644 --- a/iphone/Maps/UI/Discovery/DiscoveryCollectionHolderCell.swift +++ b/iphone/Maps/UI/Discovery/DiscoveryCollectionHolderCell.swift @@ -34,6 +34,7 @@ final class DiscoveryCollectionHolderCell: UITableViewCell { @objc func configSearchLayout() { let size = Size.search; cellHeight.constant = size.height; + setNeedsLayout() collectionView.collectionViewLayout = DiscoveryItemLayout(size: Size.search) collectionView.register(cellClass: DiscoverySearchCell.self) } @@ -41,6 +42,7 @@ final class DiscoveryCollectionHolderCell: UITableViewCell { @objc func configViatorLayout() { let size = Size.viator; cellHeight.constant = size.height; + setNeedsLayout() collectionView.collectionViewLayout = DiscoveryItemLayout(size: Size.viator) collectionView.register(cellClass: ViatorElement.self) } diff --git a/iphone/Maps/UI/Discovery/DiscoveryOnlineTemplateCell.swift b/iphone/Maps/UI/Discovery/DiscoveryOnlineTemplateCell.swift index 5376eb4913..2d6483cc02 100644 --- a/iphone/Maps/UI/Discovery/DiscoveryOnlineTemplateCell.swift +++ b/iphone/Maps/UI/Discovery/DiscoveryOnlineTemplateCell.swift @@ -32,11 +32,11 @@ final class DiscoveryOnlineTemplateCell: MWMTableViewCell { switch type { case .viator: - title.text = L("Discover_button_viator_loading_title") - subtitle.text = L("Discover_button_viator_loading_subtitle") + title.text = L("preloader_viator_title") + subtitle.text = L("preloader_viator_message") case .locals: - title.text = L("Discover_button_viator_loading_title") - subtitle.text = L("Discover_button_viator_loading_subtitle") + title.text = L("preloader_locals_title") + subtitle.text = L("preloader_locals_message") } spinner.isHidden = !needSpinner diff --git a/iphone/Maps/UI/Discovery/DiscoverySpinnerCell.xib b/iphone/Maps/UI/Discovery/DiscoverySpinnerCell.xib index 6af67c0c84..3406edca34 100644 --- a/iphone/Maps/UI/Discovery/DiscoverySpinnerCell.xib +++ b/iphone/Maps/UI/Discovery/DiscoverySpinnerCell.xib @@ -31,7 +31,7 @@ - + diff --git a/iphone/Maps/UI/Discovery/MWMDiscoveryController.h b/iphone/Maps/UI/Discovery/MWMDiscoveryController.h index fb0000cf66..37d501940b 100644 --- a/iphone/Maps/UI/Discovery/MWMDiscoveryController.h +++ b/iphone/Maps/UI/Discovery/MWMDiscoveryController.h @@ -1,7 +1,14 @@ #import "MWMViewController.h" +typedef NS_ENUM(NSUInteger, MWMDiscoveryMode) +{ + MWMDiscoveryModeOnline, + MWMDiscoveryModeOffline +}; + @interface MWMDiscoveryController : MWMViewController + (instancetype)instance; +- (void)setMode:(MWMDiscoveryMode)mode; @end diff --git a/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm b/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm index cffadf8a48..0d9950a828 100644 --- a/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm +++ b/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm @@ -4,6 +4,7 @@ #import "MWMDiscoveryTapDelegate.h" #import "MWMRoutePoint+CPP.h" #import "MWMRouter.h" +#import "Statistics.h" #import "UIKitCategories.h" #include "DiscoveryControllerViewModel.hpp" @@ -79,6 +80,7 @@ struct Callback @property(weak, nonatomic) IBOutlet UITableView * tableView; @property(nonatomic) MWMDiscoveryTableManager * tableManager; +@property(nonatomic) MWMDiscoveryMode mode; @end @@ -114,9 +116,14 @@ struct Callback delegate:self model:move(callback)]; - vector types{ItemType::Viator, ItemType::Attractions, ItemType::Cafes}; + auto getTypes = [](MWMDiscoveryMode m) -> vector { + if (m == MWMDiscoveryModeOnline) + return {ItemType::Viator, ItemType::Attractions, ItemType::Cafes}; + return {ItemType::Attractions, ItemType::Cafes}; + }; + + vector types = getTypes(self.mode); [self.tableManager loadItems:types]; - // TODO: check connection before ask for viator and local experts ClientParams p; p.m_itemTypes = move(types); GetFramework().Discover(move(p), m_callback, @@ -154,6 +161,13 @@ struct Callback break; } } + + auto const categoryAndProvider = StatCategoryAndProvider(type); + [Statistics logEvent:kStatDiscoveryButtonItemClick + withParameters:@{kStatCategory : categoryAndProvider.first, + kStatProvider : categoryAndProvider.second, + kStatDestination : kStatPlacePage, + kStatPosition : @(index + 1)}]; } - (void)routeToItem:(ItemType const)type atIndex:(size_t const)index @@ -169,6 +183,13 @@ struct Callback intermediateIndex:0]; [MWMRouter buildToPoint:pt bestRouter:YES]; [self.navigationController popViewControllerAnimated:YES]; + + auto const categoryAndProvider = StatCategoryAndProvider(type); + [Statistics logEvent:kStatDiscoveryButtonItemClick + withParameters:@{kStatCategory : categoryAndProvider.first, + kStatProvider : categoryAndProvider.second, + kStatDestination : kStatRouting, + kStatPosition : @(index + 1)}]; } - (void)openURLForItem:(discovery::ItemType const)type diff --git a/iphone/Maps/UI/Discovery/MWMDiscoveryTableManager.h b/iphone/Maps/UI/Discovery/MWMDiscoveryTableManager.h index a929f70e9a..11c24a13df 100644 --- a/iphone/Maps/UI/Discovery/MWMDiscoveryTableManager.h +++ b/iphone/Maps/UI/Discovery/MWMDiscoveryTableManager.h @@ -1,12 +1,15 @@ #include "map/discovery/discovery_client_params.hpp" #include +#include #include namespace discovery { class DiscoveryControllerViewModel; -} + +std::pair StatCategoryAndProvider(ItemType const type); +} // namespace discovery using GetModelCallback = std::function; diff --git a/iphone/Maps/UI/Discovery/MWMDiscoveryTableManager.mm b/iphone/Maps/UI/Discovery/MWMDiscoveryTableManager.mm index 2233e107c4..48e987d34e 100644 --- a/iphone/Maps/UI/Discovery/MWMDiscoveryTableManager.mm +++ b/iphone/Maps/UI/Discovery/MWMDiscoveryTableManager.mm @@ -1,5 +1,6 @@ #import "MWMDiscoveryTableManager.h" #import "MWMDiscoveryTapDelegate.h" +#import "Statistics.h" #import "SwiftBridge.h" #include "DiscoveryControllerViewModel.hpp" @@ -21,6 +22,22 @@ #include using namespace std; + +namespace discovery +{ +pair StatCategoryAndProvider(ItemType const type) +{ + switch (type) + { + case ItemType::Viator: return {kStatThingsToDo, kStatViator}; + case ItemType::LocalExperts: return {kStatLocals, kStatLocalsProvider}; + case ItemType::Attractions: return {kStatAttractions, kStatSearch}; + case ItemType::Cafes: return {kStatEatAndDrink, kStatSearch}; + case ItemType::Hotels: ASSERT(false, @""); return {}; + } +} +} // namespace discovery + using namespace discovery; namespace @@ -94,7 +111,6 @@ string GetDistance(m2::PointD const & from, m2::PointD const & to) [self removeItem:type]; return; } - m_loadingTypes.erase(remove(m_loadingTypes.begin(), m_loadingTypes.end(), type), m_loadingTypes.end()); m_failedTypes.erase(remove(m_failedTypes.begin(), m_failedTypes.end(), type), @@ -102,6 +118,11 @@ string GetDistance(m2::PointD const & from, m2::PointD const & to) auto const position = [self position:type]; [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:position]] withRowAnimation:kDefaultRowAnimation]; + + auto const categoryAndProvider = StatCategoryAndProvider(type); + [Statistics logEvent:kStatDiscoveryButtonItemShow + withParameters:@{kStatCategory : categoryAndProvider.first, + kStatProvider : categoryAndProvider.second}]; } - (void)errorAtItem:(ItemType const)type