diff --git a/iphone/Maps/Categories/String+Format.swift b/iphone/Maps/Categories/String+Format.swift index 9b1d7843a3..010924a1e2 100644 --- a/iphone/Maps/Categories/String+Format.swift +++ b/iphone/Maps/Categories/String+Format.swift @@ -4,3 +4,15 @@ extension String { self.init(format: format, arguments: arguments.map { "\($0)" }) } } + +extension NSString { + @objc + static func string(coreFormat: String, arguments: [AnyObject]) -> NSString { + return NSString(coreFormat: coreFormat, arguments: arguments) + } + + @objc + convenience init(coreFormat: String, arguments: [AnyObject]) { + self.init(string: String(coreFormat: coreFormat, arguments: arguments as! [CVarArg])) + } +} diff --git a/iphone/Maps/Classes/CustomAlert/MobileInternetAlert/MWMMobileInternetAlert.mm b/iphone/Maps/Classes/CustomAlert/MobileInternetAlert/MWMMobileInternetAlert.mm index 90e59e832b..63f9ddb03b 100644 --- a/iphone/Maps/Classes/CustomAlert/MobileInternetAlert/MWMMobileInternetAlert.mm +++ b/iphone/Maps/Classes/CustomAlert/MobileInternetAlert/MWMMobileInternetAlert.mm @@ -30,21 +30,21 @@ NSString * const kStatisticsEvent = @"Mobile Internet Settings Alert"; - (IBAction)alwaysTap { [Statistics logEvent:kStatMobileInternet withParameters:@{kStatValue : kStatAlways}]; - SetStage(np::Stage::Always); + SetStage(Stage::Always); [self close:self.completionBlock]; } - (IBAction)askTap { - [Statistics logEvent:kStatMobileInternet withParameters:@{kStatValue : kStatAsk}]; - SetStage(np::Stage::Session); + [Statistics logEvent:kStatMobileInternet withParameters:@{kStatValue: kStatToday}]; + SetStage(Stage::Today); [self close:self.completionBlock]; } - (IBAction)neverTap { - [Statistics logEvent:kStatisticsEvent withParameters:@{kStatAction : kStatNever}]; - SetStage(np::Stage::Never); + [Statistics logEvent:kStatisticsEvent withParameters:@{kStatAction: kStatNotToday}]; + SetStage(Stage::NotToday); [self close:self.completionBlock]; } diff --git a/iphone/Maps/Classes/CustomAlert/MobileInternetAlert/MWMMobileInternetAlert.xib b/iphone/Maps/Classes/CustomAlert/MobileInternetAlert/MWMMobileInternetAlert.xib index 15bd84e7e5..3de329e5c0 100644 --- a/iphone/Maps/Classes/CustomAlert/MobileInternetAlert/MWMMobileInternetAlert.xib +++ b/iphone/Maps/Classes/CustomAlert/MobileInternetAlert/MWMMobileInternetAlert.xib @@ -101,7 +101,7 @@ - + diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm index 1d0ec664b9..e74f8a8a39 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm @@ -118,22 +118,10 @@ extern NSString * const kAlohalyticsTapEventKey; - (void)showPlacePage:(place_page::Info const &)info { - auto show = ^(place_page::Info const & info) { + network_policy::CallPartnersApi([self, info](auto const & /* canUseNetwork */) { self.trafficButtonHidden = YES; [self.placePageManager show:info]; - }; - - using namespace network_policy; - if (GetPlatform().ConnectionStatus() == Platform::EConnectionType::CONNECTION_WWAN && - !CanUseNetwork() && GetStage() == platform::NetworkPolicy::Stage::Session) - { - [[MWMAlertViewController activeAlertController] - presentMobileInternetAlertWithBlock:[show, info] { show(info); }]; - } - else - { - show(info); - } + }); } - (void)searchTextOnMap:(NSString *)text forInputLocale:(NSString *)locale diff --git a/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMTaxiPreviewDataSource.mm b/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMTaxiPreviewDataSource.mm index efb4144e2a..c1d5e06741 100644 --- a/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMTaxiPreviewDataSource.mm +++ b/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMTaxiPreviewDataSource.mm @@ -94,101 +94,91 @@ using namespace taxi; cv.hidden = YES; cv.pageControl.hidden = YES; - network_policy::CallPartnersApi( - [self, completion, failure](platform::NetworkPolicy const & canUseNetwork) { - auto const engine = GetFramework().GetTaxiEngine(canUseNetwork); - if (!engine) { - failure(L(@"dialog_taxi_error")); - return; - } + network_policy::CallPartnersApi([self, completion, failure](auto const & canUseNetwork) { + auto const engine = GetFramework().GetTaxiEngine(canUseNetwork); + if (!engine) + { + failure(L(@"dialog_taxi_error")); + return; + } - auto success = [self, completion, failure](taxi::ProvidersContainer const & providers, - uint64_t const requestId) { - dispatch_async(dispatch_get_main_queue(), [self, completion, failure, providers, - requestId] { - if (self->m_requestId != requestId) - return; - if (providers.empty()) - { - failure(L(@"taxi_no_providers")); - [Statistics logEvent:kStatRoutingBuildTaxi - withParameters:@{ - @"error" : @"No providers (Taxi isn't in the city)" - }]; - return; - } - auto const & provider = providers.front(); - auto const & products = provider.GetProducts(); - auto const type = provider.GetType(); - self->m_products = products; - NSString * providerName = nil; - switch (type) - { - case taxi::Provider::Type::Uber: - self.type = MWMRoutePreviewTaxiCellTypeUber; - providerName = kStatUber; - break; - case taxi::Provider::Type::Yandex: - self.type = MWMRoutePreviewTaxiCellTypeYandex; - providerName = kStatYandex; - break; - } - [Statistics logEvent:kStatRoutingBuildTaxi - withParameters:@{ - @"provider" : providerName - }]; - auto cv = self.collectionView; - cv.hidden = NO; - cv.pageControl.hidden = products.size() == 1; - cv.numberOfPages = products.size(); - cv.contentOffset = {}; - cv.currentPage = 0; - [cv reloadData]; - completion(); - }); - }; + auto success = [self, completion, failure](taxi::ProvidersContainer const & providers, + uint64_t const requestId) { + dispatch_async(dispatch_get_main_queue(), [self, completion, failure, providers, requestId] { + if (self->m_requestId != requestId) + return; + if (providers.empty()) + { + failure(L(@"taxi_no_providers")); + [Statistics logEvent:kStatRoutingBuildTaxi + withParameters:@{@"error": @"No providers (Taxi isn't in the city)"}]; + return; + } + auto const & provider = providers.front(); + auto const & products = provider.GetProducts(); + auto const type = provider.GetType(); + self->m_products = products; + NSString * providerName = nil; + switch (type) + { + case taxi::Provider::Type::Uber: + self.type = MWMRoutePreviewTaxiCellTypeUber; + providerName = kStatUber; + break; + case taxi::Provider::Type::Yandex: + self.type = MWMRoutePreviewTaxiCellTypeYandex; + providerName = kStatYandex; + break; + } + [Statistics logEvent:kStatRoutingBuildTaxi withParameters:@{@"provider": providerName}]; + auto cv = self.collectionView; + cv.hidden = NO; + cv.pageControl.hidden = products.size() == 1; + cv.numberOfPages = products.size(); + cv.contentOffset = {}; + cv.currentPage = 0; + [cv reloadData]; + completion(); + }); + }; - auto error = [self, failure](taxi::ErrorsContainer const & errors, - uint64_t const requestId) { - dispatch_async(dispatch_get_main_queue(), [self, failure, errors, requestId] { - if (self->m_requestId != requestId) - return; - if (errors.empty()) - { - NSCAssert(false, @"Errors container is empty"); - return; - } - auto const & error = errors.front(); - auto const errorCode = error.m_code; - auto const type = error.m_type; - NSString * provider = nil; - switch (type) - { - case taxi::Provider::Type::Uber: provider = kStatUber; break; - case taxi::Provider::Type::Yandex: provider = kStatYandex; break; - } - NSString * errorValue = nil; - switch (errorCode) - { - case taxi::ErrorCode::NoProducts: - errorValue = @"No products (Taxi is in the city, but no offers)"; - failure(L(@"taxi_not_found")); - break; - case taxi::ErrorCode::RemoteError: - errorValue = @"Server error (The taxi server responded with an error)"; - failure(L(@"dialog_taxi_error")); - break; - } - [Statistics logEvent:kStatRoutingBuildTaxi - withParameters:@{ - @"provider" : provider, - @"error" : errorValue - }]; - }); - }; + auto error = [self, failure](taxi::ErrorsContainer const & errors, uint64_t const requestId) { + dispatch_async(dispatch_get_main_queue(), [self, failure, errors, requestId] { + if (self->m_requestId != requestId) + return; + if (errors.empty()) + { + NSCAssert(false, @"Errors container is empty"); + return; + } + auto const & error = errors.front(); + auto const errorCode = error.m_code; + auto const type = error.m_type; + NSString * provider = nil; + switch (type) + { + case taxi::Provider::Type::Uber: provider = kStatUber; break; + case taxi::Provider::Type::Yandex: provider = kStatYandex; break; + } + NSString * errorValue = nil; + switch (errorCode) + { + case taxi::ErrorCode::NoProducts: + errorValue = @"No products (Taxi is in the city, but no offers)"; + failure(L(@"taxi_not_found")); + break; + case taxi::ErrorCode::RemoteError: + errorValue = @"Server error (The taxi server responded with an error)"; + failure(L(@"dialog_taxi_error")); + break; + } + [Statistics logEvent:kStatRoutingBuildTaxi + withParameters:@{@"provider": provider, @"error": errorValue}]; + }); + }; - m_requestId = engine->GetAvailableProducts(m_from, m_to, success, error); - }); + m_requestId = engine->GetAvailableProducts(m_from, m_to, success, error); + }); } - (BOOL)isTaxiInstalled @@ -210,25 +200,23 @@ using namespace taxi; auto const index = [self.collectionView indexPathsForVisibleItems].firstObject.row; auto const productId = m_products[index].m_productId; - network_policy::CallPartnersApi( - [self, productId, block](platform::NetworkPolicy const & canUseNetwork) + network_policy::CallPartnersApi([self, productId, block](auto const & canUseNetwork) { + auto const engine = GetFramework().GetTaxiEngine(canUseNetwork); + if (!engine) + return; + Provider::Type type; + switch (self.type) { - auto const engine = GetFramework().GetTaxiEngine(canUseNetwork); - if (!engine) - return; - Provider::Type type; - switch (self.type) - { - case MWMRoutePreviewTaxiCellTypeTaxi: return; - case MWMRoutePreviewTaxiCellTypeUber: type = Provider::Type::Uber; break; - case MWMRoutePreviewTaxiCellTypeYandex: type = Provider::Type::Yandex; break; - } + case MWMRoutePreviewTaxiCellTypeTaxi: return; + case MWMRoutePreviewTaxiCellTypeUber: type = Provider::Type::Uber; break; + case MWMRoutePreviewTaxiCellTypeYandex: type = Provider::Type::Yandex; break; + } - auto links = engine->GetRideRequestLinks(type, productId, m_from, m_to); - auto url = [NSURL URLWithString:self.isTaxiInstalled ? @(links.m_deepLink.c_str()) : - @(links.m_universalLink.c_str())]; - block(url); - }); + auto links = engine->GetRideRequestLinks(type, productId, m_from, m_to); + auto url = [NSURL URLWithString:self.isTaxiInstalled ? @(links.m_deepLink.c_str()) + : @(links.m_universalLink.c_str())]; + block(url); + }); } #pragma mark - UICollectionViewDataSource diff --git a/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/RoutePreviewTaxiCell.swift b/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/RoutePreviewTaxiCell.swift index 5d00dd4833..97fa04d2fc 100644 --- a/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/RoutePreviewTaxiCell.swift +++ b/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/RoutePreviewTaxiCell.swift @@ -52,8 +52,7 @@ final class RoutePreviewTaxiCell: UICollectionViewCell { let timeString = { () -> String in let timeValue = DateComponentsFormatter.etaString(from: TimeInterval(eta)!)! - let format = L("taxi_wait").replacingOccurrences(of: "%s", with: "%@") - return String(format: format, arguments: [timeValue]) + return String(coreFormat: L("taxi_wait"), arguments: [timeValue]) } icon.image = iconImage() diff --git a/iphone/Maps/Common/Statistics/StatisticsStrings.h b/iphone/Maps/Common/Statistics/StatisticsStrings.h index a6cd92063f..88861479dd 100644 --- a/iphone/Maps/Common/Statistics/StatisticsStrings.h +++ b/iphone/Maps/Common/Statistics/StatisticsStrings.h @@ -190,6 +190,7 @@ static NSString * const kStatNo = @"No"; static NSString * const kStatNoConnection = @"no_connection"; static NSString * const kStatNoSpace = @"no_space"; static NSString * const kStatNone = @"none"; +static NSString * const kStatNotToday = @"NotToday"; static NSString * const kStatOSM = @"OSM"; static NSString * const kStatOSMUserName = @"osm_username"; static NSString * const kStatObjectLat = @"object_lat"; @@ -318,6 +319,7 @@ static NSString * const kStatTaxi = @"Taxi"; static NSString * const kStatThingsToDo = @"Things to do"; static NSString * const kStatToLocation = @"to_location"; static NSString * const kStatToMyPosition = @"To my position"; +static NSString * const kStatToday = @"Today"; static NSString * const kStatToggleBookmark = @"Toggle bookmark"; static NSString * const kStatToggleCompassCalibration = @"Toggle compass calibration"; static NSString * const kStatToggleCoordinates = @"Toggle coordinates"; diff --git a/iphone/Maps/Core/NetworkPolicy/MWMNetworkPolicy.h b/iphone/Maps/Core/NetworkPolicy/MWMNetworkPolicy.h index 2a1ca90ef7..272644ddc5 100644 --- a/iphone/Maps/Core/NetworkPolicy/MWMNetworkPolicy.h +++ b/iphone/Maps/Core/NetworkPolicy/MWMNetworkPolicy.h @@ -4,10 +4,19 @@ namespace network_policy { +enum Stage +{ + Ask, + Always, + Never, + Today, + NotToday +}; + void CallPartnersApi(platform::PartnersApiFn fn, bool force = false); -void SetStage(platform::NetworkPolicy::Stage state); -platform::NetworkPolicy::Stage GetStage(); +void SetStage(Stage state); +Stage const GetStage(); bool CanUseNetwork(); } // namespace network_policy diff --git a/iphone/Maps/Core/NetworkPolicy/MWMNetworkPolicy.mm b/iphone/Maps/Core/NetworkPolicy/MWMNetworkPolicy.mm index 64c7a831ae..ad544efd6a 100644 --- a/iphone/Maps/Core/NetworkPolicy/MWMNetworkPolicy.mm +++ b/iphone/Maps/Core/NetworkPolicy/MWMNetworkPolicy.mm @@ -3,16 +3,34 @@ #include "platform/platform.hpp" -using np = platform::NetworkPolicy; - namespace { NSString * const kNetworkingPolicyTimeStamp = @"NetworkingPolicyTimeStamp"; +NSString * const kNetworkingPolicyStage = @"NetworkingPolicyStage"; NSTimeInterval const kSessionDurationSeconds = 24 * 60 * 60; } // namespace namespace network_policy { +void SetStage(Stage stage) +{ + NSUserDefaults * ud = NSUserDefaults.standardUserDefaults; + [ud setInteger:static_cast(stage) forKey:kNetworkingPolicyStage]; + [ud setObject:[NSDate dateWithTimeIntervalSinceNow:kSessionDurationSeconds] + forKey:kNetworkingPolicyTimeStamp]; +} + +Stage const GetStage() +{ + return static_cast( + [NSUserDefaults.standardUserDefaults integerForKey:kNetworkingPolicyStage]); +} + +NSDate * GetPolicyDate() +{ + return [NSUserDefaults.standardUserDefaults objectForKey:kNetworkingPolicyTimeStamp]; +} + void CallPartnersApi(platform::PartnersApiFn fn, bool force) { auto const connectionType = GetPlatform().ConnectionStatus(); @@ -28,19 +46,26 @@ void CallPartnersApi(platform::PartnersApiFn fn, bool force) } auto checkAndApply = ^bool { - NSUserDefaults * ud = NSUserDefaults.standardUserDefaults; - NSDate * policyDate = [ud objectForKey:kNetworkingPolicyTimeStamp]; - if ([policyDate compare:[NSDate date]] == NSOrderedDescending) + switch (GetStage()) { - fn(true); - return true; + case Stage::Ask: return false; + case Stage::Always: fn(true); return true; + case Stage::Never: fn(false); return true; + case Stage::Today: + if ([GetPolicyDate() compare:[NSDate date]] == NSOrderedDescending) + { + fn(true); + return true; + } + return false; + case Stage::NotToday: + if ([GetPolicyDate() compare:[NSDate date]] == NSOrderedDescending) + { + fn(false); + return true; + } + return false; } - if ([policyDate isEqualToDate:NSDate.distantPast]) - { - fn(false); - return true; - } - return false; }; if (checkAndApply()) @@ -55,32 +80,6 @@ void CallPartnersApi(platform::PartnersApiFn fn, bool force) }); } -void SetStage(np::Stage state) -{ - NSUserDefaults * ud = NSUserDefaults.standardUserDefaults; - NSDate * policyDate = nil; - switch (state) - { - case np::Stage::Always: policyDate = NSDate.distantFuture; break; - case np::Stage::Session: - policyDate = [NSDate dateWithTimeIntervalSinceNow:kSessionDurationSeconds]; - break; - case np::Stage::Never: policyDate = NSDate.distantPast; break; - } - [ud setObject:policyDate forKey:kNetworkingPolicyTimeStamp]; -} - -np::Stage GetStage() -{ - NSUserDefaults * ud = NSUserDefaults.standardUserDefaults; - NSDate * policyDate = [ud objectForKey:kNetworkingPolicyTimeStamp]; - if ([policyDate isEqualToDate:NSDate.distantFuture]) - return np::Stage::Always; - if ([policyDate isEqualToDate:NSDate.distantPast]) - return np::Stage::Never; - return np::Stage::Session; -} - bool CanUseNetwork() { using ct = Platform::EConnectionType; @@ -89,11 +88,14 @@ bool CanUseNetwork() case ct::CONNECTION_NONE: return false; case ct::CONNECTION_WIFI: return true; case ct::CONNECTION_WWAN: - { - NSUserDefaults * ud = NSUserDefaults.standardUserDefaults; - NSDate * policyDate = [ud objectForKey:kNetworkingPolicyTimeStamp]; - return [policyDate compare:[NSDate date]] == NSOrderedDescending; - } + switch (GetStage()) + { + case Stage::Ask: return false; + case Stage::Always: return true; + case Stage::Never: return false; + case Stage::Today: return [GetPolicyDate() compare:[NSDate date]] == NSOrderedDescending; + case Stage::NotToday: return false; + } } } } // namespace network_policy diff --git a/iphone/Maps/UI/Autoupdate/MWMAutoupdateController.mm b/iphone/Maps/UI/Autoupdate/MWMAutoupdateController.mm index 8a528c012a..dac34f79a4 100644 --- a/iphone/Maps/UI/Autoupdate/MWMAutoupdateController.mm +++ b/iphone/Maps/UI/Autoupdate/MWMAutoupdateController.mm @@ -4,6 +4,7 @@ #import "MWMFrameworkListener.h" #import "MWMStorage.h" #import "Statistics.h" +#import "SwiftBridge.h" #import "UIButton+RuntimeAttributes.h" #include @@ -44,7 +45,6 @@ enum class State - (void)startSpinner; - (void)stopSpinner; -- (void)setProgress:(MapFilesDownloader::TProgress)progress nodeName:(NSString *)nodeName; - (void)updateForSize:(CGSize)size; @end @@ -80,9 +80,9 @@ enum class State [self stopSpinner]; self.primaryButton.hidden = NO; self.secondaryButton.localizedText = L(@"whats_new_auto_update_button_later"); - NSString * pattern = [L(@"whats_new_auto_update_button_size") stringByReplacingOccurrencesOfString:@"%s" - withString:@"%@"]; - self.primaryButton.localizedText = [NSString stringWithFormat:pattern, self.updateSize]; + self.primaryButton.localizedText = + [NSString stringWithCoreFormat:L(@"whats_new_auto_update_button_size") + arguments:@[self.updateSize]]; } - (void)startSpinner @@ -108,32 +108,22 @@ enum class State - (void)setStatusForNodeName:(NSString *)nodeName rootAttributes:(NodeAttrs const &)nodeAttrs { - auto updatePlaceholder = ^NSString *(NSString * str) - { - return [str stringByReplacingOccurrencesOfString:@"%s" withString:@"%@"]; - }; - auto const progress = nodeAttrs.m_downloadingProgress; CGFloat const prog = kMaxProgress * static_cast(progress.first) / progress.second; self.spinner.progress = prog; - NSString * percent = - [L(@"downloader_percent") stringByReplacingOccurrencesOfString:@"%s" withString:@"%@"]; NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterPercentStyle]; [numberFormatter setMaximumFractionDigits:0]; [numberFormatter setMultiplier:@100]; NSString * percentString = [numberFormatter stringFromNumber:@(prog)]; NSString * sizeString = formattedSize(progress.second); - self.progressLabel.text = [NSString stringWithFormat:percent, percentString, sizeString]; + self.progressLabel.text = [NSString stringWithCoreFormat:L(@"downloader_percent") + arguments:@[percentString, sizeString]]; - NSString * process = nil; - if (nodeAttrs.m_status == storage::NodeStatus::Applying) - process = L(@"downloader_applying"); - else - process = L(@"downloader_process"); - process = [process stringByReplacingOccurrencesOfString:@"%s" withString:@"%@"]; - self.legendLabel.text = [NSString stringWithFormat:process, nodeName]; + BOOL const isApplying = nodeAttrs.m_status == storage::NodeStatus::Applying; + NSString * format = L(isApplying ? @"downloader_applying" : @"downloader_process"); + self.legendLabel.text = [NSString stringWithCoreFormat:format arguments:@[nodeName]]; } @end diff --git a/iphone/Maps/UI/BottomMenu/MWMBottomMenuViewController.mm b/iphone/Maps/UI/BottomMenu/MWMBottomMenuViewController.mm index bf9b61cc3d..ef1b58d4a7 100644 --- a/iphone/Maps/UI/BottomMenu/MWMBottomMenuViewController.mm +++ b/iphone/Maps/UI/BottomMenu/MWMBottomMenuViewController.mm @@ -293,32 +293,16 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) { - (IBAction)discoveryTap { - auto mode = ^MWMDiscoveryMode (BOOL canUseNetwork) { - return canUseNetwork ? MWMDiscoveryModeOnline : MWMDiscoveryModeOffline; - }; - auto const connectionType = GetPlatform().ConnectionStatus(); - [Statistics logEvent:kStatDiscoveryButtonOpen withParameters:@{kStatNetwork: [Statistics connectionTypeToString:connectionType]}]; self.state = self.restoreState; - 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]; + network_policy::CallPartnersApi([self](auto const & canUseNetwork) { + auto discovery = [MWMDiscoveryController instanceWithConnection:canUseNetwork.CanUse()]; + [self.controller.navigationController pushViewController:discovery animated:YES]; + }); } - (IBAction)bookmarksButtonTouchUpInside diff --git a/iphone/Maps/UI/Discovery/MWMDiscoveryController.h b/iphone/Maps/UI/Discovery/MWMDiscoveryController.h index 37d501940b..7f50fc2b6a 100644 --- a/iphone/Maps/UI/Discovery/MWMDiscoveryController.h +++ b/iphone/Maps/UI/Discovery/MWMDiscoveryController.h @@ -1,14 +1,7 @@ #import "MWMViewController.h" -typedef NS_ENUM(NSUInteger, MWMDiscoveryMode) -{ - MWMDiscoveryModeOnline, - MWMDiscoveryModeOffline -}; - @interface MWMDiscoveryController : MWMViewController -+ (instancetype)instance; -- (void)setMode:(MWMDiscoveryMode)mode; ++ (instancetype)instanceWithConnection:(BOOL)connection; @end diff --git a/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm b/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm index 2b5dd473e5..8dab27d7c0 100644 --- a/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm +++ b/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm @@ -80,16 +80,17 @@ struct Callback @property(weak, nonatomic) IBOutlet UITableView * tableView; @property(nonatomic) MWMDiscoveryTableManager * tableManager; -@property(nonatomic) MWMDiscoveryMode mode; +@property(nonatomic) BOOL canUseNetwork; @end @implementation MWMDiscoveryController -+ (instancetype)instance ++ (instancetype)instanceWithConnection:(BOOL)canUseNetwork { auto instance = [[MWMDiscoveryController alloc] initWithNibName:self.className bundle:nil]; instance.title = L(@"discovery_button_title"); + instance.canUseNetwork = canUseNetwork; return instance; } @@ -116,14 +117,14 @@ struct Callback delegate:self model:move(callback)]; - auto getTypes = [](MWMDiscoveryMode m) -> vector { - if (m == MWMDiscoveryModeOnline) + auto getTypes = [](BOOL canUseNetwork) -> vector { + if (canUseNetwork) return {ItemType::Hotels, ItemType::Viator, ItemType::Attractions, ItemType::Cafes, ItemType::LocalExperts}; return {ItemType::Hotels, ItemType::Attractions, ItemType::Cafes}; }; - vector types = getTypes(self.mode); + vector types = getTypes(self.canUseNetwork); [self.tableManager loadItems:types]; ClientParams p; p.m_itemTypes = move(types); diff --git a/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm b/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm index ba6ac314d8..106588c7cc 100644 --- a/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm +++ b/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm @@ -289,10 +289,7 @@ NSString * const kUserDefaultsLatLonAsDMSKey = @"UserDefaultsLatLonAsDMS"; if (!self.isViator) return; - if (Platform::ConnectionStatus() == Platform::EConnectionType::CONNECTION_NONE) - return; - - network_policy::CallPartnersApi([self](platform::NetworkPolicy const & canUseNetwork) { + network_policy::CallPartnersApi([self](auto const & canUseNetwork) { auto api = GetFramework().GetViatorApi(canUseNetwork); if (!api) return; @@ -346,10 +343,7 @@ NSString * const kUserDefaultsLatLonAsDMSKey = @"UserDefaultsLatLonAsDMS"; if (!self.isBooking) return; - if (Platform::ConnectionStatus() == Platform::EConnectionType::CONNECTION_NONE) - return; - - network_policy::CallPartnersApi([self](platform::NetworkPolicy const & canUseNetwork) { + network_policy::CallPartnersApi([self](auto const & canUseNetwork) { auto api = GetFramework().GetBookingApi(canUseNetwork); if (!api) return; @@ -569,42 +563,38 @@ NSString * const kUserDefaultsLatLonAsDMSKey = @"UserDefaultsLatLonAsDMS"; return; } - if (Platform::ConnectionStatus() == Platform::EConnectionType::CONNECTION_NONE) - return; - - std::string const currency = self.currencyFormatter.currencyCode.UTF8String; - - auto const func = [self, label, currency](std::string const & hotelId, std::string const & minPrice, - std::string const & priceCurrency) { - if (currency != priceCurrency) + network_policy::CallPartnersApi([self, label](auto const & canUseNetwork) { + auto const api = GetFramework().GetBookingApi(canUseNetwork); + if (!api) return; - NSNumberFormatter * decimalFormatter = [[NSNumberFormatter alloc] init]; - decimalFormatter.numberStyle = NSNumberFormatterDecimalStyle; + std::string const currency = self.currencyFormatter.currencyCode.UTF8String; - NSNumber * currencyNumber = [decimalFormatter - numberFromString:[@(minPrice.c_str()) - stringByReplacingOccurrencesOfString:@"." - withString:decimalFormatter - .decimalSeparator]]; - NSString * currencyString = [self.currencyFormatter stringFromNumber:currencyNumber]; + auto const func = [self, label, currency](std::string const & hotelId, + std::string const & minPrice, + std::string const & priceCurrency) { + if (currency != priceCurrency) + return; - NSString * pattern = - [L(@"place_page_starting_from") stringByReplacingOccurrencesOfString:@"%s" - withString:@"%@"]; + NSNumberFormatter * decimalFormatter = [[NSNumberFormatter alloc] init]; + decimalFormatter.numberStyle = NSNumberFormatterDecimalStyle; - self.cachedMinPrice = [NSString stringWithFormat:pattern, currencyString]; - dispatch_async(dispatch_get_main_queue(), ^{ - label.text = self.cachedMinPrice; - }); - }; + NSNumber * currencyNumber = [decimalFormatter + numberFromString:[@(minPrice.c_str()) + stringByReplacingOccurrencesOfString:@"." + withString:decimalFormatter + .decimalSeparator]]; + NSString * currencyString = [self.currencyFormatter stringFromNumber:currencyNumber]; - network_policy::CallPartnersApi( - [self, currency, func](platform::NetworkPolicy const & canUseNetwork) { - auto const api = GetFramework().GetBookingApi(canUseNetwork); - if (api) - api->GetMinPrice(self.sponsoredId.UTF8String, currency, func); + self.cachedMinPrice = [NSString stringWithCoreFormat:L(@"place_page_starting_from") + arguments:@[currencyString]]; + dispatch_async(dispatch_get_main_queue(), ^{ + label.text = self.cachedMinPrice; }); + }; + + api->GetMinPrice(self.sponsoredId.UTF8String, currency, func); + }); } - (NSNumberFormatter *)currencyFormatter diff --git a/iphone/Maps/UI/Settings/MWMMobileInternetViewController.mm b/iphone/Maps/UI/Settings/MWMMobileInternetViewController.mm index 8764796c42..94334feb8e 100644 --- a/iphone/Maps/UI/Settings/MWMMobileInternetViewController.mm +++ b/iphone/Maps/UI/Settings/MWMMobileInternetViewController.mm @@ -25,9 +25,11 @@ using np = platform::NetworkPolicy; SettingsTableViewSelectableCell * selected; switch (GetStage()) { - case np::Stage::Always: selected = self.always; break; - case np::Stage::Session: selected = self.ask; break; - case np::Stage::Never: selected = self.never; break; + case Always: selected = self.always; break; + case Never: selected = self.never; break; + case Ask: + case Today: + case NotToday: selected = self.ask; break; } selected.accessoryType = UITableViewCellAccessoryCheckmark; self.selected = selected; @@ -43,17 +45,17 @@ using np = platform::NetworkPolicy; if ([selected isEqual:self.always]) { statValue = kStatAlways; - SetStage(np::Stage::Always); + SetStage(Always); } else if ([selected isEqual:self.ask]) { statValue = kStatAsk; - SetStage(np::Stage::Session); + SetStage(Ask); } else if ([selected isEqual:self.never]) { statValue = kStatNever; - SetStage(np::Stage::Never); + SetStage(Never); } [Statistics logEvent:kStatMobileInternet withParameters:@{kStatValue : statValue}]; diff --git a/iphone/Maps/UI/Settings/MWMSettingsViewController.mm b/iphone/Maps/UI/Settings/MWMSettingsViewController.mm index 381c17c8b1..ec37046927 100644 --- a/iphone/Maps/UI/Settings/MWMSettingsViewController.mm +++ b/iphone/Maps/UI/Settings/MWMSettingsViewController.mm @@ -89,16 +89,16 @@ extern NSString * const kAlohalyticsTapEventKey; isOn:![MWMSettings autoDownloadEnabled]]; NSString * mobileInternet = nil; - using stage = platform::NetworkPolicy::Stage; switch (network_policy::GetStage()) { - case stage::Always: mobileInternet = L(@"mobile_data_option_always"); break; - case stage::Session: mobileInternet = L(@"mobile_data_option_today"); break; - case stage::Never: mobileInternet = L(@"mobile_data_option_never"); break; + case network_policy::Ask: + case network_policy::Today: + case network_policy::NotToday: mobileInternet = L(@"mobile_data_option_ask"); break; + case network_policy::Always: mobileInternet = L(@"mobile_data_option_always"); break; + case network_policy::Never: mobileInternet = L(@"mobile_data_option_never"); break; } [self.mobileInternetCell configWithTitle:L(@"mobile_data") info:mobileInternet]; - NSString * recentTrack = nil; if (!GpsTracker::Instance().IsEnabled()) { diff --git a/iphone/Maps/UI/Storyboard/Settings.storyboard b/iphone/Maps/UI/Storyboard/Settings.storyboard index 28dec4c0ca..0d8720b321 100644 --- a/iphone/Maps/UI/Storyboard/Settings.storyboard +++ b/iphone/Maps/UI/Storyboard/Settings.storyboard @@ -446,7 +446,7 @@ - +