diff --git a/iphone/CoreApi/CoreApi.xcodeproj/project.pbxproj b/iphone/CoreApi/CoreApi.xcodeproj/project.pbxproj index 530419f159..e75373ec88 100644 --- a/iphone/CoreApi/CoreApi.xcodeproj/project.pbxproj +++ b/iphone/CoreApi/CoreApi.xcodeproj/project.pbxproj @@ -49,6 +49,8 @@ 47D9019523AC22E500D9364C /* MWMMapUpdateInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 47D9019323AC22E500D9364C /* MWMMapUpdateInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 47D9019623AC22E500D9364C /* MWMMapUpdateInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47D9019423AC22E500D9364C /* MWMMapUpdateInfo.mm */; }; 47D9019923AC236100D9364C /* MWMMapUpdateInfo+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47D9019723AC236100D9364C /* MWMMapUpdateInfo+Core.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47E8163623B1889C008FD836 /* MWMStorage.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47E8163423B1889B008FD836 /* MWMStorage.mm */; }; + 47E8163723B188D3008FD836 /* MWMStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 47E8163523B1889B008FD836 /* MWMStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 47EEAFF42350CEDB005CF316 /* AppInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47EEAFF22350CEDA005CF316 /* AppInfo.mm */; }; 47EEAFF62350CF48005CF316 /* AppInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 47EEAFF32350CEDB005CF316 /* AppInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 47EEAFF72350D060005CF316 /* MWMCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = 47EEAFF52350CEF6005CF316 /* MWMCommon.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -119,6 +121,8 @@ 47D9019323AC22E500D9364C /* MWMMapUpdateInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMMapUpdateInfo.h; sourceTree = ""; }; 47D9019423AC22E500D9364C /* MWMMapUpdateInfo.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMMapUpdateInfo.mm; sourceTree = ""; }; 47D9019723AC236100D9364C /* MWMMapUpdateInfo+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MWMMapUpdateInfo+Core.h"; sourceTree = ""; }; + 47E8163423B1889B008FD836 /* MWMStorage.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMStorage.mm; sourceTree = ""; }; + 47E8163523B1889B008FD836 /* MWMStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMStorage.h; sourceTree = ""; }; 47EEAFF22350CEDA005CF316 /* AppInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = AppInfo.mm; sourceTree = ""; }; 47EEAFF32350CEDB005CF316 /* AppInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppInfo.h; sourceTree = ""; }; 47EEAFF52350CEF6005CF316 /* MWMCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMCommon.h; sourceTree = ""; }; @@ -318,6 +322,8 @@ 47F4F1F623A333280022FD56 /* Storage */ = { isa = PBXGroup; children = ( + 47E8163523B1889B008FD836 /* MWMStorage.h */, + 47E8163423B1889B008FD836 /* MWMStorage.mm */, 47F4F1F723A3336B0022FD56 /* MWMMapNodeAttributes.h */, 47F4F1FB23A3D1AC0022FD56 /* MWMMapNodeAttributes+Core.h */, 47F4F1F823A3336C0022FD56 /* MWMMapNodeAttributes.mm */, @@ -416,6 +422,7 @@ 999D3A64237B097C00C5F7A8 /* DeepLinkSubscriptionData.h in Headers */, 470016102342579200EBF03D /* MWMTagGroup.h in Headers */, 479F7063234FBC5900011E2E /* MWMCarPlayBookmarkObject.h in Headers */, + 47E8163723B188D3008FD836 /* MWMStorage.h in Headers */, 47EEAFF62350CF48005CF316 /* AppInfo.h in Headers */, 479F7053234FB7BC00011E2E /* MWMCatalogCommon.h in Headers */, 4700160F2342579000EBF03D /* MWMTag.h in Headers */, @@ -524,6 +531,7 @@ 4718C4332355FC3C00640DF1 /* MWMNetworkPolicy.mm in Sources */, 993F54F3237C5D1100545511 /* PromoAfterBookingCampaignAdapter.mm in Sources */, 47EEAFF42350CEDB005CF316 /* AppInfo.mm in Sources */, + 47E8163623B1889C008FD836 /* MWMStorage.mm in Sources */, 9957FAE9237AE5B000855F48 /* Logger.mm in Sources */, 999D3A65237B097C00C5F7A8 /* DeepLinkSubscriptionData.mm in Sources */, ); diff --git a/iphone/CoreApi/CoreApi/CoreApi-swift.h b/iphone/CoreApi/CoreApi/CoreApi-swift.h index 00771da115..1743060dff 100644 --- a/iphone/CoreApi/CoreApi/CoreApi-swift.h +++ b/iphone/CoreApi/CoreApi/CoreApi-swift.h @@ -14,6 +14,7 @@ FOUNDATION_EXPORT const unsigned char CoreApiVersionString[]; #import #import #import +#import #import #import #import diff --git a/iphone/Maps/Core/Storage/MWMStorage.h b/iphone/CoreApi/CoreApi/Storage/MWMStorage.h similarity index 55% rename from iphone/Maps/Core/Storage/MWMStorage.h rename to iphone/CoreApi/CoreApi/Storage/MWMStorage.h index 05490a1578..6f071a8101 100644 --- a/iphone/Maps/Core/Storage/MWMStorage.h +++ b/iphone/CoreApi/CoreApi/Storage/MWMStorage.h @@ -1,27 +1,35 @@ +#import +#import + @class MWMMapNodeAttributes; @class MWMMapUpdateInfo; NS_ASSUME_NONNULL_BEGIN +extern NSErrorDomain const kStorageErrorDomain; + +extern NSInteger const kStorageNotEnoughSpace; +extern NSInteger const kStorageNoConnection; +extern NSInteger const kStorageCellularForbidden; +extern NSInteger const kStorageRoutingActive; +extern NSInteger const kStorageHaveUnsavedEdits; + NS_SWIFT_NAME(Storage) @interface MWMStorage : NSObject -+ (void)downloadNode:(NSString *)countryId - onSuccess:(nullable MWMVoidBlock)onSuccess - onCancel:(nullable MWMVoidBlock)onCancel; ++ (BOOL)downloadNode:(NSString *)countryId error:(NSError * __autoreleasing _Nullable *)error; + (void)retryDownloadNode:(NSString *)countryId; -+ (void)updateNode:(NSString *)countryId - onCancel:(nullable MWMVoidBlock)onCancel; -+ (void)deleteNode:(NSString *)countryId; ++ (BOOL)updateNode:(NSString *)countryId error:(NSError * __autoreleasing _Nullable *)error; ++ (BOOL)deleteNode:(NSString *)countryId +ignoreUnsavedEdits:(BOOL)force + error:(NSError * __autoreleasing _Nullable *)error; + (void)cancelDownloadNode:(NSString *)countryId; + (void)showNode:(NSString *)countryId; - -+ (void)downloadNodes:(NSArray *)countryIds - onSuccess:(nullable MWMVoidBlock)onSuccess - onCancel:(nullable MWMVoidBlock)onCancel; ++ (BOOL)downloadNodes:(NSArray *)countryIds error:(NSError * __autoreleasing _Nullable *)error; + (BOOL)haveDownloadedCountries; + (BOOL)downloadInProgress; ++ (void)enableCellularDownload:(BOOL)enable; #pragma mark - Attributes diff --git a/iphone/Maps/Core/Storage/MWMStorage.mm b/iphone/CoreApi/CoreApi/Storage/MWMStorage.mm similarity index 60% rename from iphone/Maps/Core/Storage/MWMStorage.mm rename to iphone/CoreApi/CoreApi/Storage/MWMStorage.mm index 3e0e8b2695..d0b12968d6 100644 --- a/iphone/Maps/Core/Storage/MWMStorage.mm +++ b/iphone/CoreApi/CoreApi/Storage/MWMStorage.mm @@ -1,88 +1,93 @@ #import "MWMStorage.h" -#import "MWMAlertViewController.h" +#import "MWMMapNodeAttributes+Core.h" +#import "MWMMapUpdateInfo+Core.h" #include -#import -#import - #include "storage/storage_helpers.hpp" +NSErrorDomain const kStorageErrorDomain = @"com.mapswithme.storage"; + +NSInteger const kStorageNotEnoughSpace = 1; +NSInteger const kStorageNoConnection = 2; +NSInteger const kStorageCellularForbidden = 3; +NSInteger const kStorageRoutingActive = 4; +NSInteger const kStorageHaveUnsavedEdits = 5; + using namespace storage; @implementation MWMStorage -+ (void)downloadNode:(NSString *)countryId onSuccess:(MWMVoidBlock)onSuccess onCancel:(MWMVoidBlock)onCancel -{ - if (IsEnoughSpaceForDownload(countryId.UTF8String, GetFramework().GetStorage())) - { - [self checkConnectionAndPerformAction:[countryId, onSuccess] { ++ (BOOL)downloadNode:(NSString *)countryId error:(NSError *__autoreleasing _Nullable *)error { + if (IsEnoughSpaceForDownload(countryId.UTF8String, GetFramework().GetStorage())) { + NSError *connectionError; + if ([self checkConnection:&connectionError]) { GetFramework().GetStorage().DownloadNode(countryId.UTF8String); - if (onSuccess) - onSuccess(); - } cancelAction:onCancel]; - } - else - { - [[MWMAlertViewController activeAlertController] presentNotEnoughSpaceAlert]; - if (onCancel) - onCancel(); + return YES; + } else if (error) { + *error = connectionError; + } + } else if (error) { + *error = [NSError errorWithDomain:kStorageErrorDomain code:kStorageNotEnoughSpace userInfo:nil]; } + + return NO; } -+ (void)retryDownloadNode:(NSString *)countryId -{ - [self checkConnectionAndPerformAction:[countryId] { ++ (void)retryDownloadNode:(NSString *)countryId { + if ([self checkConnection:nil]) { GetFramework().GetStorage().RetryDownloadNode(countryId.UTF8String); - } cancelAction:nil]; + } } -+ (void)updateNode:(NSString *)countryId onCancel:(MWMVoidBlock)onCancel -{ - if (IsEnoughSpaceForUpdate(countryId.UTF8String, GetFramework().GetStorage())) - { - [self checkConnectionAndPerformAction:[countryId] { ++ (BOOL)updateNode:(NSString *)countryId error:(NSError *__autoreleasing _Nullable *)error { + if (IsEnoughSpaceForUpdate(countryId.UTF8String, GetFramework().GetStorage())) { + NSError *connectionError; + if ([self checkConnection:&connectionError]) { GetFramework().GetStorage().UpdateNode(countryId.UTF8String); - } cancelAction:onCancel]; - } - else - { - [[MWMAlertViewController activeAlertController] presentNotEnoughSpaceAlert]; - if (onCancel) - onCancel(); + return YES; + } else if (error) { + *error = connectionError; + } + } else if (error) { + *error = [NSError errorWithDomain:kStorageErrorDomain code:kStorageNotEnoughSpace userInfo:nil]; } + + return NO; } -+ (void)deleteNode:(NSString *)countryId -{ - auto & f = GetFramework(); - if (f.GetRoutingManager().IsRoutingActive()) - { - [[MWMAlertViewController activeAlertController] presentDeleteMapProhibitedAlert]; - return; ++ (BOOL)deleteNode:(NSString *)countryId + ignoreUnsavedEdits:(BOOL)force + error:(NSError *__autoreleasing _Nullable *)error { + auto &f = GetFramework(); + if (f.GetRoutingManager().IsRoutingActive()) { + if (error) { + *error = [NSError errorWithDomain:kStorageErrorDomain code:kStorageRoutingActive userInfo:nil]; + } + return NO; } - if (f.HasUnsavedEdits(countryId.UTF8String)) - { - [[MWMAlertViewController activeAlertController] - presentUnsavedEditsAlertWithOkBlock:[countryId] { - GetFramework().GetStorage().DeleteNode(countryId.UTF8String); - }]; - } - else - { + if (!force && f.HasUnsavedEdits(countryId.UTF8String)) { + if (error) { + *error = [NSError errorWithDomain:kStorageErrorDomain code:kStorageHaveUnsavedEdits userInfo:nil]; + } + } else { f.GetStorage().DeleteNode(countryId.UTF8String); + return YES; } + + return NO; } -+ (void)cancelDownloadNode:(NSString *)countryId -{ ++ (void)cancelDownloadNode:(NSString *)countryId { GetFramework().GetStorage().CancelDownloadNode(countryId.UTF8String); } -+ (void)showNode:(NSString *)countryId { GetFramework().ShowNode(countryId.UTF8String); } -+ (void)downloadNodes:(NSArray *)countryIds onSuccess:(MWMVoidBlock)onSuccess onCancel:(MWMVoidBlock)onCancel -{ - auto & s = GetFramework().GetStorage(); ++ (void)showNode:(NSString *)countryId { + GetFramework().ShowNode(countryId.UTF8String); +} + ++ (BOOL)downloadNodes:(NSArray *)countryIds error:(NSError *__autoreleasing _Nullable *)error { + auto &s = GetFramework().GetStorage(); MwmSize requiredSize = s.GetMaxMwmSizeBytes(); for (NSString *countryId in countryIds) { @@ -90,47 +95,49 @@ using namespace storage; GetFramework().GetStorage().GetNodeAttrs(countryId.UTF8String, nodeAttrs); requiredSize += nodeAttrs.m_mwmSize; } - if (storage::IsEnoughSpaceForDownload(requiredSize)) - { - [self checkConnectionAndPerformAction:[countryIds, onSuccess, &s] { - for (NSString *countryId in countryIds) + + if (storage::IsEnoughSpaceForDownload(requiredSize)) { + NSError *connectionError; + if ([self checkConnection:&connectionError]) { + for (NSString *countryId in countryIds) { s.DownloadNode(countryId.UTF8String); - if (onSuccess) - onSuccess(); - } cancelAction: onCancel]; - } - else - { - [[MWMAlertViewController activeAlertController] presentNotEnoughSpaceAlert]; - if (onCancel) - onCancel(); + } + return YES; + } else if (error) { + *error = connectionError; + } + } else if (error) { + *error = [NSError errorWithDomain:kStorageErrorDomain code:kStorageNotEnoughSpace userInfo:nil]; } + + return NO; } -+ (void)checkConnectionAndPerformAction:(MWMVoidBlock)action cancelAction:(MWMVoidBlock)cancel -{ - switch (Platform::ConnectionStatus()) - { ++ (BOOL)checkConnection:(NSError *__autoreleasing *)error { + switch (Platform::ConnectionStatus()) { case Platform::EConnectionType::CONNECTION_NONE: - [[MWMAlertViewController activeAlertController] presentNoConnectionAlert]; - if (cancel) - cancel(); + if (error) { + *error = [NSError errorWithDomain:kStorageErrorDomain code:kStorageNoConnection userInfo:nil]; + } + return NO; break; case Platform::EConnectionType::CONNECTION_WIFI: - action(); - break; - case Platform::EConnectionType::CONNECTION_WWAN: - { - if (!GetFramework().GetDownloadingPolicy().IsCellularDownloadEnabled()) - { - [[MWMAlertViewController activeAlertController] presentNoWiFiAlertWithOkBlock:[action] { - GetFramework().GetDownloadingPolicy().EnableCellularDownload(true); - action(); - } andCancelBlock:cancel]; + if (error) { + *error = nil; } - else - { - action(); + return YES; + break; + case Platform::EConnectionType::CONNECTION_WWAN: { + if (!GetFramework().GetDownloadingPolicy().IsCellularDownloadEnabled()) { + if (error) { + *error = [NSError errorWithDomain:kStorageErrorDomain code:kStorageCellularForbidden userInfo:nil]; + } + return NO; + } else { + if (error) { + *error = nil; + } + return YES; } break; } @@ -145,6 +152,10 @@ using namespace storage; return GetFramework().GetStorage().IsDownloadInProgress(); } ++ (void)enableCellularDownload:(BOOL)enable { + GetFramework().GetDownloadingPolicy().EnableCellularDownload(enable); +} + #pragma mark - Attributes + (NSArray *)allCountries { @@ -155,9 +166,7 @@ using namespace storage; + (NSArray *)allCountriesWithParent:(NSString *)countryId { storage::CountriesVec downloadedChildren; storage::CountriesVec availableChildren; - GetFramework().GetStorage().GetChildrenInGroups(countryId.UTF8String, - downloadedChildren, - availableChildren, + GetFramework().GetStorage().GetChildrenInGroups(countryId.UTF8String, downloadedChildren, availableChildren, true /* keepAvailableChildren */); NSMutableArray *result = [NSMutableArray arrayWithCapacity:availableChildren.size()]; @@ -170,9 +179,7 @@ using namespace storage; + (NSArray *)availableCountriesWithParent:(NSString *)countryId { storage::CountriesVec downloadedChildren; storage::CountriesVec availableChildren; - GetFramework().GetStorage().GetChildrenInGroups(countryId.UTF8String, - downloadedChildren, - availableChildren); + GetFramework().GetStorage().GetChildrenInGroups(countryId.UTF8String, downloadedChildren, availableChildren); NSMutableArray *result = [NSMutableArray arrayWithCapacity:availableChildren.size()]; for (auto const &cid : availableChildren) { @@ -189,9 +196,7 @@ using namespace storage; + (NSArray *)downloadedCountriesWithParent:(NSString *)countryId { storage::CountriesVec downloadedChildren; storage::CountriesVec availableChildren; - GetFramework().GetStorage().GetChildrenInGroups(countryId.UTF8String, - downloadedChildren, - availableChildren); + GetFramework().GetStorage().GetChildrenInGroups(countryId.UTF8String, downloadedChildren, availableChildren); NSMutableArray *result = [NSMutableArray arrayWithCapacity:downloadedChildren.size()]; for (auto const &cid : downloadedChildren) { diff --git a/iphone/Maps/Bridging-Header.h b/iphone/Maps/Bridging-Header.h index 41afe4a241..6195aed85e 100644 --- a/iphone/Maps/Bridging-Header.h +++ b/iphone/Maps/Bridging-Header.h @@ -33,7 +33,7 @@ #import "MWMAvailableAreaAffectDirection.h" #import "MWMBanner.h" #import "MWMBottomMenuViewController.h" -#import "MWMCircularProgress+Swift.h" +#import "MWMCircularProgress.h" #import "MWMCollectionViewController.h" #import "MWMConsts.h" #import "MWMController.h" @@ -69,7 +69,7 @@ #import "MWMSearchNoResults.h" #import "MWMSettings.h" #import "MWMSideButtons.h" -#import "MWMStorage.h" +#import "MWMStorage+UI.h" #import "MWMTableViewCell.h" #import "MWMTableViewController.h" #import "MWMTextToSpeech.h" diff --git a/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.mm b/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.mm index f9bcdd9d1e..e7db5f957c 100644 --- a/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.mm +++ b/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.mm @@ -4,7 +4,7 @@ #import "MWMDownloaderDialogHeader.h" #import "MWMFrameworkListener.h" #import "MWMFrameworkStorageObserver.h" -#import "MWMStorage.h" +#import "MWMStorage+UI.h" #import "Statistics.h" #import "SwiftBridge.h" #import "UILabel+RuntimeAttributes.h" diff --git a/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress+Swift.h b/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress+Swift.h deleted file mode 100644 index 2b34264a09..0000000000 --- a/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress+Swift.h +++ /dev/null @@ -1,29 +0,0 @@ -#import "MWMButton.h" -#import "MWMCircularProgressState.h" -#import "UIImageView+Coloring.h" - -@class MWMCircularProgress; - -@protocol MWMCircularProgressProtocol - -- (void)progressButtonPressed:(nonnull MWMCircularProgress *)progress; - -@end - -@interface MWMCircularProgress : NSObject - -+ (nonnull instancetype)downloaderProgressForParentView:(nonnull UIView *)parentView; - -@property(nonatomic) CGFloat progress; -@property(nonatomic) MWMCircularProgressState state; -@property(weak, nonatomic) id _Nullable delegate; - -- (void)setSpinnerColoring:(MWMImageColoring)coloring; -- (void)setSpinnerBackgroundColor:(nonnull UIColor *)backgroundColor; -- (void)setInvertColor:(BOOL)invertColor; -- (void)setCancelButtonHidden; - -- (nonnull instancetype)init __attribute__((unavailable("init is not available"))); -- (nonnull instancetype)initWithParentView:(nonnull UIView *)parentView; - -@end diff --git a/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress.h b/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress.h index a532a40d7c..545bb04d24 100644 --- a/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress.h +++ b/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress.h @@ -1,14 +1,40 @@ -#import "MWMCircularProgress+Swift.h" +#import "MWMButton.h" +#import "MWMCircularProgressState.h" +#import "UIImageView+Coloring.h" -#include +NS_ASSUME_NONNULL_BEGIN -using MWMCircularProgressStateVec = std::vector; +@class MWMCircularProgress; -@interface MWMCircularProgress () +typedef NSArray *MWMCircularProgressStateVec; + +@protocol MWMCircularProgressProtocol + +- (void)progressButtonPressed:(MWMCircularProgress *)progress; + +@end + +@interface MWMCircularProgress: NSObject + ++ (instancetype)downloaderProgressForParentView:(UIView *)parentView; + +@property(nonatomic) CGFloat progress; +@property(nonatomic) MWMCircularProgressState state; +@property(weak, nonatomic, nullable) id delegate; + +- (void)setSpinnerColoring:(MWMImageColoring)coloring; +- (void)setSpinnerBackgroundColor:(UIColor *)backgroundColor; +- (void)setInvertColor:(BOOL)invertColor; +- (void)setCancelButtonHidden; + +- (nonnull instancetype)init __attribute__((unavailable("init is not available"))); +- (nonnull instancetype)initWithParentView:(UIView *)parentView; - (void)setImageName:(nullable NSString *)imageName - forStates:(MWMCircularProgressStateVec const &)states; -- (void)setColor:(nonnull UIColor *)color forStates:(MWMCircularProgressStateVec const &)states; + forStates:(MWMCircularProgressStateVec)states; +- (void)setColor:(UIColor *)color forStates:(MWMCircularProgressStateVec)states; - (void)setColoring:(MWMButtonColoring)coloring - forStates:(MWMCircularProgressStateVec const &)states; + forStates:(MWMCircularProgressStateVec)states; @end + +NS_ASSUME_NONNULL_END diff --git a/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress.mm b/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress.m similarity index 72% rename from iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress.mm rename to iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress.m index 48a67e5324..948d14c7b7 100644 --- a/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress.mm +++ b/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgress.m @@ -24,19 +24,17 @@ progress.rootView.suspendRefreshProgress = YES; [progress setImageName:@"ic_download" - forStates:{MWMCircularProgressStateNormal, MWMCircularProgressStateSelected}]; + forStates:@[@(MWMCircularProgressStateNormal), @(MWMCircularProgressStateSelected)]]; [progress setImageName:@"ic_close_spinner" - forStates:{MWMCircularProgressStateProgress, MWMCircularProgressStateSpinner}]; - [progress setImageName:@"ic_download_error" - forStates:{MWMCircularProgressStateFailed}]; - [progress setImageName:@"ic_check" - forStates:{MWMCircularProgressStateCompleted}]; + forStates:@[@(MWMCircularProgressStateProgress), @(MWMCircularProgressStateSpinner)]]; + [progress setImageName:@"ic_download_error" forStates:@[@(MWMCircularProgressStateFailed)]]; + [progress setImageName:@"ic_check" forStates:@[@(MWMCircularProgressStateCompleted)]]; [progress setColoring:MWMButtonColoringBlack - forStates:{MWMCircularProgressStateNormal, MWMCircularProgressStateSelected, - MWMCircularProgressStateProgress, MWMCircularProgressStateSpinner}]; - [progress setColoring:MWMButtonColoringOther forStates:{MWMCircularProgressStateFailed}]; - [progress setColoring:MWMButtonColoringBlue forStates:{MWMCircularProgressStateCompleted}]; + forStates:@[@(MWMCircularProgressStateNormal), @(MWMCircularProgressStateSelected), + @(MWMCircularProgressStateProgress), @(MWMCircularProgressStateSpinner)]]; + [progress setColoring:MWMButtonColoringOther forStates:@[@(MWMCircularProgressStateFailed)]]; + [progress setColoring:MWMButtonColoringBlue forStates:@[@(MWMCircularProgressStateCompleted)]]; progress.rootView.suspendRefreshProgress = NO; @@ -80,23 +78,23 @@ } - (void)setImageName:(nullable NSString *)imageName - forStates:(MWMCircularProgressStateVec const &)states + forStates:(MWMCircularProgressStateVec)states { - for (auto const & state : states) - [self.rootView setImageName:imageName forState:state]; + for (NSNumber *state in states) + [self.rootView setImageName:imageName forState:(MWMCircularProgressState)state.integerValue]; } -- (void)setColor:(nonnull UIColor *)color forStates:(MWMCircularProgressStateVec const &)states +- (void)setColor:(UIColor *)color forStates:(MWMCircularProgressStateVec)states { - for (auto const & state : states) - [self.rootView setColor:color forState:state]; + for (NSNumber *state in states) + [self.rootView setColor:color forState:(MWMCircularProgressState)state.integerValue]; } - (void)setColoring:(MWMButtonColoring)coloring - forStates:(MWMCircularProgressStateVec const &)states + forStates:(MWMCircularProgressStateVec)states { - for (auto const & state : states) - [self.rootView setColoring:coloring forState:state]; + for (NSNumber *state in states) + [self.rootView setColoring:coloring forState:(MWMCircularProgressState)state.integerValue]; } - (void)setInvertColor:(BOOL)invertColor { self.rootView.isInvertColor = invertColor; } diff --git a/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgressView.mm b/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgressView.m similarity index 86% rename from iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgressView.mm rename to iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgressView.m index 976945e44c..de402494e3 100644 --- a/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgressView.mm +++ b/iphone/Maps/Classes/CustomViews/CircularProgress/MWMCircularProgressView.m @@ -2,15 +2,11 @@ #import "SwiftBridge.h" #import "UIImageView+Coloring.h" -#include +static CGFloat const kLineWidth = 2.0; +static NSString * const kAnimationKey = @"CircleAnimation"; -namespace -{ -CGFloat const kLineWidth = 2.0; -NSString * const kAnimationKey = @"CircleAnimation"; +static CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_PI_2; } -CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_PI_2; } -} // namespace @interface MWMCircularProgressView () @property(nonatomic) CAShapeLayer * backgroundLayer; @@ -20,6 +16,8 @@ CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_P @property(nonatomic, readonly) CGColorRef progressLayerColor; @property(nonatomic) NSMutableDictionary * colors; +@property(nonatomic) NSMutableDictionary * buttonColoring; +@property(nonatomic) NSMutableDictionary * images; @property(weak, nonatomic) IBOutlet MWMCircularProgress * owner; @property(weak, nonatomic) IBOutlet UIImageView * spinner; @@ -30,10 +28,6 @@ CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_P @end @implementation MWMCircularProgressView -{ - std::map m_buttonColoring; - std::map m_images; -} - (void)awakeFromNib { @@ -41,6 +35,7 @@ CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_P self.suspendRefreshProgress = YES; [self setupColors]; [self setupButtonColoring]; + self.images = [NSMutableDictionary dictionary]; [self setupAnimationLayers]; self.suspendRefreshProgress = NO; } @@ -65,6 +60,7 @@ CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_P - (void)setupButtonColoring { + self.buttonColoring = [NSMutableDictionary dictionary]; [self setColoring:MWMButtonColoringBlack forState:MWMCircularProgressStateNormal]; [self setColoring:MWMButtonColoringBlue forState:MWMCircularProgressStateSelected]; [self setColoring:MWMButtonColoringBlue forState:MWMCircularProgressStateProgress]; @@ -93,11 +89,11 @@ CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_P - (void)setSpinnerColoring:(MWMImageColoring)coloring { self.spinner.mwm_coloring = coloring; } - (void)setImageName:(nullable NSString *)imageName forState:(MWMCircularProgressState)state { - m_images[state] = imageName; + self.images[@(state)] = imageName; [self refreshProgress]; } -- (void)setColor:(nonnull UIColor *)color forState:(MWMCircularProgressState)state +- (void)setColor:(UIColor *)color forState:(MWMCircularProgressState)state { self.colors[@(state)] = color; [self refreshProgress]; @@ -105,7 +101,7 @@ CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_P - (void)setColoring:(MWMButtonColoring)coloring forState:(MWMCircularProgressState)state { - m_buttonColoring[state] = coloring; + self.buttonColoring[@(state)] = @(coloring); [self refreshProgress]; } @@ -121,10 +117,12 @@ CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_P self.progressLayer.strokeColor = self.progressLayerColor; CGRect rect = CGRectInset(self.bounds, kLineWidth, kLineWidth); self.backgroundLayer.path = [UIBezierPath bezierPathWithOvalInRect:rect].CGPath; - if (auto imageName = m_images[self.state]) + NSString * imageName = self.images[@(self.state)]; + if (imageName) { [self.button setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal]; - if (auto hl = [UIImage imageNamed:[imageName stringByAppendingString:@"_highlighted"]]) + UIImage *hl = [UIImage imageNamed:[imageName stringByAppendingString:@"_highlighted"]]; + if (hl) [self.button setImage:hl forState:UIControlStateHighlighted]; } else @@ -133,7 +131,7 @@ CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_P [self.button setImage:nil forState:UIControlStateHighlighted]; } - self.button.coloring = m_buttonColoring[self.state]; + self.button.coloring = (MWMButtonColoring)self.buttonColoring[@(self.state)].unsignedIntegerValue; } - (void)updatePath:(CGFloat)progress @@ -144,9 +142,8 @@ CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_P progress < 1.0 ? MWMCircularProgressStateProgress : MWMCircularProgressStateCompleted; [self stopSpinner]; } - CGPoint const center = {static_cast(self.width / 2.0), - static_cast(self.height / 2.0)}; - CGFloat const radius = MIN(center.x, center.y) - kLineWidth; + CGPoint center = CGPointMake(self.width / 2.0, self.height / 2.0); + CGFloat radius = MIN(center.x, center.y) - kLineWidth; UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:angleWithProgress(0.0) @@ -237,7 +234,7 @@ CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_P - (void)setFrame:(CGRect)frame { - BOOL const needrefreshProgress = !CGRectEqualToRect(self.frame, frame); + BOOL needrefreshProgress = !CGRectEqualToRect(self.frame, frame); super.frame = frame; if (needrefreshProgress) [self refreshProgress]; diff --git a/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm b/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm index 972378f1bc..a368a26849 100644 --- a/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm +++ b/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm @@ -86,21 +86,21 @@ static CGFloat const kDrivingOptionsHeight = 48; routerType:(MWMRouterType)routerType { MWMCircularProgress * progress = [[MWMCircularProgress alloc] initWithParentView:parentView]; - MWMCircularProgressStateVec const imageStates = {MWMCircularProgressStateNormal, - MWMCircularProgressStateProgress, MWMCircularProgressStateSpinner}; + MWMCircularProgressStateVec imageStates = @[@(MWMCircularProgressStateNormal), + @(MWMCircularProgressStateProgress), @(MWMCircularProgressStateSpinner)]; [progress setImageName:imageName forStates:imageStates]; - [progress setImageName:[imageName stringByAppendingString:@"_selected"] forStates:{MWMCircularProgressStateSelected, MWMCircularProgressStateCompleted}]; - [progress setImageName:@"ic_error" forStates:{MWMCircularProgressStateFailed}]; + [progress setImageName:[imageName stringByAppendingString:@"_selected"] forStates:@[@(MWMCircularProgressStateSelected), @(MWMCircularProgressStateCompleted)]]; + [progress setImageName:@"ic_error" forStates:@[@(MWMCircularProgressStateFailed)]]; [progress setColoring:MWMButtonColoringWhiteText - forStates:{MWMCircularProgressStateFailed, MWMCircularProgressStateSelected, - MWMCircularProgressStateProgress, MWMCircularProgressStateSpinner, - MWMCircularProgressStateCompleted}]; + forStates:@[@(MWMCircularProgressStateFailed), @(MWMCircularProgressStateSelected), + @(MWMCircularProgressStateProgress), @(MWMCircularProgressStateSpinner), + @(MWMCircularProgressStateCompleted)]]; [progress setSpinnerBackgroundColor:UIColor.clearColor]; [progress setColor:UIColor.whiteColor - forStates:{MWMCircularProgressStateProgress, MWMCircularProgressStateSpinner}]; + forStates:@[@(MWMCircularProgressStateProgress), @(MWMCircularProgressStateSpinner)]]; progress.delegate = self; m_progresses[routerType] = progress; diff --git a/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm b/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm index ab975f3c91..8f8932ad00 100644 --- a/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm +++ b/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm @@ -6,7 +6,7 @@ #import "MWMFrameworkListener.h" #import "MWMFrameworkStorageObserver.h" #import "MWMMegafonBannerViewController.h" -#import "MWMStorage.h" +#import "MWMStorage+UI.h" #import "MapViewController.h" #import "Statistics.h" #import "SwiftBridge.h" @@ -137,8 +137,7 @@ using namespace storage; [MWMStorage downloadNode:@(m_countryId.c_str()) onSuccess:^{ [self showInQueue]; - } - onCancel:nil]; + }]; } else { m_autoDownloadCountryId = kInvalidCountryId; [self showDownloadRequest]; @@ -428,8 +427,7 @@ using namespace storage; kStatScenario: kStatDownload }]; [MWMStorage downloadNode:@(m_countryId.c_str()) - onSuccess:^{ [self showInQueue]; } - onCancel:nil]; + onSuccess:^{ [self showInQueue]; }]; } #pragma mark - Properties diff --git a/iphone/Maps/Core/Routing/MWMRouter.mm b/iphone/Maps/Core/Routing/MWMRouter.mm index bf8b9a32cd..e7ee04ddb9 100644 --- a/iphone/Maps/Core/Routing/MWMRouter.mm +++ b/iphone/Maps/Core/Routing/MWMRouter.mm @@ -9,7 +9,7 @@ #import "MWMMapViewControlsManager.h" #import "MWMNavigationDashboardManager+Entity.h" #import "MWMRoutePoint+CPP.h" -#import "MWMStorage.h" +#import "MWMStorage+UI.h" #import "MapsAppDelegate.h" #import "SwiftBridge.h" #import "UIImage+RGBAData.h" @@ -727,8 +727,7 @@ void logPointEvent(MWMRoutePoint * point, NSString * eventType) [array addObject:@(cid.c_str())]; } [MWMStorage downloadNodes:array - onSuccess:onSuccess - onCancel:nil]; + onSuccess:onSuccess]; } downloadCompleteBlock:^{ [MWMRouter rebuildWithBestRouter:NO]; diff --git a/iphone/Maps/Core/Storage/MWMStorage+UI.h b/iphone/Maps/Core/Storage/MWMStorage+UI.h new file mode 100644 index 0000000000..93db970d89 --- /dev/null +++ b/iphone/Maps/Core/Storage/MWMStorage+UI.h @@ -0,0 +1,16 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface MWMStorage (UI) + ++ (void)downloadNode:(NSString *)countryId; ++ (void)downloadNode:(NSString *)countryId onSuccess:(nullable MWMVoidBlock)success; ++ (void)updateNode:(NSString *)countryId; ++ (void)updateNode:(NSString *)countryId onCancel:(nullable MWMVoidBlock)cancel; ++ (void)deleteNode:(NSString *)countryId; ++ (void)downloadNodes:(NSArray *)countryIds onSuccess:(nullable MWMVoidBlock)success; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/Maps/Core/Storage/MWMStorage+UI.m b/iphone/Maps/Core/Storage/MWMStorage+UI.m new file mode 100644 index 0000000000..19093b8efa --- /dev/null +++ b/iphone/Maps/Core/Storage/MWMStorage+UI.m @@ -0,0 +1,105 @@ +#import "MWMStorage+UI.h" +#import "MWMAlertViewController.h" + +@implementation MWMStorage (UI) + ++ (void)handleError:(NSError *)error { + if (error.code == kStorageNotEnoughSpace) { + [[MWMAlertViewController activeAlertController] presentNotEnoughSpaceAlert]; + } else if (error.code == kStorageNoConnection) { + [[MWMAlertViewController activeAlertController] presentNoConnectionAlert]; + } else if (error.code == kStorageRoutingActive) { + [[MWMAlertViewController activeAlertController] presentDeleteMapProhibitedAlert]; + } else { + NSAssert(NO, @"Unknown error code"); + } +} + ++ (void)downloadNode:(NSString *)countryId { + [self downloadNode:countryId onSuccess:nil]; +} + ++ (void)downloadNode:(NSString *)countryId onSuccess:(MWMVoidBlock)success { + NSError *error; + [self downloadNode:countryId error:&error]; + if (error) { + if (error.code == kStorageCellularForbidden) { + __weak __typeof(self) ws = self; + [[MWMAlertViewController activeAlertController] presentNoWiFiAlertWithOkBlock:^{ + [ws downloadNode:countryId]; + } andCancelBlock:nil]; + } else { + [self handleError:error]; + } + return; + } + if (success) { + success(); + } +} + ++ (void)updateNode:(NSString *)countryId { + [self updateNode:countryId onCancel:nil]; +} + ++ (void)updateNode:(NSString *)countryId onCancel:(MWMVoidBlock)cancel { + NSError *error; + [self updateNode:countryId error:&error]; + if (error) { + if (error.code == kStorageCellularForbidden) { + __weak __typeof(self) ws = self; + [[MWMAlertViewController activeAlertController] presentNoWiFiAlertWithOkBlock:^{ + [ws updateNode:countryId onCancel:cancel]; + } andCancelBlock:cancel]; + } else { + [self handleError:error]; + if (cancel) { + cancel(); + } + } + } +} + ++ (void)deleteNode:(NSString *)countryId { + [self deleteNode:countryId ignoreUnsavedEdits:NO]; +} + ++ (void)deleteNode:(NSString *)countryId ignoreUnsavedEdits:(BOOL)force { + NSError *error; + [self deleteNode:countryId ignoreUnsavedEdits:force error:&error]; + if (error) { + __weak __typeof(self) ws = self; + if (error.code == kStorageCellularForbidden) { + [[MWMAlertViewController activeAlertController] presentNoWiFiAlertWithOkBlock:^{ + [ws deleteNode:countryId]; + } andCancelBlock:nil]; + } else if (error.code == kStorageHaveUnsavedEdits) { + [[MWMAlertViewController activeAlertController] presentUnsavedEditsAlertWithOkBlock:^ { + [ws deleteNode:countryId ignoreUnsavedEdits:YES]; + }]; + } else { + [self handleError:error]; + } + } +} + ++ (void)downloadNodes:(NSArray *)countryIds onSuccess:(nullable MWMVoidBlock)success { + NSError *error; + [self downloadNodes:countryIds error:&error]; + if (error) { + if (error.code == kStorageCellularForbidden) { + __weak __typeof(self) ws = self; + [[MWMAlertViewController activeAlertController] presentNoWiFiAlertWithOkBlock:^{ + [ws downloadNodes:countryIds onSuccess:success]; + } andCancelBlock:nil]; + } else { + [self handleError:error]; + } + return; + } + if (success) { + success(); + } +} + +@end diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index b1162a344a..dd17338642 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -55,7 +55,6 @@ 3404756B1E081A4600C92850 /* MWMSearch+CoreSpotlight.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3404753B1E081A4600C92850 /* MWMSearch+CoreSpotlight.mm */; }; 3404756E1E081A4600C92850 /* MWMSearch.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3404753D1E081A4600C92850 /* MWMSearch.mm */; }; 340475711E081A4600C92850 /* MWMSettings.mm in Sources */ = {isa = PBXBuildFile; fileRef = 340475411E081A4600C92850 /* MWMSettings.mm */; }; - 340475741E081A4600C92850 /* MWMStorage.mm in Sources */ = {isa = PBXBuildFile; fileRef = 340475441E081A4600C92850 /* MWMStorage.mm */; }; 3404757E1E081B3300C92850 /* iosOGLContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3404757A1E081B3300C92850 /* iosOGLContext.mm */; }; 340475811E081B3300C92850 /* iosOGLContextFactory.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3404757C1E081B3300C92850 /* iosOGLContextFactory.mm */; }; 3404F48B202894EA0090E401 /* BMCViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3404F489202894EA0090E401 /* BMCViewController.swift */; }; @@ -439,6 +438,7 @@ 47E6688A23196F0100057733 /* UIViewController+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47E6688923196F0000057733 /* UIViewController+Subscription.swift */; }; 47E6CB0B2178BA3600EA102B /* SearchBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47E6CB092178BA3600EA102B /* SearchBannerCell.swift */; }; 47E6CB0C2178BA3600EA102B /* SearchBannerCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 47E6CB0A2178BA3600EA102B /* SearchBannerCell.xib */; }; + 47E8163323B17734008FD836 /* MWMStorage+UI.m in Sources */ = {isa = PBXBuildFile; fileRef = 47E8163223B17734008FD836 /* MWMStorage+UI.m */; }; 47EF05B321504D8F00EAC269 /* RemoveAdsPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47EF05B221504D8F00EAC269 /* RemoveAdsPresentationController.swift */; }; 47F4F21323A6EC420022FD56 /* DownloadMapsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47F4F21223A6EC420022FD56 /* DownloadMapsViewController.swift */; }; 47F4F21523A6F06F0022FD56 /* AvailableMapsDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47F4F21423A6F06F0022FD56 /* AvailableMapsDataSource.swift */; }; @@ -503,8 +503,8 @@ 6741A9CF1BF340DE002C974C /* MWMLocationAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = F6BBF2C51B4FFB72000CF8E2 /* MWMLocationAlert.m */; }; 6741A9D41BF340DE002C974C /* MWMAlertViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F19821AB81A00006EAF7E /* MWMAlertViewController.mm */; }; 6741A9E01BF340DE002C974C /* MWMDownloaderDialogHeader.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F4B731B4A45FD0081A24A /* MWMDownloaderDialogHeader.mm */; }; - 6741A9E71BF340DE002C974C /* MWMCircularProgressView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 349A35791B53D4C9009677EE /* MWMCircularProgressView.mm */; }; - 6741A9EC1BF340DE002C974C /* MWMCircularProgress.mm in Sources */ = {isa = PBXBuildFile; fileRef = 349A35761B53D4C9009677EE /* MWMCircularProgress.mm */; }; + 6741A9E71BF340DE002C974C /* MWMCircularProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 349A35791B53D4C9009677EE /* MWMCircularProgressView.m */; }; + 6741A9EC1BF340DE002C974C /* MWMCircularProgress.m in Sources */ = {isa = PBXBuildFile; fileRef = 349A35761B53D4C9009677EE /* MWMCircularProgress.m */; }; 6741A9F51BF340DE002C974C /* BookmarksVC.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA36B80615403A4F004560CC /* BookmarksVC.mm */; }; 6741A9FE1BF340DE002C974C /* SelectSetVC.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA054611155C465E001F4E37 /* SelectSetVC.mm */; }; 6741AA031BF340DE002C974C /* MWMActivityViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 340837121B7243CE00B5C185 /* MWMActivityViewController.mm */; }; @@ -720,11 +720,11 @@ F6E2FD5C1E097BA00083EBEC /* MWMMapDownloaderCellHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC051E097B9F0083EBEC /* MWMMapDownloaderCellHeader.m */; }; F6E2FD5F1E097BA00083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC071E097B9F0083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.m */; }; F6E2FD621E097BA00083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FC081E097B9F0083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.xib */; }; - F6E2FD651E097BA00083EBEC /* MWMMapDownloaderPlaceTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC0A1E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.mm */; }; + F6E2FD651E097BA00083EBEC /* MWMMapDownloaderPlaceTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC0A1E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.m */; }; F6E2FD681E097BA00083EBEC /* MWMMapDownloaderPlaceTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FC0B1E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.xib */; }; F6E2FD6B1E097BA00083EBEC /* MWMMapDownloaderSubplaceTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC0D1E097B9F0083EBEC /* MWMMapDownloaderSubplaceTableViewCell.m */; }; F6E2FD6E1E097BA00083EBEC /* MWMMapDownloaderSubplaceTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FC0E1E097B9F0083EBEC /* MWMMapDownloaderSubplaceTableViewCell.xib */; }; - F6E2FD711E097BA00083EBEC /* MWMMapDownloaderTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC101E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.mm */; }; + F6E2FD711E097BA00083EBEC /* MWMMapDownloaderTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC101E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.m */; }; F6E2FD741E097BA00083EBEC /* MWMMapDownloaderTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FC111E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.xib */; }; F6E2FD8C1E097BA00083EBEC /* MWMNoMapsView.m in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC261E097B9F0083EBEC /* MWMNoMapsView.m */; }; F6E2FD8F1E097BA00083EBEC /* MWMNoMapsViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC281E097B9F0083EBEC /* MWMNoMapsViewController.mm */; }; @@ -948,8 +948,6 @@ 3404753E1E081A4600C92850 /* MWMSearchObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchObserver.h; sourceTree = ""; }; 340475401E081A4600C92850 /* MWMSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSettings.h; sourceTree = ""; }; 340475411E081A4600C92850 /* MWMSettings.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSettings.mm; sourceTree = ""; }; - 340475431E081A4600C92850 /* MWMStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMStorage.h; sourceTree = ""; }; - 340475441E081A4600C92850 /* MWMStorage.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMStorage.mm; sourceTree = ""; }; 340475791E081B3300C92850 /* iosOGLContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iosOGLContext.h; sourceTree = ""; }; 3404757A1E081B3300C92850 /* iosOGLContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iosOGLContext.mm; sourceTree = ""; }; 3404757B1E081B3300C92850 /* iosOGLContextFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iosOGLContextFactory.h; sourceTree = ""; }; @@ -1066,7 +1064,6 @@ 3467CEB1202C6EEE00D3C670 /* BMCNotificationsHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BMCNotificationsHeader.swift; sourceTree = ""; }; 3467CEB4202C6FA900D3C670 /* BMCNotificationsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BMCNotificationsCell.swift; sourceTree = ""; }; 3467CEB5202C6FA900D3C670 /* BMCNotificationsCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BMCNotificationsCell.xib; sourceTree = ""; }; - 3467CEB8202C70A300D3C670 /* MWMCircularProgress+Swift.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MWMCircularProgress+Swift.h"; sourceTree = ""; }; 346B42A91DD5E3D20094EBEE /* MWMLocationNotFoundAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMLocationNotFoundAlert.h; sourceTree = ""; }; 346B42AA1DD5E3D20094EBEE /* MWMLocationNotFoundAlert.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMLocationNotFoundAlert.mm; sourceTree = ""; }; 346B42AD1DD5E5450094EBEE /* MWMDefaultAlert_Protected.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMDefaultAlert_Protected.h; sourceTree = ""; }; @@ -1138,10 +1135,10 @@ 349A13801DEC138C00C7DB60 /* MWMMobileInternetAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = MWMMobileInternetAlert.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 349A13811DEC138C00C7DB60 /* MWMMobileInternetAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMMobileInternetAlert.xib; sourceTree = ""; }; 349A35751B53D4C9009677EE /* MWMCircularProgress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMCircularProgress.h; sourceTree = ""; }; - 349A35761B53D4C9009677EE /* MWMCircularProgress.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMCircularProgress.mm; sourceTree = ""; }; + 349A35761B53D4C9009677EE /* MWMCircularProgress.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMCircularProgress.m; sourceTree = ""; }; 349A35771B53D4C9009677EE /* MWMCircularProgress.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMCircularProgress.xib; sourceTree = ""; }; 349A35781B53D4C9009677EE /* MWMCircularProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMCircularProgressView.h; sourceTree = ""; }; - 349A35791B53D4C9009677EE /* MWMCircularProgressView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMCircularProgressView.mm; sourceTree = ""; }; + 349A35791B53D4C9009677EE /* MWMCircularProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMCircularProgressView.m; sourceTree = ""; }; 349D1ABA1E2D05EF004A2006 /* SearchBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = ""; }; 349D1AC31E2E325B004A2006 /* MWMBottomMenuCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMBottomMenuCollectionViewCell.h; sourceTree = ""; }; 349D1AC41E2E325B004A2006 /* MWMBottomMenuCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMBottomMenuCollectionViewCell.m; sourceTree = ""; }; @@ -1545,6 +1542,8 @@ 47E6688923196F0000057733 /* UIViewController+Subscription.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Subscription.swift"; sourceTree = ""; }; 47E6CB092178BA3600EA102B /* SearchBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBannerCell.swift; sourceTree = ""; }; 47E6CB0A2178BA3600EA102B /* SearchBannerCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchBannerCell.xib; sourceTree = ""; }; + 47E8163123B17734008FD836 /* MWMStorage+UI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MWMStorage+UI.h"; sourceTree = ""; }; + 47E8163223B17734008FD836 /* MWMStorage+UI.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "MWMStorage+UI.m"; sourceTree = ""; }; 47EF05B221504D8F00EAC269 /* RemoveAdsPresentationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveAdsPresentationController.swift; sourceTree = ""; }; 47F4F21223A6EC420022FD56 /* DownloadMapsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadMapsViewController.swift; sourceTree = ""; }; 47F4F21423A6F06F0022FD56 /* AvailableMapsDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvailableMapsDataSource.swift; sourceTree = ""; }; @@ -1906,13 +1905,13 @@ F6E2FC071E097B9F0083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMMapDownloaderLargeCountryTableViewCell.m; sourceTree = ""; }; F6E2FC081E097B9F0083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMMapDownloaderLargeCountryTableViewCell.xib; sourceTree = ""; }; F6E2FC091E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapDownloaderPlaceTableViewCell.h; sourceTree = ""; }; - F6E2FC0A1E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMMapDownloaderPlaceTableViewCell.mm; sourceTree = ""; }; + F6E2FC0A1E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMMapDownloaderPlaceTableViewCell.m; sourceTree = ""; }; F6E2FC0B1E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMMapDownloaderPlaceTableViewCell.xib; sourceTree = ""; }; F6E2FC0C1E097B9F0083EBEC /* MWMMapDownloaderSubplaceTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapDownloaderSubplaceTableViewCell.h; sourceTree = ""; }; F6E2FC0D1E097B9F0083EBEC /* MWMMapDownloaderSubplaceTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMMapDownloaderSubplaceTableViewCell.m; sourceTree = ""; }; F6E2FC0E1E097B9F0083EBEC /* MWMMapDownloaderSubplaceTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMMapDownloaderSubplaceTableViewCell.xib; sourceTree = ""; }; F6E2FC0F1E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapDownloaderTableViewCell.h; sourceTree = ""; }; - F6E2FC101E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMMapDownloaderTableViewCell.mm; sourceTree = ""; }; + F6E2FC101E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMMapDownloaderTableViewCell.m; sourceTree = ""; }; F6E2FC111E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMMapDownloaderTableViewCell.xib; sourceTree = ""; }; F6E2FC211E097B9F0083EBEC /* MWMMapDownloaderMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapDownloaderMode.h; sourceTree = ""; }; F6E2FC251E097B9F0083EBEC /* MWMNoMapsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMNoMapsView.h; sourceTree = ""; }; @@ -2615,8 +2614,8 @@ 340475421E081A4600C92850 /* Storage */ = { isa = PBXGroup; children = ( - 340475431E081A4600C92850 /* MWMStorage.h */, - 340475441E081A4600C92850 /* MWMStorage.mm */, + 47E8163123B17734008FD836 /* MWMStorage+UI.h */, + 47E8163223B17734008FD836 /* MWMStorage+UI.m */, ); path = Storage; sourceTree = ""; @@ -3083,12 +3082,11 @@ isa = PBXGroup; children = ( 349A35751B53D4C9009677EE /* MWMCircularProgress.h */, - 349A35761B53D4C9009677EE /* MWMCircularProgress.mm */, + 349A35761B53D4C9009677EE /* MWMCircularProgress.m */, 349A35771B53D4C9009677EE /* MWMCircularProgress.xib */, - 3467CEB8202C70A300D3C670 /* MWMCircularProgress+Swift.h */, 340708891F2B8CBF00029ECC /* MWMCircularProgressState.h */, 349A35781B53D4C9009677EE /* MWMCircularProgressView.h */, - 349A35791B53D4C9009677EE /* MWMCircularProgressView.mm */, + 349A35791B53D4C9009677EE /* MWMCircularProgressView.m */, ); name = CircularProgress; path = CustomViews/CircularProgress; @@ -4277,13 +4275,13 @@ F6E2FC071E097B9F0083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.m */, F6E2FC081E097B9F0083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.xib */, F6E2FC091E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.h */, - F6E2FC0A1E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.mm */, + F6E2FC0A1E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.m */, F6E2FC0B1E097B9F0083EBEC /* MWMMapDownloaderPlaceTableViewCell.xib */, F6E2FC0C1E097B9F0083EBEC /* MWMMapDownloaderSubplaceTableViewCell.h */, F6E2FC0D1E097B9F0083EBEC /* MWMMapDownloaderSubplaceTableViewCell.m */, F6E2FC0E1E097B9F0083EBEC /* MWMMapDownloaderSubplaceTableViewCell.xib */, F6E2FC0F1E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.h */, - F6E2FC101E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.mm */, + F6E2FC101E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.m */, F6E2FC111E097B9F0083EBEC /* MWMMapDownloaderTableViewCell.xib */, ); path = Cells; @@ -5380,6 +5378,7 @@ 340708651F2905A500029ECC /* NavigationInfoArea.swift in Sources */, 34AB666B1FC5AA330078E451 /* TransportTransitCell.swift in Sources */, 3404163C1E7BDFE000E2B6D6 /* PhotosViewController.swift in Sources */, + 47E8163323B17734008FD836 /* MWMStorage+UI.m in Sources */, 34AB66471FC5AA330078E451 /* RouteManagerTableView.swift in Sources */, 47DF72B922520CE20004AB10 /* MWMRoutingOptions.mm in Sources */, F6E2FE611E097BA00083EBEC /* MWMBookmarkCell.mm in Sources */, @@ -5403,7 +5402,7 @@ B32FE74320D2B09600EF7446 /* CatalogWebViewController.swift in Sources */, F6E2FDB61E097BA00083EBEC /* MWMEditorAdditionalNamesHeader.m in Sources */, F6E2FDC81E097BA00083EBEC /* MWMEditorNotesFooter.m in Sources */, - F6E2FD651E097BA00083EBEC /* MWMMapDownloaderPlaceTableViewCell.mm in Sources */, + F6E2FD651E097BA00083EBEC /* MWMMapDownloaderPlaceTableViewCell.m in Sources */, F6E2FF2D1E097BA00083EBEC /* MWMSearchCell.mm in Sources */, 3454D7C51E07F045004AF2AD /* UIButton+Orientation.m in Sources */, 3454D7E61E07F045004AF2AD /* UIView+RuntimeAttributes.m in Sources */, @@ -5492,7 +5491,7 @@ 34C9BD031C6DB693000DC38D /* MWMTableViewController.m in Sources */, F6E2FD8C1E097BA00083EBEC /* MWMNoMapsView.m in Sources */, 34D3B0361E389D05004100F9 /* MWMEditorSelectTableViewCell.m in Sources */, - F6E2FD711E097BA00083EBEC /* MWMMapDownloaderTableViewCell.mm in Sources */, + F6E2FD711E097BA00083EBEC /* MWMMapDownloaderTableViewCell.m in Sources */, F6E2FE4F1E097BA00083EBEC /* MWMActionBarButton.mm in Sources */, 47F86CFF20C936FC00FEE291 /* TabView.swift in Sources */, 34AB66741FC5AA330078E451 /* BaseRoutePreviewStatus.swift in Sources */, @@ -5531,7 +5530,7 @@ 470F5A7D2189BB2F00754295 /* PaidRoutePurchase.swift in Sources */, 34AB66171FC5AA320078E451 /* MWMiPhoneRoutePreview.m in Sources */, 47E6688A23196F0100057733 /* UIViewController+Subscription.swift in Sources */, - 6741A9E71BF340DE002C974C /* MWMCircularProgressView.mm in Sources */, + 6741A9E71BF340DE002C974C /* MWMCircularProgressView.m in Sources */, 34AC8FDB1EFC07FE00E7F910 /* UILabel+NumberOfVisibleLines.swift in Sources */, 99B6A77F23684573002C94CB /* PromoDiscoveryBuilder.swift in Sources */, 4767CD9F20AAD48A00BD8166 /* Checkmark.swift in Sources */, @@ -5541,7 +5540,7 @@ 349A13831DEC138C00C7DB60 /* MWMMobileInternetAlert.m in Sources */, 349D1ADE1E2E325C004A2006 /* MWMBottomMenuViewController.mm in Sources */, BB87BF8A22FAF1CA008A8A72 /* TracksSection.mm in Sources */, - 6741A9EC1BF340DE002C974C /* MWMCircularProgress.mm in Sources */, + 6741A9EC1BF340DE002C974C /* MWMCircularProgress.m in Sources */, 99CB34C3236AEAEA001D28AD /* WhatsNewController.swift in Sources */, 470A89FD21342A9D00D72FBF /* TutorialBlurView.swift in Sources */, 342CC5F21C2D7730005F3FE5 /* MWMAuthorizationLoginViewController.mm in Sources */, @@ -5685,7 +5684,6 @@ 4719A64E21A30C3B009F9AA7 /* PaidRouteStatistics.swift in Sources */, 34BBD6601F8270360070CA50 /* AuthorizationiPadPresentationController.swift in Sources */, F6E2FED31E097BA00083EBEC /* MWMSearchHotelsFilterViewController.mm in Sources */, - 340475741E081A4600C92850 /* MWMStorage.mm in Sources */, 347752901F7251C7000D46A3 /* UGCAddReviewTextCell.swift in Sources */, 34E50DF01F6FCC41008EED49 /* UGCYourReviewCell.swift in Sources */, 34AB66381FC5AA330078E451 /* RouteManagerCell.swift in Sources */, diff --git a/iphone/Maps/UI/Autoupdate/MWMAutoupdateController.mm b/iphone/Maps/UI/Autoupdate/MWMAutoupdateController.mm index e7dd50f3b9..352360ed9b 100644 --- a/iphone/Maps/UI/Autoupdate/MWMAutoupdateController.mm +++ b/iphone/Maps/UI/Autoupdate/MWMAutoupdateController.mm @@ -2,7 +2,7 @@ #import "MWMCircularProgress.h" #import "MWMFrameworkListener.h" #import "MWMFrameworkStorageObserver.h" -#import "MWMStorage.h" +#import "MWMStorage+UI.h" #import "Statistics.h" #import "SwiftBridge.h" diff --git a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderLargeCountryTableViewCell.m b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderLargeCountryTableViewCell.m index 6b38871398..1c3b006a2b 100644 --- a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderLargeCountryTableViewCell.m +++ b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderLargeCountryTableViewCell.m @@ -1,4 +1,5 @@ #import "MWMMapDownloaderLargeCountryTableViewCell.h" +#import "MWMCircularProgress.h" #import @@ -19,4 +20,12 @@ self.mapsCount.text = [NSString stringWithFormat:@"%@: %@", L(@"downloader_status_maps"), ofMaps]; } +- (void)configProgress:(MWMMapNodeAttributes *)nodeAttrs { + [super configProgress:nodeAttrs]; + if (nodeAttrs.nodeStatus == MWMMapNodeStatusPartly || nodeAttrs.nodeStatus == MWMMapNodeStatusNotDownloaded) { + MWMCircularProgressStateVec affectedStates = @[@(MWMCircularProgressStateNormal), @(MWMCircularProgressStateSelected)]; + [self.progress setImageName:@"ic_folder" forStates:affectedStates]; + } +} + @end diff --git a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderPlaceTableViewCell.mm b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderPlaceTableViewCell.m similarity index 78% rename from iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderPlaceTableViewCell.mm rename to iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderPlaceTableViewCell.m index abc86ee234..9c5ba69b0c 100644 --- a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderPlaceTableViewCell.mm +++ b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderPlaceTableViewCell.m @@ -1,16 +1,7 @@ #import "MWMMapDownloaderPlaceTableViewCell.h" -#include #import -@interface MWMMapDownloaderTableViewCell () - -- (NSAttributedString *)matchedString:(NSString *)str - selectedAttrs:(NSDictionary *)selectedAttrs - unselectedAttrs:(NSDictionary *)unselectedAttrs; - -@end - @interface MWMMapDownloaderPlaceTableViewCell () @property(weak, nonatomic) IBOutlet UILabel *descriptionLabel; @@ -29,8 +20,7 @@ NSDictionary *unselectedAreaAttrs = @{NSFontAttributeName : [UIFont regular12]}; self.needDisplayArea = !nodeAttrs.hasParent; if (self.needDisplayArea && nodeAttrs.topmostParentInfo.count == 1) { - NSString *areaName = nodeAttrs.topmostParentInfo[0].countryId; - isDescriptionVisible = ![areaName isEqualToString:@(GetFramework().GetStorage().GetRootId().c_str())]; + isDescriptionVisible = nodeAttrs.hasParent; if (isDescriptionVisible) { self.descriptionLabel.attributedText = [self matchedString:nodeAttrs.topmostParentInfo[0].countryName selectedAttrs:selectedAreaAttrs diff --git a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderSubplaceTableViewCell.m b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderSubplaceTableViewCell.m index 17b46dfa93..88f8054d67 100644 --- a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderSubplaceTableViewCell.m +++ b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderSubplaceTableViewCell.m @@ -1,13 +1,5 @@ #import "MWMMapDownloaderSubplaceTableViewCell.h" -@interface MWMMapDownloaderTableViewCell () - -- (NSAttributedString *)matchedString:(NSString *)str - selectedAttrs:(NSDictionary *)selectedAttrs - unselectedAttrs:(NSDictionary *)unselectedAttrs; - -@end - @interface MWMMapDownloaderSubplaceTableViewCell () @property(weak, nonatomic) IBOutlet UILabel *subPlace; diff --git a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.h b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.h index e8f3b5e834..730bbe0dc7 100644 --- a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.h +++ b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.h @@ -1,6 +1,7 @@ #import "MWMMapDownloaderMode.h" #import "MWMTableViewCell.h" +@class MWMCircularProgress; @class MWMMapNodeAttributes; @class MWMMapDownloaderTableViewCell; @@ -15,13 +16,17 @@ NS_ASSUME_NONNULL_BEGIN @interface MWMMapDownloaderTableViewCell : MWMTableViewCell +@property(nonatomic) MWMCircularProgress *progress; @property(weak, nonatomic) id delegate; @property(nonatomic) MWMMapDownloaderMode mode; @property(readonly, nonatomic) MWMMapNodeAttributes *nodeAttrs; - (void)config:(MWMMapNodeAttributes *)nodeAttrs searchQuery:(nullable NSString *)searchQuery; +- (void)configProgress:(MWMMapNodeAttributes *)nodeAttrs; - (void)setDownloadProgress:(CGFloat)progress; - +- (NSAttributedString *)matchedString:(NSString *)str + selectedAttrs:(NSDictionary *)selectedAttrs + unselectedAttrs:(NSDictionary *)unselectedAttrs; @end NS_ASSUME_NONNULL_END diff --git a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.mm b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.m similarity index 86% rename from iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.mm rename to iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.m index 161a18e036..f2e18d004d 100644 --- a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.mm +++ b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.m @@ -1,16 +1,13 @@ #import "MWMMapDownloaderTableViewCell.h" #import "MWMCircularProgress.h" -#import "MWMMapDownloaderLargeCountryTableViewCell.h" #import "NSString+Categories.h" -#include #import #import #import @interface MWMMapDownloaderTableViewCell () -@property(nonatomic) MWMCircularProgress *progress; @property(copy, nonatomic) NSString *searchQuery; @property(weak, nonatomic) IBOutlet UIView *stateWrapper; @@ -48,10 +45,10 @@ selectedAttrs:(NSDictionary *)selectedAttrs unselectedAttrs:(NSDictionary *)unselectedAttrs { NSMutableAttributedString *attrTitle = [[NSMutableAttributedString alloc] initWithString:str]; - [attrTitle addAttributes:unselectedAttrs range:{0, str.length}]; + [attrTitle addAttributes:unselectedAttrs range:NSMakeRange(0, str.length)]; if (!self.searchQuery) return [attrTitle copy]; - for (NSValue *range : [str rangesOfString:self.searchQuery]) + for (NSValue *range in [str rangesOfString:self.searchQuery]) [attrTitle addAttributes:selectedAttrs range:range.rangeValue]; return [attrTitle copy]; } @@ -99,11 +96,8 @@ switch (nodeAttrs.nodeStatus) { case MWMMapNodeStatusNotDownloaded: case MWMMapNodeStatusPartly: { - MWMCircularProgressStateVec const affectedStates = {MWMCircularProgressStateNormal, - MWMCircularProgressStateSelected}; - NSString *imageName = - [self isKindOfClass:[MWMMapDownloaderLargeCountryTableViewCell class]] ? @"ic_folder" : @"ic_download"; - [progress setImageName:imageName forStates:affectedStates]; + MWMCircularProgressStateVec affectedStates = @[@(MWMCircularProgressStateNormal), @(MWMCircularProgressStateSelected)]; + [progress setImageName:@"ic_download" forStates:affectedStates]; [progress setColoring:coloring forStates:affectedStates]; progress.state = MWMCircularProgressStateNormal; break; @@ -123,7 +117,7 @@ progress.state = MWMCircularProgressStateCompleted; break; case MWMMapNodeStatusOnDiskOutOfDate: { - MWMCircularProgressStateVec affectedStates = {MWMCircularProgressStateNormal, MWMCircularProgressStateSelected}; + MWMCircularProgressStateVec affectedStates = @[@(MWMCircularProgressStateNormal), @(MWMCircularProgressStateSelected)]; [progress setImageName:@"ic_update" forStates:affectedStates]; [progress setColoring:MWMButtonColoringOther forStates:affectedStates]; progress.state = MWMCircularProgressStateNormal; diff --git a/iphone/Maps/UI/Downloader/DownloadMapsViewController.swift b/iphone/Maps/UI/Downloader/DownloadMapsViewController.swift index 6027367781..d9ca37eb7b 100644 --- a/iphone/Maps/UI/Downloader/DownloadMapsViewController.swift +++ b/iphone/Maps/UI/Downloader/DownloadMapsViewController.swift @@ -11,6 +11,12 @@ class DownloadMapsViewController: MWMViewController { case delete } + private enum AllMapsButtonState { + case none + case download(String) + case cancel(String) + } + // MARK: - Outlets @IBOutlet var tableView: UITableView! @@ -47,7 +53,7 @@ class DownloadMapsViewController: MWMViewController { case .downloaded: dataSource = DownloadedMapsDataSource() case .available: - dataSource = AvailableMapsDataSource() + dataSource = AvailableMapsDataSource(location: MWMLocationManager.lastLocation()?.coordinate) @unknown default: fatalError() } @@ -118,7 +124,7 @@ class DownloadMapsViewController: MWMViewController { action = UIAlertAction(title: "\(prefix) (\(formattedSize(nodeAttrs.totalSize)))", style: .default, handler: { _ in - Storage.downloadNode(nodeAttrs.countryId, onSuccess: nil) + Storage.downloadNode(nodeAttrs.countryId) }) case .update: let title = "\(L("downloader_status_outdated")) (TODO: updated size)" @@ -142,45 +148,44 @@ class DownloadMapsViewController: MWMViewController { } } + private func setAllMapsButton(_ state: AllMapsButtonState) { + switch state { + case .none: + allMapsView.isHidden = true + case .download(let buttonTitle): + allMapsView.isHidden = false + allMapsButton.isHidden = false + allMapsButton.setTitle(buttonTitle, for: .normal) + allMapsCancelButton.isHidden = true + case .cancel(let buttonTitle): + allMapsView.isHidden = false + allMapsButton.isHidden = true + allMapsCancelButton.isHidden = false + allMapsCancelButton.setTitle(buttonTitle, for: .normal) + } + } + fileprivate func configButtons() { allMapsView.isHidden = true if mode == .available { if dataSource.isRoot { - allMapsView.isHidden = true + setAllMapsButton(.none) } else { let parentAttributes = dataSource.parentAttributes() if parentAttributes.downloadingMwmCount > 0 { - allMapsView.isHidden = false - allMapsButton.isHidden = true - allMapsCancelButton.isHidden = false - allMapsCancelButton.setTitle( - "\(L("downloader_cancel_all")) (\(formattedSize(parentAttributes.downloadingSize)))", - for: .normal) + setAllMapsButton(.cancel("\(L("downloader_cancel_all")) (\(formattedSize(parentAttributes.downloadingSize)))")) } else if parentAttributes.downloadedMwmCount < parentAttributes.totalMwmCount { - allMapsView.isHidden = false - allMapsButton.isHidden = false - allMapsButton.setTitle( - "\(L("downloader_download_all_button")) (\(formattedSize(parentAttributes.totalSize - parentAttributes.downloadedSize)))", - for: .normal) - allMapsCancelButton.isHidden = true + setAllMapsButton(.download("\(L("downloader_download_all_button")) (\(formattedSize(parentAttributes.totalSize - parentAttributes.downloadedSize)))")) } } } else { let updateInfo = Storage.updateInfo(withParent: dataSource.parentAttributes().countryId) if updateInfo.numberOfFiles > 0 { - allMapsView.isHidden = false - allMapsButton.isHidden = false - allMapsButton.setTitle( - "\(L("downloader_update_all_button")) (\(formattedSize(updateInfo.updateSize)))", - for: .normal) - allMapsCancelButton.isHidden = true + setAllMapsButton(.download("\(L("downloader_update_all_button")) (\(formattedSize(updateInfo.updateSize)))")) } else { let parentAttributes = dataSource.parentAttributes() if parentAttributes.downloadingMwmCount > 0 { - allMapsView.isHidden = false - allMapsButton.isHidden = true - allMapsCancelButton.isHidden = false - allMapsCancelButton.setTitle(L("downloader_cancel_all"), for: .normal) + setAllMapsButton(.cancel(L("downloader_cancel_all"))) } } } @@ -195,9 +200,9 @@ class DownloadMapsViewController: MWMViewController { @IBAction func onAllMaps(_ sender: UIButton) { skipCountryEvent = true if mode == .downloaded { - Storage.updateNode(dataSource.parentAttributes().countryId, onCancel: nil) + Storage.updateNode(dataSource.parentAttributes().countryId) } else { - Storage.downloadNode(dataSource.parentAttributes().countryId, onSuccess: nil, onCancel: nil) + Storage.downloadNode(dataSource.parentAttributes().countryId) } skipCountryEvent = false self.processCountryEvent(dataSource.parentAttributes().countryId) @@ -339,7 +344,7 @@ extension DownloadMapsViewController: MWMMapDownloaderTableViewCellDelegate { if nodeAttrs.hasChildren { showChildren(nodeAttrs) } else { - Storage.downloadNode(nodeAttrs.countryId, onSuccess: nil) + Storage.downloadNode(nodeAttrs.countryId) } break @unknown default: diff --git a/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm b/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm index 6e67e1094a..d413fcd93b 100644 --- a/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm +++ b/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm @@ -9,7 +9,7 @@ #import "MWMPlacePageLayout.h" #import "MWMRoutePoint+CPP.h" #import "MWMSearchManager+Filter.h" -#import "MWMStorage.h" +#import "MWMStorage+UI.h" #import "SwiftBridge.h" #import "MWMMapViewControlsManager+AddPlace.h" @@ -168,10 +168,10 @@ void RegisterEventIfPossible(eye::MapObject::Event::Type const type, place_page: switch (nodeAttrs.m_status) { case NodeStatus::NotDownloaded: - case NodeStatus::Partly: [MWMStorage downloadNode:@(countryId.c_str()) onSuccess:nil onCancel:nil]; break; + case NodeStatus::Partly: [MWMStorage downloadNode:@(countryId.c_str())]; break; case NodeStatus::Undefined: case NodeStatus::Error: [MWMStorage retryDownloadNode:@(countryId.c_str())]; break; - case NodeStatus::OnDiskOutOfDate: [MWMStorage updateNode:@(countryId.c_str()) onCancel:nil]; break; + case NodeStatus::OnDiskOutOfDate: [MWMStorage updateNode:@(countryId.c_str())]; break; case NodeStatus::Downloading: case NodeStatus::Applying: case NodeStatus::InQueue: [MWMStorage cancelDownloadNode:@(countryId.c_str())]; break; diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMActionBarButton.mm b/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMActionBarButton.mm index f72063d2c7..3cce751785 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMActionBarButton.mm +++ b/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMActionBarButton.mm @@ -89,8 +89,8 @@ UIColor * backgroundColorForPartner(int partnerIndex) self.mapDownloadProgress = [MWMCircularProgress downloaderProgressForParentView:self.button]; self.mapDownloadProgress.delegate = self; - MWMCircularProgressStateVec const affectedStates = {MWMCircularProgressStateNormal, - MWMCircularProgressStateSelected}; + MWMCircularProgressStateVec affectedStates = @[@(MWMCircularProgressStateNormal), + @(MWMCircularProgressStateSelected)]; [self.mapDownloadProgress setImageName:@"ic_download" forStates:affectedStates]; [self.mapDownloadProgress setColoring:MWMButtonColoringBlue forStates:affectedStates];