[iOS] New promo screen and promo button

https://jira.mail.ru/browse/MAPSME-12294
This commit is contained in:
Alexander Boriskov 2019-10-28 18:04:23 +03:00 committed by Aleksey Belousov
parent bdf3f6ed4c
commit 9fda68a378
115 changed files with 1786 additions and 1519 deletions

View file

@ -46,6 +46,10 @@
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, ); }; };
991CE2EA2375AF19009EB02A /* PromoAfterBookingCampaignAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 991CE2E82375AF19009EB02A /* PromoAfterBookingCampaignAdapter.mm */; };
991CE2EB2375AF19009EB02A /* PromoAfterBookingCampaignAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 991CE2E92375AF19009EB02A /* PromoAfterBookingCampaignAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; };
991CE2EE2375AF26009EB02A /* PromoDiscoveryCampaignAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 991CE2ED2375AF25009EB02A /* PromoDiscoveryCampaignAdapter.mm */; };
991CE2EF2375AF4E009EB02A /* PromoDiscoveryCampaignAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 991CE2EC2375AF25009EB02A /* PromoDiscoveryCampaignAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@ -92,6 +96,10 @@
47EEAFF22350CEDA005CF316 /* AppInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = AppInfo.mm; sourceTree = "<group>"; };
47EEAFF32350CEDB005CF316 /* AppInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppInfo.h; sourceTree = "<group>"; };
47EEAFF52350CEF6005CF316 /* MWMCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMCommon.h; sourceTree = "<group>"; };
991CE2E82375AF19009EB02A /* PromoAfterBookingCampaignAdapter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PromoAfterBookingCampaignAdapter.mm; sourceTree = "<group>"; };
991CE2E92375AF19009EB02A /* PromoAfterBookingCampaignAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PromoAfterBookingCampaignAdapter.h; sourceTree = "<group>"; };
991CE2EC2375AF25009EB02A /* PromoDiscoveryCampaignAdapter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PromoDiscoveryCampaignAdapter.h; sourceTree = "<group>"; };
991CE2ED2375AF25009EB02A /* PromoDiscoveryCampaignAdapter.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PromoDiscoveryCampaignAdapter.mm; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -128,6 +136,7 @@
470015F12342509C00EBF03D /* CoreApi */ = {
isa = PBXGroup;
children = (
991CE2E72375AEEF009EB02A /* Promo */,
4718C42F2355FC0D00640DF1 /* NetworkPolicy */,
47C637D92354B76700E12DE0 /* Search */,
47C637D32354AEA800E12DE0 /* Traffic */,
@ -258,6 +267,17 @@
path = Search;
sourceTree = "<group>";
};
991CE2E72375AEEF009EB02A /* Promo */ = {
isa = PBXGroup;
children = (
991CE2EC2375AF25009EB02A /* PromoDiscoveryCampaignAdapter.h */,
991CE2ED2375AF25009EB02A /* PromoDiscoveryCampaignAdapter.mm */,
991CE2E92375AF19009EB02A /* PromoAfterBookingCampaignAdapter.h */,
991CE2E82375AF19009EB02A /* PromoAfterBookingCampaignAdapter.mm */,
);
path = Promo;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
@ -283,6 +303,8 @@
4700160F2342579000EBF03D /* MWMTag.h in Headers */,
479F705B234FBB1100011E2E /* MWMUTM.h in Headers */,
479F704A234F785B00011E2E /* MWMTypes.h in Headers */,
991CE2EB2375AF19009EB02A /* PromoAfterBookingCampaignAdapter.h in Headers */,
991CE2EF2375AF4E009EB02A /* PromoDiscoveryCampaignAdapter.h in Headers */,
47C637D72354AEBE00E12DE0 /* MWMTrafficManager.h in Headers */,
47D609DC234FE625008ECC47 /* MWMBookmarksObserver.h in Headers */,
475784C22344B422008291A4 /* Framework.h in Headers */,
@ -363,6 +385,7 @@
47C637D12354A6FB00E12DE0 /* MWMEye.mm in Sources */,
47C637DC2354B79B00E12DE0 /* MWMSearchFrameworkHelper.mm in Sources */,
479F7062234FBC4700011E2E /* MWMCarPlayBookmarkObject.mm in Sources */,
991CE2EA2375AF19009EB02A /* PromoAfterBookingCampaignAdapter.mm in Sources */,
479F705E234FBB8C00011E2E /* MWMCategory.m in Sources */,
479834EB2342697400724D1E /* MWMTagGroup+Convenience.mm in Sources */,
470016082342541100EBF03D /* MWMTagGroup.m in Sources */,
@ -371,6 +394,7 @@
470016072342541100EBF03D /* MWMTag.m in Sources */,
479834EA2342697400724D1E /* MWMTag+Convenience.mm in Sources */,
47C637D62354AEBE00E12DE0 /* MWMTrafficManager.mm in Sources */,
991CE2EE2375AF26009EB02A /* PromoDiscoveryCampaignAdapter.mm in Sources */,
475784C32344B422008291A4 /* Framework.cpp in Sources */,
4718C4332355FC3C00640DF1 /* MWMNetworkPolicy.mm in Sources */,
47EEAFF42350CEDB005CF316 /* AppInfo.mm in Sources */,

View file

@ -19,3 +19,5 @@ FOUNDATION_EXPORT const unsigned char CoreApiVersionString[];
#import <CoreApi/MWMTrafficManager.h>
#import <CoreApi/MWMTypes.h>
#import <CoreApi/MWMUTM.h>
#import <CoreApi/PromoDiscoveryCampaignAdapter.h>
#import <CoreApi/PromoAfterBookingCampaignAdapter.h>

View file

@ -1,14 +1,14 @@
#include "partners_api/promo_api.hpp"
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface MWMPromoAfterBooking : NSObject
@interface PromoAfterBookingCampaignAdapter : NSObject
@property(nonatomic, readonly) NSString *promoId;
@property(nonatomic, readonly) NSString *promoUrl;
@property(nonatomic, readonly) NSString *pictureUrl;
- (instancetype)initWithPromoAfterBooking:(promo::AfterBooking const &)afterBooking;
- (nullable instancetype)init;
@end

View file

@ -0,0 +1,43 @@
#import "PromoAfterBookingCampaignAdapter.h"
#include <CoreApi/Framework.h>
#include "platform/network_policy.hpp"
@interface PromoAfterBookingCampaignAdapter () {
promo::AfterBooking m_afterBooking;
}
@end
@implementation PromoAfterBookingCampaignAdapter
- (instancetype)init {
self = [super init];
if (self) {
auto policy = platform::GetCurrentNetworkPolicy();
auto promoApi = GetFramework().GetPromoApi(policy);
if (promoApi == nullptr)
return nil;
auto const promoAfterBooking = promoApi->GetAfterBooking(languages::GetCurrentNorm());
if (promoAfterBooking.IsEmpty())
return nil;
m_afterBooking = promoAfterBooking;
}
return self;
}
- (NSString *)promoId {
return @(m_afterBooking.m_id.c_str());
}
- (NSString *)promoUrl {
return @(m_afterBooking.m_promoUrl.c_str());
}
- (NSString *)pictureUrl {
return @(m_afterBooking.m_pictureUrl.c_str());
}
@end

View file

@ -0,0 +1,15 @@
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface PromoDiscoveryCampaignAdapter : NSObject
@property(nonatomic, retain, nullable) NSURL *url;
@property(nonatomic) NSInteger type;
- (instancetype)init;
- (BOOL)canShowTipButton;
@end
NS_ASSUME_NONNULL_END

View file

@ -0,0 +1,22 @@
#import "PromoDiscoveryCampaignAdapter.h"
#include "map/onboarding.hpp"
@implementation PromoDiscoveryCampaignAdapter
- (instancetype)init {
self = [super init];
if (self) {
onboarding::Tip tip = onboarding::GetTip();
NSString* urlStr = [[NSString alloc] initWithUTF8String:tip.m_url.c_str()];
_url = [[NSURL alloc] initWithString:urlStr];
_type = static_cast<NSInteger>(tip.m_type);
}
return self;
}
- (BOOL)canShowTipButton {
return onboarding::CanShowTipButton();
}
@end

View file

@ -45,6 +45,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (UIFont *)italic16;
+ (UIFont *)semibold12;
+ (UIFont *)semibold14;
+ (UIFont *)semibold15;
+ (UIFont *)semibold16;
+ (UIFont *)fredokaRegular25;

View file

@ -44,6 +44,7 @@
+ (UIFont *)italic16 { return [UIFont italicSystemFontOfSize:16]; }
+ (UIFont *)semibold12 { return [UIFont systemFontOfSize:14 weight:UIFontWeightSemibold]; }
+ (UIFont *)semibold14 { return [UIFont systemFontOfSize:14 weight:UIFontWeightSemibold]; }
+ (UIFont *)semibold15 { return [UIFont systemFontOfSize:15 weight:UIFontWeightSemibold]; }
+ (UIFont *)semibold16 { return [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold]; }
+ (UIFont *)fredokaRegular25 { return [UIFont fontWithName:@"FredokaOne-Regular" size:25]; }

View file

@ -5,8 +5,6 @@
#import "MWMNetworkPolicy+UI.h"
#import "MWMPlacePageManager.h"
#import "MWMPlacePageProtocol.h"
#import "MWMPromoAfterBooking.h"
#import "MWMPromoApi.h"
#import "MWMSearchManager.h"
#import "MWMSideButtons.h"
#import "MWMTrafficButtonViewController.h"
@ -33,7 +31,7 @@ NSString * const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
@property(nonatomic) MWMSideButtons * sideButtons;
@property(nonatomic) MWMTrafficButtonViewController * trafficButton;
@property(nonatomic) UIButton * crownButton;
@property(nonatomic) UIButton * promoButton;
@property(nonatomic) MWMBottomMenuViewController * menuController;
@property(nonatomic) id<MWMPlacePageProtocol> placePageManager;
@property(nonatomic) MWMNavigationDashboardManager * navigationManager;
@ -44,6 +42,7 @@ NSString * const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
@property(nonatomic) BOOL disableStandbyOnRouteFollowing;
@property(nonatomic) MWMTip tutorialType;
@property(nonatomic) MWMTutorialViewController * tutorialViewContoller;
@property(nonatomic) PromoDiscoveryCampaign * promoDiscoveryCampaign;
@end
@ -63,13 +62,13 @@ NSString * const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
self.trafficButtonHidden = NO;
self.isDirectionViewHidden = YES;
self.menuRestoreState = MWMBottomMenuStateInactive;
if ([MWMFrameworkHelper shouldShowCrown]) {
[controller.controlsView addSubview:self.crownButton];
self.crownButton.translatesAutoresizingMaskIntoConstraints = NO;
self.promoDiscoveryCampaign = [PromoCampaignManager manager].promoDiscoveryCampaign;
if (_promoDiscoveryCampaign.enabled){
[controller.controlsView addSubview:self.promoButton];
self.promoButton.translatesAutoresizingMaskIntoConstraints = NO;
[NSLayoutConstraint activateConstraints:
@[[self.crownButton.leftAnchor constraintEqualToAnchor:self.trafficButton.view.leftAnchor constant:-4],
[self.crownButton.topAnchor constraintEqualToAnchor:self.sideButtons.view.topAnchor]]];
[Statistics logEvent:kStatMapCrownButtonShow withParameters:@{kStatTarget : kStatGuidesSubscription}];
@[[self.promoButton.centerXAnchor constraintEqualToAnchor:self.trafficButton.view.centerXAnchor],
[self.promoButton.topAnchor constraintEqualToAnchor:self.sideButtons.view.topAnchor]]];
}
return self;
}
@ -108,6 +107,7 @@ NSString * const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
[self.searchManager mwm_refreshUI];
[self.menuController mwm_refreshUI];
[self.placePageManager mwm_refreshUI];
[self.promoButton mwm_refreshUI];
[self.ownerController setNeedsStatusBarAppearanceUpdate];
}
@ -239,7 +239,7 @@ NSString * const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
auto nm = self.navigationManager;
[nm onRoutePrepare];
[nm onRoutePointsUpdated];
self.crownButton.hidden = YES;
self.promoButton.hidden = YES;
}
- (void)onRouteRebuild
@ -248,14 +248,14 @@ NSString * const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
self.searchManager.state = MWMSearchManagerStateHidden;
[self.navigationManager onRoutePlanning];
self.crownButton.hidden = YES;
self.promoButton.hidden = YES;
}
- (void)onRouteReady:(BOOL)hasWarnings
{
self.searchManager.state = MWMSearchManagerStateHidden;
[self.navigationManager onRouteReady:hasWarnings];
self.crownButton.hidden = YES;
self.promoButton.hidden = YES;
}
- (void)onRouteStart
@ -266,7 +266,7 @@ NSString * const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
self.disableStandbyOnRouteFollowing = YES;
self.trafficButtonHidden = YES;
[self.navigationManager onRouteStart];
self.crownButton.hidden = YES;
self.promoButton.hidden = YES;
}
- (void)onRouteStop
@ -276,47 +276,19 @@ NSString * const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
[self.navigationManager onRouteStop];
self.disableStandbyOnRouteFollowing = NO;
self.trafficButtonHidden = NO;
self.crownButton.hidden = NO;
self.promoButton.hidden = NO;
}
- (void)onCrown:(UIButton *)sender {
[Statistics logEvent:kStatMapCrownButtonClick withParameters:@{kStatTarget : kStatGuidesSubscription}];
BookmarksSubscriptionViewController *controller = [[BookmarksSubscriptionViewController alloc] init];
controller.onSubscribe = ^{
MapViewController *mapViewController = self.ownerController;
[mapViewController dismissViewControllerAnimated:YES completion:nil];
SubscriptionGoToCatalogViewController *successDialog =
[[SubscriptionGoToCatalogViewController alloc] init:SubscriptionScreenTypeSightseeing
onOk:^{
[mapViewController dismissViewControllerAnimated:YES completion:nil];
[mapViewController openCatalogAnimated:YES utm:MWMUTMCrownButton];
} onCancel:^{
[mapViewController dismissViewControllerAnimated:YES completion:nil];
}];
[mapViewController presentViewController:successDialog animated:YES completion:nil];
};
controller.onCancel = ^{
[self.ownerController dismissViewControllerAnimated:YES completion:nil];
};
controller.source = kStatSponsoredButton;
[self.ownerController presentViewController:controller animated:YES completion:^{
self.crownButton.hidden = YES;
}];
[MWMEye crownClicked];
}
#pragma mark - Properties
- (UIButton *)crownButton {
if (!_crownButton) {
_crownButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_crownButton setImage:[UIImage imageNamed:@"bookmarksSubscriptionPromo"] forState:UIControlStateNormal];
[_crownButton addTarget:self action:@selector(onCrown:) forControlEvents:UIControlEventTouchUpInside];
- (UIButton *)promoButton {
if (!_promoButton) {
PromoCoordinator * coordinator = [[PromoCoordinator alloc] initWithViewController:self.ownerController
campaign:_promoDiscoveryCampaign];
_promoButton = [[PromoButton alloc] initWithCoordinator:coordinator];
}
return _crownButton;
return _promoButton;
}
- (MWMSideButtons *)sideButtons
@ -477,9 +449,9 @@ NSString * const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
}
- (BOOL)showPromoBookingIfNeeded {
MWMPromoAfterBooking *afterBooking = [MWMPromoApi afterBooking];
if (!afterBooking)
PromoAfterBookingCampaign * afterBooking = [PromoCampaignManager manager].promoAfterBookingCampaign;
if (!afterBooking.enabled)
return NO;
MWMVoidBlock ok = ^{

View file

@ -0,0 +1,70 @@
import UIKit
@objc class PromoButton: UIButton {
private let coordinator: PromoCoordinator
private var timer: Timer?
private let buttonSize: CGSize = CGSize(width: 48, height: 48)
@objc init(coordinator: PromoCoordinator) {
self.coordinator = coordinator
super.init(frame: CGRect(x: 0, y: 0, width: buttonSize.width, height: buttonSize.height))
configure()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func configure() {
removeTarget(self, action: nil, for: .touchUpInside)
timer?.invalidate()
timer = nil
configureDiscovery()
}
private func configureDiscovery() {
if UIColor.isNightMode() {
setImage(UIImage.init(named: "promo_discovery_button_night"), for: .normal)
} else {
setImage(UIImage.init(named: "promo_discovery_button_day"), for: .normal)
}
addTarget(self, action: #selector(onButtonPress), for: .touchUpInside)
let view = UIView(frame: CGRect(x: buttonSize.width - 14, y: 0, width: 12, height: 12))
view.layer.cornerRadius = view.size.width/2
view.backgroundColor = UIColor.red
addSubview(view)
imageView?.clipsToBounds = false
imageView?.contentMode = .center
let animation = CABasicAnimation(keyPath: "transform.rotation.z")
animation.duration = kDefaultAnimationDuration
animation.fromValue = 0
animation.toValue = Double(-30 * Double.pi / 180)
animation.autoreverses = true
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
animation.repeatCount = 1
let animationGroup = CAAnimationGroup()
animationGroup.duration = 3
animationGroup.repeatCount = Float(Int.max)
animationGroup.animations = [animation]
imageView?.layer.add(animationGroup, forKey: "transform.rotation.z")
}
@objc private func onButtonPress(sender: UIButton) {
coordinator.onPromoButtonPress(completion: { [weak self] in
self?.isHidden = true;
self?.timer?.invalidate()
self?.timer = nil
})
}
override func mwm_refreshUI() {
super.mwm_refreshUI()
configure()
}
}

View file

@ -0,0 +1,30 @@
import UIKit
@objc class PromoCoordinator: NSObject {
@objc enum PromoType: Int{
case crown
case discoveryGuide
case discoverySubscribe
case discoveryFree
}
private weak var mapViewController: MapViewController?
let campaign: PromoDiscoveryCampaign
@objc init(viewController: MapViewController, campaign: PromoDiscoveryCampaign) {
self.mapViewController = viewController
self.campaign = campaign
}
func onPromoButtonPress(completion: @escaping () -> Void) {
presentPromoDiscoveryOnboarding(completion: completion)
}
private func presentPromoDiscoveryOnboarding(completion: @escaping () -> Void) {
let vc = PromoDiscoveryBuilder.build(rootViewController: mapViewController, campaign: campaign)
vc.modalPresentationStyle = .fullScreen
mapViewController?.present(vc, animated: true, completion: {
completion()
})
}
}

View file

@ -0,0 +1,25 @@
@objc class PromoAfterBookingCampaign: NSObject, IPromoCampaign {
private var adapter: PromoAfterBookingCampaignAdapter?
@objc let promoId: String
@objc let promoUrl: String
@objc let pictureUrl: String
var enabled: Bool {
return adapter != nil
}
required override init() {
adapter = PromoAfterBookingCampaignAdapter()
guard let adapter = adapter else{
promoId = ""
promoUrl = ""
pictureUrl = ""
return;
}
promoId = adapter.promoId
promoUrl = adapter.promoUrl
pictureUrl = adapter.pictureUrl
}
}

View file

@ -0,0 +1,4 @@
@objc protocol IPromoCampaign {
init()
var enabled: Bool { get }
}

View file

@ -0,0 +1,20 @@
@objc protocol IPromoCampaignManager {
@objc var promoDiscoveryCampaign: PromoDiscoveryCampaign { get }
@objc var promoAfterBookingCampaign: PromoAfterBookingCampaign { get }
}
@objc class PromoCampaignManager: NSObject, IPromoCampaignManager {
private static var shared: IPromoCampaignManager = PromoCampaignManager()
@objc static func manager() -> IPromoCampaignManager {
return shared
}
@objc lazy var promoDiscoveryCampaign: PromoDiscoveryCampaign = {
return PromoDiscoveryCampaign()
}()
@objc lazy var promoAfterBookingCampaign: PromoAfterBookingCampaign = {
return PromoAfterBookingCampaign()
}()
}

View file

@ -0,0 +1,22 @@
@objc class PromoDiscoveryCampaign: NSObject, IPromoCampaign {
enum Group: Int {
case discoverCatalog = 0
case downloadSamples
case buySubscription
}
private var adapter: PromoDiscoveryCampaignAdapter
let group: Group
let url: URL?
var enabled: Bool {
return adapter.canShowTipButton() && Alohalytics.isFirstSession();
}
required override init() {
adapter = PromoDiscoveryCampaignAdapter()
group = Group(rawValue: adapter.type) ?? .discoverCatalog
url = adapter.url
}
}

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_06 1.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_06 1@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_06 1@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_03.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_03@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_03@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_02.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_02@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_02@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_05 1.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_05 1@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_05 1@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_04.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_04@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_04@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icons_set_v_48.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_48@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_48@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_01.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_01@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "icons_set_v_52_pic_01@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

View file

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View file

@ -2,17 +2,17 @@
"images" : [
{
"idiom" : "universal",
"filename" : "img_welcome.png",
"filename" : "Group 334.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "img_welcome@2x.png",
"filename" : "Group 334@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "img_welcome@3x.png",
"filename" : "Group 334@3x.png",
"scale" : "3x"
}
],

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Group 334.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Group 334@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "Group 334@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Shape-1.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Shape@2x-1.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "Shape@3x-1.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Shape.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Shape@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "Shape@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -293,8 +293,6 @@
34D3B0481E389D05004100F9 /* MWMNoteCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D3B0151E389D05004100F9 /* MWMNoteCell.m */; };
34D3B04B1E389D05004100F9 /* MWMNoteCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34D3B0161E389D05004100F9 /* MWMNoteCell.xib */; };
34D3B04F1E38A20C004100F9 /* Bundle+Init.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D3B04D1E38A20C004100F9 /* Bundle+Init.swift */; };
34D4FA631E26572D003F53EF /* FirstLaunchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D4FA611E26572D003F53EF /* FirstLaunchController.swift */; };
34D4FA671E265749003F53EF /* WhatsNewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D4FA651E265749003F53EF /* WhatsNewController.swift */; };
34E50DD81F6FCAB1008EED49 /* UGCSummaryRatingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34E50DD51F6FCAB1008EED49 /* UGCSummaryRatingCell.swift */; };
34E50DDB1F6FCAB1008EED49 /* UGCSummaryRatingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34E50DD61F6FCAB1008EED49 /* UGCSummaryRatingCell.xib */; };
34E50DE01F6FCBA1008EED49 /* UGCAddReviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34E50DDD1F6FCBA1008EED49 /* UGCAddReviewCell.swift */; };
@ -328,8 +326,6 @@
3D15ACEE2155117000F725D5 /* MWMObjectsCategorySelectorDataSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3D15ACED2155117000F725D5 /* MWMObjectsCategorySelectorDataSource.mm */; };
3D1958EB213804B6009A83EC /* libmetrics.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D1958EA213804B6009A83EC /* libmetrics.a */; };
3DB1C57122D5DDA60097EC4C /* PromoAfterBookingViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3DB1C57022D5DDA60097EC4C /* PromoAfterBookingViewController.xib */; };
3DD1A20B22D8D93500B158F4 /* MWMPromoAfterBooking.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3DD1A20A22D8D93500B158F4 /* MWMPromoAfterBooking.mm */; };
3DD1A20F22D8DD1100B158F4 /* MWMPromoApi.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3DD1A20E22D8DD1100B158F4 /* MWMPromoApi.mm */; };
3DE1762422D614B8000214FF /* PromoAfterBookingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DE1762322D614B8000214FF /* PromoAfterBookingViewController.swift */; };
3DEE1AEB21F72CD300054A91 /* MWMPowerManagmentViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3DEE1AEA21F72CD300054A91 /* MWMPowerManagmentViewController.mm */; };
3DF9C22B207CC14A00DA0793 /* taxi_places in Resources */ = {isa = PBXBuildFile; fileRef = 3DF9C22A207CC14A00DA0793 /* taxi_places */; };
@ -384,12 +380,10 @@
4767CDA420AAF66B00BD8166 /* NSAttributedString+HTML.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4767CDA320AAF66B00BD8166 /* NSAttributedString+HTML.swift */; };
4767CDA620AB1F6200BD8166 /* LeftAlignedIconButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4767CDA520AB1F6200BD8166 /* LeftAlignedIconButton.swift */; };
4767CDA820AB401000BD8166 /* LinkTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4767CDA720AB401000BD8166 /* LinkTextView.swift */; };
4767CDC120B477BA00BD8166 /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4767CDC020B477BA00BD8166 /* WelcomeViewController.swift */; };
47699A0821F08E37009E6585 /* NSDate+TimeDistance.m in Sources */ = {isa = PBXBuildFile; fileRef = 47699A0721F08E37009E6585 /* NSDate+TimeDistance.m */; };
47699A0A21F0C4C8009E6585 /* NotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47699A0921F0C4C8009E6585 /* NotificationManager.swift */; };
477219052243E79500E5B227 /* DrivingOptionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477219042243E79500E5B227 /* DrivingOptionsViewController.swift */; };
477D7AC7218F1515007EE2CB /* IPaidRoutePurchase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477D7AC6218F1515007EE2CB /* IPaidRoutePurchase.swift */; };
47800D1D20BEEE2E00072F42 /* TermsOfUseController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47800D1C20BEEE2E00072F42 /* TermsOfUseController.swift */; };
47800D2520C05E3200072F42 /* libFlurry_8.6.1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 47800D2420C05E3200072F42 /* libFlurry_8.6.1.a */; };
47868A7B22145A2C000AFC86 /* GuideNameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47868A7A22145A2C000AFC86 /* GuideNameViewController.swift */; };
47868A7D22145A95000AFC86 /* GuideDescriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47868A7C22145A95000AFC86 /* GuideDescriptionViewController.swift */; };
@ -420,7 +414,6 @@
47B9065321C7FA400079C85E /* MWMImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 47B9064A21C7FA3C0079C85E /* MWMImageCache.m */; };
47B9065421C7FA400079C85E /* UIImageView+WebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 47B9064F21C7FA3E0079C85E /* UIImageView+WebImage.m */; };
47B9065521C7FA400079C85E /* NSString+MD5.m in Sources */ = {isa = PBXBuildFile; fileRef = 47B9065021C7FA3F0079C85E /* NSString+MD5.m */; };
47C3DB582268CDDB00DF6F91 /* DeeplinkInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C3DB572268CDD800DF6F91 /* DeeplinkInfoViewController.swift */; };
47C7F9732191E15A00C2760C /* InAppBilling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C7F9722191E15A00C2760C /* InAppBilling.swift */; };
47C7F97521930F5300C2760C /* IInAppBilling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C7F97421930F5300C2760C /* IInAppBilling.swift */; };
47C8789022DF525A00A772DA /* SubscriptionSuccessViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C8788E22DF525A00A772DA /* SubscriptionSuccessViewController.swift */; };
@ -557,16 +550,41 @@
6B653B951C7F2DE4007BEFC5 /* cuisine-strings in Resources */ = {isa = PBXBuildFile; fileRef = 6B653B931C7F2DE4007BEFC5 /* cuisine-strings */; };
6B9978361C89A316003B8AA0 /* editor.config in Resources */ = {isa = PBXBuildFile; fileRef = 6B9978341C89A316003B8AA0 /* editor.config */; };
7BD07E4A8D71CA41F082BEC7 /* Pods_MAPS_ME.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58E5736C23FC4E77509C9946 /* Pods_MAPS_ME.framework */; };
991CE2BF2371D349009EB02A /* PromoCampaignManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 991CE2BA2371D349009EB02A /* PromoCampaignManager.swift */; };
991CE2C02371D349009EB02A /* PromoCampaign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 991CE2BB2371D349009EB02A /* PromoCampaign.swift */; };
991CE2C22371D349009EB02A /* PromoDiscoveryCampaign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 991CE2BE2371D349009EB02A /* PromoDiscoveryCampaign.swift */; };
991CE2DD2373145C009EB02A /* PromoAfterBookingCampaign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 991CE2DC2373145C009EB02A /* PromoAfterBookingCampaign.swift */; };
99425AF4236855BB00D005C0 /* PromoDiscoveryRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99425AF3236855BB00D005C0 /* PromoDiscoveryRouter.swift */; };
99425AFC23685F1E00D005C0 /* PromoDiscoveryPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99425AFB23685F1E00D005C0 /* PromoDiscoveryPresenter.swift */; };
99536111235DABB1008B218F /* BaseSubscriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99536110235DABB1008B218F /* BaseSubscriptionViewController.swift */; };
99536113235DB86C008B218F /* BookmarksSubscriptionDiscountLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99536112235DB86C008B218F /* BookmarksSubscriptionDiscountLabel.swift */; };
995738DB235484410019AEE7 /* AllPassSubscriptionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 995738DA235484410019AEE7 /* AllPassSubscriptionViewController.xib */; };
995739042355CAA30019AEE7 /* PageIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 995739032355CAA30019AEE7 /* PageIndicator.swift */; };
995739062355CAC40019AEE7 /* ImageViewCrossDisolve.swift in Sources */ = {isa = PBXBuildFile; fileRef = 995739052355CAC40019AEE7 /* ImageViewCrossDisolve.swift */; };
995739082355CB660019AEE7 /* AllPassSubscriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 995739072355CB660019AEE7 /* AllPassSubscriptionViewController.swift */; };
9975225A236B187400ADF673 /* FirstLaunchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99752259236B187400ADF673 /* FirstLaunchController.swift */; };
99B6A74C2362F5AA002C94CB /* PromoButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B6A74B2362F5AA002C94CB /* PromoButton.swift */; };
99B6A74E2362F5CD002C94CB /* PromoCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B6A74D2362F5CD002C94CB /* PromoCoordinator.swift */; };
99B6A77F23684573002C94CB /* PromoDiscoveryBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B6A77E23684573002C94CB /* PromoDiscoveryBuilder.swift */; };
99CB34962369C281001D28AD /* FirstLaunchBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34952369C281001D28AD /* FirstLaunchBuilder.swift */; };
99CB34982369C291001D28AD /* FirstLaunchPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34972369C291001D28AD /* FirstLaunchPresenter.swift */; };
99CB34B02369DF2E001D28AD /* WhatsNewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34AB2369DF2E001D28AD /* WhatsNewPresenter.swift */; };
99CB34B32369DF2E001D28AD /* WhatsNewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34AE2369DF2E001D28AD /* WhatsNewBuilder.swift */; };
99CB34B72369E188001D28AD /* WelcomeRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34B62369E188001D28AD /* WelcomeRouter.swift */; };
99CB34BD2369EAAC001D28AD /* TermsOfUsePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34B82369EAAC001D28AD /* TermsOfUsePresenter.swift */; };
99CB34BF2369EAAC001D28AD /* TermsOfUseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34BA2369EAAC001D28AD /* TermsOfUseViewController.swift */; };
99CB34C02369EAAC001D28AD /* TermsOfUseBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34BB2369EAAC001D28AD /* TermsOfUseBuilder.swift */; };
99CB34C3236AEAEA001D28AD /* WhatsNewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34C2236AEAEA001D28AD /* WhatsNewController.swift */; };
99CB34C5236B00FD001D28AD /* WelcomeStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34C4236B00FD001D28AD /* WelcomeStorage.swift */; };
99CB34CC236B054B001D28AD /* DeepLinkInfoPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34C7236B054B001D28AD /* DeepLinkInfoPresenter.swift */; };
99CB34CD236B054B001D28AD /* DeepLinkInfoRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34C8236B054B001D28AD /* DeepLinkInfoRouter.swift */; };
99CB34CF236B054B001D28AD /* DeepLinkInfoBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34CA236B054B001D28AD /* DeepLinkInfoBuilder.swift */; };
99D363172358647700941BF4 /* SubscriptionGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99D363162358647700941BF4 /* SubscriptionGroup.swift */; };
99D363192358685300941BF4 /* SubscriptionGroupItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99D363182358685300941BF4 /* SubscriptionGroupItem.swift */; };
99D3631E23589BE800941BF4 /* FredokaOne-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 99D3631D23589BE800941BF4 /* FredokaOne-Regular.ttf */; };
99E2B0122368A8C700FFABC5 /* MWMCategory+PlacesCountTitle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99E2B0112368A8C700FFABC5 /* MWMCategory+PlacesCountTitle.swift */; };
99E2B01E23698B0800FFABC5 /* WelcomeProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99E2B01D23698B0800FFABC5 /* WelcomeProtocols.swift */; };
99E2B0232369904800FFABC5 /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99E2B0222369904800FFABC5 /* WelcomeViewController.swift */; };
A630D1EA207CA95900976DEA /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = A630D1E8207CA95900976DEA /* Localizable.stringsdict */; };
B32FE74020D2844600EF7446 /* DownloadedBookmarksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B32FE73E20D2844600EF7446 /* DownloadedBookmarksViewController.swift */; };
B32FE74120D2844600EF7446 /* DownloadedBookmarksViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B32FE73F20D2844600EF7446 /* DownloadedBookmarksViewController.xib */; };
@ -1268,8 +1286,6 @@
34D3B0151E389D05004100F9 /* MWMNoteCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMNoteCell.m; sourceTree = "<group>"; };
34D3B0161E389D05004100F9 /* MWMNoteCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMNoteCell.xib; sourceTree = "<group>"; };
34D3B04D1E38A20C004100F9 /* Bundle+Init.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bundle+Init.swift"; sourceTree = "<group>"; };
34D4FA611E26572D003F53EF /* FirstLaunchController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirstLaunchController.swift; sourceTree = "<group>"; };
34D4FA651E265749003F53EF /* WhatsNewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhatsNewController.swift; sourceTree = "<group>"; };
34D7DB77204ED3DD0041D015 /* maps.me dbg.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "maps.me dbg.entitlements"; sourceTree = "<group>"; };
34DFCD971F87ED2400AE2672 /* MWMReviewsViewModelProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMReviewsViewModelProtocol.h; sourceTree = "<group>"; };
34DFCD981F87ED5600AE2672 /* MWMReviewProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMReviewProtocol.h; sourceTree = "<group>"; };
@ -1375,10 +1391,6 @@
3D15ACEF2155118800F725D5 /* MWMObjectsCategorySelectorDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMObjectsCategorySelectorDataSource.h; sourceTree = "<group>"; };
3D1958EA213804B6009A83EC /* libmetrics.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libmetrics.a; sourceTree = BUILT_PRODUCTS_DIR; };
3DB1C57022D5DDA60097EC4C /* PromoAfterBookingViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PromoAfterBookingViewController.xib; sourceTree = "<group>"; };
3DD1A20A22D8D93500B158F4 /* MWMPromoAfterBooking.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPromoAfterBooking.mm; sourceTree = "<group>"; };
3DD1A20C22D8DB0B00B158F4 /* MWMPromoAfterBooking.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMPromoAfterBooking.h; sourceTree = "<group>"; };
3DD1A20D22D8DCF400B158F4 /* MWMPromoApi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMPromoApi.h; sourceTree = "<group>"; };
3DD1A20E22D8DD1100B158F4 /* MWMPromoApi.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPromoApi.mm; sourceTree = "<group>"; };
3DDB4BC31DAB98F000F4D021 /* libpartners_api.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpartners_api.a; path = "../../../omim-xcode-build/Debug-iphonesimulator/libpartners_api.a"; sourceTree = "<group>"; };
3DE1762322D614B8000214FF /* PromoAfterBookingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromoAfterBookingViewController.swift; sourceTree = "<group>"; };
3DEE1AE921F72CD300054A91 /* MWMPowerManagmentViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMPowerManagmentViewController.h; sourceTree = "<group>"; };
@ -1449,13 +1461,11 @@
4767CDA320AAF66B00BD8166 /* NSAttributedString+HTML.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSAttributedString+HTML.swift"; sourceTree = "<group>"; };
4767CDA520AB1F6200BD8166 /* LeftAlignedIconButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeftAlignedIconButton.swift; sourceTree = "<group>"; };
4767CDA720AB401000BD8166 /* LinkTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkTextView.swift; sourceTree = "<group>"; };
4767CDC020B477BA00BD8166 /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = "<group>"; };
47699A0621F08E37009E6585 /* NSDate+TimeDistance.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSDate+TimeDistance.h"; sourceTree = "<group>"; };
47699A0721F08E37009E6585 /* NSDate+TimeDistance.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSDate+TimeDistance.m"; sourceTree = "<group>"; };
47699A0921F0C4C8009E6585 /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = "<group>"; };
477219042243E79500E5B227 /* DrivingOptionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrivingOptionsViewController.swift; sourceTree = "<group>"; };
477D7AC6218F1515007EE2CB /* IPaidRoutePurchase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPaidRoutePurchase.swift; sourceTree = "<group>"; };
47800D1C20BEEE2E00072F42 /* TermsOfUseController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfUseController.swift; sourceTree = "<group>"; };
47800D2420C05E3200072F42 /* libFlurry_8.6.1.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libFlurry_8.6.1.a; sourceTree = "<group>"; };
47800D2620C05E8700072F42 /* FlurryConsent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlurryConsent.h; sourceTree = "<group>"; };
47868A7A22145A2C000AFC86 /* GuideNameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuideNameViewController.swift; sourceTree = "<group>"; };
@ -1499,7 +1509,6 @@
47B9064F21C7FA3E0079C85E /* UIImageView+WebImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+WebImage.m"; sourceTree = "<group>"; };
47B9065021C7FA3F0079C85E /* NSString+MD5.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+MD5.m"; sourceTree = "<group>"; };
47B9065121C7FA400079C85E /* IMWMImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IMWMImageCache.h; sourceTree = "<group>"; };
47C3DB572268CDD800DF6F91 /* DeeplinkInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeeplinkInfoViewController.swift; sourceTree = "<group>"; };
47C7F9722191E15A00C2760C /* InAppBilling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppBilling.swift; sourceTree = "<group>"; };
47C7F97421930F5300C2760C /* IInAppBilling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IInAppBilling.swift; sourceTree = "<group>"; };
47C7F976219310D800C2760C /* IMWMPurchaseValidation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IMWMPurchaseValidation.h; sourceTree = "<group>"; };
@ -1589,16 +1598,41 @@
8D1107310486CEB800E47090 /* MAPSME.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = MAPSME.plist; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
978D4A30199A11E600D72CA7 /* faq.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = faq.html; path = ../../data/faq.html; sourceTree = "<group>"; };
97A5967E19B9CD47007A963F /* copyright.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = copyright.html; path = ../../data/copyright.html; sourceTree = "<group>"; };
991CE2BA2371D349009EB02A /* PromoCampaignManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromoCampaignManager.swift; sourceTree = "<group>"; };
991CE2BB2371D349009EB02A /* PromoCampaign.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromoCampaign.swift; sourceTree = "<group>"; };
991CE2BE2371D349009EB02A /* PromoDiscoveryCampaign.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromoDiscoveryCampaign.swift; sourceTree = "<group>"; };
991CE2DC2373145C009EB02A /* PromoAfterBookingCampaign.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromoAfterBookingCampaign.swift; sourceTree = "<group>"; };
99425AF3236855BB00D005C0 /* PromoDiscoveryRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromoDiscoveryRouter.swift; sourceTree = "<group>"; };
99425AFB23685F1E00D005C0 /* PromoDiscoveryPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromoDiscoveryPresenter.swift; sourceTree = "<group>"; };
99536110235DABB1008B218F /* BaseSubscriptionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseSubscriptionViewController.swift; sourceTree = "<group>"; };
99536112235DB86C008B218F /* BookmarksSubscriptionDiscountLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksSubscriptionDiscountLabel.swift; sourceTree = "<group>"; };
995738DA235484410019AEE7 /* AllPassSubscriptionViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AllPassSubscriptionViewController.xib; sourceTree = "<group>"; };
995739032355CAA30019AEE7 /* PageIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageIndicator.swift; sourceTree = "<group>"; };
995739052355CAC40019AEE7 /* ImageViewCrossDisolve.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageViewCrossDisolve.swift; sourceTree = "<group>"; };
995739072355CB660019AEE7 /* AllPassSubscriptionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllPassSubscriptionViewController.swift; sourceTree = "<group>"; };
99752259236B187400ADF673 /* FirstLaunchController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstLaunchController.swift; sourceTree = "<group>"; };
99B6A74B2362F5AA002C94CB /* PromoButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromoButton.swift; sourceTree = "<group>"; };
99B6A74D2362F5CD002C94CB /* PromoCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromoCoordinator.swift; sourceTree = "<group>"; };
99B6A77E23684573002C94CB /* PromoDiscoveryBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromoDiscoveryBuilder.swift; sourceTree = "<group>"; };
99CB34952369C281001D28AD /* FirstLaunchBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstLaunchBuilder.swift; sourceTree = "<group>"; };
99CB34972369C291001D28AD /* FirstLaunchPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstLaunchPresenter.swift; sourceTree = "<group>"; };
99CB34AB2369DF2E001D28AD /* WhatsNewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNewPresenter.swift; sourceTree = "<group>"; };
99CB34AE2369DF2E001D28AD /* WhatsNewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNewBuilder.swift; sourceTree = "<group>"; };
99CB34B62369E188001D28AD /* WelcomeRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeRouter.swift; sourceTree = "<group>"; };
99CB34B82369EAAC001D28AD /* TermsOfUsePresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfUsePresenter.swift; sourceTree = "<group>"; };
99CB34BA2369EAAC001D28AD /* TermsOfUseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfUseViewController.swift; sourceTree = "<group>"; };
99CB34BB2369EAAC001D28AD /* TermsOfUseBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfUseBuilder.swift; sourceTree = "<group>"; };
99CB34C2236AEAEA001D28AD /* WhatsNewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNewController.swift; sourceTree = "<group>"; };
99CB34C4236B00FD001D28AD /* WelcomeStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeStorage.swift; sourceTree = "<group>"; };
99CB34C7236B054B001D28AD /* DeepLinkInfoPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLinkInfoPresenter.swift; sourceTree = "<group>"; };
99CB34C8236B054B001D28AD /* DeepLinkInfoRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLinkInfoRouter.swift; sourceTree = "<group>"; };
99CB34CA236B054B001D28AD /* DeepLinkInfoBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLinkInfoBuilder.swift; sourceTree = "<group>"; };
99D363162358647700941BF4 /* SubscriptionGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionGroup.swift; sourceTree = "<group>"; };
99D363182358685300941BF4 /* SubscriptionGroupItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionGroupItem.swift; sourceTree = "<group>"; };
99D3631D23589BE800941BF4 /* FredokaOne-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "FredokaOne-Regular.ttf"; sourceTree = "<group>"; };
99E2B0112368A8C700FFABC5 /* MWMCategory+PlacesCountTitle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MWMCategory+PlacesCountTitle.swift"; sourceTree = "<group>"; };
99E2B01D23698B0800FFABC5 /* WelcomeProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeProtocols.swift; sourceTree = "<group>"; };
99E2B0222369904800FFABC5 /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = "<group>"; };
9DF04B231B71010E00DACAF1 /* 02_droidsans-fallback.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "02_droidsans-fallback.ttf"; path = "../../data/02_droidsans-fallback.ttf"; sourceTree = "<group>"; };
A367C93A1B17334800E2B6E7 /* resources-default */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-default"; path = "../../data/resources-default"; sourceTree = "<group>"; };
A630D1E9207CA95900976DEA /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ar; path = ar.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
@ -2460,6 +2494,7 @@
340475281E081A4600C92850 /* Core */ = {
isa = PBXGroup;
children = (
991CE2B92371D349009EB02A /* PromoCampaign */,
CDCA27822245090900167D87 /* EventListening */,
47B9064821C7FA100079C85E /* WebImage */,
470F5A7B2189BA7200754295 /* InappPurchase */,
@ -2600,8 +2635,8 @@
340E1EE71E2F614400CE49BF /* SearchFilters.storyboard */,
340E1EE81E2F614400CE49BF /* Settings.storyboard */,
340E1EE91E2F614400CE49BF /* Storyboard.swift */,
340E1EEA1E2F614400CE49BF /* Welcome.storyboard */,
CDB4D4D6222D248900104869 /* CarPlayStoryboard.storyboard */,
340E1EEA1E2F614400CE49BF /* Welcome.storyboard */,
);
path = Storyboard;
sourceTree = "<group>";
@ -2997,11 +3032,12 @@
isa = PBXGroup;
children = (
34943BB91E2626B200B14F84 /* WelcomePageController.swift */,
34D4FA611E26572D003F53EF /* FirstLaunchController.swift */,
34D4FA651E265749003F53EF /* WhatsNewController.swift */,
4767CDC020B477BA00BD8166 /* WelcomeViewController.swift */,
47800D1C20BEEE2E00072F42 /* TermsOfUseController.swift */,
47C3DB572268CDD800DF6F91 /* DeeplinkInfoViewController.swift */,
99CB34D1236B0C2A001D28AD /* WelcomeView */,
99CB34C6236B052B001D28AD /* DeepLinkInfo */,
99CB34AA2369DF23001D28AD /* WhatsNew */,
99E2B024236990A100FFABC5 /* TermsOfUse */,
99E2B01F23698C0900FFABC5 /* FirstLaunch */,
99B6A77D2368454D002C94CB /* PromoDiscovery */,
);
path = Welcome;
sourceTree = "<group>";
@ -3226,6 +3262,7 @@
34BC72091B0DECAE0012A34B /* MapViewControls */ = {
isa = PBXGroup;
children = (
99B6A74A2362F579002C94CB /* PromoButton */,
474A450520EBA03900C10B4E /* Layers */,
340537621BBED98600D452C6 /* MWMMapViewControlsCommon.h */,
34BC72101B0DECAE0012A34B /* MWMMapViewControlsManager.h */,
@ -3382,10 +3419,6 @@
children = (
3DB1C57022D5DDA60097EC4C /* PromoAfterBookingViewController.xib */,
3DE1762322D614B8000214FF /* PromoAfterBookingViewController.swift */,
3DD1A20A22D8D93500B158F4 /* MWMPromoAfterBooking.mm */,
3DD1A20C22D8DB0B00B158F4 /* MWMPromoAfterBooking.h */,
3DD1A20D22D8DCF400B158F4 /* MWMPromoApi.h */,
3DD1A20E22D8DD1100B158F4 /* MWMPromoApi.mm */,
);
path = Promo;
sourceTree = "<group>";
@ -3586,6 +3619,33 @@
name = "Custom Views";
sourceTree = "<group>";
};
991CE2B92371D349009EB02A /* PromoCampaign */ = {
isa = PBXGroup;
children = (
991CE2DB23731440009EB02A /* PromoAfterBookingCampaign */,
991CE2BD2371D349009EB02A /* PromoDiscoveryCampaign */,
991CE2BA2371D349009EB02A /* PromoCampaignManager.swift */,
991CE2BB2371D349009EB02A /* PromoCampaign.swift */,
);
path = PromoCampaign;
sourceTree = "<group>";
};
991CE2BD2371D349009EB02A /* PromoDiscoveryCampaign */ = {
isa = PBXGroup;
children = (
991CE2BE2371D349009EB02A /* PromoDiscoveryCampaign.swift */,
);
path = PromoDiscoveryCampaign;
sourceTree = "<group>";
};
991CE2DB23731440009EB02A /* PromoAfterBookingCampaign */ = {
isa = PBXGroup;
children = (
991CE2DC2373145C009EB02A /* PromoAfterBookingCampaign.swift */,
);
path = PromoAfterBookingCampaign;
sourceTree = "<group>";
};
995738D9235481FE0019AEE7 /* Subscription */ = {
isa = PBXGroup;
children = (
@ -3609,6 +3669,76 @@
path = Pages;
sourceTree = "<group>";
};
99B6A74A2362F579002C94CB /* PromoButton */ = {
isa = PBXGroup;
children = (
99B6A74B2362F5AA002C94CB /* PromoButton.swift */,
99B6A74D2362F5CD002C94CB /* PromoCoordinator.swift */,
);
path = PromoButton;
sourceTree = "<group>";
};
99B6A77D2368454D002C94CB /* PromoDiscovery */ = {
isa = PBXGroup;
children = (
99B6A77E23684573002C94CB /* PromoDiscoveryBuilder.swift */,
99425AFB23685F1E00D005C0 /* PromoDiscoveryPresenter.swift */,
99425AF3236855BB00D005C0 /* PromoDiscoveryRouter.swift */,
);
path = PromoDiscovery;
sourceTree = "<group>";
};
99CB34AA2369DF23001D28AD /* WhatsNew */ = {
isa = PBXGroup;
children = (
99CB34AB2369DF2E001D28AD /* WhatsNewPresenter.swift */,
99CB34AE2369DF2E001D28AD /* WhatsNewBuilder.swift */,
99CB34C2236AEAEA001D28AD /* WhatsNewController.swift */,
);
path = WhatsNew;
sourceTree = "<group>";
};
99CB34C6236B052B001D28AD /* DeepLinkInfo */ = {
isa = PBXGroup;
children = (
99CB34C7236B054B001D28AD /* DeepLinkInfoPresenter.swift */,
99CB34C8236B054B001D28AD /* DeepLinkInfoRouter.swift */,
99CB34CA236B054B001D28AD /* DeepLinkInfoBuilder.swift */,
);
path = DeepLinkInfo;
sourceTree = "<group>";
};
99CB34D1236B0C2A001D28AD /* WelcomeView */ = {
isa = PBXGroup;
children = (
99E2B01D23698B0800FFABC5 /* WelcomeProtocols.swift */,
99E2B0222369904800FFABC5 /* WelcomeViewController.swift */,
99CB34B62369E188001D28AD /* WelcomeRouter.swift */,
99CB34C4236B00FD001D28AD /* WelcomeStorage.swift */,
);
path = WelcomeView;
sourceTree = "<group>";
};
99E2B01F23698C0900FFABC5 /* FirstLaunch */ = {
isa = PBXGroup;
children = (
99CB34952369C281001D28AD /* FirstLaunchBuilder.swift */,
99CB34972369C291001D28AD /* FirstLaunchPresenter.swift */,
99752259236B187400ADF673 /* FirstLaunchController.swift */,
);
path = FirstLaunch;
sourceTree = "<group>";
};
99E2B024236990A100FFABC5 /* TermsOfUse */ = {
isa = PBXGroup;
children = (
99CB34B82369EAAC001D28AD /* TermsOfUsePresenter.swift */,
99CB34BA2369EAAC001D28AD /* TermsOfUseViewController.swift */,
99CB34BB2369EAAC001D28AD /* TermsOfUseBuilder.swift */,
);
path = TermsOfUse;
sourceTree = "<group>";
};
B32FE73D20D283D600EF7446 /* Catalog */ = {
isa = PBXGroup;
children = (
@ -5130,6 +5260,7 @@
3408963F1F83CEDE00BC7117 /* MWMAuthorizationViewModel.mm in Sources */,
F6E2FE1F1E097BA00083EBEC /* MWMOpeningHoursCommon.mm in Sources */,
3454D7B91E07F045004AF2AD /* CALayer+RuntimeAttributes.m in Sources */,
99E2B0232369904800FFABC5 /* WelcomeViewController.swift in Sources */,
F6E2FF5D1E097BA00083EBEC /* MWMRecentTrackSettingsController.mm in Sources */,
34AB66651FC5AA330078E451 /* TransportTransitTrain.swift in Sources */,
343064411E9FDC7300DC7665 /* SearchIndex.swift in Sources */,
@ -5152,6 +5283,7 @@
340708781F2B5D6C00029ECC /* DimBackground.swift in Sources */,
99D363172358647700941BF4 /* SubscriptionGroup.swift in Sources */,
3490D2DF1CE9DD2500D0B838 /* MWMSideButtons.mm in Sources */,
99425AFC23685F1E00D005C0 /* PromoDiscoveryPresenter.swift in Sources */,
F6E2FDF81E097BA00083EBEC /* MWMOpeningHoursAllDayTableViewCell.mm in Sources */,
472E3F4C2147D5700020E412 /* Subscription.swift in Sources */,
340B33C61F3AEFDB00A8C1B4 /* MWMRouter+RouteManager.mm in Sources */,
@ -5178,7 +5310,6 @@
CDCA273A2237FCFE00167D87 /* SearchTemplateBuilder.swift in Sources */,
34F4073E1E9E1AFF00E57AC0 /* MPNativeAd+MWM.m in Sources */,
F6E2FED01E097BA00083EBEC /* MWMSearchFilterViewController.mm in Sources */,
34D4FA671E265749003F53EF /* WhatsNewController.swift in Sources */,
CDB92CEE229E9CF900EC757C /* MWMDiscoveryMapObjects.mm in Sources */,
34B6FD5F2015E6BF00C18E97 /* DiscoveryBookingCell.swift in Sources */,
34D3B01B1E389D05004100F9 /* MWMButtonCell.m in Sources */,
@ -5195,6 +5326,7 @@
34AB66471FC5AA330078E451 /* RouteManagerTableView.swift in Sources */,
47DF72B922520CE20004AB10 /* MWMRoutingOptions.mm in Sources */,
F6E2FE611E097BA00083EBEC /* MWMBookmarkCell.mm in Sources */,
99B6A74E2362F5CD002C94CB /* PromoCoordinator.swift in Sources */,
F6E2FEA31E097BA00083EBEC /* MWMPPView.mm in Sources */,
3D15ACEE2155117000F725D5 /* MWMObjectsCategorySelectorDataSource.mm in Sources */,
F69739B21FD197DB00FDA07D /* MWMDiscoveryTableManager.mm in Sources */,
@ -5202,6 +5334,7 @@
6741A9B71BF340DE002C974C /* EAGLView.mm in Sources */,
6741A9B81BF340DE002C974C /* MapViewController.mm in Sources */,
34AB662C1FC5AA330078E451 /* RouteManagerViewModel.swift in Sources */,
99CB34BF2369EAAC001D28AD /* TermsOfUseViewController.swift in Sources */,
6741A9B91BF340DE002C974C /* MWMRateAlert.mm in Sources */,
3404F48B202894EA0090E401 /* BMCViewController.swift in Sources */,
349D1ABC1E2D05EF004A2006 /* SearchBar.swift in Sources */,
@ -5255,6 +5388,7 @@
F6E2FE551E097BA00083EBEC /* MWMPlacePageActionBar.mm in Sources */,
34AB66051FC5AA320078E451 /* MWMNavigationDashboardManager+Entity.mm in Sources */,
34ABA6171C2D185C00FE1BEC /* MWMAuthorizationOSMLoginViewController.mm in Sources */,
991CE2DD2373145C009EB02A /* PromoAfterBookingCampaign.swift in Sources */,
995739042355CAA30019AEE7 /* PageIndicator.swift in Sources */,
B33D21AF20DAF9F000BAD749 /* Toast.swift in Sources */,
33B19C67218B481700B323A7 /* TagCollectionViewCell.swift in Sources */,
@ -5271,6 +5405,7 @@
34B846A12029DCC10081ECCD /* BMCCategoriesHeader.swift in Sources */,
346DB8341E5C4F6700E3123E /* GalleryViewController.swift in Sources */,
F61757ED1FC73027000AD0D0 /* DiscoveryOnlineTemplateCell.swift in Sources */,
99425AF4236855BB00D005C0 /* PromoDiscoveryRouter.swift in Sources */,
F6E2FD5F1E097BA00083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.mm in Sources */,
34F4073B1E9E1AFF00E57AC0 /* MopubBanner.swift in Sources */,
47B9065421C7FA400079C85E /* UIImageView+WebImage.m in Sources */,
@ -5285,7 +5420,9 @@
34C9BD0A1C6DBCDA000DC38D /* MWMNavigationController.m in Sources */,
CDB92CF822A5350500EC757C /* MWMDiscoveryHotelViewModel.m in Sources */,
F6550C1F1FD81B3800352D88 /* RatingSummaryView+DefaultConfig.swift in Sources */,
991CE2C02371D349009EB02A /* PromoCampaign.swift in Sources */,
F6E2FE311E097BA00083EBEC /* MWMStreetEditorViewController.mm in Sources */,
99CB34B32369DF2E001D28AD /* WhatsNewBuilder.swift in Sources */,
F6E2FE281E097BA00083EBEC /* MWMOpeningHoursSection.mm in Sources */,
3406FA161C6E0C3300E9FAD2 /* MWMMapDownloadDialog.mm in Sources */,
340416481E7BF28E00E2B6D6 /* UIView+Snapshot.swift in Sources */,
@ -5308,7 +5445,6 @@
34574A671E3B85F80061E839 /* ThemeManager.swift in Sources */,
34BF0CC71C31304A00D097EB /* MWMAuthorizationCommon.mm in Sources */,
34AB664D1FC5AA330078E451 /* RouteManagerFooterView.swift in Sources */,
3DD1A20B22D8D93500B158F4 /* MWMPromoAfterBooking.mm in Sources */,
F6E2FD771E097BA00083EBEC /* MWMMapDownloaderDataSource.mm in Sources */,
6741A9E01BF340DE002C974C /* MWMDownloaderDialogHeader.mm in Sources */,
479D306822C66C8F00D18278 /* MWMBookmarksBannerViewController.m in Sources */,
@ -5324,10 +5460,10 @@
34E776141F14B17F003040B3 /* AvailableArea.swift in Sources */,
34AB66081FC5AA320078E451 /* MWMNavigationDashboardManager.mm in Sources */,
F6664C131E645A4100E703C2 /* MWMPPReviewCell.mm in Sources */,
991CE2BF2371D349009EB02A /* PromoCampaignManager.swift in Sources */,
F6E2FE431E097BA00083EBEC /* MWMDirectionView.mm in Sources */,
470F5A5B2181DE7500754295 /* PaidRouteViewController.swift in Sources */,
3486B50D1E27A6DA0069C126 /* MWMPushNotifications.mm in Sources */,
47C3DB582268CDDB00DF6F91 /* DeeplinkInfoViewController.swift in Sources */,
3404F490202898CC0090E401 /* BMCModels.swift in Sources */,
F6E2FD561E097BA00083EBEC /* MWMMapDownloaderButtonTableViewCell.m in Sources */,
CDB4D5002231412900104869 /* MapTemplateBuilder.swift in Sources */,
@ -5338,6 +5474,7 @@
47E6688A23196F0100057733 /* UIViewController+Subscription.swift in Sources */,
6741A9E71BF340DE002C974C /* MWMCircularProgressView.mm in Sources */,
34AC8FDB1EFC07FE00E7F910 /* UILabel+NumberOfVisibleLines.swift in Sources */,
99B6A77F23684573002C94CB /* PromoDiscoveryBuilder.swift in Sources */,
4767CD9F20AAD48A00BD8166 /* Checkmark.swift in Sources */,
F6E2FD981E097BA00083EBEC /* MWMBookmarkTitleCell.m in Sources */,
33E905462180C40900868CAC /* UIViewController+Authorization.swift in Sources */,
@ -5346,6 +5483,7 @@
349D1ADE1E2E325C004A2006 /* MWMBottomMenuViewController.mm in Sources */,
BB87BF8A22FAF1CA008A8A72 /* TracksSection.mm in Sources */,
6741A9EC1BF340DE002C974C /* MWMCircularProgress.mm in Sources */,
99CB34C3236AEAEA001D28AD /* WhatsNewController.swift in Sources */,
470A89FD21342A9D00D72FBF /* TutorialBlurView.swift in Sources */,
342CC5F21C2D7730005F3FE5 /* MWMAuthorizationLoginViewController.mm in Sources */,
340475591E081A4600C92850 /* WebViewController.m in Sources */,
@ -5359,6 +5497,7 @@
3472B5E1200F86C800DC6CD5 /* MWMEditorHelper.mm in Sources */,
47B06DF021B697230094CCAD /* MWMGeoTrackerCore.mm in Sources */,
F6E2FD501E097BA00083EBEC /* MWMMapDownloaderAdsTableViewCell.m in Sources */,
99B6A74C2362F5AA002C94CB /* PromoButton.swift in Sources */,
4719A643219CB61D009F9AA7 /* BillingPendingTransaction.swift in Sources */,
CD9AD96F2281DF3600EC174A /* CategoryInfo.swift in Sources */,
F6E2FE881E097BA00083EBEC /* MWMPlacePageRegularCell.mm in Sources */,
@ -5376,6 +5515,7 @@
472C40E4232A7B9F009AA777 /* CatalogSingleItemCell.swift in Sources */,
B33D21B820E130D000BAD749 /* BookmarksTabViewController.swift in Sources */,
3358607E217632A2006D11F2 /* BookmarksSharingViewController.swift in Sources */,
99CB34C5236B00FD001D28AD /* WelcomeStorage.swift in Sources */,
CDB92CF1229EB8A800EC757C /* MWMDiscoverySearchViewModel.m in Sources */,
34AB662F1FC5AA330078E451 /* RouteManageriPhonePresentationController.swift in Sources */,
BB87BF8D22FAF435008A8A72 /* InfoSection.mm in Sources */,
@ -5402,10 +5542,8 @@
CDB4D4E4222E8FF600104869 /* CarPlayService.swift in Sources */,
F6E2FF3C1E097BA00083EBEC /* MWMSearchTableView.m in Sources */,
F6E2FF661E097BA00083EBEC /* MWMTTSSettingsViewController.mm in Sources */,
3DD1A20F22D8DD1100B158F4 /* MWMPromoApi.mm in Sources */,
3454D7C21E07F045004AF2AD /* NSString+Categories.m in Sources */,
6741A9FE1BF340DE002C974C /* SelectSetVC.mm in Sources */,
4767CDC120B477BA00BD8166 /* WelcomeViewController.swift in Sources */,
34E7761F1F14DB48003040B3 /* PlacePageArea.swift in Sources */,
346DB82E1E5C4F6700E3123E /* GalleryItemViewController.swift in Sources */,
4728F69322CF89A400E00028 /* GradientView.swift in Sources */,
@ -5422,6 +5560,7 @@
F682249B1E5B104600BC1C18 /* PPHotelDescriptionCell.swift in Sources */,
3454D7DD1E07F045004AF2AD /* UISwitch+RuntimeAttributes.m in Sources */,
CD4A1F1A230EADC100F2A6B6 /* CatalogConnectionErrorView.swift in Sources */,
991CE2C22371D349009EB02A /* PromoDiscoveryCampaign.swift in Sources */,
4719A647219CBD7F009F9AA7 /* IBillingPendingTransaction.swift in Sources */,
340416581E7C0D4100E2B6D6 /* PhotosOverlayView.swift in Sources */,
F6E2FE821E097BA00083EBEC /* MWMPlacePageOpeningHoursDayView.m in Sources */,
@ -5429,6 +5568,9 @@
F6E2FD6B1E097BA00083EBEC /* MWMMapDownloaderSubplaceTableViewCell.mm in Sources */,
CDCA27842245090900167D87 /* ListenerContainer.swift in Sources */,
47E3C7252111E41B008B3B27 /* DimmedModalPresentationController.swift in Sources */,
99CB34CD236B054B001D28AD /* DeepLinkInfoRouter.swift in Sources */,
99CB34B72369E188001D28AD /* WelcomeRouter.swift in Sources */,
99CB34CC236B054B001D28AD /* DeepLinkInfoPresenter.swift in Sources */,
3409D50B1FC6D8D2000F9B3E /* FilterCheckCell.swift in Sources */,
47E3C72121108E9F008B3B27 /* BookmarksLoadedViewController.swift in Sources */,
3472B5CB200F43EF00DC6CD5 /* BackgroundFetchScheduler.swift in Sources */,
@ -5451,6 +5593,7 @@
344532311F6FE5880059FBCC /* UGCSummaryRatingStarsCell.swift in Sources */,
F626D52F1C3E83F800C17D15 /* MWMTableViewCell.m in Sources */,
34AB66591FC5AA330078E451 /* TransportTransitFlowLayout.swift in Sources */,
99CB34962369C281001D28AD /* FirstLaunchBuilder.swift in Sources */,
3486B5191E27AD3B0069C126 /* MWMFrameworkListener.mm in Sources */,
3404756B1E081A4600C92850 /* MWMSearch+CoreSpotlight.mm in Sources */,
CD9AD96C2281B56900EC174A /* CPViewPortState.swift in Sources */,
@ -5462,7 +5605,9 @@
47B06DF921B95F5E0094CCAD /* IGeoTracker.swift in Sources */,
CDCA27812243F59800167D87 /* CarPlayRouter.swift in Sources */,
34F407381E9E1AFF00E57AC0 /* FacebookBanner.swift in Sources */,
99CB34BD2369EAAC001D28AD /* TermsOfUsePresenter.swift in Sources */,
34F5E0D41E3F254800B1C415 /* UIView+Hierarchy.swift in Sources */,
99CB34C02369EAAC001D28AD /* TermsOfUseBuilder.swift in Sources */,
33BCDF8B218C976D00EF5B74 /* TagsCollectionViewLayout.swift in Sources */,
6741AA0B1BF340DE002C974C /* MWMMapViewControlsManager.mm in Sources */,
F6E2FED91E097BA00083EBEC /* MWMSearchContentView.m in Sources */,
@ -5513,6 +5658,7 @@
F63AF5061EA6162400A1DB98 /* FilterTypeCell.swift in Sources */,
347752881F725002000D46A3 /* UGCAddReviewRatingCell.swift in Sources */,
47E3C7332111F4D8008B3B27 /* CoverVerticalDismissalAnimator.swift in Sources */,
99E2B01E23698B0800FFABC5 /* WelcomeProtocols.swift in Sources */,
34AB661A1FC5AA330078E451 /* MWMTaxiCollectionLayout.m in Sources */,
345C2F8A1F86361B009DB8B4 /* MWMUGCViewModel.mm in Sources */,
33F8BA4E2199AB9500ECA8EE /* TagsDataSource.swift in Sources */,
@ -5529,12 +5675,12 @@
34D3B02A1E389D05004100F9 /* MWMEditorAdditionalNameTableViewCell.m in Sources */,
33C558E3217F6CF100299E70 /* UploadActionCell.swift in Sources */,
4726254921C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift in Sources */,
99CB34CF236B054B001D28AD /* DeepLinkInfoBuilder.swift in Sources */,
347E039A1FAC5F1D00426032 /* UIWindow+InputLanguage.swift in Sources */,
340475711E081A4600C92850 /* MWMSettings.mm in Sources */,
33046832219C57180041F3A8 /* CategorySettingsViewController.swift in Sources */,
3404165C1E7C29AE00E2B6D6 /* PhotosInteractionAnimator.swift in Sources */,
34E50DE01F6FCBA1008EED49 /* UGCAddReviewCell.swift in Sources */,
34D4FA631E26572D003F53EF /* FirstLaunchController.swift in Sources */,
3404756E1E081A4600C92850 /* MWMSearch.mm in Sources */,
6741AA191BF340DE002C974C /* MWMDownloaderDialogCell.m in Sources */,
3DE1762422D614B8000214FF /* PromoAfterBookingViewController.swift in Sources */,
@ -5551,7 +5697,6 @@
346B42AC1DD5E3D20094EBEE /* MWMLocationNotFoundAlert.mm in Sources */,
340475091E08199E00C92850 /* MWMMyTarget.mm in Sources */,
340416501E7C086000E2B6D6 /* PhotoViewController.swift in Sources */,
47800D1D20BEEE2E00072F42 /* TermsOfUseController.swift in Sources */,
331922AF21BAD29900D4AAC5 /* MWMPlaceDescriptionCell.m in Sources */,
674A7E301C0DB10B003D48E1 /* MWMMapWidgets.mm in Sources */,
34AB66291FC5AA330078E451 /* RouteManagerViewController.swift in Sources */,
@ -5580,6 +5725,7 @@
47E3C72F2111F472008B3B27 /* CoverVerticalModalTransitioning.swift in Sources */,
471C448C2322A7C800C307EC /* SubscriptionGoToCatalogViewController.swift in Sources */,
346DB83D1E5C4F6700E3123E /* GalleryModel.swift in Sources */,
99CB34B02369DF2E001D28AD /* WhatsNewPresenter.swift in Sources */,
34E776101F14B165003040B3 /* VisibleArea.swift in Sources */,
330473EA21F7440C00DC4AEA /* MWMHotelParams.mm in Sources */,
47C8789922DF622400A772DA /* SubscriptionFailViewController.swift in Sources */,
@ -5599,6 +5745,7 @@
6741AA291BF340DE002C974C /* ColorPickerView.mm in Sources */,
6741AA2B1BF340DE002C974C /* CircleView.m in Sources */,
F6E2FEEB1E097BA00083EBEC /* MWMSearchTextField.mm in Sources */,
99CB34982369C291001D28AD /* FirstLaunchPresenter.swift in Sources */,
CD08887422B7ABB400C1368D /* MWMDiscoveryCollectionView.mm in Sources */,
4788739220EE326500F6826B /* VerticallyAlignedButton.swift in Sources */,
3444DFDE1F18A5AF00E73099 /* SideButtonsArea.swift in Sources */,
@ -5615,6 +5762,7 @@
34AB66531FC5AA330078E451 /* MWMiPadRoutePreview.m in Sources */,
3454D7E31E07F045004AF2AD /* UITextView+RuntimeAttributes.m in Sources */,
F6A2184A1CA3F26800BE2CC6 /* MWMEditorViralActivityItem.mm in Sources */,
9975225A236B187400ADF673 /* FirstLaunchController.swift in Sources */,
F6E2FED61E097BA00083EBEC /* MWMSearchChangeModeView.mm in Sources */,
33603C85219F0F6300B11FFE /* SharingPropertiesViewController.swift in Sources */,
47699A0821F08E37009E6585 /* NSDate+TimeDistance.m in Sources */,

View file

@ -1,31 +0,0 @@
#import "MWMPromoAfterBooking.h"
@interface MWMPromoAfterBooking() {
promo::AfterBooking m_afterBooking;
}
@end
@implementation MWMPromoAfterBooking
- (instancetype)initWithPromoAfterBooking:(promo::AfterBooking const &)afterBooking {
self = [super init];
if (self) {
m_afterBooking = afterBooking;
}
return self;
}
- (NSString *)promoId {
return @(m_afterBooking.m_id.c_str());
}
- (NSString *)promoUrl {
return @(m_afterBooking.m_promoUrl.c_str());
}
- (NSString *)pictureUrl {
return @(m_afterBooking.m_pictureUrl.c_str());
}
@end

View file

@ -1,7 +0,0 @@
@class MWMPromoAfterBooking;
@interface MWMPromoApi : NSObject
+ (MWMPromoAfterBooking *)afterBooking;
@end

View file

@ -1,24 +0,0 @@
#import "MWMPromoApi.h"
#import "MWMPromoAfterBooking.h"
#include <CoreApi/Framework.h>
#include "platform/network_policy.hpp"
@implementation MWMPromoApi
+ (MWMPromoAfterBooking *)afterBooking {
auto policy = platform::GetCurrentNetworkPolicy();
auto promoApi = GetFramework().GetPromoApi(policy);
if (promoApi == nullptr)
return nil;
auto const promoAfterBooking = promoApi->GetAfterBooking(languages::GetCurrentNorm());
if (promoAfterBooking.IsEmpty())
return nil;
return [[MWMPromoAfterBooking alloc] initWithPromoAfterBooking:promoAfterBooking];
}
@end

View file

@ -31,4 +31,9 @@ extension UIStoryboard {
}
return UIStoryboard(name: name, bundle: nil)
}
func instantiateViewController<T: UIViewController>(ofType: T.Type) -> T {
let name = String(describing: ofType);
return self.instantiateViewController(withIdentifier: name) as! T;
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,17 @@
class DeepLinkInfoBuilder {
static func build(delegate: DeeplinkInfoViewControllerDelegate) -> UIViewController {
let sb = UIStoryboard.instance(.welcome)
let vc = sb.instantiateViewController(ofType: WelcomeViewController.self);
let deeplinkUrl = DeepLinkHandler.shared.deeplinkURL
let router = DeepLinkInfoRouter(viewController: vc,
delegate: delegate,
deeplink: deeplinkUrl)
let presenter = DeepLinkInfoPresenter(view: vc,
router: router,
deeplink: deeplinkUrl)
vc.presenter = presenter
return vc
}
}

View file

@ -0,0 +1,56 @@
protocol IDeepLinkInfoPresenter: IWelcomePresenter {
}
class DeepLinkInfoPresenter {
private weak var view: IWelcomeView?
private let router: DeepLinkInfoRouterProtocol
private var deeplinkURL: URL?
init(view: IWelcomeView, router: DeepLinkInfoRouterProtocol, deeplink: URL?) {
self.view = view
self.router = router
self.deeplinkURL = deeplink
}
}
extension DeepLinkInfoPresenter: IDeepLinkInfoPresenter {
func configure() {
guard let dlUrl = deeplinkURL, let host = dlUrl.host else { return }
switch host {
case "guides_page":
view?.setTitle(L("onboarding_guide_direct_download_title"))
view?.setText(L("onboarding_guide_direct_download_subtitle"))
view?.setNextButtonTitle(L("onboarding_guide_direct_download_button"))
view?.setTitleImage(UIImage(named: "img_onboarding_downloadmaps"))
view?.isCloseButtonHidden = true
case "catalogue":
view?.setTitle(L("onboarding_bydeeplink_guide_title"))
view?.setText(L("onboarding_bydeeplink_guide_subtitle"))
view?.setNextButtonTitle(L("current_location_unknown_continue_button"))
view?.setTitleImage(UIImage(named: "img_onboarding_downloadmaps"))
view?.isCloseButtonHidden = true
default:
break
}
}
func onAppear() {
guard let dlUrl = deeplinkURL, let host = dlUrl.host else { return }
Statistics.logEvent(kStatOnboardingDlShow, withParameters: [kStatType : host])
}
func onNext() {
router.onNext()
guard let dlUrl = deeplinkURL, let host = dlUrl.host else { return }
Statistics.logEvent(kStatOnboardingDlAccept, withParameters: [kStatType : host])
}
func key() -> String {
return ""
}
func onClose() {
}
}

View file

@ -0,0 +1,28 @@
protocol DeeplinkInfoViewControllerDelegate: AnyObject {
func deeplinkInfoViewControllerDidFinish(_ viewController: UIViewController, deeplink: URL?)
}
protocol DeepLinkInfoRouterProtocol: class {
func onNext()
}
class DeepLinkInfoRouter {
private weak var viewController: UIViewController?
private weak var delegate: DeeplinkInfoViewControllerDelegate?
private var deeplinkURL: URL?
init(viewController: UIViewController,
delegate: DeeplinkInfoViewControllerDelegate,
deeplink: URL?) {
self.viewController = viewController
self.delegate = delegate
self.deeplinkURL = deeplink
}
}
extension DeepLinkInfoRouter: DeepLinkInfoRouterProtocol {
func onNext() {
guard let viewController = viewController else { return }
delegate?.deeplinkInfoViewControllerDidFinish(viewController, deeplink: deeplinkURL)
}
}

View file

@ -1,39 +0,0 @@
protocol DeeplinkInfoViewControllerDelegate: AnyObject {
func deeplinkInfoViewControllerDidFinish(_ viewController: DeeplinkInfoViewController, deeplink: URL?)
}
class DeeplinkInfoViewController: UIViewController {
@IBOutlet weak var image: UIImageView!
@IBOutlet weak var alertTitle: UILabel!
@IBOutlet weak var alertText: UILabel!
@IBOutlet weak var nextPageButton: UIButton!
var deeplinkURL: URL?
var delegate: DeeplinkInfoViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
guard let dlUrl = deeplinkURL, let host = dlUrl.host else { return }
switch host {
case "guides_page":
alertTitle.text = L("onboarding_guide_direct_download_title")
alertText.text = L("onboarding_guide_direct_download_subtitle")
nextPageButton.setTitle(L("onboarding_guide_direct_download_button"), for: .normal)
case "catalogue":
alertTitle.text = L("onboarding_bydeeplink_guide_title")
alertText.text = L("onboarding_bydeeplink_guide_subtitle")
nextPageButton.setTitle(L("current_location_unknown_continue_button"), for: .normal)
default:
break
}
Statistics.logEvent(kStatOnboardingDlShow, withParameters: [kStatType : host])
}
@IBAction func onNextButton(_ sender: UIButton) {
delegate?.deeplinkInfoViewControllerDidFinish(self, deeplink: deeplinkURL)
guard let dlUrl = deeplinkURL, let host = dlUrl.host else { return }
Statistics.logEvent(kStatOnboardingDlAccept, withParameters: [kStatType : host])
}
}

View file

@ -0,0 +1,40 @@
class FirstLaunchBuilder {
static var configs:[FirstLaunchPresenter.FirstLaunchConfig] {
return [
FirstLaunchPresenter.FirstLaunchConfig(image: UIImage(named: "img_onboarding_dreamnplan"),
title: "new_onboarding_step2_header",
text: "new_onboarding_step2_message",
buttonNextTitle: "new_onboarding_button",
isCloseButtonHidden: true,
requestPermission: .notifications),
FirstLaunchPresenter.FirstLaunchConfig(image: UIImage(named: "img_onboarding_offlinemaps"),
title: "new_onboarding_step3_header",
text: "new_onboarding_step3_message",
buttonNextTitle: "new_onboarding_button",
isCloseButtonHidden: true,
requestPermission: .location),
FirstLaunchPresenter.FirstLaunchConfig(image: UIImage(named: "img_onboarding_sharebookmarks"),
title: "new_onboarding_step4_header",
text: "new_onboarding_step4_message",
buttonNextTitle: "new_onboarding_button_2",
isCloseButtonHidden: true,
requestPermission: .nothing),
]
}
static func build(delegate: WelcomeViewDelegate) -> [UIViewController] {
return FirstLaunchBuilder.configs.map { (config) -> UIViewController in
let sb = UIStoryboard.instance(.welcome)
let vc = sb.instantiateViewController(ofType: WelcomeViewController.self);
let router = WelcomeRouter(viewController: vc,
delegate: delegate)
let presenter = FirstLaunchPresenter(viewController: vc,
router: router,
config: config)
vc.presenter = presenter
return vc
}
}
}

View file

@ -0,0 +1,3 @@
class FirstLaunchController: WelcomeViewController {
class var key: String { return toString(self) }
}

View file

@ -0,0 +1,60 @@
protocol IFirstLaunchPresenter: IWelcomePresenter {
}
class FirstLaunchPresenter {
enum Permission {
case location
case notifications
case nothing
}
struct FirstLaunchConfig: IWelcomeConfig{
var image: UIImage?
var title: String
var text: String
var buttonNextTitle: String
var isCloseButtonHidden: Bool
let requestPermission: Permission
}
private weak var viewController: IWelcomeView?
private let router: WelcomeRouter
private let config: FirstLaunchConfig
init(viewController: IWelcomeView,
router: WelcomeRouter,
config: FirstLaunchConfig) {
self.viewController = viewController
self.router = router
self.config = config
}
}
extension FirstLaunchPresenter: IFirstLaunchPresenter {
func configure() {
viewController?.configure(config: config)
}
func key() -> String {
return FirstLaunchController.key
}
func onAppear() {
switch config.requestPermission {
case .location:
MWMLocationManager.start()
case .notifications:
MWMPushNotifications.setup()
case .nothing:
break
}
}
func onNext() {
router.onNext()
}
func onClose() {
router.onClose()
}
}

View file

@ -1,67 +0,0 @@
final class FirstLaunchController: WelcomeViewController {
private enum Permission {
case location
case notifications
case nothing
}
private struct FirstLaunchConfig: WelcomeConfig {
let image: UIImage
let title: String
let text: String
let buttonTitle: String
let requestPermission: Permission
}
static var welcomeConfigs: [WelcomeConfig] {
return [
FirstLaunchConfig(image: #imageLiteral(resourceName: "img_onboarding_offline_maps"),
title: "onboarding_offline_maps_title",
text: "onboarding_offline_maps_message",
buttonTitle: "whats_new_next_button",
requestPermission: .nothing),
FirstLaunchConfig(image: #imageLiteral(resourceName: "img_onboarding_geoposition"),
title: "onboarding_location_title",
text: "onboarding_location_message",
buttonTitle: "whats_new_next_button",
requestPermission: .nothing),
FirstLaunchConfig(image: #imageLiteral(resourceName: "img_onboarding_notification"),
title: "onboarding_notifications_title",
text: "onboarding_notifications_message",
buttonTitle: "whats_new_next_button",
requestPermission: .location),
FirstLaunchConfig(image: #imageLiteral(resourceName: "img_onboarding_done"),
title: "first_launch_congrats_title",
text: "first_launch_congrats_text",
buttonTitle: "done",
requestPermission: .notifications)
]
}
override class var key: String { return toString(self) }
static func controllers() -> [FirstLaunchController] {
var result = [FirstLaunchController]()
let sb = UIStoryboard.instance(.welcome)
FirstLaunchController.welcomeConfigs.forEach { (config) in
let vc = sb.instantiateViewController(withIdentifier: toString(self)) as! FirstLaunchController
vc.pageConfig = config
result.append(vc)
}
return result
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let config = pageConfig as! FirstLaunchConfig
switch config.requestPermission {
case .location:
MWMLocationManager.start()
case .notifications:
MWMPushNotifications.setup()
case .nothing:
break
}
}
}

View file

@ -0,0 +1,17 @@
class PromoDiscoveryBuilder {
static func build(rootViewController:MWMViewController?,
campaign: PromoDiscoveryCampaign) -> UIViewController {
let sb = UIStoryboard.instance(.welcome)
let vc = sb.instantiateViewController(ofType: WelcomeViewController.self);
let router = PromoDiscoveryRouter(viewController: vc,
rootViewController: rootViewController,
campaign: campaign)
let presenter = PromoDiscoveryPresenter(viewController: vc,
router: router,
campaign: campaign)
vc.presenter = presenter
return vc
}
}

View file

@ -0,0 +1,55 @@
protocol IPromoRouterPresenter: IWelcomePresenter {
}
class PromoDiscoveryPresenter {
private weak var viewController: IWelcomeView?
private let router: IPromoDiscoveryRouter
private let campaign: PromoDiscoveryCampaign
init(viewController: IWelcomeView,
router: IPromoDiscoveryRouter,
campaign: PromoDiscoveryCampaign) {
self.viewController = viewController
self.router = router
self.campaign = campaign;
}
}
extension PromoDiscoveryPresenter: IPromoRouterPresenter {
func configure(){
switch campaign.group {
case .discoverCatalog:
viewController?.setTitleImage(UIImage(named: "img_onboarding_subscribeguides"))
viewController?.setTitle(L("new_onboarding_step5.1_header"))
viewController?.setText(L("new_onboarding_step5.1_message"))
viewController?.setNextButtonTitle(L("new_onboarding_step5.1_button"))
case .buySubscription:
viewController?.setTitleImage(UIImage(named: "img_onboarding_subscribeguides"))
viewController?.setTitle(L("new_onboarding_step5.2_header"))
viewController?.setText(L("new_onboarding_step5.2_message"))
viewController?.setNextButtonTitle(L("new_onboarding_step5.2_button"))
case .downloadSamples:
viewController?.setTitleImage(UIImage(named: "img_onboarding_samples"))
viewController?.setTitle(L("new_onboarding_step5.3_header"))
viewController?.setText(L("new_onboarding_step5.3_message"))
viewController?.setNextButtonTitle(L("new_onboarding_step5.3_button"))
}
}
func key() -> String {
return ""
}
func onAppear() {
}
func onNext() {
router.presentNext()
}
func onClose() {
router.dissmiss()
}
}

View file

@ -0,0 +1,63 @@
protocol IPromoDiscoveryRouter: class {
func dissmiss()
func presentNext()
}
class PromoDiscoveryRouter {
private weak var viewController: UIViewController?
private weak var rootViewController: MWMViewController?
private let campaign: PromoDiscoveryCampaign
init(viewController: UIViewController,
rootViewController: MWMViewController?,
campaign: PromoDiscoveryCampaign) {
self.viewController = viewController
self.rootViewController = rootViewController
self.campaign = campaign
}
}
extension PromoDiscoveryRouter: IPromoDiscoveryRouter {
func dissmiss() {
viewController?.dismiss(animated: true, completion: nil)
}
func presentNext() {
switch campaign.group {
case .discoverCatalog:
presentPromoDiscoveryGuide()
case .buySubscription:
presentPromoDiscoverySubscribe()
case .downloadSamples:
presentPromoDiscoveryFree()
}
}
private func presentPromoDiscoveryGuide() {
let webViewController = CatalogWebViewController.catalogFromAbsoluteUrl(campaign.url, utm: .bookmarksPageCatalogButton)
rootViewController?.navigationController?.pushViewController(webViewController, animated: true)
dissmiss()
}
private func presentPromoDiscoverySubscribe() {
let subscribeViewController = AllPassSubscriptionViewController()
subscribeViewController.onSubscribe = { [weak self] in
self?.rootViewController?.dismiss(animated: true)
let successDialog = SubscriptionSuccessViewController(.allPass) { [weak self] in
self?.rootViewController?.dismiss(animated: true)
}
self?.rootViewController?.present(successDialog, animated: true)
}
subscribeViewController.onCancel = { [weak self] in
self?.rootViewController?.dismiss(animated: true)
}
viewController?.present(subscribeViewController, animated: true)
}
private func presentPromoDiscoveryFree() {
let webViewController = CatalogWebViewController.catalogFromAbsoluteUrl(campaign.url, utm: .bookmarksPageCatalogButton)
rootViewController?.navigationController?.pushViewController(webViewController, animated: true)
dissmiss()
}
}

Some files were not shown because too many files have changed in this diff Show more