From 24e19dd399f4b6aa13f2bf74497d9cea5d1a9f44 Mon Sep 17 00:00:00 2001 From: VladiMihaylenko Date: Wed, 25 Mar 2015 20:55:47 +0300 Subject: [PATCH] [ios] Added base rate dialog behavior. --- .../AlertController/MWMAlertViewController.h | 4 +- .../AlertController/MWMAlertViewController.mm | 18 +- .../Classes/CustomAlert/BaseAlert/MWMAlert.h | 4 +- .../Classes/CustomAlert/BaseAlert/MWMAlert.mm | 14 +- .../DefaultAlert/MWMDefaultAlert+Configure.h | 15 -- .../DefaultAlert/MWMDefaultAlert+Configure.mm | 29 -- .../DefaultAlert/MWMDefaultAlert.h | 4 - .../DefaultAlert/MWMDefaultAlert.mm | 25 +- .../MWMDownloadAllMapsAlert+Configure.h | 15 -- .../MWMDownloadAllMapsAlert+Configure.mm | 33 --- .../MWMDownloadAllMapsAlert.h | 7 - .../MWMDownloadAllMapsAlert.mm | 35 ++- .../MWMDownloadTransitMapAlert+Configure.h | 13 - .../MWMDownloadTransitMapAlert+Configure.mm | 45 ---- .../MWMDownloadTransitMapAlert.h | 10 +- .../MWMDownloadTransitMapAlert.mm | 50 +++- .../FeedbackAlert/MWMFeedbackAlert.h | 15 ++ .../FeedbackAlert/MWMFeedbackAlert.mm | 112 ++++++++ .../FeedbackAlert/MWMFeedbackAlert.xib | 117 ++++++++ .../RateAlert/MWMFeedbackAlert.xib | 117 ++++++++ .../CustomAlert/RateAlert/MWMRateAlert.h | 15 ++ .../CustomAlert/RateAlert/MWMRateAlert.mm | 195 ++++++++++++++ .../CustomAlert/RateAlert/MWMRateAlert.xib | 254 ++++++++++++++++++ iphone/Maps/Classes/MapViewController.mm | 35 +-- iphone/Maps/Classes/MapsAppDelegate.h | 2 +- iphone/Maps/Classes/MapsAppDelegate.mm | 110 +++++++- .../NewDialog/bg_rate.imageset/Contents.json | 23 ++ .../NewDialog/bg_rate.imageset/bg_rate.png | Bin 0 -> 2928 bytes .../NewDialog/bg_rate.imageset/bg_rate@2x.png | Bin 0 -> 5376 bytes .../NewDialog/bg_rate.imageset/bg_rate@3x.png | Bin 0 -> 13014 bytes .../rate-empty.imageset/Contents.json | 23 ++ .../rate-empty.imageset/rate-empty.png | Bin 0 -> 1098 bytes .../rate-empty.imageset/rate-empty@2x.png | Bin 0 -> 2558 bytes .../rate-empty.imageset/rate-empty@3x.png | Bin 0 -> 4081 bytes .../rate-full.imageset/Contents.json | 23 ++ .../rate-full.imageset/rate-full.png | Bin 0 -> 926 bytes .../rate-full.imageset/rate-full@2x.png | Bin 0 -> 1730 bytes .../rate-full.imageset/rate-full@3x.png | Bin 0 -> 2758 bytes .../rate-send.imageset/Contents.json | 23 ++ .../rate-send.imageset/rate-send.png | Bin 0 -> 188 bytes .../rate-send.imageset/rate-send@2x.png | Bin 0 -> 279 bytes .../rate-send.imageset/rate-send@3x.png | Bin 0 -> 332 bytes iphone/Maps/Maps.xcodeproj/project.pbxproj | 54 ++-- iphone/Maps/SettingsAndMoreVC.mm | 100 +++---- 44 files changed, 1237 insertions(+), 302 deletions(-) delete mode 100644 iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert+Configure.h delete mode 100644 iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert+Configure.mm delete mode 100644 iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert+Configure.h delete mode 100644 iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert+Configure.mm delete mode 100644 iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert+Configure.h delete mode 100644 iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert+Configure.mm create mode 100644 iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.h create mode 100644 iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.mm create mode 100644 iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.xib create mode 100644 iphone/Maps/Classes/CustomAlert/RateAlert/MWMFeedbackAlert.xib create mode 100644 iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.h create mode 100644 iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.mm create mode 100644 iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.xib create mode 100644 iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/Contents.json create mode 100644 iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/bg_rate.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/bg_rate@2x.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/bg_rate@3x.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-empty.imageset/Contents.json create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-empty.imageset/rate-empty.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-empty.imageset/rate-empty@2x.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-empty.imageset/rate-empty@3x.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-full.imageset/Contents.json create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-full.imageset/rate-full.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-full.imageset/rate-full@2x.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-full.imageset/rate-full@3x.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-send.imageset/Contents.json create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-send.imageset/rate-send.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-send.imageset/rate-send@2x.png create mode 100644 iphone/Maps/Images.xcassets/NewDialog/rate-send.imageset/rate-send@3x.png diff --git a/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.h b/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.h index 03bb6e9ab9..a171082f99 100644 --- a/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.h +++ b/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.h @@ -18,7 +18,9 @@ - (instancetype)initWithViewController:(UIViewController *)viewController; - (void)presentAlert:(routing::IRouter::ResultCode)type; -- (void)presentDownloaderAlertWithCountrieIndex:(const storage::TIndex&)index; +- (void)presentDownloaderAlertWithCountryIndex:(const storage::TIndex&)index; +- (void)presentRateAlert; +- (void)presentFeedbackAlertWithStarsCount:(NSUInteger)starsCount; - (void)closeAlert; @end diff --git a/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.mm b/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.mm index d602c4f526..57febc209e 100644 --- a/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.mm +++ b/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.mm @@ -28,8 +28,6 @@ static NSString * const kAlertControllerNibIdentifier = @"MWMAlertViewController - (void)viewDidLoad { [super viewDidLoad]; - self.view.frame = UIApplication.sharedApplication.keyWindow.bounds; - // Need only for iOS 5. if ([[[UIDevice currentDevice] systemVersion] integerValue] < 6) { self.tap.delegate = self; @@ -38,8 +36,18 @@ static NSString * const kAlertControllerNibIdentifier = @"MWMAlertViewController #pragma mark - Actions -- (void)presentDownloaderAlertWithCountrieIndex:(const storage::TIndex&)index { - MWMAlert *alert = [MWMAlert downloaderAlertWithCountrieIndex:index]; +- (void)presentRateAlert { + MWMAlert *alert = [MWMAlert rateAlert]; + [self displayAlert:alert]; +} + +- (void)presentFeedbackAlertWithStarsCount:(NSUInteger)starsCount { + MWMAlert *alert = [MWMAlert feedbackAlertWithStarsCount:starsCount]; + [self displayAlert:alert]; +} + +- (void)presentDownloaderAlertWithCountryIndex:(const storage::TIndex&)index { + MWMAlert *alert = [MWMAlert downloaderAlertWithCountryIndex:index]; [self displayAlert:alert]; } @@ -53,6 +61,8 @@ static NSString * const kAlertControllerNibIdentifier = @"MWMAlertViewController [self.ownerViewController addChildViewController:self]; self.view.center = self.ownerViewController.view.center; [self.ownerViewController.view addSubview:self.view]; + [[[[UIApplication sharedApplication] delegate] window] addSubview:self.view]; + self.view.frame = [[[[UIApplication sharedApplication] delegate] window] frame]; [self.view addSubview:alert]; alert.center = self.view.center; } diff --git a/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.h b/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.h index 3972328547..906cc25895 100644 --- a/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.h +++ b/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.h @@ -17,6 +17,8 @@ @property (nonatomic, weak) MWMAlertViewController *alertController; + (MWMAlert *)alert:(routing::IRouter::ResultCode)type; -+ (MWMAlert *)downloaderAlertWithCountrieIndex:(const storage::TIndex&)index; ++ (MWMAlert *)downloaderAlertWithCountryIndex:(const storage::TIndex&)index; ++ (MWMAlert *)rateAlert; ++ (MWMAlert *)feedbackAlertWithStarsCount:(NSUInteger)starsCount; @end diff --git a/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.mm b/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.mm index 458c943f3b..3e14456d06 100644 --- a/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.mm +++ b/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.mm @@ -10,13 +10,23 @@ #import "MWMDownloadTransitMapAlert.h" #import "MWMDownloadAllMapsAlert.h" #import "MWMDefaultAlert.h" +#import "MWMFeedbackAlert.h" +#import "MWMRateAlert.h" extern UIColor * const kActiveDownloaderViewColor = [UIColor colorWithRed:211/255. green:209/255. blue:205/255. alpha:1.]; @implementation MWMAlert -+ (MWMAlert *)downloaderAlertWithCountrieIndex:(const storage::TIndex&)index { - return [MWMDownloadTransitMapAlert alertWithCountrieIndex:index]; ++ (MWMAlert *)rateAlert { + return [MWMRateAlert alert]; +} + ++ (MWMAlert *)feedbackAlertWithStarsCount:(NSUInteger)starsCount { + return [MWMFeedbackAlert alertWithStarsCount:starsCount]; +} + ++ (MWMAlert *)downloaderAlertWithCountryIndex:(const storage::TIndex&)index { + return [MWMDownloadTransitMapAlert alertWithCountryIndex:index]; } + (MWMAlert *)alert:(routing::IRouter::ResultCode)type { diff --git a/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert+Configure.h b/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert+Configure.h deleted file mode 100644 index 09035172b8..0000000000 --- a/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert+Configure.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// MWMRouteNotFoundDefaultAlert+Configure.h -// Maps -// -// Created by v.mikhaylenko on 12.03.15. -// Copyright (c) 2015 MapsWithMe. All rights reserved. -// - -#import "MWMDefaultAlert.h" - -@interface MWMDefaultAlert (Configure) - -- (void)configure; - -@end diff --git a/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert+Configure.mm b/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert+Configure.mm deleted file mode 100644 index a61162c0fd..0000000000 --- a/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert+Configure.mm +++ /dev/null @@ -1,29 +0,0 @@ -// -// MWMRouteNotFoundDefaultAlert+Configure.m -// Maps -// -// Created by v.mikhaylenko on 12.03.15. -// Copyright (c) 2015 MapsWithMe. All rights reserved. -// - -#import "MWMDefaultAlert+Configure.h" -#import "UIKitCategories.h" - -@implementation MWMDefaultAlert (Configure) - -- (void)configure { - [self.messageLabel sizeToFit]; - [self configureViewSize]; -} - -- (void)configureViewSize { - const CGFloat topMainViewOffset = 17.; - const CGFloat minMainViewHeight = 144.; - const CGFloat actualMainViewHeight = 2 * topMainViewOffset + self.messageLabel.height + self.okButton.height; - self.height = actualMainViewHeight >= minMainViewHeight ? actualMainViewHeight : minMainViewHeight; - self.messageLabel.minY = topMainViewOffset; - self.deviderLine.minY = self.height - self.okButton.height; - self.okButton.minY = self.deviderLine.minY + self.deviderLine.height; -} - -@end diff --git a/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.h b/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.h index 8b97a33235..c7a0c8dad5 100644 --- a/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.h +++ b/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.h @@ -17,8 +17,4 @@ + (instancetype)noCurrentPositionAlert; + (instancetype)pointsInDifferentMWMAlert; -@property (nonatomic, weak, readonly) IBOutlet UILabel *messageLabel; -@property (nonatomic, weak, readonly) IBOutlet UIButton *okButton; -@property (nonatomic, weak, readonly) IBOutlet UIView *deviderLine; - @end diff --git a/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.mm b/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.mm index cc0591a3e8..37f0e75e22 100644 --- a/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.mm +++ b/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.mm @@ -8,14 +8,14 @@ #import "MWMDefaultAlert.h" #import "MWMAlertViewController.h" -#import "MWMDefaultAlert+Configure.h" #import "UILabel+RuntimeAttributes.h" +#import "UIKitCategories.h" @interface MWMDefaultAlert () -@property (nonatomic, weak, readwrite) IBOutlet UILabel *messageLabel; -@property (nonatomic, weak, readwrite) IBOutlet UIButton *okButton; -@property (nonatomic, weak, readwrite) IBOutlet UIView *deviderLine; +@property (nonatomic, weak) IBOutlet UILabel *messageLabel; +@property (nonatomic, weak) IBOutlet UIButton *okButton; +@property (nonatomic, weak) IBOutlet UIView *deviderLine; @end @@ -60,4 +60,21 @@ static NSString * const kDefaultAlertNibName = @"MWMDefaultAlert"; [self.alertController closeAlert]; } +#pragma mark - Configure + +- (void)configure { + [self.messageLabel sizeToFit]; + [self configureViewSize]; +} + +- (void)configureViewSize { + const CGFloat topMainViewOffset = 17.; + const CGFloat minMainViewHeight = 144.; + const CGFloat actualMainViewHeight = 2 * topMainViewOffset + self.messageLabel.height + self.okButton.height; + self.height = actualMainViewHeight >= minMainViewHeight ? actualMainViewHeight : minMainViewHeight; + self.messageLabel.minY = topMainViewOffset; + self.deviderLine.minY = self.height - self.okButton.height; + self.okButton.minY = self.deviderLine.minY + self.deviderLine.height; +} + @end diff --git a/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert+Configure.h b/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert+Configure.h deleted file mode 100644 index 04c3eea0cc..0000000000 --- a/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert+Configure.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// MWMDownloadAllMapsAlert+Configure.h -// Maps -// -// Created by v.mikhaylenko on 12.03.15. -// Copyright (c) 2015 MapsWithMe. All rights reserved. -// - -#import "MWMDownloadAllMapsAlert.h" - -@interface MWMDownloadAllMapsAlert (Configure) - -- (void)configure; - -@end diff --git a/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert+Configure.mm b/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert+Configure.mm deleted file mode 100644 index f49b101ef4..0000000000 --- a/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert+Configure.mm +++ /dev/null @@ -1,33 +0,0 @@ -// -// MWMDownloadAllMapsAlert+Configure.m -// Maps -// -// Created by v.mikhaylenko on 12.03.15. -// Copyright (c) 2015 MapsWithMe. All rights reserved. -// - -#import "MWMDownloadAllMapsAlert+Configure.h" -#import "UIKitCategories.h" - -@implementation MWMDownloadAllMapsAlert (Configure) - -- (void)configure { - [self.titleLabel sizeToFit]; - [self.messageLabel sizeToFit]; - [self configureMainViewSize]; -} - -- (void)configureMainViewSize { - const CGFloat topMainViewOffset = 17.; - const CGFloat secondMainViewOffset = 14.; - const CGFloat thirdMainViewOffset = 20.; - const CGFloat bottomMainViewOffset = 52.; - const CGFloat mainViewHeight = topMainViewOffset + self.titleLabel.height + secondMainViewOffset + self.messageLabel.height + thirdMainViewOffset + self.specsView.height + bottomMainViewOffset; - self.height = mainViewHeight; - self.titleLabel.minY = topMainViewOffset; - self.messageLabel.minY = self.titleLabel.minY + self.titleLabel.height + secondMainViewOffset; - self.specsView.minY = self.messageLabel.minY + self.messageLabel.height + thirdMainViewOffset; - self.notNowButton.minY = self.specsView.minY + self.specsView.height; -} - -@end diff --git a/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert.h b/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert.h index d3dbc67b1f..bcd130345c 100644 --- a/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert.h +++ b/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert.h @@ -12,11 +12,4 @@ + (instancetype)alert; -@property (nonatomic, weak, readonly) IBOutlet UIView *specsView; -@property (nonatomic, weak, readonly) IBOutlet UILabel *titleLabel; -@property (nonatomic, weak, readonly) IBOutlet UILabel *messageLabel; -@property (nonatomic, weak, readonly) IBOutlet UIButton *notNowButton; -@property (nonatomic, weak, readonly) IBOutlet UIButton *downloadButton; -@property (nonatomic, weak, readonly) IBOutlet UILabel *downloadMapsLabel; - @end diff --git a/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert.mm b/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert.mm index ec54ff40ad..77f3df9081 100644 --- a/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert.mm +++ b/iphone/Maps/Classes/CustomAlert/DownloadAllMapsAlert/MWMDownloadAllMapsAlert.mm @@ -9,15 +9,15 @@ #import "MWMDownloadAllMapsAlert.h" #import "MWMAlertViewController.h" #import "CountryTreeVC.h" -#import "MWMDownloadAllMapsAlert+Configure.h" +#import "UIKitCategories.h" @interface MWMDownloadAllMapsAlert () -@property (nonatomic, weak, readwrite) IBOutlet UIView *specsView; -@property (nonatomic, weak, readwrite) IBOutlet UILabel *titleLabel; -@property (nonatomic, weak, readwrite) IBOutlet UILabel *messageLabel; -@property (nonatomic, weak, readwrite) IBOutlet UIButton *notNowButton; -@property (nonatomic, weak, readwrite) IBOutlet UIButton *downloadButton; -@property (nonatomic, weak, readwrite) IBOutlet UILabel *downloadMapsLabel; +@property (nonatomic, weak) IBOutlet UIView *specsView; +@property (nonatomic, weak) IBOutlet UILabel *titleLabel; +@property (nonatomic, weak) IBOutlet UILabel *messageLabel; +@property (nonatomic, weak) IBOutlet UIButton *notNowButton; +@property (nonatomic, weak) IBOutlet UIButton *downloadButton; +@property (nonatomic, weak) IBOutlet UILabel *downloadMapsLabel; @end static NSString * const kDownloadAllMapsAlertNibName = @"MWMDownloadAllMapsAlert"; @@ -48,4 +48,25 @@ static NSInteger const kNodePositionForDownloadMaps = -1; }]; } +#pragma mark - Configure + +- (void)configure { + [self.titleLabel sizeToFit]; + [self.messageLabel sizeToFit]; + [self configureMainViewSize]; +} + +- (void)configureMainViewSize { + const CGFloat topMainViewOffset = 17.; + const CGFloat secondMainViewOffset = 14.; + const CGFloat thirdMainViewOffset = 20.; + const CGFloat bottomMainViewOffset = 52.; + const CGFloat mainViewHeight = topMainViewOffset + self.titleLabel.height + secondMainViewOffset + self.messageLabel.height + thirdMainViewOffset + self.specsView.height + bottomMainViewOffset; + self.height = mainViewHeight; + self.titleLabel.minY = topMainViewOffset; + self.messageLabel.minY = self.titleLabel.minY + self.titleLabel.height + secondMainViewOffset; + self.specsView.minY = self.messageLabel.minY + self.messageLabel.height + thirdMainViewOffset; + self.notNowButton.minY = self.specsView.minY + self.specsView.height; +} + @end diff --git a/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert+Configure.h b/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert+Configure.h deleted file mode 100644 index 318cd61233..0000000000 --- a/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert+Configure.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// MWMDownloadTransitMapAlert+Configure.h -// Maps -// -// Created by v.mikhaylenko on 12.03.15. -// Copyright (c) 2015 MapsWithMe. All rights reserved. -// - -#import "MWMDownloadTransitMapAlert.h" - -@interface MWMDownloadTransitMapAlert (Configure) -- (void)configure; -@end diff --git a/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert+Configure.mm b/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert+Configure.mm deleted file mode 100644 index f49155d11c..0000000000 --- a/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert+Configure.mm +++ /dev/null @@ -1,45 +0,0 @@ -// -// MWMDownloadTransitMapAlert+Configure.m -// Maps -// -// Created by v.mikhaylenko on 12.03.15. -// Copyright (c) 2015 MapsWithMe. All rights reserved. -// - -#import "MWMDownloadTransitMapAlert+Configure.h" -#import "UIKitCategories.h" - -@implementation MWMDownloadTransitMapAlert (Configure) - -- (void)configure { - [self.messageLabel sizeToFit]; - [self.titleLabel sizeToFit]; - [self.countryLabel sizeToFit]; - [self configureSpecsViewSize]; - [self configureMaintViewSize]; -} - -- (void)configureSpecsViewSize { - const CGFloat topSpecsViewOffset = 16.; - const CGFloat specsViewHeight = 2 * topSpecsViewOffset + self.countryLabel.frame.size.height; - self.specsView.height = specsViewHeight; - self.countryLabel.minY = topSpecsViewOffset; - self.sizeLabel.center = CGPointMake(self.sizeLabel.center.x, self.countryLabel.center.y); -} - -- (void)configureMaintViewSize { - const CGFloat topMainViewOffset = 17.; - const CGFloat secondMainViewOffset = 14.; - const CGFloat thirdMainViewOffset = 20.; - const CGFloat bottomMainViewOffset = 52.; - const CGFloat mainViewHeight = topMainViewOffset + self.titleLabel.frame.size.height + secondMainViewOffset + self.messageLabel.frame.size.height + thirdMainViewOffset + self.specsView.frame.size.height + bottomMainViewOffset; - self.height = mainViewHeight; - self.titleLabel.minY = topMainViewOffset; - self.messageLabel.minY = self.titleLabel.frame.origin.y + self.titleLabel.frame.size.height + secondMainViewOffset; - self.specsView.minY = self.messageLabel.frame.origin.y + self.messageLabel.frame.size.height + thirdMainViewOffset; - self.notNowButton.minY = self.specsView.frame.origin.y + self.specsView.frame.size.height; - self.downloadButton.minY = self.notNowButton.frame.origin.y; -} - - -@end diff --git a/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.h b/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.h index b94cc9228a..d4b3892d81 100644 --- a/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.h +++ b/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.h @@ -13,14 +13,6 @@ @interface MWMDownloadTransitMapAlert : MWMAlert -+ (instancetype)alertWithCountrieIndex:(const storage::TIndex)index; - -@property (nonatomic, weak, readonly) IBOutlet UILabel *titleLabel; -@property (nonatomic, weak, readonly) IBOutlet UILabel *messageLabel; -@property (nonatomic, weak, readonly) IBOutlet UIButton *notNowButton; -@property (nonatomic, weak, readonly) IBOutlet UIButton *downloadButton; -@property (nonatomic, weak, readonly) IBOutlet UILabel *sizeLabel; -@property (nonatomic, weak, readonly) IBOutlet UILabel *countryLabel; -@property (nonatomic, weak, readonly) IBOutlet UIView *specsView; ++ (instancetype)alertWithCountryIndex:(const storage::TIndex)index; @end diff --git a/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.mm b/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.mm index a79ce7c259..e99e4383fa 100644 --- a/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.mm +++ b/iphone/Maps/Classes/CustomAlert/DownloadTransitMapsAlert/MWMDownloadTransitMapAlert.mm @@ -9,18 +9,18 @@ #import "MWMDownloadTransitMapAlert.h" #import "MWMAlertViewController.h" #import "ActiveMapsVC.h" -#import "MWMDownloadTransitMapAlert+Configure.h" +#import "UIKitCategories.h" typedef void (^MWMDownloaderBlock)(); @interface MWMDownloadTransitMapAlert () -@property (nonatomic, weak, readwrite) IBOutlet UILabel *titleLabel; -@property (nonatomic, weak, readwrite) IBOutlet UILabel *messageLabel; -@property (nonatomic, weak, readwrite) IBOutlet UIButton *notNowButton; -@property (nonatomic, weak, readwrite) IBOutlet UIButton *downloadButton; -@property (nonatomic, weak, readwrite) IBOutlet UILabel *sizeLabel; -@property (nonatomic, weak, readwrite) IBOutlet UILabel *countryLabel; -@property (nonatomic, weak, readwrite) IBOutlet UIView *specsView; +@property (nonatomic, weak) IBOutlet UILabel *titleLabel; +@property (nonatomic, weak) IBOutlet UILabel *messageLabel; +@property (nonatomic, weak) IBOutlet UIButton *notNowButton; +@property (nonatomic, weak) IBOutlet UIButton *downloadButton; +@property (nonatomic, weak) IBOutlet UILabel *sizeLabel; +@property (nonatomic, weak) IBOutlet UILabel *countryLabel; +@property (nonatomic, weak) IBOutlet UIView *specsView; @property (nonatomic, copy) MWMDownloaderBlock downloaderBlock; @end @@ -29,7 +29,7 @@ extern UIColor * const kActiveDownloaderViewColor; @implementation MWMDownloadTransitMapAlert -+ (instancetype)alertWithCountrieIndex:(const storage::TIndex)index { ++ (instancetype)alertWithCountryIndex:(const storage::TIndex)index { MWMDownloadTransitMapAlert *alert = [[[NSBundle mainBundle] loadNibNamed:kDownloadTransitMapAlertNibName owner:self options:nil] firstObject]; ActiveMapsLayout& layout = GetFramework().GetCountryTree().GetActiveMapLayout(); alert.countryLabel.text = [NSString stringWithUTF8String:layout.GetFormatedCountryName(index).c_str()]; @@ -66,4 +66,36 @@ extern UIColor * const kActiveDownloaderViewColor; [self.alertController.ownerViewController.navigationController pushViewController:activeMapsViewController animated:YES]; } +#pragma mark - Configure + +- (void)configure { + [self.messageLabel sizeToFit]; + [self.titleLabel sizeToFit]; + [self.countryLabel sizeToFit]; + [self configureSpecsViewSize]; + [self configureMaintViewSize]; +} + +- (void)configureSpecsViewSize { + const CGFloat topSpecsViewOffset = 16.; + const CGFloat specsViewHeight = 2 * topSpecsViewOffset + self.countryLabel.frame.size.height; + self.specsView.height = specsViewHeight; + self.countryLabel.minY = topSpecsViewOffset; + self.sizeLabel.center = CGPointMake(self.sizeLabel.center.x, self.countryLabel.center.y); +} + +- (void)configureMaintViewSize { + const CGFloat topMainViewOffset = 17.; + const CGFloat secondMainViewOffset = 14.; + const CGFloat thirdMainViewOffset = 20.; + const CGFloat bottomMainViewOffset = 52.; + const CGFloat mainViewHeight = topMainViewOffset + self.titleLabel.frame.size.height + secondMainViewOffset + self.messageLabel.frame.size.height + thirdMainViewOffset + self.specsView.frame.size.height + bottomMainViewOffset; + self.height = mainViewHeight; + self.titleLabel.minY = topMainViewOffset; + self.messageLabel.minY = self.titleLabel.frame.origin.y + self.titleLabel.frame.size.height + secondMainViewOffset; + self.specsView.minY = self.messageLabel.frame.origin.y + self.messageLabel.frame.size.height + thirdMainViewOffset; + self.notNowButton.minY = self.specsView.frame.origin.y + self.specsView.frame.size.height; + self.downloadButton.minY = self.notNowButton.frame.origin.y; +} + @end \ No newline at end of file diff --git a/iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.h b/iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.h new file mode 100644 index 0000000000..f59afe33fe --- /dev/null +++ b/iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.h @@ -0,0 +1,15 @@ +// +// MWMFeedbackAlert.h +// Maps +// +// Created by v.mikhaylenko on 25.03.15. +// Copyright (c) 2015 MapsWithMe. All rights reserved. +// + +#import "MWMAlert.h" + +@interface MWMFeedbackAlert : MWMAlert + ++ (instancetype)alertWithStarsCount:(NSUInteger)starsCount; + +@end diff --git a/iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.mm b/iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.mm new file mode 100644 index 0000000000..6d9e63c893 --- /dev/null +++ b/iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.mm @@ -0,0 +1,112 @@ +// +// MWMFeedbackAlert.m +// Maps +// +// Created by v.mikhaylenko on 25.03.15. +// Copyright (c) 2015 MapsWithMe. All rights reserved. +// + +#import "MWMFeedbackAlert.h" +#import "MWMAlertViewController.h" +#import +#import "UIKitCategories.h" +#import + +#include "../../platform/platform.hpp" + +@interface MWMFeedbackAlert () + +@property (nonatomic, weak) IBOutlet UIView *specsView; +@property (nonatomic, weak) IBOutlet UILabel *titleLabel; +@property (nonatomic, weak) IBOutlet UILabel *messageLabel; +@property (nonatomic, weak) IBOutlet UIButton *notNowButton; +@property (nonatomic, weak) IBOutlet UIButton *writeFeedbackButton; +@property (nonatomic, weak) IBOutlet UILabel *writeFeedbackLabel; +@property (nonatomic, assign) NSUInteger starsCount; + +@end + +static NSString * const kFeedbackAlertNibName = @"MWMFeedbackAlert"; +extern NSString * const kiOSEmail; +extern NSDictionary * const deviceNames; +extern UIColor * const kActiveDownloaderViewColor; +extern NSString * const kLocaleUsedInSupportEmails; + +@implementation MWMFeedbackAlert + ++ (instancetype)alertWithStarsCount:(NSUInteger)starsCount { + MWMFeedbackAlert *alert = [[[NSBundle mainBundle] loadNibNamed:kFeedbackAlertNibName owner:self options:nil] firstObject]; + alert.starsCount = starsCount; + [alert configure]; + return alert; +} + +#pragma mark - Actions + +- (IBAction)notNowButtonTap:(id)sender { + [self.alertController closeAlert]; +} + +- (IBAction)writeFeedbackButtonTap:(id)sender { + [UIView animateWithDuration:0.2f animations:^{ + self.specsView.backgroundColor = kActiveDownloaderViewColor; + } completion:^(BOOL finished) { + self.alpha = 0.; + self.alertController.view.alpha = 0.; + if ([MFMailComposeViewController canSendMail]) + { + struct utsname systemInfo; + uname(&systemInfo); + NSString * machine = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; + NSString * device = deviceNames[machine]; + if (!device) + device = machine; + NSString * languageCode = [[NSLocale preferredLanguages] firstObject]; + NSString * language = [[NSLocale localeWithLocaleIdentifier:kLocaleUsedInSupportEmails] displayNameForKey:NSLocaleLanguageCode value:languageCode]; + NSString * locale = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; + NSString * country = [[NSLocale localeWithLocaleIdentifier:kLocaleUsedInSupportEmails] displayNameForKey:NSLocaleCountryCode value:locale]; + NSString * bundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey]; + NSString * text = [NSString stringWithFormat:@"\n\n\n\n- %@ (%@)\n- MAPS.ME %@\n- %@/%@", device, [UIDevice currentDevice].systemVersion, bundleVersion, language, country]; + MFMailComposeViewController *mailController = [[MFMailComposeViewController alloc] init]; + mailController.mailComposeDelegate = self; + [mailController setSubject:[NSString stringWithFormat:@"%@ : %@", L(@"rating_just_rated"),@(self.starsCount)]]; + [mailController setToRecipients:@[kiOSEmail]]; + [mailController setMessageBody:text isHTML:NO]; + [self.alertController.ownerViewController presentViewController:mailController animated:YES completion:nil]; + } else { + NSString * text = [NSString stringWithFormat:L(@"email_error_body"), kiOSEmail]; + [[[UIAlertView alloc] initWithTitle:L(@"email_error_title") message:text delegate:nil cancelButtonTitle:L(@"ok") otherButtonTitles:nil] show]; + } + }]; +} + +#pragma mark - MFMailComposeViewControllerDelegate + +- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error { + [self.alertController.ownerViewController dismissViewControllerAnimated:YES completion:^{ + [self.alertController closeAlert]; + }]; +} + +#pragma mark - Configure + +- (void)configure { + [self.titleLabel sizeToFit]; + [self.messageLabel sizeToFit]; + [self configureMainViewSize]; +} + +- (void)configureMainViewSize { + CGFloat const topMainViewOffset = 17.; + CGFloat const secondMainViewOffset = 14.; + CGFloat const thirdMainViewOffset = 20.; + CGFloat const bottomMainViewOffset = 52.; + CGFloat const mainViewHeight = topMainViewOffset + self.titleLabel.height + secondMainViewOffset + self.messageLabel.height + thirdMainViewOffset + self.specsView.height + bottomMainViewOffset; + self.height = mainViewHeight; + self.titleLabel.minY = topMainViewOffset; + self.messageLabel.minY = self.titleLabel.minY + self.titleLabel.height + secondMainViewOffset; + self.specsView.minY = self.messageLabel.minY + self.messageLabel.height + thirdMainViewOffset; + self.notNowButton.minY = self.specsView.minY + self.specsView.height; +} + +@end diff --git a/iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.xib b/iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.xib new file mode 100644 index 0000000000..fd34dbdc54 --- /dev/null +++ b/iphone/Maps/Classes/CustomAlert/FeedbackAlert/MWMFeedbackAlert.xib @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iphone/Maps/Classes/CustomAlert/RateAlert/MWMFeedbackAlert.xib b/iphone/Maps/Classes/CustomAlert/RateAlert/MWMFeedbackAlert.xib new file mode 100644 index 0000000000..fd34dbdc54 --- /dev/null +++ b/iphone/Maps/Classes/CustomAlert/RateAlert/MWMFeedbackAlert.xib @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.h b/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.h new file mode 100644 index 0000000000..c8d576f65a --- /dev/null +++ b/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.h @@ -0,0 +1,15 @@ +// +// MWMRateAlert.h +// Maps +// +// Created by v.mikhaylenko on 25.03.15. +// Copyright (c) 2015 MapsWithMe. All rights reserved. +// + +#import "MWMAlert.h" + +@interface MWMRateAlert : MWMAlert + ++ (instancetype)alert; + +@end diff --git a/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.mm b/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.mm new file mode 100644 index 0000000000..4b2dbc45c5 --- /dev/null +++ b/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.mm @@ -0,0 +1,195 @@ +// +// MWMRateAlert.m +// Maps +// +// Created by v.mikhaylenko on 25.03.15. +// Copyright (c) 2015 MapsWithMe. All rights reserved. +// + +#import "MWMRateAlert.h" +#import "MWMAlertViewController.h" +#import "UIKitCategories.h" + +#include "../../../../../map/dialog_settings.hpp" + +extern NSString * const kUDAlreadyRatedKey; + +@interface MWMRateAlert () + +@property (nonatomic, weak) IBOutlet UILabel *titleLabel; +@property (nonatomic, weak) IBOutlet UILabel *messageLabel; +@property (nonatomic, weak) IBOutlet UIButton *oneStarButton; +@property (nonatomic, weak) IBOutlet UIButton *twoStarButton; +@property (nonatomic, weak) IBOutlet UIButton *threeStarButton; +@property (nonatomic, weak) IBOutlet UIButton *fourStarButton; +@property (nonatomic, weak) IBOutlet UIButton *fiveStarButton; +@property (nonatomic, weak) IBOutlet UIImageView *oneStarPushImageView; +@property (nonatomic, weak) IBOutlet UIImageView *twoStarPushImageView; +@property (nonatomic, weak) IBOutlet UIImageView *threeStarPushImageView; +@property (nonatomic, weak) IBOutlet UIImageView *fourStarPushImageView; +@property (nonatomic, weak) IBOutlet UIImageView *fiveStarPushImageView; +@property (nonatomic, weak) IBOutlet UILabel *oneStarLabel; +@property (nonatomic, weak) IBOutlet UILabel *twoStarLabel; +@property (nonatomic, weak) IBOutlet UILabel *threeStarLabel; +@property (nonatomic, weak) IBOutlet UILabel *fourStarLabel; +@property (nonatomic, weak) IBOutlet UILabel *fiveStarLabel; +@property (nonatomic, weak) IBOutlet UIView *rateView; +@property (nonatomic, weak) IBOutlet UIButton *notNowBotton; +@property (nonatomic, weak) IBOutlet UIView *deviderView; + +@end + +static NSString * const kRateAlertNibName = @"MWMRateAlert"; + +@implementation MWMRateAlert + ++ (instancetype)alert { + MWMRateAlert *alert = [[[NSBundle mainBundle] loadNibNamed:kRateAlertNibName owner:self options:nil] firstObject]; + [alert configure]; + return alert; +} + +#pragma mark - Actions + +- (IBAction)oneStarTap:(UILongPressGestureRecognizer *)sender { + [self starButtonLongTap:sender withBegan:^{ + [UIView animateWithDuration:0.35f animations:^{ + self.oneStarPushImageView.alpha = 1; + self.oneStarButton.selected = YES; + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.35f animations:^{ + self.oneStarPushImageView.alpha = 0.; + }]; + }]; + } completion:^{ + [self presentAlertWithStarsCount:1]; + }]; +} + +- (IBAction)twoStarTap:(UILongPressGestureRecognizer *)sender { + [self starButtonLongTap:sender withBegan:^{ + [UIView animateWithDuration:0.35f animations:^{ + self.twoStarPushImageView.alpha = 1; + self.oneStarButton.selected = YES; + self.twoStarButton.selected = YES; + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.35f animations:^{ + self.twoStarPushImageView.alpha = 0.; + }]; + }]; + } completion:^{ + [self presentAlertWithStarsCount:2]; + }]; +} + +- (IBAction)threeStarTap:(UILongPressGestureRecognizer *)sender { + [self starButtonLongTap:sender withBegan:^{ + [UIView animateWithDuration:0.35f animations:^{ + self.threeStarPushImageView.alpha = 1.; + self.oneStarButton.selected = YES; + self.twoStarButton.selected = YES; + self.threeStarButton.selected = YES; + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.35f animations:^{ + self.threeStarPushImageView.alpha = 0.; + }]; + }]; + } completion:^{ + [self presentAlertWithStarsCount:3]; + }]; +} + +- (IBAction)fourStarTap:(UILongPressGestureRecognizer *)sender { + [self starButtonLongTap:sender withBegan:^{ + [UIView animateWithDuration:0.35f animations:^{ + self.fourStarPushImageView.alpha = 1.; + self.oneStarButton.selected = YES; + self.twoStarButton.selected = YES; + self.threeStarButton.selected = YES; + self.fourStarButton.selected = YES; + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.35f animations:^{ + self.fourStarPushImageView.alpha = 0.; + }]; + }]; + } completion:^{ + [self presentAlertWithStarsCount:4]; + }]; +} + +- (IBAction)fiveStarTap:(UILongPressGestureRecognizer *)sender { + [self starButtonLongTap:sender withBegan:^{ + [UIView animateWithDuration:0.35f animations:^{ + self.fiveStarPushImageView.alpha = 1.; + self.oneStarButton.selected = YES; + self.twoStarButton.selected = YES; + self.threeStarButton.selected = YES; + self.fourStarButton.selected = YES; + self.fiveStarButton.selected = YES; + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.35f animations:^{ + self.fiveStarPushImageView.alpha = 0.; + }]; + }]; + } completion:^{ + dlg_settings::SaveResult(dlg_settings::AppStore, dlg_settings::OK); + [[UIApplication sharedApplication] rateVersionFrom:@"ios_pro_popup"]; + [self.alertController closeAlert]; + [self setupAlreadyRatedInUserDefaults]; + }]; +} + +- (IBAction)notNowTap:(UILongPressGestureRecognizer *)sender { + [self.alertController closeAlert]; +} + +- (void)presentAlertWithStarsCount:(NSUInteger)starsCount { + [self removeFromSuperview]; + [self.alertController presentFeedbackAlertWithStarsCount:starsCount]; + [self setupAlreadyRatedInUserDefaults]; +} + +- (void)setupAlreadyRatedInUserDefaults { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kUDAlreadyRatedKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +- (void)starButtonLongTap:(UILongPressGestureRecognizer *) tap withBegan:(void (^)())began completion:(void (^)())completion { + switch (tap.state) { + case UIGestureRecognizerStateBegan: + began(); + break; + + case UIGestureRecognizerStateEnded: + completion(); + break; + + default: + break; + } +} + +#pragma mark - Configure + +- (void)configure { + self.oneStarPushImageView.alpha = 0.; + self.twoStarPushImageView.alpha = 0.; + self.threeStarPushImageView.alpha = 0.; + self.fourStarPushImageView.alpha = 0.; + self.fiveStarPushImageView.alpha = 0.; + [self.titleLabel sizeToFit]; + [self.messageLabel sizeToFit]; + CGFloat const topMainViewOffset = 17.; + CGFloat const secondMainViewOffset = 14.; + CGFloat const thirdMainViewOffset = 20.; + CGFloat const minMainViewHeight = 144. + self.deviderView.height + self.notNowBotton.height; + CGFloat const actualMainViewHeight = topMainViewOffset + secondMainViewOffset + (2 * thirdMainViewOffset) + self.titleLabel.height + self.messageLabel.height + self.rateView.height + self.deviderView.height + self.notNowBotton.height; + self.height = actualMainViewHeight >= minMainViewHeight ? actualMainViewHeight : minMainViewHeight; + self.titleLabel.minY = topMainViewOffset; + self.messageLabel.minY = self.titleLabel.maxY + secondMainViewOffset; + self.notNowBotton.minY = self.height - self.notNowBotton.height; + self.deviderView.minY = self.notNowBotton.minY - 1; + self.rateView.minY = self.messageLabel.maxY + thirdMainViewOffset; +} + +@end diff --git a/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.xib b/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.xib new file mode 100644 index 0000000000..e657fc26bf --- /dev/null +++ b/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.xib @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index 5e3b3ff756..c5c931aa03 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -577,9 +577,7 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick"; Reachability * reachability = [Reachability reachabilityForInternetConnection]; if ([reachability isReachable]) { - if (dlg_settings::ShouldShow(dlg_settings::AppStore)) - [self showAppStoreRatingMenu]; - else if (dlg_settings::ShouldShow(dlg_settings::FacebookDlg)) + if (dlg_settings::ShouldShow(dlg_settings::FacebookDlg)) [self showFacebookRatingMenu]; } } @@ -821,7 +819,7 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick"; - (void)presentDownloaderAlert:(routing::IRouter::ResultCode)type countries:(vector const&)countries { if (countries.size()) { MWMAlertViewController *alert = [[MWMAlertViewController alloc] initWithViewController:self]; - [alert presentDownloaderAlertWithCountrieIndex:countries[0]]; + [alert presentDownloaderAlertWithCountryIndex:countries[0]]; } else { [self presentDefaultAlert:type]; } @@ -1202,24 +1200,6 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick"; { switch (alertView.tag) { - case ALERT_VIEW_APPSTORE: - { - if (buttonIndex == 0) - { - dlg_settings::SaveResult(dlg_settings::AppStore, dlg_settings::Never); - } - else if (buttonIndex == 1) - { - dlg_settings::SaveResult(dlg_settings::AppStore, dlg_settings::OK); - [[UIApplication sharedApplication] rateVersionFrom:@"ios_pro_popup"]; - } - else if (buttonIndex == 2) - { - dlg_settings::SaveResult(dlg_settings::AppStore, dlg_settings::Later); - } - - break; - } case ALERT_VIEW_FACEBOOK: { if (buttonIndex == 0) @@ -1432,17 +1412,6 @@ NSInteger compareAddress(id l, id r, void * context) f.Invalidate(); } -- (void)showAppStoreRatingMenu -{ - UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"App Store" - message:L(@"appStore_message") - delegate:self - cancelButtonTitle:L(@"no_thanks") - otherButtonTitles:L(@"ok"), L(@"remind_me_later"), nil]; - alertView.tag = ALERT_VIEW_APPSTORE; - [alertView show]; -} - - (void)showFacebookRatingMenu { UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"Facebook" diff --git a/iphone/Maps/Classes/MapsAppDelegate.h b/iphone/Maps/Classes/MapsAppDelegate.h index 35b5d27074..3f28ae0c2b 100644 --- a/iphone/Maps/Classes/MapsAppDelegate.h +++ b/iphone/Maps/Classes/MapsAppDelegate.h @@ -18,7 +18,7 @@ extern NSString * const MapsStatusChangedNotification; UIAlertView * m_loadingAlertView; } -@property (nonatomic, strong) IBOutlet MapViewController * m_mapViewController; +@property (nonatomic, weak) IBOutlet MapViewController * m_mapViewController; @property (nonatomic, readonly) LocationManager * m_locationManager; + (MapsAppDelegate *)theApp; diff --git a/iphone/Maps/Classes/MapsAppDelegate.mm b/iphone/Maps/Classes/MapsAppDelegate.mm index 1b536b73d1..da646d917b 100644 --- a/iphone/Maps/Classes/MapsAppDelegate.mm +++ b/iphone/Maps/Classes/MapsAppDelegate.mm @@ -6,6 +6,8 @@ #import "UIKitCategories.h" #import "AppInfo.h" #import "LocalNotificationManager.h" +#import "MWMAlertViewController.h" +#import "Reachability.h" #include @@ -21,6 +23,11 @@ #import "../../../3party/Alohalytics/src/alohalytics_objc.h" NSString * const MapsStatusChangedNotification = @"MapsStatusChangedNotification"; +static NSString * const kUDLastLaunchDateKey = @"LastLaunchDate"; +extern NSString * const kUDAlreadyRatedKey = @"UserAlreadyRatedApp"; +static NSString * const kUDSessionsCountKey = @"SessionsCount"; +static NSString * const kUDFirstVersionKey = @"FirstVersion"; +static NSString * const kUDLastRateRequestDate = @"LastRateRequestDate"; /// Adds needed localized strings to C++ code /// @TODO Refactor localization mechanism to make it simpler @@ -86,7 +93,7 @@ void InitLocalizedStrings() mrgsParams.allowPushNotificationHooks = YES; [MRGServiceInit startWithServiceParams:mrgsParams externalSDKParams:@[] delegate:nil]; - [[MRGSApplication currentApplication] markAsUpdatedWithRegistrationDate:[NSDate date]]; + [[MRGSApplication currentApplication] markAsUpdatedWithRegistrationDate:NSDate.date]; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions @@ -107,7 +114,8 @@ void InitLocalizedStrings() [[Statistics instance] logEvent:@"Device Info" withParameters:@{@"IFA" : [AppInfo sharedInfo].advertisingId, @"Country" : [AppInfo sharedInfo].countryCode}]; InitLocalizedStrings(); - + + [self shouldShowRateAlert]; [self.m_mapViewController onEnterForeground]; [Preferences setup:self.m_mapViewController]; @@ -392,4 +400,102 @@ void InitLocalizedStrings() [UIApplication sharedApplication].applicationIconBadgeNumber = [[notification userInfo][@"OutOfDate"] integerValue]; } +- (UIWindow *)window +{ + return m_window; +} + +#pragma mark - Rate alert logic + +- (void)showRateAlert +{ + if (!Reachability.reachabilityForInternetConnection.isReachable) + return; + + UIViewController *topViewController = [(UINavigationController*)m_window.rootViewController visibleViewController]; + MWMAlertViewController *alert = [[MWMAlertViewController alloc] initWithViewController:topViewController]; + [alert presentRateAlert]; + [[NSUserDefaults standardUserDefaults] setObject:NSDate.date forKey:kUDLastRateRequestDate]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +- (void)shouldShowRateAlert +{ + NSUInteger const kMaximumSessionCountForShowingAlert = 21; + NSUserDefaults *standartDefaults = [NSUserDefaults standardUserDefaults]; + BOOL alreadyRated = [standartDefaults boolForKey:kUDAlreadyRatedKey]; + if (alreadyRated) + return; + + NSUInteger sessionCount = [standartDefaults integerForKey:kUDSessionsCountKey]; + if (sessionCount > kMaximumSessionCountForShowingAlert) + return; + + NSDate *lastRateDate = [standartDefaults objectForKey:kUDLastRateRequestDate]; + NSUInteger daysFromLastRate = [self.class daysBetweenNowAndDate:lastRateDate]; + // Do not show more than one alert per day. + if (lastRateDate != nil && daysFromLastRate == 0) + return; + + // Get days spent after last launch. lastLaunchDate may be nil, then dayAgo == 0. + NSDate *lastLaunchDate = [standartDefaults objectForKey:kUDLastLaunchDateKey]; + NSString *currentVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey]; + if (self.class.isFirstAppLaunch) + { + // It's first launch for new user. + [standartDefaults setObject:currentVersion forKey:kUDFirstVersionKey]; + sessionCount = 1; + } + else + { + NSString *firstVersion = [standartDefaults stringForKey:kUDFirstVersionKey]; + if (!firstVersion.length || [self version:currentVersion greaterThanVersion:firstVersion]) + { + // User just got updated. Show alert, if it first session or if 90 days spent. + if (daysFromLastRate >= 90 || daysFromLastRate == 0) + [NSTimer scheduledTimerWithTimeInterval:30. target:self selector:@selector(showRateAlert) userInfo:nil repeats:NO]; + } + else + { + // It's new user. + NSUInteger daysFromLastLaunch = [self.class daysBetweenNowAndDate:lastLaunchDate]; + if (daysFromLastLaunch > 0) + sessionCount++; + if (sessionCount == 3 || sessionCount == 10 || sessionCount == kMaximumSessionCountForShowingAlert) + [NSTimer scheduledTimerWithTimeInterval:30. target:self selector:@selector(showRateAlert) userInfo:nil repeats:NO]; + } + } + [standartDefaults setInteger:sessionCount forKey:kUDSessionsCountKey]; + [standartDefaults setObject:NSDate.date forKey:kUDLastLaunchDateKey]; + [standartDefaults synchronize]; +} + +- (BOOL)version:(NSString *)first greaterThanVersion:(NSString *)second +{ + NSArray *f = [first componentsSeparatedByString:@"."]; + NSArray *s = [second componentsSeparatedByString:@"."]; + NSUInteger iter = 0; + while (f.count > iter && s.count > iter) + { + if ([(NSString*)f[iter] integerValue] == [(NSString*)s[iter] integerValue]) + iter++; + else + return [(NSString*)f[iter] integerValue] > [(NSString*)s[iter] integerValue]; + } + return f.count > s.count; +} + ++ (NSInteger)daysBetweenNowAndDate:(NSDate*)fromDate +{ + if (!fromDate) + return 0; + + NSDate *now = NSDate.date; + NSCalendar *calendar = [NSCalendar currentCalendar]; + [calendar rangeOfUnit:NSCalendarUnitDay startDate:&fromDate interval:NULL forDate:fromDate]; + [calendar rangeOfUnit:NSCalendarUnitDay startDate:&now interval:NULL forDate:now]; + NSDateComponents *difference = [calendar components:NSCalendarUnitDay fromDate:fromDate toDate:now options:0]; + return difference.day; +} + @end diff --git a/iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/Contents.json b/iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/Contents.json new file mode 100644 index 0000000000..11508953d6 --- /dev/null +++ b/iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "bg_rate.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "bg_rate@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "bg_rate@3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/bg_rate.png b/iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/bg_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6fc7a3b525f00072ccb9d96e691565630f6d99 GIT binary patch literal 2928 zcmYjS2{hDO9KM#KdB(mqmF&e!vS!IPMvQgL41=*|kR`9f)T^hEO1A1HvM)m;DP(D6 zUh$L`9+5rD?vWA+4Ws7Wnd+Q(&Np}d_q)IE`+dJV|8pi8=WL5apb!86B-Rdthu
CD?DO-e}HQR51D|& zD~6Tu0hVpRZ4UShx6M3ocmwB-uAm8s{lZ7r-lLYdGZp# zf%s|2XnbGYC-z_dSy;!0>gr-n&*L&59i zk}x6M{_OIjHLQnx4q(Aq3Vsd1pq zAI9h+fV{1(ot>Sn_7*WL)*futwRdoE+yxXJot&JV^o77SduJCH9L`D^sJh}^9T5Oe zAQ1NeHKLo_FTkBdA}PqZdw6;=m67fFpqc zfs`P!n<|zP5`6Ti2=ERP0Xhn5;_{M$KwEag8Vko2x{AeE5l`_IkiyHoNvmVwi)YuS z@^cyw>RcXIIjTw5VCY}NScmp8{L4M8gyYa!5>~f+;>A$6GcuCge@XHCAV)||z-_8C zV(r+^^_`0C?`<<5t{-Y0mcOUp_9%KbzwV1Udtx}`U*F#8M9aYgA(9W8J)2j_U3|+` z3!1nG9qwQA*87hi7U*a)kU*(_zC)Y%O4_({S`cZbVwWr-zlV8`Z8C~?i^ygyTL$M~DvJ5~-xdMm}n#l#ir zwuF{a!f3X19<|rPf7Ro8dRT=eu1#eEY{x2N&DC~XuS@FxZFJpY&W95GyrH1@N%=3` zAfGSK<_2C->9m)v?+%91y7XPkMPJu7R`>h%aA%Df`Co^LH;2@AmtNf;amebqse5aJ z&p#ZNfY$xul&GdiSG=;GA4WNltaZ`{QLxR&;kjv6&ApJd^^S*w32yqAQnbYhdy)Bl z*}3Bn#b_sLjx~V=diQc=>D=|K44DKC%>cC;98{lo!vw+md*s38g=beOb5pEX!FM-^2>PXbgq1@k;u*F}Q!>jtt9LRj^x=JF=QXahEH_2tSH{s-kx9o!yxSQDS9iTU{V1@g=X`k`q4K6b zeKL*Il-(|@Uh?=Qt-i{jD5gEzXno0{^YMnk5LL_~{+g&x529cVrPrc5-M6Ou^vdAN z*XkxK1M;b7x&}YF#-A55U;4wXJ>}Q5dP`L~w2mX8canX))H-y=>*J0o;8EZ^f4NJ6tHYPg9AZy%k3qPZwse2`joa#HWG0Ax%F+{)LhfWUb`&>zBX;o~q@^h;H zG>I0@mWfu;jeKQt-mm*jr2k@^XsLY=ttwSu->ur|+CS4PPh6w`4U#pxW$;a>Hi|?} zt8c^o5g^$l%C=~(8;)XT@LQi9ABUL>cZ@fzWA1#8ZNKB*`r$=D^yI3&f8 z*cN!V#XVzyvN&7*W;rn<%4aSFqjq7hs#bh0#tv}=Jwm=h-pBc%zmMwijgfcg+>Fco z8!9s-pY672)FxP}DbpjN9AQh2Fd6B8#Vph|@0?!S4IbKmV=Xk+Gm3>DZiDc*Q?tuNy{T2Z55)Fl z=l2ggT`?;Pk$NX8(n`IXi6^v1D(q^0r++Is1BvN*npq<|zi^2uyNc|sIlSiT9;%a% zB(x?3r%QnsCTa}}9vyZgi33zdr{0;<+38&o+72!4=<>JCy}E%DQgLd!*JdOXs!e0Y zrqq>tes>x*87sJaymqOfbmm5HZu`5*Vw(ZGw;OV4tFlp#6RISFZ=4>LzJUn+! zKd#=2ZEKc& z5k8fS`uGT+w>9mp zLX~a{+N+AARW!XjL=(pIPR&@w4=7+WC8^@ZA;caITT89CQX$!imTHcPFcTmZDor0_ zNo6pXzji*QDMlN38poQidyBLrz9(74zNkADm08RtU)CG{bv9^OPe##p zWgbYG)4!A}p4%%$P*zYJ3o|rSB$=&ri++qX8>8a@Q}jaFsKzr?+iJDEVdCfa6JfVj zVtfm4skqFP5$Jo;F!2`-Gbxf}``ye9*SyXN4dfG$5@BM~9jRKanpNI)Yh_W}ls=}o zSU&<7O@J~-)5h3c&{BHOj*IRTFyHZaTW8j{2t~isldR{}U+V&bXNwzz;`o=AN=clW c<;aERh=JGy=HLBO@V^;gZJaSxX#a%&0OMwH&Hw-a literal 0 HcmV?d00001 diff --git a/iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/bg_rate@2x.png b/iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/bg_rate@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0188e157415834da5cd73822e3cb4978a53d5b GIT binary patch literal 5376 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 AI{*Lx literal 0 HcmV?d00001 diff --git a/iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/bg_rate@3x.png b/iphone/Maps/Images.xcassets/NewDialog/bg_rate.imageset/bg_rate@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..248b9fee3f1c74d489b475ad436d3b9f318b20c8 GIT binary patch literal 13014 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

Dn>&`{HlVTH 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 G5&s4L;N`gh literal 0 HcmV?d00001 diff --git a/iphone/Maps/Images.xcassets/NewDialog/rate-empty.imageset/rate-empty@3x.png b/iphone/Maps/Images.xcassets/NewDialog/rate-empty.imageset/rate-empty@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..925329884841e5fe6c1fb8293ee249c4527da06c GIT binary patch literal 4081 zcmd6q=RX^a*N3gv-g{Jy+OgHH9eb4+C00mPwN$K9tF@_7BSy9Mju1E1q!As|2x_}K za1$%`PON%7|HbdcIoFHpbKahFzUlV1X3Pu%3=|X;%ogS*4%dYLf6?8%?z)sAOV^+b zbucrcK#mF#DJWQ*EldnS&ndUxG3N>ax%(HkJdJh|*ceb8Nfj|e^@eOpZboz!i{e}i zlxjxgk0uQqhBtsU9k~;-N_4KZcisfEnHvFV`oz3VK8uLlEC{}jv!=3Sm&PU$BKjBJ ze)_pdeAoS3yr}!#PmRWrBW#@Ng~_ zt_)PqyfigP4?`06dkZin+RsxLVpi*?K!(S#f;*I0x^4qK^eV9 z5K?7ivg0X{uDH*#ANV!d0nj7UYEVTVAZsWh$4KylC>dJ@oVF;aW;$h31}=}e)l4{k zwg12o_W0fW229+U`DTH!R->si5S(KRME7ybaM!76il&6Dko>rv1FR)sy7oG#&YeQuf5RCg2aL#`(%sLclio3hS)> zz3F!yUDBbS>hOfDY0@^g2~||X(+@H2u&q1Mt9aP#AnibBauzg3$#Fhn%1u3hr@57A z^>WxemqE*~vE5qP@j~}r*OWwm-)Rd@19GhD?HteHaBMmq90Cn0O*@y5v(CJDfV7pX z&vNb1bJWzCXmP50EM}AhJ2!B=dtX?a{@_{Gx*NSupfDfmQRI@n)A*s0{U^cKjd^wX z5iPDgg(vcM2 zYRgK~9MGYfW99n8@1zCXdwqD7?#gZd={fMp3!#f?6k_^B{`id7L_oZnKH-( zgGZ?dcMGcw@|G<9kr2{R6z-WH?nX*tTz;}cD(JA_CAl+>b65qXM3)1I8ZCWG(3J7s zHmO3(cKL(|Hr0u==d|$3ca2LCCy$|F3&L-{4ce`rm`><;TkF^!CmgR}3zL=G9iLTQ z1WRY}c`6DP%?^fw#7ysCwT7v@D5ko%r_ zsCFv-))y5ovO)6+205V0ucs=v^r6B@{0n0$G%%_;?~#gi18Aj=uCT)&-Q3YXxKR<+-li>iTgDxO>eEZnFG(=?S`hK6K*9^3ab378{E3 zNfaBJ9}z&^dXPkhxs{k&&L~lAw0Jj)(5mNw!tRpT*UPZDnu#;+wE?V=pj`(DXvaIq5`%vib~#f)5Nm{ZOq&bHF|C%Y z^e4W1Ojy3neVLF9{9SM(s;h7n&uXp#J-t-vDfex8J9B@tDclzQUCc;4pS!sL%g%e( z!)0CktNAAQBJVbp0y3%V2FxX-Am+_yU*x=rWUdbK==}wUj@n2w3dt!adc{JWoOy|T zs2vmyk#QySrT*vp=XLkOSK1r~Y{F0N(!~g;S>ooyMZWrYR>Ty?2BzD~bK~r$-YPx0 z*y?&tXVk={%0Pwmfz@u4;kLn3iX~4xz5VFkVS5B3d<;{Qmw_?k^Gg6_ypRMqTeH{!W|UfQ4RIN zWgvZN9NC(gr~gB_;BUr^pC(g!X9rsFOI+g*!vKNepEbL!d`4h zLDJJ#Wb7~5Lro-rK8yaC4_nP4pZ>Cs5kE4Ffh(RzjldAlNtL=cmYX%uEWiJ|i z*UzH$&G`NOo|iwkEyo=Clux!M&Ly0ByaI7>Veu;}D>q~p9Z)mT{r2(i#O7z&lhJQ}UZoC#8LaYq82|ET=3 z2mH~wCp~bAvL>-TRr6S3M&y1+mm|(Od&ztQz;wyDK zH6O#jg_=R14fzICcb=~2Wky|v%3SM72{R0HQ-IhnR&qOYEEs^l-Ekhen>eUFb8pmL zd$#wh%AGVI;cqJWqFit;jY-lo#cA+71qM2D2&!hBtT%wgp`#3k^Qvq)2IBQ0K&x~=(>@t}WXu@wZB5QMRkwNaIdtXB*?LXF-x zdLI8OCi-X&Y0CSMdO@+Mm+GJ17?GLB$t3mm?$ZK`i`gvp=kLScQMG@ZCW}+I3*nOK303V4I z9Ok51)C-Yr*8oDM<27rlP-yBBKWC>vQca zM~5F>#9YS16l|1%GpcqwW*0=wOw;G}N~Is&v-Knz?Yxodt1Efq5x8incL$HU3z>oo zP`QUNL|R;%dLbxU9+2(!y%x)bqT{edkj|QDWiGvml8Av)^@2dPPeI5uAoXTf!^yru zPku^o8Z*wvB3nLka8kOQ--e4dj)5uPmu^L$ng2(thGd@sM0v$}nBrOPsRr8PBMb<@ zAjQE8K)Ioeal>y+)>ltx8+VLiMc3-%DtN>YtE3D@&$5)XTNetlJz{oC1c{q0sO(Sv zA}EH-Wj{?uwqu)M7ezb~%+9#E7@2tH)KjXLYfIH!ySTfcYaw2jJuEV*N`92OcQQ;9 z$2sj~JeyNtCX@j9J$Y}Q(qh+daFm6bJ#o5adTvob>q$judqI&PggD7U&l2&ae*we0 zIkqyiq*mQcjSn6oJPv4c@P$NS>(9acyHvOv`^vM1vxXE_8OJ)+Qu$YIh}~^g|7B97 z-i>GMbD^n4yth=eu~`SJA9RM9QLdUA+!u>UjX!$md$1A{pAcViCsmKR?V(P;mnAVrr+fOF>(0mkF+FT!-V`&AN zxX3UP|FC5i-N~C1$+E*Xay)fe$Ycjg#Vap8n2@Tw%aZgUT|yiAG~3#Df?OV;jbsWW z^UM)`l0))y6+;h~)M$R+(+$LGY@9yr z=AmoWg=l)Uetf$#j&Zz)Wznqu9n<< zp9MSq_mSKKn`3S1a(GB-G&Ek^Z;y|;-KG0(*brvK$E`b*AK zY?i_GTJt}HW)5>&d3h;@&yr>()`hQLdWGKP9I)C9TK2J@f+~|;)*!XG5$aq%be+e0 z(+5_?zTjVJYBoLm(4V^upP)a!B-B>UCxdt=?ro1hatQd@_Ih(2rnsyazHLPM=+|~& zy8Oaj;P3Yn?-c>dIQi5F=~=!9b5tRcXQid?B0XzFt#@yJhu#erC}1!9zQD(Is*7qe zmO0>Nd$d;CrQo}uf`u+XV$I>cZ<=Bx08@dksU>7t$G0y*3TAwOKg@eC?016qU-XYm zszKw^dG%E;=b|?XFS9hK=ds6F3Nf1{Ef*sX zatO4eOFpjSThQQ=gXEY6Rea$HKFk*W`}0r`9UoOnf~fcZ3XVnh;tToJtN%K|=&mz7 Og$2;o1Zm{`>i+Px&SV=@dRA>e5SW8G%K^XpKu9?~kA~6DY7DUt{LRz$m2r`jc^dN&YNGqbq7HuM- z)-4hOv#gd;v}w~SXxlQ1XkkU0LP0VYCaC93-+#QP&bfK7XU-!CW-f<0GxNW`@Be4! zZ~@mG1C9a5fMdWh;23ZWI0pV(2E2Q?;*DUSXaK562WAA@J>aeQC;>avS-dOCpDxO< z*!2~9$rL;I@?NB`!ZKoBq0S$}HwM3<3}8}k#wN8F3q=4bE+e1NVGNr2sPfZ{F&roY zgxD+$i07jR3fv;)#&-^S!(rZiA*E$TvEKJEZh#fhfaz>rm#|Tt!T0EV9`A)@gdn;r zK}fJNCu?~GUTGs$M$CP*FsgMtQyby)0h**|=`^ue*D8aX+!rmJ=cyZOo>G`F3WHpj zrp_$oXDRVB=smtGOshUj#IzC&tby=?8)lH_YT2gI1+rhaluWI)P@Z7#milo%94G11 zl-AU8hO2=Py;^G#yUY5B$Of<0Ky)9jk<~#ya?$-cl`1V;j>T5l=AihnRA)t|Y}_XY zeIJj>@G6?9+zYl=1;mWjIKln#!d6-2Qv(rY9!a3P)bgjMd`!|Y?1qJUsPGkmTpjRB5-L_h_xiVi<8cbkW3O%r@n zCo>R?VkcRZFWto!W=7$OuE!Q0ueVBlxUE;CjRM2v%>B+@P+s#m5~`=|GXvpgN|!hf z*(SqZN(%c4pj(~Bco>*Ei7C!qpu=6v;p<@DES4TW>yL+WY5UAT7({#7`8><#hHk|+ z)sL6e0^-`6x_;~-m{SBlDH)+&yLpQGYC1{gX(L_?^A!cCA#+rG6HU0uF z6I4C3b=^kS$vOrc1C9a5fMdWh;23ZW{5uAI0o}9WCD~)A#Q*>R07*qoM6N<$f}sPd A&;S4c literal 0 HcmV?d00001 diff --git a/iphone/Maps/Images.xcassets/NewDialog/rate-full.imageset/rate-full@2x.png b/iphone/Maps/Images.xcassets/NewDialog/rate-full.imageset/rate-full@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d57d4fdc7a18f7b022a83f9357faf935f31639 GIT binary patch literal 1730 zcmb7_dpr}00>?)l%edwg^J=W?L^tx5n8z?}$z#Gv-54Fs7q^o zKmSiag(Hvo@Wk&ZWa510J_lkMxybt>w?nP&CU_5nKL)xHjPaX_DvUHF>pttbCPUEqLd3p`v=8k5Y5J zy0&N0rv~YA@5&*SzZ3Ubx_mRyQG>${!{Knk@o)c0=U|APuAW#OTFPBC9 zQ{^Mtc{T7^-tQe}kd_^m?GEk&BP0)Lzum6&(Z8rAg^joKRmE4Pqgd}>oJw9WNl<!Prs>!F7BpDCFJ)M?`&04hNBC zuahxQ<3v(P=(0oY4jhDsdF5w^Opl5{%Hw*>8m1`4jIR^8!!^K&rv( z8e3L{MQmV|lne??Dcv_aPKd0;C^ZEaOr5PFc13u+PeC=U^#phg38#t+=&`R%{Zw;4 zL4Ok&&(gm{DC*93auoR;J*fC!Lw6ss@YOfXuQ8g8Y4}U<;L($pA2F8Gx^rc4J!kr7 zhx*N69xQMEHB=w5_xmTSYA}X@JJg$X1F- zYaOwYVpQifzGTAzR0Bg$rs_A9HHh~I3U+JJ=H1aNq=DgDydialF7lpY=7UIT9OLq*mf{EGeIe~z z=yY)`!fdIJr1%jWy4maQV1Dglm&3M9zoyj*|EPnSWs$Skr~um`2`YIXdCP%038x@# z1RHrzD$Wvk7AF@6BgA*%BBw#uxcGA63N&$jLBIM~M0pxx!EpuFvY>Sr?A~?j^P#`w z;+=7-JY05t~*5BzONiOHpsI&#U|WWfaT-X zI5xy4Y>8t4w6UrW-u1p4(gk7Jvi|GIY6| z#lM%a$AhLS_vX22P)Xh;<(Z0}>xR#%0j)#ZdqV+Xakjy)YaTAOY>ib zWu01&lNi?j((~2~Eo;6`mqT1(K_(s@?tX!*$j|@YoHj#etUl2X!O|0{N{ym-5xmT- zpGcxd(#6{(n3U)pGNyw_0_HyLA7kokM*T9~vQrn;i+%iH`E7S_ z*262$&+WYU+bq>P)L~t2@&I#VU4^N)I`n25qTM|JLhQ_8CNxLi2~xQT)nY@DGoDmA zOd;Gi_Tr_~GCHsP15dZaEQ1gtE3sTLbHisR3rRd$4-Oyl2CDA4e*lYJp9y?rC8r6= zFyQye=GGW8qi)MSyOImq9C=J!QQv~Z5YD+J%d^JNtJ)GZrgR%eFGxN=83ZKNOG`+A z&!$N&U7#8~wPGU@cDd6EeMcc|o&3Ngcx;Lgf;xG)p#Lt8!j;9?=` z!jb|eX!y<>r{#>zdpnfrnRbgz`Ern~z{cheMKjjQ)SD1^$Jb*YT_oSABL^c@B9jgM z{HP40mwPqwK>}L>LTXPF&U;^k7;qDGW!)r-pIi1`sVDgARmxPAvNMVnkid9NrXD+7 z-0N?@=lmBThYGbv4Wxh7VgJ(|)qZS4i8az_DcUdb!bDu%!P2FIqBt literal 0 HcmV?d00001 diff --git a/iphone/Maps/Images.xcassets/NewDialog/rate-full.imageset/rate-full@3x.png b/iphone/Maps/Images.xcassets/NewDialog/rate-full.imageset/rate-full@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..54007aebf473655e027623a028e6f5f2d571f0c2 GIT binary patch literal 2758 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 literal 0 HcmV?d00001 diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index a7677cfb78..e06d7bab72 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -115,19 +115,20 @@ EED10A4511F78D120095FAD4 /* MapViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = EED10A4411F78D120095FAD4 /* MapViewController.mm */; }; EEFE7C1412F8C9E1006AF8C3 /* fonts_blacklist.txt in Resources */ = {isa = PBXBuildFile; fileRef = EEFE7C1212F8C9E1006AF8C3 /* fonts_blacklist.txt */; }; EEFE7C1512F8C9E1006AF8C3 /* fonts_whitelist.txt in Resources */ = {isa = PBXBuildFile; fileRef = EEFE7C1312F8C9E1006AF8C3 /* fonts_whitelist.txt */; }; + F61579341AC2CE9A0032D8E9 /* MWMRateAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = F61579331AC2CE9A0032D8E9 /* MWMRateAlert.mm */; }; + F61579361AC2CEB60032D8E9 /* MWMRateAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = F61579351AC2CEB60032D8E9 /* MWMRateAlert.xib */; }; F62404FB1AAF3DB200B58DB6 /* UILabel+RuntimeAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = F62404FA1AAF3DB200B58DB6 /* UILabel+RuntimeAttributes.m */; }; F64F19991AB81A00006EAF7E /* MWMAlertViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F19821AB81A00006EAF7E /* MWMAlertViewController.mm */; }; F64F199A1AB81A00006EAF7E /* MWMAlertViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F64F19831AB81A00006EAF7E /* MWMAlertViewController.xib */; }; F64F199B1AB81A00006EAF7E /* MWMAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F19861AB81A00006EAF7E /* MWMAlert.mm */; }; - F64F199C1AB81A00006EAF7E /* MWMDefaultAlert+Configure.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F19891AB81A00006EAF7E /* MWMDefaultAlert+Configure.mm */; }; F64F199D1AB81A00006EAF7E /* MWMDefaultAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F198B1AB81A00006EAF7E /* MWMDefaultAlert.mm */; }; F64F199E1AB81A00006EAF7E /* MWMDefaultAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = F64F198C1AB81A00006EAF7E /* MWMDefaultAlert.xib */; }; - F64F199F1AB81A00006EAF7E /* MWMDownloadAllMapsAlert+Configure.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F198F1AB81A00006EAF7E /* MWMDownloadAllMapsAlert+Configure.mm */; }; F64F19A01AB81A00006EAF7E /* MWMDownloadAllMapsAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F19911AB81A00006EAF7E /* MWMDownloadAllMapsAlert.mm */; }; F64F19A11AB81A00006EAF7E /* MWMDownloadAllMapsAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = F64F19921AB81A00006EAF7E /* MWMDownloadAllMapsAlert.xib */; }; - F64F19A21AB81A00006EAF7E /* MWMDownloadTransitMapAlert+Configure.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F19951AB81A00006EAF7E /* MWMDownloadTransitMapAlert+Configure.mm */; }; F64F19A31AB81A00006EAF7E /* MWMDownloadTransitMapAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F19971AB81A00006EAF7E /* MWMDownloadTransitMapAlert.mm */; }; F64F19A41AB81A00006EAF7E /* MWMDownloadTransitMapAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = F64F19981AB81A00006EAF7E /* MWMDownloadTransitMapAlert.xib */; }; + F67BBB571AC54A7800D162C7 /* MWMFeedbackAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = F67BBB551AC54A7800D162C7 /* MWMFeedbackAlert.mm */; }; + F67BBB581AC54A7800D162C7 /* MWMFeedbackAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = F67BBB561AC54A7800D162C7 /* MWMFeedbackAlert.xib */; }; F6DBF9B61AA8779300F2EC2C /* CALayer+RuntimeAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = F6DBF9B51AA8779300F2EC2C /* CALayer+RuntimeAttributes.m */; }; F785EB4016386FC4003A38A8 /* BookmarkCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F785EB3F16386FC4003A38A8 /* BookmarkCell.mm */; }; F7B90CD31521E6D200C054EE /* CustomNavigationView.mm in Sources */ = {isa = PBXBuildFile; fileRef = F7B90CD21521E6D100C054EE /* CustomNavigationView.mm */; }; @@ -377,6 +378,9 @@ EED10A4411F78D120095FAD4 /* MapViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = MapViewController.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; EEFE7C1212F8C9E1006AF8C3 /* fonts_blacklist.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = fonts_blacklist.txt; path = ../../data/fonts_blacklist.txt; sourceTree = ""; }; EEFE7C1312F8C9E1006AF8C3 /* fonts_whitelist.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = fonts_whitelist.txt; path = ../../data/fonts_whitelist.txt; sourceTree = ""; }; + F61579321AC2CE9A0032D8E9 /* MWMRateAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMRateAlert.h; sourceTree = ""; }; + F61579331AC2CE9A0032D8E9 /* MWMRateAlert.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMRateAlert.mm; sourceTree = ""; }; + F61579351AC2CEB60032D8E9 /* MWMRateAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMRateAlert.xib; sourceTree = ""; }; F62404F91AAF3DB200B58DB6 /* UILabel+RuntimeAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UILabel+RuntimeAttributes.h"; sourceTree = ""; }; F62404FA1AAF3DB200B58DB6 /* UILabel+RuntimeAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UILabel+RuntimeAttributes.m"; sourceTree = ""; }; F64F19811AB81A00006EAF7E /* MWMAlertViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMAlertViewController.h; sourceTree = ""; }; @@ -384,21 +388,18 @@ F64F19831AB81A00006EAF7E /* MWMAlertViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMAlertViewController.xib; sourceTree = ""; }; F64F19851AB81A00006EAF7E /* MWMAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMAlert.h; sourceTree = ""; }; F64F19861AB81A00006EAF7E /* MWMAlert.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMAlert.mm; sourceTree = ""; }; - F64F19881AB81A00006EAF7E /* MWMDefaultAlert+Configure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MWMDefaultAlert+Configure.h"; sourceTree = ""; }; - F64F19891AB81A00006EAF7E /* MWMDefaultAlert+Configure.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "MWMDefaultAlert+Configure.mm"; sourceTree = ""; }; F64F198A1AB81A00006EAF7E /* MWMDefaultAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMDefaultAlert.h; sourceTree = ""; }; F64F198B1AB81A00006EAF7E /* MWMDefaultAlert.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMDefaultAlert.mm; sourceTree = ""; }; F64F198C1AB81A00006EAF7E /* MWMDefaultAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMDefaultAlert.xib; sourceTree = ""; }; - F64F198E1AB81A00006EAF7E /* MWMDownloadAllMapsAlert+Configure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MWMDownloadAllMapsAlert+Configure.h"; sourceTree = ""; }; - F64F198F1AB81A00006EAF7E /* MWMDownloadAllMapsAlert+Configure.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "MWMDownloadAllMapsAlert+Configure.mm"; sourceTree = ""; }; F64F19901AB81A00006EAF7E /* MWMDownloadAllMapsAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMDownloadAllMapsAlert.h; sourceTree = ""; }; F64F19911AB81A00006EAF7E /* MWMDownloadAllMapsAlert.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMDownloadAllMapsAlert.mm; sourceTree = ""; }; F64F19921AB81A00006EAF7E /* MWMDownloadAllMapsAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMDownloadAllMapsAlert.xib; sourceTree = ""; }; - F64F19941AB81A00006EAF7E /* MWMDownloadTransitMapAlert+Configure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MWMDownloadTransitMapAlert+Configure.h"; sourceTree = ""; }; - F64F19951AB81A00006EAF7E /* MWMDownloadTransitMapAlert+Configure.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "MWMDownloadTransitMapAlert+Configure.mm"; sourceTree = ""; }; F64F19961AB81A00006EAF7E /* MWMDownloadTransitMapAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMDownloadTransitMapAlert.h; sourceTree = ""; }; F64F19971AB81A00006EAF7E /* MWMDownloadTransitMapAlert.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMDownloadTransitMapAlert.mm; sourceTree = ""; }; F64F19981AB81A00006EAF7E /* MWMDownloadTransitMapAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMDownloadTransitMapAlert.xib; sourceTree = ""; }; + F67BBB541AC54A7800D162C7 /* MWMFeedbackAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMFeedbackAlert.h; sourceTree = ""; }; + F67BBB551AC54A7800D162C7 /* MWMFeedbackAlert.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMFeedbackAlert.mm; sourceTree = ""; }; + F67BBB561AC54A7800D162C7 /* MWMFeedbackAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMFeedbackAlert.xib; sourceTree = ""; }; F6DBF9B41AA8779300F2EC2C /* CALayer+RuntimeAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CALayer+RuntimeAttributes.h"; sourceTree = ""; }; F6DBF9B51AA8779300F2EC2C /* CALayer+RuntimeAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CALayer+RuntimeAttributes.m"; sourceTree = ""; }; F785EB3E16386FC4003A38A8 /* BookmarkCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarkCell.h; path = Bookmarks/BookmarkCell.h; sourceTree = SOURCE_ROOT; }; @@ -839,11 +840,23 @@ name = MapViewController; sourceTree = ""; }; + F61579301AC2CE760032D8E9 /* RateAlert */ = { + isa = PBXGroup; + children = ( + F61579321AC2CE9A0032D8E9 /* MWMRateAlert.h */, + F61579331AC2CE9A0032D8E9 /* MWMRateAlert.mm */, + F61579351AC2CEB60032D8E9 /* MWMRateAlert.xib */, + ); + path = RateAlert; + sourceTree = ""; + }; F64F195F1AB8125C006EAF7E /* CustomAlert */ = { isa = PBXGroup; children = ( F64F19801AB81A00006EAF7E /* AlertController */, + F67BBB531AC54A7800D162C7 /* FeedbackAlert */, F64F19841AB81A00006EAF7E /* BaseAlert */, + F61579301AC2CE760032D8E9 /* RateAlert */, F64F19871AB81A00006EAF7E /* DefaultAlert */, F64F198D1AB81A00006EAF7E /* DownloadAllMapsAlert */, F64F19931AB81A00006EAF7E /* DownloadTransitMapsAlert */, @@ -873,8 +886,6 @@ F64F19871AB81A00006EAF7E /* DefaultAlert */ = { isa = PBXGroup; children = ( - F64F19881AB81A00006EAF7E /* MWMDefaultAlert+Configure.h */, - F64F19891AB81A00006EAF7E /* MWMDefaultAlert+Configure.mm */, F64F198A1AB81A00006EAF7E /* MWMDefaultAlert.h */, F64F198B1AB81A00006EAF7E /* MWMDefaultAlert.mm */, F64F198C1AB81A00006EAF7E /* MWMDefaultAlert.xib */, @@ -885,8 +896,6 @@ F64F198D1AB81A00006EAF7E /* DownloadAllMapsAlert */ = { isa = PBXGroup; children = ( - F64F198E1AB81A00006EAF7E /* MWMDownloadAllMapsAlert+Configure.h */, - F64F198F1AB81A00006EAF7E /* MWMDownloadAllMapsAlert+Configure.mm */, F64F19901AB81A00006EAF7E /* MWMDownloadAllMapsAlert.h */, F64F19911AB81A00006EAF7E /* MWMDownloadAllMapsAlert.mm */, F64F19921AB81A00006EAF7E /* MWMDownloadAllMapsAlert.xib */, @@ -897,8 +906,6 @@ F64F19931AB81A00006EAF7E /* DownloadTransitMapsAlert */ = { isa = PBXGroup; children = ( - F64F19941AB81A00006EAF7E /* MWMDownloadTransitMapAlert+Configure.h */, - F64F19951AB81A00006EAF7E /* MWMDownloadTransitMapAlert+Configure.mm */, F64F19961AB81A00006EAF7E /* MWMDownloadTransitMapAlert.h */, F64F19971AB81A00006EAF7E /* MWMDownloadTransitMapAlert.mm */, F64F19981AB81A00006EAF7E /* MWMDownloadTransitMapAlert.xib */, @@ -906,6 +913,16 @@ path = DownloadTransitMapsAlert; sourceTree = ""; }; + F67BBB531AC54A7800D162C7 /* FeedbackAlert */ = { + isa = PBXGroup; + children = ( + F67BBB541AC54A7800D162C7 /* MWMFeedbackAlert.h */, + F67BBB551AC54A7800D162C7 /* MWMFeedbackAlert.mm */, + F67BBB561AC54A7800D162C7 /* MWMFeedbackAlert.xib */, + ); + path = FeedbackAlert; + sourceTree = ""; + }; FA065FC61286143F00FEA989 /* External Resources */ = { isa = PBXGroup; children = ( @@ -1179,6 +1196,8 @@ F7FDD823147F30CC005900FA /* drules_proto.bin in Resources */, FAAEA7D1161BD26600CCD661 /* synonyms.txt in Resources */, FA140651162A6288002BC1ED /* empty@2x.png in Resources */, + F61579361AC2CEB60032D8E9 /* MWMRateAlert.xib in Resources */, + F67BBB581AC54A7800D162C7 /* MWMFeedbackAlert.xib in Resources */, FA140653162A6288002BC1ED /* empty.png in Resources */, FA140655162A6288002BC1ED /* eye.png in Resources */, FA140657162A6288002BC1ED /* eye@2x.png in Resources */, @@ -1253,11 +1272,13 @@ 977E26C219E31BCC00BA2219 /* ActiveMapsVC.mm in Sources */, B08AA8CE1A24C7BC00810B1C /* LocalNotificationInfoProvider.m in Sources */, 1D3623260D0F684500981E51 /* MapsAppDelegate.mm in Sources */, + F67BBB571AC54A7800D162C7 /* MWMFeedbackAlert.mm in Sources */, A32B6D4C1A14980500E54A65 /* iosOGLContext.mm in Sources */, B0E1FCDF1A2343BC00A8E08B /* NextTurnPhoneView.m in Sources */, 9746492718EEE2F8004B4658 /* ToolbarView.mm in Sources */, 46F26CD810F623BA00ECCA39 /* EAGLView.mm in Sources */, EED10A4511F78D120095FAD4 /* MapViewController.mm in Sources */, + F61579341AC2CE9A0032D8E9 /* MWMRateAlert.mm in Sources */, A3CC2CD41A1C723900B832E1 /* LocationPredictor.mm in Sources */, EE7F29811219ECA300EB67A9 /* RenderBuffer.mm in Sources */, F62404FB1AAF3DB200B58DB6 /* UILabel+RuntimeAttributes.m in Sources */, @@ -1269,7 +1290,6 @@ 97C9851E186AE3C500AF7E9E /* Reachability.m in Sources */, 977E26B919E2E64200BA2219 /* MapsObservers.mm in Sources */, EE7F29821219ECA300EB67A9 /* RenderContext.mm in Sources */, - F64F19A21AB81A00006EAF7E /* MWMDownloadTransitMapAlert+Configure.mm in Sources */, F64F19991AB81A00006EAF7E /* MWMAlertViewController.mm in Sources */, FAFCB63613366E78001A5C59 /* WebViewController.mm in Sources */, FA34BECA1338D72F00FFB2A7 /* CustomAlertView.mm in Sources */, @@ -1287,7 +1307,6 @@ 976D86F519CB21BD00C920EF /* RouteView.m in Sources */, FA29FDAA141E77F8004ADF66 /* Preferences.mm in Sources */, 97A8000C18B21363000C07A2 /* SearchView.mm in Sources */, - F64F199F1AB81A00006EAF7E /* MWMDownloadAllMapsAlert+Configure.mm in Sources */, FAA5C2A2144F135F005337F6 /* LocationManager.mm in Sources */, 97AA2821190AD21100AE1AAB /* PlacePageShareCell.m in Sources */, 97DEA09618D75BB000C5F963 /* ContextViews.mm in Sources */, @@ -1297,7 +1316,6 @@ F6DBF9B61AA8779300F2EC2C /* CALayer+RuntimeAttributes.m in Sources */, FA36B80D15403A4F004560CC /* BookmarksVC.mm in Sources */, A32B6D4D1A14980500E54A65 /* iosOGLContextFactory.mm in Sources */, - F64F199C1AB81A00006EAF7E /* MWMDefaultAlert+Configure.mm in Sources */, 9769D6EF1912BF3000CA6158 /* ContainerView.mm in Sources */, FAF457E715597D4600DCCC49 /* Framework.cpp in Sources */, 97CC93BB19599F4700369B42 /* SearchSuggestCell.m in Sources */, diff --git a/iphone/Maps/SettingsAndMoreVC.mm b/iphone/Maps/SettingsAndMoreVC.mm index 8d25a27cc8..bef6141346 100644 --- a/iphone/Maps/SettingsAndMoreVC.mm +++ b/iphone/Maps/SettingsAndMoreVC.mm @@ -12,15 +12,58 @@ #import "RichTextVC.h" #import "../../3party/Alohalytics/src/alohalytics_objc.h" -extern NSString * const kAlohalyticsTapEventKey; @interface SettingsAndMoreVC () @property (nonatomic) NSArray * items; -@property (nonatomic) NSDictionary * deviceNames; @end +extern NSString * const kLocaleUsedInSupportEmails = @"en_gb"; +extern NSString * const kAlohalyticsTapEventKey; +extern NSString * const kiOSEmail = @"ios@maps.me"; +extern NSDictionary * const deviceNames = @{@"x86_64" : @"Simulator", + @"i386" : @"Simulator", + @"iPod1,1" : @"iPod Touch", + @"iPod2,1" : @"iPod Touch 2nd gen.", + @"iPod3,1" : @"iPod Touch 3rd gen.", + @"iPod4,1" : @"iPod Touch 4th gen.", + @"iPod5,1" : @"iPod Touch 5th gen.", + @"iPhone1,1" : @"iPhone", + @"iPhone1,2" : @"iPhone 3G", + @"iPhone2,1" : @"iPhone 3GS", + @"iPhone3,1" : @"iPhone 4", + @"iPhone4,1" : @"iPhone 4S", + @"iPhone4,2" : @"iPhone 4S", + @"iPhone4,3" : @"iPhone 4S", + @"iPhone5,1" : @"iPhone 5", + @"iPhone5,2" : @"iPhone 5", + @"iPhone5,3" : @"iPhone 5c", + @"iPhone5,4" : @"iPhone 5c", + @"iPhone6,1" : @"iPhone 5s", + @"iPhone6,2" : @"iPhone 5s", + @"iPad1,1" : @"iPad WiFi", + @"iPad1,2" : @"iPad GSM", + @"iPad2,1" : @"iPad 2 WiFi", + @"iPad2,2" : @"iPad 2 GSM", + @"iPad2,2" : @"iPad 2 CDMA", + @"iPad3,1" : @"iPad 3rd gen. WiFi", + @"iPad3,2" : @"iPad 3rd gen. GSM", + @"iPad3,3" : @"iPad 3rd gen. CDMA", + @"iPad3,4" : @"iPad 4th gen. WiFi", + @"iPad3,5" : @"iPad 4th gen. GSM", + @"iPad3,6" : @"iPad 4th gen. CDMA", + @"iPad4,1" : @"iPad Air WiFi", + @"iPad4,2" : @"iPad Air GSM", + @"iPad4,3" : @"iPad Air CDMA", + @"iPad2,5" : @"iPad Mini WiFi", + @"iPad2,6" : @"iPad Mini GSM", + @"iPad2,7" : @"iPad Mini CDMA", + @"iPad4,4" : @"iPad Mini 2nd gen. WiFi", + @"iPad4,5" : @"iPad Mini 2nd gen. GSM", + @"iPad4,6" : @"iPad Mini 2nd gen. CDMA"}; + + @implementation SettingsAndMoreVC - (void)viewDidLoad @@ -28,48 +71,6 @@ extern NSString * const kAlohalyticsTapEventKey; [super viewDidLoad]; self.title = L(@"settings_and_more"); - - self.deviceNames = @{@"x86_64" : @"Simulator", - @"i386" : @"Simulator", - @"iPod1,1" : @"iPod Touch", - @"iPod2,1" : @"iPod Touch 2nd gen.", - @"iPod3,1" : @"iPod Touch 3rd gen.", - @"iPod4,1" : @"iPod Touch 4th gen.", - @"iPod5,1" : @"iPod Touch 5th gen.", - @"iPhone1,1" : @"iPhone", - @"iPhone1,2" : @"iPhone 3G", - @"iPhone2,1" : @"iPhone 3GS", - @"iPhone3,1" : @"iPhone 4", - @"iPhone4,1" : @"iPhone 4S", - @"iPhone4,2" : @"iPhone 4S", - @"iPhone4,3" : @"iPhone 4S", - @"iPhone5,1" : @"iPhone 5", - @"iPhone5,2" : @"iPhone 5", - @"iPhone5,3" : @"iPhone 5c", - @"iPhone5,4" : @"iPhone 5c", - @"iPhone6,1" : @"iPhone 5s", - @"iPhone6,2" : @"iPhone 5s", - @"iPad1,1" : @"iPad WiFi", - @"iPad1,2" : @"iPad GSM", - @"iPad2,1" : @"iPad 2 WiFi", - @"iPad2,2" : @"iPad 2 GSM", - @"iPad2,2" : @"iPad 2 CDMA", - @"iPad3,1" : @"iPad 3rd gen. WiFi", - @"iPad3,2" : @"iPad 3rd gen. GSM", - @"iPad3,3" : @"iPad 3rd gen. CDMA", - @"iPad3,4" : @"iPad 4th gen. WiFi", - @"iPad3,5" : @"iPad 4th gen. GSM", - @"iPad3,6" : @"iPad 4th gen. CDMA", - @"iPad4,1" : @"iPad Air WiFi", - @"iPad4,2" : @"iPad Air GSM", - @"iPad4,3" : @"iPad Air CDMA", - @"iPad2,5" : @"iPad Mini WiFi", - @"iPad2,6" : @"iPad Mini GSM", - @"iPad2,7" : @"iPad Mini CDMA", - @"iPad4,4" : @"iPad Mini 2nd gen. WiFi", - @"iPad4,5" : @"iPad Mini 2nd gen. GSM", - @"iPad4,6" : @"iPad Mini 2nd gen. CDMA"}; - self.items = @[@{@"Title" : @"", @"Items" : @[@{@"Id" : @"Settings", @"Title" : L(@"settings"), @"Icon" : @"IconAppSettings"}, @{@"Id" : @"Help", @"Title" : L(@"help"), @"Icon" : @"IconHelp"}, @@ -204,28 +205,27 @@ extern NSString * const kAlohalyticsTapEventKey; struct utsname systemInfo; uname(&systemInfo); NSString * machine = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; - NSString * device = self.deviceNames[machine]; + NSString * device = deviceNames[machine]; if (!device) device = machine; NSString * languageCode = [[NSLocale preferredLanguages] firstObject]; - NSString * language = [[NSLocale localeWithLocaleIdentifier:@"en_gb"] displayNameForKey:NSLocaleLanguageCode value:languageCode]; + NSString * language = [[NSLocale localeWithLocaleIdentifier:kLocaleUsedInSupportEmails] displayNameForKey:NSLocaleLanguageCode value:languageCode]; NSString * locale = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; - NSString * country = [[NSLocale localeWithLocaleIdentifier:@"en_gb"] displayNameForKey:NSLocaleCountryCode value:locale]; + NSString * country = [[NSLocale localeWithLocaleIdentifier:kLocaleUsedInSupportEmails] displayNameForKey:NSLocaleCountryCode value:locale]; NSString * bundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey]; NSString * text = [NSString stringWithFormat:@"\n\n\n\n- %@ (%@)\n- MAPS.ME %@\n- %@/%@", device, [UIDevice currentDevice].systemVersion, bundleVersion, language, country]; - NSString * email = @"ios@maps.me"; if ([MFMailComposeViewController canSendMail]) { MFMailComposeViewController * vc = [[MFMailComposeViewController alloc] init]; vc.mailComposeDelegate = self; [vc setSubject:@"MAPS.ME"]; - [vc setToRecipients:@[email]]; + [vc setToRecipients:@[kiOSEmail]]; [vc setMessageBody:text isHTML:NO]; [self presentViewController:vc animated:YES completion:nil]; } else { - NSString * text = [NSString stringWithFormat:L(@"email_error_body"), email]; + NSString * text = [NSString stringWithFormat:L(@"email_error_body"), kiOSEmail]; [[[UIAlertView alloc] initWithTitle:L(@"email_error_title") message:text delegate:nil cancelButtonTitle:L(@"ok") otherButtonTitles:nil] show]; } }