[iOS] Sightseeing subscription screen

https://jira.mail.ru/browse/MAPSME-12085
This commit is contained in:
Alexander Boriskov 2019-10-11 18:11:46 +03:00 committed by Aleksey Belousov
parent 29cd34bdc4
commit 670f7447ce
27 changed files with 487 additions and 463 deletions

View file

@ -0,0 +1,41 @@
import UIKit
class BookmarksSubscriptionButton: UIButton {
private let descriptionLabel = UILabel()
private let priceLabel = UILabel()
override func awakeFromNib() {
addSubview(descriptionLabel)
addSubview(priceLabel)
descriptionLabel.translatesAutoresizingMaskIntoConstraints = false
priceLabel.translatesAutoresizingMaskIntoConstraints = false
priceLabel.font = UIFont.semibold16()
priceLabel.textAlignment = .right;
descriptionLabel.font = UIFont.semibold16()
descriptionLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
descriptionLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 16).isActive = true
priceLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
priceLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -16).isActive = true
setTitle("", for: .normal)
}
override func setTitleColor(_ color: UIColor?, for state: UIControlState) {
super.setTitleColor(color, for: state)
descriptionLabel.textColor = color
priceLabel.textColor = color
}
override func setTitle(_ title: String?, for state: UIControlState) {
super.setTitle("", for: state);
}
func config(title: String, price: String, enabled: Bool) {
descriptionLabel.text = title
priceLabel.text = price
self.isEnabled = enabled
}
}

View file

@ -1,90 +0,0 @@
class BookmarksSubscriptionCellViewController: UIViewController {
@IBOutlet private var subtitleLabel: UILabel!
@IBOutlet private var titleLabel: UILabel!
@IBOutlet private var priceLabel: UILabel!
@IBOutlet private var discountView: UIView!
@IBOutlet private var discountLabel: UILabel!
@IBOutlet private var imageView: UIImageView!
@IBOutlet private var containerView: UIView!
@IBOutlet private var contentView: UIView!
private(set) var isSelected = false
override func viewDidLoad() {
super.viewDidLoad()
if !UIColor.isNightMode() {
setupShadow(containerView, color: .shadowColorBlue())
setupShadow(discountView, color: .shadowColorPurple())
}
contentView.layer.borderColor = UIColor.subscriptionCellBorder().cgColor
setSelected(false, animated: false)
}
func setSelected(_ selected: Bool, animated: Bool = false) {
isSelected = selected
let setSelectedClosure = { [unowned self] in
self.titleLabel.textColor = selected ? .subscriptionCellTitle() : .blackSecondaryText()
self.subtitleLabel.textColor = selected ? .linkBlue() : .blackSecondaryText()
self.priceLabel.textColor = selected ? .subscriptionCellTitle() : .blackSecondaryText()
self.contentView.backgroundColor = selected ? .subscriptionCellBackground() : .clear
self.containerView.backgroundColor = selected ? .white() : .clear
}
if animated {
UIView.animate(withDuration: kDefaultAnimationDuration) {
setSelectedClosure()
}
animateBorder(contentView, show: !selected)
if !UIColor.isNightMode() {
animateShadow(containerView, opacity: selected ? 0.5 : 0)
animateShadow(discountView, opacity: selected ? 0.62 : 0)
}
} else {
setSelectedClosure()
contentView.layer.borderWidth = selected ? 0 : 1
if !UIColor.isNightMode() {
containerView.layer.shadowOpacity = selected ? 0.5 : 0
discountView.layer.shadowOpacity = selected ? 0.62 : 0
}
}
}
func config(title: String, subtitle: String, price: String, image: UIImage, discount: String? = nil) {
titleLabel.text = title
subtitleLabel.text = subtitle
priceLabel.text = price
imageView.image = image
guard let discount = discount else {
discountView.isHidden = true
return
}
discountLabel.text = discount
discountView.isHidden = false
}
private func setupShadow(_ view: UIView, color: UIColor) {
view.layer.shadowRadius = 4
view.layer.shadowOffset = CGSize(width: 0, height: 2)
view.layer.shadowColor = color.cgColor
}
private func animateShadow(_ view: UIView, opacity: Float) {
let shadowOpacityKey = "shadowOpacity"
let animation = CABasicAnimation(keyPath: shadowOpacityKey)
animation.fromValue = view.layer.shadowOpacity
animation.duration = kDefaultAnimationDuration
view.layer.add(animation, forKey: shadowOpacityKey)
view.layer.shadowOpacity = opacity
}
private func animateBorder(_ view: UIView, show: Bool) {
let borderWidthKey = "borderWidth"
let animation = CABasicAnimation(keyPath: borderWidthKey)
animation.fromValue = view.layer.borderWidth
animation.duration = kDefaultAnimationDuration
view.layer.add(animation, forKey: borderWidthKey)
view.layer.borderWidth = show ? 1 : 0
}
}

View file

@ -1,149 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BookmarksSubscriptionCellViewController" customModule="maps_me" customModuleProvider="target">
<connections>
<outlet property="containerView" destination="5im-1k-ZSt" id="KFK-PM-Aq7"/>
<outlet property="contentView" destination="MkX-w4-BJH" id="wvB-ug-ZxF"/>
<outlet property="discountLabel" destination="Udv-PO-OUs" id="TWf-Rw-Mdg"/>
<outlet property="discountView" destination="T1l-r7-y0s" id="QwX-Ie-Awz"/>
<outlet property="imageView" destination="seQ-P4-q7a" id="c98-Ed-EYY"/>
<outlet property="priceLabel" destination="udg-sP-X24" id="Rxw-0m-IGk"/>
<outlet property="subtitleLabel" destination="sD6-bq-sR9" id="RqJ-a5-WGF"/>
<outlet property="titleLabel" destination="RSU-fu-mKp" id="GRu-u9-L94"/>
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
<rect key="frame" x="0.0" y="0.0" width="166" height="254"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="brj-0e-hWP">
<rect key="frame" x="0.0" y="0.0" width="166" height="254"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5im-1k-ZSt">
<rect key="frame" x="0.0" y="23" width="166" height="231"/>
<subviews>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MkX-w4-BJH">
<rect key="frame" x="3" y="3" width="160" height="225"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionYear" translatesAutoresizingMaskIntoConstraints="NO" id="seQ-P4-q7a">
<rect key="frame" x="0.0" y="0.0" width="160" height="90"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Annual" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="17" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RSU-fu-mKp">
<rect key="frame" x="12" y="92" width="136" height="26"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="21"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="12 month unlimited guides" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sD6-bq-sR9">
<rect key="frame" x="12" y="123" width="136" height="33.5"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="$29.99" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="udg-sP-X24">
<rect key="frame" x="12" y="192" width="60" height="21"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="seQ-P4-q7a" secondAttribute="trailing" id="3OW-ye-Bgc"/>
<constraint firstAttribute="trailing" secondItem="RSU-fu-mKp" secondAttribute="trailing" constant="12" id="FXV-bc-was"/>
<constraint firstItem="udg-sP-X24" firstAttribute="leading" secondItem="MkX-w4-BJH" secondAttribute="leading" constant="12" id="Gfz-tP-WVx"/>
<constraint firstItem="sD6-bq-sR9" firstAttribute="top" secondItem="RSU-fu-mKp" secondAttribute="bottom" constant="5" id="SLD-GM-dh0"/>
<constraint firstItem="seQ-P4-q7a" firstAttribute="top" secondItem="MkX-w4-BJH" secondAttribute="top" id="T6I-jw-sah"/>
<constraint firstAttribute="bottom" secondItem="udg-sP-X24" secondAttribute="bottom" constant="12" id="UqO-55-UZx"/>
<constraint firstItem="sD6-bq-sR9" firstAttribute="leading" secondItem="MkX-w4-BJH" secondAttribute="leading" constant="12" id="XOh-t3-MhF"/>
<constraint firstAttribute="trailing" secondItem="sD6-bq-sR9" secondAttribute="trailing" constant="12" id="bLV-g1-tND"/>
<constraint firstItem="seQ-P4-q7a" firstAttribute="leading" secondItem="MkX-w4-BJH" secondAttribute="leading" id="fVs-iN-QlK"/>
<constraint firstItem="RSU-fu-mKp" firstAttribute="leading" secondItem="MkX-w4-BJH" secondAttribute="leading" constant="12" id="gfN-Wt-ehy"/>
<constraint firstItem="RSU-fu-mKp" firstAttribute="top" secondItem="MkX-w4-BJH" secondAttribute="top" constant="92" id="no0-Lz-cuL"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="7"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<gestureRecognizers/>
<constraints>
<constraint firstAttribute="bottom" secondItem="MkX-w4-BJH" secondAttribute="bottom" constant="3" id="HD7-Dy-l0d"/>
<constraint firstItem="MkX-w4-BJH" firstAttribute="top" secondItem="5im-1k-ZSt" secondAttribute="top" constant="3" id="Jyz-d9-hWa"/>
<constraint firstAttribute="trailing" secondItem="MkX-w4-BJH" secondAttribute="trailing" constant="3" id="R83-rm-27x"/>
<constraint firstItem="MkX-w4-BJH" firstAttribute="leading" secondItem="5im-1k-ZSt" secondAttribute="leading" constant="3" id="cKq-HI-5nL"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="T1l-r7-y0s">
<rect key="frame" x="0.0" y="0.0" width="116" height="35"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SAVE $38" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Udv-PO-OUs">
<rect key="frame" x="4" y="7" width="108" height="21"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" red="0.63921568630000003" green="0.20784313730000001" blue="0.95686274510000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="35" id="1hc-rF-WeJ"/>
<constraint firstAttribute="width" constant="116" id="MmH-NQ-a79"/>
<constraint firstItem="Udv-PO-OUs" firstAttribute="centerY" secondItem="T1l-r7-y0s" secondAttribute="centerY" id="Rc1-MY-abl"/>
<constraint firstAttribute="trailing" secondItem="Udv-PO-OUs" secondAttribute="trailing" constant="4" id="Ugx-X0-X5n"/>
<constraint firstItem="Udv-PO-OUs" firstAttribute="leading" secondItem="T1l-r7-y0s" secondAttribute="leading" constant="4" id="ftl-Dn-UeW"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="6"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="T1l-r7-y0s" firstAttribute="top" secondItem="brj-0e-hWP" secondAttribute="top" id="8fR-FO-nnO"/>
<constraint firstAttribute="trailing" secondItem="5im-1k-ZSt" secondAttribute="trailing" id="9A1-Mp-LlU"/>
<constraint firstAttribute="width" constant="166" id="XlP-bR-oy4"/>
<constraint firstItem="5im-1k-ZSt" firstAttribute="top" secondItem="brj-0e-hWP" secondAttribute="top" constant="23" id="dYu-M1-Tnx"/>
<constraint firstAttribute="bottom" secondItem="5im-1k-ZSt" secondAttribute="bottom" id="kDE-4I-7LZ"/>
<constraint firstItem="5im-1k-ZSt" firstAttribute="leading" secondItem="brj-0e-hWP" secondAttribute="leading" id="kyQ-R7-x0Y"/>
<constraint firstItem="T1l-r7-y0s" firstAttribute="leading" secondItem="brj-0e-hWP" secondAttribute="leading" id="pAD-k1-weD"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="brj-0e-hWP" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="2LO-Qg-bMl"/>
<constraint firstItem="brj-0e-hWP" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="AoM-wo-8Fy"/>
<constraint firstAttribute="bottom" secondItem="brj-0e-hWP" secondAttribute="bottom" id="EKl-sH-rak"/>
<constraint firstAttribute="trailing" secondItem="brj-0e-hWP" secondAttribute="trailing" id="z6f-Go-kJT"/>
</constraints>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
<point key="canvasLocation" x="137.68115942028987" y="-20.758928571428569"/>
</view>
</objects>
<resources>
<image name="bookmarksSubscriptionYear" width="160" height="90"/>
</resources>
</document>

View file

@ -1,19 +1,21 @@
import SafariServices
@objc class BookmarksSubscriptionViewController: MWMViewController {
@IBOutlet private var annualView: UIView!
@IBOutlet private var monthlyView: UIView!
@IBOutlet private var gradientView: GradientView!
@IBOutlet private var scrollView: UIScrollView!
@IBOutlet private var continueButton: UIButton!
@IBOutlet var loadingView: UIView!
private let annualViewController = BookmarksSubscriptionCellViewController()
private let monthlyViewController = BookmarksSubscriptionCellViewController()
//MARK: outlets
@IBOutlet private var annualSubscriptionButton: BookmarksSubscriptionButton!
@IBOutlet private var annualDiscountView: UIView!
@IBOutlet private var annualDiscountLabel: UILabel!
@IBOutlet private var monthlySubscriptionButton: BookmarksSubscriptionButton!
@IBOutlet private var loadingView: UIView!
//MARK: locals
private var priceFormatter: NumberFormatter?
private var monthlySubscription: ISubscription?
private var annualSubscription: ISubscription?
private var selectedSubscription: ISubscription?
//MARK: dependency
private let subscriptionManager: ISubscriptionManager = InAppPurchase.bookmarksSubscriptionManager
private let bookmarksManager: MWMBookmarksManager = MWMBookmarksManager.shared()
@objc var onSubscribe: MWMVoidBlock?
@objc var onCancel: MWMVoidBlock?
@ -29,7 +31,7 @@ import SafariServices
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
InAppPurchase.bookmarksSubscriptionManager.addListener(self)
subscriptionManager.addListener(self)
}
required init?(coder aDecoder: NSCoder) {
@ -37,53 +39,40 @@ import SafariServices
}
deinit {
InAppPurchase.bookmarksSubscriptionManager.removeListener(self)
subscriptionManager.removeListener(self)
}
override func viewDidLoad() {
super.viewDidLoad()
gradientView.isHidden = UIColor.isNightMode()
addChildViewController(annualViewController)
annualView.addSubview(annualViewController.view)
annualViewController.view.alignToSuperview()
annualViewController.didMove(toParentViewController: self)
addChildViewController(monthlyViewController)
monthlyView.addSubview(monthlyViewController.view)
monthlyViewController.view.alignToSuperview()
monthlyViewController.didMove(toParentViewController: self)
annualViewController.config(title: L("annual_subscription_title"),
subtitle: L("annual_subscription_message"),
price: "...",
image: UIImage(named: "bookmarksSubscriptionYear")!,
discount: "...")
monthlyViewController.config(title: L("montly_subscription_title"),
subtitle: L("montly_subscription_message"),
price: "...",
image: UIImage(named: "bookmarksSubscriptionMonth")!)
annualViewController.setSelected(true, animated: false)
continueButton.setTitle(L("current_location_unknown_continue_button").uppercased(), for: .normal)
continueButton.isEnabled = false
scrollView.isUserInteractionEnabled = false
annualSubscriptionButton.config(title: L("annual_subscription_title"),
price: "...",
enabled: false)
monthlySubscriptionButton.config(title: L("montly_subscription_title"),
price: "...",
enabled: false)
if !UIColor.isNightMode() {
annualDiscountView.layer.shadowRadius = 4
annualDiscountView.layer.shadowOffset = CGSize(width: 0, height: 2)
annualDiscountView.layer.shadowColor = UIColor.blackHintText().cgColor
annualDiscountView.layer.shadowOpacity = 0.62
}
annualDiscountView.isHidden = true
Statistics.logEvent(kStatInappShow, withParameters: [kStatVendor: MWMPurchaseManager.bookmarksSubscriptionVendorId(),
kStatPurchase: MWMPurchaseManager.bookmarksSubscriptionServerId(),
kStatProduct: BOOKMARKS_SUBSCRIPTION_YEARLY_PRODUCT_ID,
kStatFrom: source], with: .realtime)
InAppPurchase.bookmarksSubscriptionManager.getAvailableSubscriptions { [weak self] (subscriptions, error) in
subscriptionManager.getAvailableSubscriptions { [weak self] (subscriptions, error) in
guard let subscriptions = subscriptions, subscriptions.count == 2 else {
MWMAlertViewController.activeAlert().presentInfoAlert(L("price_error_title"),
text: L("price_error_subtitle"))
self?.onCancel?()
return
}
self?.monthlySubscription = subscriptions[0]
self?.annualSubscription = subscriptions[1]
self?.selectedSubscription = self?.annualSubscription
let s = subscriptions[0]
let formatter = NumberFormatter()
@ -96,49 +85,30 @@ import SafariServices
let twelveMonthPrice = monthlyPrice.multiplying(by: 12)
let discount = twelveMonthPrice.subtracting(annualPrice).dividing(by: twelveMonthPrice).multiplying(by: 100)
self?.monthlyViewController.config(title: L("montly_subscription_title"),
subtitle: L("montly_subscription_message"),
price: formatter.string(from: monthlyPrice) ?? "",
image: UIImage(named: "bookmarksSubscriptionMonth")!)
self?.annualViewController.config(title: L("annual_subscription_title"),
subtitle: L("annual_subscription_message"),
price: formatter.string(from: annualPrice) ?? "",
image: UIImage(named: "bookmarksSubscriptionYear")!,
discount: "- \(discount.rounding(accordingToBehavior: nil).intValue) %")
self?.continueButton.isEnabled = true
self?.scrollView.isUserInteractionEnabled = true
self?.annualSubscriptionButton.config(title: L("annual_subscription_title"),
price: formatter.string(from: annualPrice) ?? "",
enabled: true)
self?.monthlySubscriptionButton.config(title: L("montly_subscription_title"),
price: formatter.string(from: monthlyPrice) ?? "",
enabled: true)
self?.annualDiscountView.isHidden = false
self?.annualDiscountLabel.text = "- \(discount.rounding(accordingToBehavior: nil).intValue) %"
}
}
@IBAction func onAnnualViewTap(_ sender: UITapGestureRecognizer) {
guard !annualViewController.isSelected else {
return
}
selectedSubscription = annualSubscription
annualViewController.setSelected(true, animated: true)
monthlyViewController.setSelected(false, animated: true)
scrollView.scrollRectToVisible(annualView.convert(annualView.bounds, to: scrollView), animated: true)
Statistics.logEvent(kStatInappSelect, withParameters: [kStatProduct: selectedSubscription!.productId,
kStatPurchase: MWMPurchaseManager.bookmarksSubscriptionServerId()])
@IBAction func onAnnualButtonTap(_ sender: UIButton) {
purchase(sender: sender, subscription: annualSubscription)
}
@IBAction func onMonthlyViewTap(_ sender: UITapGestureRecognizer) {
guard !monthlyViewController.isSelected else {
return
}
selectedSubscription = monthlySubscription
annualViewController.setSelected(false, animated: true)
monthlyViewController.setSelected(true, animated: true)
scrollView.scrollRectToVisible(monthlyView.convert(monthlyView.bounds, to: scrollView), animated: true)
Statistics.logEvent(kStatInappSelect, withParameters: [kStatProduct: selectedSubscription!.productId,
kStatPurchase: MWMPurchaseManager.bookmarksSubscriptionServerId()])
@IBAction func onMonthlyButtonTap(_ sender: UIButton) {
purchase(sender: sender, subscription: monthlySubscription)
}
@IBAction func onContinue(_ sender: UIButton) {
private func purchase(sender: UIButton, subscription: ISubscription?) {
signup(anchor: sender) { [weak self] success in
guard success else { return }
self?.loadingView.isHidden = false
MWMBookmarksManager.shared().ping { success in
self?.bookmarksManager.ping { success in
guard success else {
self?.loadingView.isHidden = true
let errorDialog = BookmarksSubscriptionFailViewController { [weak self] in
@ -148,11 +118,11 @@ import SafariServices
return
}
guard let subscription = self?.selectedSubscription else {
guard let subscription = subscription else {
return
}
InAppPurchase.bookmarksSubscriptionManager.subscribe(to: subscription)
self?.subscriptionManager.subscribe(to: subscription)
}
}
Statistics.logEvent(kStatInappPay, withParameters: [kStatPurchase: MWMPurchaseManager.bookmarksSubscriptionServerId()],
@ -164,7 +134,7 @@ import SafariServices
signup(anchor: sender) { [weak self] (success) in
guard success else { return }
self?.loadingView.isHidden = false
InAppPurchase.bookmarksSubscriptionManager.restore { result in
self?.subscriptionManager.restore { result in
self?.loadingView.isHidden = true
let alertText: String
switch result {
@ -223,7 +193,7 @@ extension BookmarksSubscriptionViewController: SubscriptionManagerListener {
func didSubscribe(_ subscription: ISubscription) {
MWMPurchaseManager.setBookmarksSubscriptionActive(true)
MWMBookmarksManager.shared().resetInvalidCategories()
bookmarksManager.resetInvalidCategories()
}
func didDefer(_ subscription: ISubscription) {

View file

@ -1,23 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina5_5" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina5_5" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BookmarksSubscriptionViewController" customModule="maps_me" customModuleProvider="target">
<connections>
<outlet property="annualView" destination="Bae-oL-ekX" id="l9n-u0-LNW"/>
<outlet property="continueButton" destination="neX-0h-hs4" id="kQw-7y-Igs"/>
<outlet property="gradientView" destination="BcI-3g-iCI" id="Rmd-LB-Rl5"/>
<outlet property="annualDiscountLabel" destination="YH0-h4-ZEb" id="onk-lS-6im"/>
<outlet property="annualDiscountView" destination="8Qf-I6-xXL" id="CNZ-eh-LJj"/>
<outlet property="annualSubscriptionButton" destination="neX-0h-hs4" id="I6s-8S-Qks"/>
<outlet property="loadingView" destination="BHb-cU-Ze3" id="bfe-6a-BJf"/>
<outlet property="monthlyView" destination="Jpy-cA-wCv" id="6yi-OC-MrD"/>
<outlet property="scrollView" destination="q5w-jW-Chn" id="dMR-TM-gMC"/>
<outlet property="monthlySubscriptionButton" destination="sj5-ey-SEv" id="nUs-dU-WOI"/>
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
</connections>
</placeholder>
@ -26,122 +23,237 @@
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BcI-3g-iCI" customClass="GradientView" customModule="maps_me" customModuleProvider="target">
<scrollView multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" contentInsetAdjustmentBehavior="always" translatesAutoresizingMaskIntoConstraints="NO" id="0eE-hs-sId">
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="startColor">
<color key="value" red="0.81568627450980391" green="0.92156862745098034" blue="1" alpha="0.70424871575342463" colorSpace="custom" customColorSpace="sRGB"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="endColor">
<color key="value" white="1" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<scrollView multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0eE-hs-sId">
<rect key="frame" x="0.0" y="20" width="414" height="716"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Eiz-QQ-h0b">
<rect key="frame" x="0.0" y="0.0" width="414" height="677.66666666666663"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="1015"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Unlimited access to 5000+ guides!" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bOS-sQ-rkD">
<rect key="frame" x="16" y="24.000000000000004" width="382" height="57.333333333333343"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="24"/>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionHeader" translatesAutoresizingMaskIntoConstraints="NO" id="Y38-kF-ZnW">
<rect key="frame" x="0.0" y="0.0" width="414" height="212"/>
<constraints>
<constraint firstAttribute="height" constant="212" id="YbO-Ju-JzM"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Sightseeing" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bOS-sQ-rkD">
<rect key="frame" x="24" y="232" width="366" height="33.666666666666686"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="28"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold24"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="subscription_screen_native_title_version_2"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold28"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="linkBlue"/>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="sightseeing_subscription_header_sightseeing"/>
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Every kind of journey. Whether alone or with friends, hiking or sunbathing" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vzD-qz-Fwt">
<rect key="frame" x="16" y="97.333333333333329" width="382" height="33.666666666666671"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Subscription" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vzD-qz-Fwt">
<rect key="frame" x="24" y="269.66666666666669" width="366" height="33.666666666666686"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="28"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular14"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold28"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="subscription_screen_native_message_version_2"/>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="sightseeing_subscription_header_subscription"/>
</userDefinedRuntimeAttributes>
</label>
<scrollView multipleTouchEnabled="YES" contentMode="scaleToFill" bounces="NO" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" bouncesZoom="NO" translatesAutoresizingMaskIntoConstraints="NO" id="q5w-jW-Chn">
<rect key="frame" x="33" y="165" width="348" height="254"/>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" spacing="16" translatesAutoresizingMaskIntoConstraints="NO" id="PSz-Kf-Ihe">
<rect key="frame" x="16" y="327.33333333333331" width="382" height="192.99999999999994"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GGO-lU-mzy">
<rect key="frame" x="0.0" y="0.0" width="348" height="254"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6wz-nj-9Hk">
<rect key="frame" x="0.0" y="0.0" width="382" height="50"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Bae-oL-ekX">
<rect key="frame" x="0.0" y="0.0" width="166" height="254"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionBullet" translatesAutoresizingMaskIntoConstraints="NO" id="v8f-bu-XRf">
<rect key="frame" x="0.0" y="0.0" width="16" height="16"/>
<constraints>
<constraint firstAttribute="width" constant="166" id="VWj-No-rzW"/>
<constraint firstAttribute="height" constant="16" id="9uz-Gn-4dK"/>
<constraint firstAttribute="width" constant="16" id="v33-uE-cyp"/>
</constraints>
<connections>
<outletCollection property="gestureRecognizers" destination="CPT-bP-cim" appends="YES" id="1dj-wC-eaz"/>
</connections>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Jpy-cA-wCv">
<rect key="frame" x="182" y="0.0" width="166" height="254"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="166" id="RXq-j7-sUf"/>
</constraints>
<connections>
<outletCollection property="gestureRecognizers" destination="6bt-Wj-I8y" appends="YES" id="CUa-Ee-sVX"/>
</connections>
</view>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="700+ cities and 100+ countries" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0Yb-rS-wW6">
<rect key="frame" x="32" y="-4" width="350" height="50"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium17"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="sightseeing_subscription_message"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="Bae-oL-ekX" secondAttribute="bottom" id="72v-2J-b39"/>
<constraint firstItem="Bae-oL-ekX" firstAttribute="leading" secondItem="GGO-lU-mzy" secondAttribute="leading" id="9Xb-Ed-LrY"/>
<constraint firstItem="Jpy-cA-wCv" firstAttribute="top" secondItem="GGO-lU-mzy" secondAttribute="top" id="AcV-qq-Sad"/>
<constraint firstAttribute="trailing" secondItem="Jpy-cA-wCv" secondAttribute="trailing" id="PHw-4l-fxy"/>
<constraint firstAttribute="bottom" secondItem="Jpy-cA-wCv" secondAttribute="bottom" id="Uy5-XO-hD6"/>
<constraint firstItem="Jpy-cA-wCv" firstAttribute="leading" secondItem="Bae-oL-ekX" secondAttribute="trailing" constant="16" id="qkv-Ia-8dz"/>
<constraint firstItem="Bae-oL-ekX" firstAttribute="top" secondItem="GGO-lU-mzy" secondAttribute="top" id="x9A-wI-c5M"/>
<constraint firstItem="v8f-bu-XRf" firstAttribute="leading" secondItem="6wz-nj-9Hk" secondAttribute="leading" id="6qd-3D-YnN"/>
<constraint firstItem="0Yb-rS-wW6" firstAttribute="leading" secondItem="v8f-bu-XRf" secondAttribute="trailing" constant="16" id="ZXr-Ei-8iB"/>
<constraint firstAttribute="trailing" secondItem="0Yb-rS-wW6" secondAttribute="trailing" id="d33-Y9-0BY"/>
<constraint firstAttribute="height" secondItem="0Yb-rS-wW6" secondAttribute="height" id="jW8-zs-I4k"/>
<constraint firstItem="v8f-bu-XRf" firstAttribute="top" secondItem="6wz-nj-9Hk" secondAttribute="top" id="o1E-GY-Jsr"/>
<constraint firstItem="0Yb-rS-wW6" firstAttribute="top" secondItem="v8f-bu-XRf" secondAttribute="top" constant="-4" id="vYU-Ps-E1X"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mF9-z9-HWN">
<rect key="frame" x="0.0" y="66" width="382" height="61"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionBullet" translatesAutoresizingMaskIntoConstraints="NO" id="FOL-e3-sHY">
<rect key="frame" x="0.0" y="0.0" width="16" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="IZr-8y-6VR"/>
<constraint firstAttribute="width" constant="16" id="W4F-Fw-jXu"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Detailed descriptions" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="f3W-d3-0t1">
<rect key="frame" x="32" y="-4" width="350" height="61"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium17"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="sightseeing_subscription_message_2"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="FOL-e3-sHY" firstAttribute="leading" secondItem="mF9-z9-HWN" secondAttribute="leading" id="Bxw-V5-GPB"/>
<constraint firstItem="FOL-e3-sHY" firstAttribute="top" secondItem="mF9-z9-HWN" secondAttribute="top" id="Efh-b4-3CU"/>
<constraint firstItem="f3W-d3-0t1" firstAttribute="top" secondItem="FOL-e3-sHY" secondAttribute="top" constant="-4" id="GDe-wG-JEm"/>
<constraint firstItem="f3W-d3-0t1" firstAttribute="leading" secondItem="FOL-e3-sHY" secondAttribute="trailing" constant="16" id="Tpf-lQ-ASZ"/>
<constraint firstAttribute="trailing" secondItem="f3W-d3-0t1" secondAttribute="trailing" id="Ua8-y7-ggf"/>
<constraint firstAttribute="height" secondItem="f3W-d3-0t1" secondAttribute="height" id="Zwn-Ri-YNB"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mtL-ar-cGM">
<rect key="frame" x="0.0" y="143" width="382" height="50"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionBullet" translatesAutoresizingMaskIntoConstraints="NO" id="PSK-Ys-mFZ">
<rect key="frame" x="0.0" y="0.0" width="16" height="16"/>
<constraints>
<constraint firstAttribute="width" constant="16" id="FPa-mC-5hG"/>
<constraint firstAttribute="height" constant="16" id="xzI-O9-glP"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Rich content: photos and tracks" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ahr-bo-V6W">
<rect key="frame" x="32" y="-4" width="350" height="50"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium17"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="sightseeing_subscription_message_3"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="ahr-bo-V6W" firstAttribute="top" secondItem="PSK-Ys-mFZ" secondAttribute="top" constant="-4" id="25q-3a-RFA"/>
<constraint firstItem="ahr-bo-V6W" firstAttribute="leading" secondItem="PSK-Ys-mFZ" secondAttribute="trailing" constant="16" id="FKU-iT-1dV"/>
<constraint firstItem="PSK-Ys-mFZ" firstAttribute="top" secondItem="mtL-ar-cGM" secondAttribute="top" id="IuY-vv-OCR"/>
<constraint firstAttribute="trailing" secondItem="ahr-bo-V6W" secondAttribute="trailing" id="bLU-Eh-O9Y"/>
<constraint firstAttribute="height" secondItem="ahr-bo-V6W" secondAttribute="height" id="bb7-EL-YyX"/>
<constraint firstItem="PSK-Ys-mFZ" firstAttribute="leading" secondItem="mtL-ar-cGM" secondAttribute="leading" id="fEj-Bj-7VH"/>
</constraints>
</view>
</subviews>
<constraints>
<constraint firstItem="GGO-lU-mzy" firstAttribute="leading" secondItem="q5w-jW-Chn" secondAttribute="leading" id="0go-36-y89"/>
<constraint firstItem="GGO-lU-mzy" firstAttribute="height" secondItem="q5w-jW-Chn" secondAttribute="height" id="Hu0-Yv-PbT"/>
<constraint firstAttribute="height" constant="254" id="KST-Zr-MUU"/>
<constraint firstAttribute="bottom" secondItem="GGO-lU-mzy" secondAttribute="bottom" id="Nt2-u8-Jy8"/>
<constraint firstItem="GGO-lU-mzy" firstAttribute="width" secondItem="q5w-jW-Chn" secondAttribute="width" priority="750" id="TCc-RX-U0D"/>
<constraint firstAttribute="trailing" secondItem="GGO-lU-mzy" secondAttribute="trailing" id="bZ7-83-JVY"/>
<constraint firstItem="GGO-lU-mzy" firstAttribute="top" secondItem="q5w-jW-Chn" secondAttribute="top" id="bqg-vJ-nua"/>
<constraint firstItem="mF9-z9-HWN" firstAttribute="width" secondItem="PSz-Kf-Ihe" secondAttribute="width" id="XnH-V7-TZc"/>
<constraint firstItem="6wz-nj-9Hk" firstAttribute="width" secondItem="PSz-Kf-Ihe" secondAttribute="width" id="iKl-Zj-mQ5"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="80" id="pJI-V4-7Ss"/>
<constraint firstItem="mtL-ar-cGM" firstAttribute="width" secondItem="PSz-Kf-Ihe" secondAttribute="width" id="z7N-mA-IV4"/>
</constraints>
</scrollView>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="neX-0h-hs4" userLabel="Continue">
<rect key="frame" x="50" y="453" width="314" height="50"/>
<color key="backgroundColor" red="0.1176470588" green="0.58823529409999997" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_next2"/>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="16" translatesAutoresizingMaskIntoConstraints="NO" id="pHi-wc-Fah">
<rect key="frame" x="20" y="564.33333333333337" width="374" height="144"/>
<subviews>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="neX-0h-hs4" userLabel="Continue" customClass="BookmarksSubscriptionButton" customModule="maps_me" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="374" height="64"/>
<color key="backgroundColor" red="0.1176470588" green="0.58823529409999997" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_subscription_annual"/>
<constraints>
<constraint firstAttribute="height" constant="64" id="fov-Od-QwC"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
<state key="normal" title="!! Annual">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="textColorHighlightedName" value="white"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium14"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="6"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="white"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="linkBlue"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="linkBlueHighlighted"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="onAnnualButtonTap:" destination="-1" eventType="touchUpInside" id="KEE-ZN-J9Y"/>
</connections>
</button>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sj5-ey-SEv" userLabel="Continue" customClass="BookmarksSubscriptionButton" customModule="maps_me" customModuleProvider="target">
<rect key="frame" x="0.0" y="80" width="374" height="64"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_subscription_monthly"/>
<constraints>
<constraint firstAttribute="height" constant="64" id="uHO-Gb-tBx"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
<state key="normal" title="!! Monthly">
<color key="titleColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="textColorHighlightedName" value="white"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium14"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="6"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="blackHintText"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.borderWidth">
<integer key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="borderColorName" value="blackHintText"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="blackDividers"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="onMonthlyButtonTap:" destination="-1" eventType="touchUpInside" id="Uc2-Qk-Flp"/>
</connections>
</button>
</subviews>
</stackView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Qf-I6-xXL">
<rect key="frame" x="28" y="541.33333333333337" width="68.333333333333329" height="35"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="- $38" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="YH0-h4-ZEb">
<rect key="frame" x="10.000000000000004" y="6.6666666666666305" width="48.333333333333343" height="21.666666666666671"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="keyPath" value="YES"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<color key="backgroundColor" red="0.63921568630000003" green="0.20784313730000001" blue="0.95686274510000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="fov-Od-QwC"/>
<constraint firstItem="YH0-h4-ZEb" firstAttribute="leading" secondItem="8Qf-I6-xXL" secondAttribute="leading" constant="10" id="C0N-aA-9E7"/>
<constraint firstAttribute="trailing" secondItem="YH0-h4-ZEb" secondAttribute="trailing" constant="10" id="Dp8-du-XOO"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="20" id="HAR-vc-83l"/>
<constraint firstItem="YH0-h4-ZEb" firstAttribute="centerY" secondItem="8Qf-I6-xXL" secondAttribute="centerY" id="fDL-BG-gMf"/>
<constraint firstAttribute="height" constant="35" id="jRh-2M-BXj"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
<state key="normal" title="CONTINUE">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="textColorHighlightedName" value="white"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium14"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="6"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="white"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="linkBlue"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="linkBlueHighlighted"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="discountBackground"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="onContinue:" destination="-1" eventType="touchUpInside" id="aAu-Te-fXW"/>
</connections>
</button>
</view>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="a64-qc-DrZ" userLabel="Restore">
<rect key="frame" x="50" y="511" width="314" height="50"/>
<rect key="frame" x="50" y="718.33333333333337" width="314" height="50"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_next2"/>
<constraints>
@ -162,7 +274,7 @@
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="justified" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tWZ-GP-RxW">
<rect key="frame" x="20" y="569" width="374" height="64.666666666666629"/>
<rect key="frame" x="20" y="776.33333333333337" width="374" height="64.666666666666629"/>
<string key="text">Payment will be charged to your iTunes account at confirmation of purchase. The subscription will automatically renew unless auto-renew is turned off at least 24 hours before the end of the current period. Your account will be charged according to your plan for renewal within 24 hours prior to the end of the current period. You can manage or turn off auto-renew in your Apple ID account settings at any time of your purchase.</string>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" white="0.0" alpha="0.31555008561643838" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@ -174,7 +286,7 @@
</userDefinedRuntimeAttributes>
</label>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="awa-we-Pjk" userLabel="TermsOfUse">
<rect key="frame" x="20" y="633.66666666666663" width="66" height="44"/>
<rect key="frame" x="20" y="841" width="66" height="44"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_next2"/>
<constraints>
@ -195,7 +307,7 @@
</connections>
</button>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" horizontalCompressionResistancePriority="749" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="60B-kT-Eev" userLabel="PrivacyPolicy">
<rect key="frame" x="325" y="633.66666666666663" width="69" height="44"/>
<rect key="frame" x="325" y="841" width="69" height="44"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_next2"/>
<constraints>
@ -215,17 +327,27 @@
<action selector="onPrivacy:" destination="-1" eventType="touchUpInside" id="ySf-IG-mMz"/>
</connections>
</button>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionFooter" translatesAutoresizingMaskIntoConstraints="NO" id="GUc-JW-T3W">
<rect key="frame" x="0.0" y="786.33333333333337" width="414" height="228.66666666666663"/>
<constraints>
<constraint firstAttribute="width" secondItem="GUc-JW-T3W" secondAttribute="height" multiplier="375:207" id="yvv-rm-Tjg"/>
</constraints>
</imageView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MPt-NS-DbA">
<rect key="frame" x="0.0" y="1015" width="414" height="736"/>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="bookmarkSubscriptionFooterBackground"/>
</userDefinedRuntimeAttributes>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="v0Z-5m-unD">
<rect key="frame" x="362" y="0.0" width="44" height="44"/>
<rect key="frame" x="362" y="4" width="44" height="44"/>
<constraints>
<constraint firstAttribute="height" constant="44" id="9dL-YL-GLY"/>
<constraint firstAttribute="width" constant="44" id="tIs-g1-eI6"/>
</constraints>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<state key="normal" image="bookmarksSubscriptionClose"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="tintColorName" value="linkBlue"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="onClose:" destination="-1" eventType="touchUpInside" id="VMj-IW-RNx"/>
</connections>
@ -233,43 +355,61 @@
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="bOS-sQ-rkD" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="16" id="2dJ-3J-bOG"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="q5w-jW-Chn" secondAttribute="trailing" constant="13" id="3OB-ln-ZP1"/>
<constraint firstAttribute="trailing" secondItem="vzD-qz-Fwt" secondAttribute="trailing" constant="16" id="3Xf-Bz-ISk"/>
<constraint firstItem="MPt-NS-DbA" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" id="1QZ-Ze-yR5"/>
<constraint firstItem="bOS-sQ-rkD" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="24" id="2dJ-3J-bOG"/>
<constraint firstAttribute="trailing" secondItem="vzD-qz-Fwt" secondAttribute="trailing" constant="24" id="3Xf-Bz-ISk"/>
<constraint firstAttribute="trailing" secondItem="GUc-JW-T3W" secondAttribute="trailing" id="5eY-po-9Sf"/>
<constraint firstItem="awa-we-Pjk" firstAttribute="top" secondItem="tWZ-GP-RxW" secondAttribute="bottom" id="7ey-rc-AJD"/>
<constraint firstItem="vzD-qz-Fwt" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="16" id="819-Wz-tmt"/>
<constraint firstItem="q5w-jW-Chn" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="13" id="9kc-0C-7dp"/>
<constraint firstItem="vzD-qz-Fwt" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="24" id="819-Wz-tmt"/>
<constraint firstItem="pHi-wc-Fah" firstAttribute="top" secondItem="8Qf-I6-xXL" secondAttribute="bottom" constant="-12" id="Av2-tQ-YYz"/>
<constraint firstAttribute="bottom" secondItem="GUc-JW-T3W" secondAttribute="bottom" id="DbY-me-8DS"/>
<constraint firstItem="Y38-kF-ZnW" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" id="Egn-no-uGA"/>
<constraint firstItem="60B-kT-Eev" firstAttribute="top" secondItem="tWZ-GP-RxW" secondAttribute="bottom" id="HNk-gd-Qc6"/>
<constraint firstAttribute="trailing" secondItem="a64-qc-DrZ" secondAttribute="trailing" constant="50" id="INc-Pv-5M3"/>
<constraint firstItem="bOS-sQ-rkD" firstAttribute="top" secondItem="Eiz-QQ-h0b" secondAttribute="top" constant="24" id="JTG-8l-iqj"/>
<constraint firstItem="8Qf-I6-xXL" firstAttribute="leading" secondItem="pHi-wc-Fah" secondAttribute="leading" constant="8" id="Ifx-No-gEE"/>
<constraint firstItem="pHi-wc-Fah" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="20" id="J0P-76-RPl"/>
<constraint firstItem="awa-we-Pjk" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="20" id="Loh-WS-cJr"/>
<constraint firstItem="a64-qc-DrZ" firstAttribute="top" secondItem="pHi-wc-Fah" secondAttribute="bottom" constant="10" id="N8l-CI-D02"/>
<constraint firstItem="Y38-kF-ZnW" firstAttribute="top" secondItem="Eiz-QQ-h0b" secondAttribute="top" id="NJc-wc-d8G"/>
<constraint firstItem="GUc-JW-T3W" firstAttribute="centerX" secondItem="Eiz-QQ-h0b" secondAttribute="centerX" id="NUr-Gl-90a"/>
<constraint firstAttribute="trailing" secondItem="tWZ-GP-RxW" secondAttribute="trailing" constant="20" id="OFb-vM-2cl"/>
<constraint firstAttribute="bottom" secondItem="60B-kT-Eev" secondAttribute="bottom" constant="130" id="Oal-d1-061"/>
<constraint firstItem="a64-qc-DrZ" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="50" id="R8g-2f-TIi"/>
<constraint firstItem="q5w-jW-Chn" firstAttribute="centerX" secondItem="Eiz-QQ-h0b" secondAttribute="centerX" id="RqB-aN-G6b"/>
<constraint firstItem="neX-0h-hs4" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="50" id="SOV-6g-yrG"/>
<constraint firstAttribute="trailing" secondItem="bOS-sQ-rkD" secondAttribute="trailing" constant="16" id="UBz-JQ-dSq"/>
<constraint firstAttribute="trailing" secondItem="neX-0h-hs4" secondAttribute="trailing" constant="50" id="UTD-bj-67L"/>
<constraint firstAttribute="trailing" secondItem="pHi-wc-Fah" secondAttribute="trailing" constant="20" id="SMh-T1-d1h"/>
<constraint firstAttribute="trailing" secondItem="bOS-sQ-rkD" secondAttribute="trailing" constant="24" id="UBz-JQ-dSq"/>
<constraint firstAttribute="trailing" secondItem="v0Z-5m-unD" secondAttribute="trailing" constant="8" id="aj5-SM-A2m"/>
<constraint firstItem="60B-kT-Eev" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="awa-we-Pjk" secondAttribute="trailing" constant="16" id="bOW-rf-yBR"/>
<constraint firstItem="neX-0h-hs4" firstAttribute="top" secondItem="q5w-jW-Chn" secondAttribute="bottom" constant="34" id="cZ6-hC-ePD"/>
<constraint firstItem="q5w-jW-Chn" firstAttribute="top" secondItem="vzD-qz-Fwt" secondAttribute="bottom" constant="34" id="esu-FS-r9d"/>
<constraint firstItem="vzD-qz-Fwt" firstAttribute="top" secondItem="bOS-sQ-rkD" secondAttribute="bottom" constant="16" id="f5X-2e-9pD"/>
<constraint firstItem="PSz-Kf-Ihe" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="16" id="cbD-Jg-kMl"/>
<constraint firstItem="vzD-qz-Fwt" firstAttribute="top" secondItem="bOS-sQ-rkD" secondAttribute="bottom" constant="4" id="f5X-2e-9pD"/>
<constraint firstItem="tWZ-GP-RxW" firstAttribute="top" secondItem="a64-qc-DrZ" secondAttribute="bottom" constant="8" id="fUL-gY-evu"/>
<constraint firstItem="a64-qc-DrZ" firstAttribute="top" secondItem="neX-0h-hs4" secondAttribute="bottom" constant="8" id="gEf-O0-spw"/>
<constraint firstAttribute="trailing" secondItem="Y38-kF-ZnW" secondAttribute="trailing" id="g3S-MI-Ade"/>
<constraint firstAttribute="trailing" secondItem="MPt-NS-DbA" secondAttribute="trailing" id="h6E-wP-Tod"/>
<constraint firstItem="pHi-wc-Fah" firstAttribute="top" secondItem="PSz-Kf-Ihe" secondAttribute="bottom" constant="44" id="hJY-HS-z7Q"/>
<constraint firstAttribute="trailing" secondItem="PSz-Kf-Ihe" secondAttribute="trailing" constant="16" id="jgx-hb-G4E"/>
<constraint firstItem="tWZ-GP-RxW" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="20" id="km3-TI-Nnc"/>
<constraint firstItem="v0Z-5m-unD" firstAttribute="top" secondItem="Eiz-QQ-h0b" secondAttribute="top" id="lx8-MC-GlM"/>
<constraint firstItem="v0Z-5m-unD" firstAttribute="top" secondItem="Eiz-QQ-h0b" secondAttribute="top" constant="4" id="qdm-IQ-Y6J"/>
<constraint firstItem="GUc-JW-T3W" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" id="rj2-o4-Jw3"/>
<constraint firstItem="PSz-Kf-Ihe" firstAttribute="top" secondItem="vzD-qz-Fwt" secondAttribute="bottom" constant="24" id="syy-VW-Tlt"/>
<constraint firstItem="MPt-NS-DbA" firstAttribute="top" secondItem="Eiz-QQ-h0b" secondAttribute="bottom" id="vy8-dM-4jS"/>
<constraint firstAttribute="trailing" secondItem="60B-kT-Eev" secondAttribute="trailing" constant="20" id="wEX-hK-g2z"/>
<constraint firstAttribute="bottom" secondItem="awa-we-Pjk" secondAttribute="bottom" id="yuL-cU-wGM"/>
<constraint firstItem="bOS-sQ-rkD" firstAttribute="top" secondItem="Y38-kF-ZnW" secondAttribute="bottom" constant="20" id="xYU-mb-XeF"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="bookmarkSubscriptionBackground"/>
</userDefinedRuntimeAttributes>
</view>
</subviews>
<constraints>
<constraint firstItem="Eiz-QQ-h0b" firstAttribute="top" secondItem="0eE-hs-sId" secondAttribute="top" id="9jr-XF-OP2"/>
<constraint firstItem="Eiz-QQ-h0b" firstAttribute="leading" secondItem="0eE-hs-sId" secondAttribute="leading" id="DjF-kC-58d"/>
<constraint firstAttribute="trailing" secondItem="Eiz-QQ-h0b" secondAttribute="trailing" id="GL8-iC-MmT"/>
<constraint firstItem="MPt-NS-DbA" firstAttribute="height" secondItem="0eE-hs-sId" secondAttribute="height" id="Hu8-4c-2lH"/>
<constraint firstAttribute="bottom" secondItem="Eiz-QQ-h0b" secondAttribute="bottom" id="amI-MH-1yy"/>
<constraint firstItem="Eiz-QQ-h0b" firstAttribute="width" secondItem="0eE-hs-sId" secondAttribute="width" id="ke9-ke-QPG"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="bookmarkSubscriptionScrollBackground"/>
</userDefinedRuntimeAttributes>
</scrollView>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BHb-cU-Ze3">
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
@ -284,7 +424,6 @@
<constraint firstItem="XZg-yN-Jtv" firstAttribute="centerX" secondItem="BHb-cU-Ze3" secondAttribute="centerX" id="Ade-4z-Spa"/>
<constraint firstItem="XZg-yN-Jtv" firstAttribute="centerY" secondItem="BHb-cU-Ze3" secondAttribute="centerY" id="CQX-i5-ZcY"/>
</constraints>
<viewLayoutGuide key="safeArea" id="Nh0-0H-Zgm"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="toastBackground"/>
</userDefinedRuntimeAttributes>
@ -292,20 +431,16 @@
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="BcI-3g-iCI" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="1cC-us-Ehh"/>
<constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="0eE-hs-sId" secondAttribute="trailing" id="7gZ-TD-rRu"/>
<constraint firstItem="0eE-hs-sId" firstAttribute="top" secondItem="fnl-2z-Ty3" secondAttribute="top" id="Avd-W3-cXU"/>
<constraint firstAttribute="trailing" secondItem="BcI-3g-iCI" secondAttribute="trailing" id="IKZ-OT-jxC"/>
<constraint firstAttribute="bottom" secondItem="BcI-3g-iCI" secondAttribute="bottom" id="SHg-Ke-dap"/>
<constraint firstAttribute="trailing" secondItem="0eE-hs-sId" secondAttribute="trailing" id="7gZ-TD-rRu"/>
<constraint firstItem="0eE-hs-sId" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="Avd-W3-cXU"/>
<constraint firstAttribute="bottom" secondItem="BHb-cU-Ze3" secondAttribute="bottom" id="X6W-ia-1Mi"/>
<constraint firstAttribute="trailing" secondItem="BHb-cU-Ze3" secondAttribute="trailing" id="dNr-7E-k98"/>
<constraint firstItem="BcI-3g-iCI" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="doL-Dw-bDS"/>
<constraint firstItem="BHb-cU-Ze3" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="ipn-ug-1wp"/>
<constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="0eE-hs-sId" secondAttribute="bottom" id="ku8-zI-AI4"/>
<constraint firstItem="0eE-hs-sId" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="sv4-ek-sAP"/>
<constraint firstAttribute="bottom" secondItem="0eE-hs-sId" secondAttribute="bottom" id="ku8-zI-AI4"/>
<constraint firstItem="0eE-hs-sId" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="sv4-ek-sAP"/>
<constraint firstAttribute="top" secondItem="BHb-cU-Ze3" secondAttribute="top" id="vTu-oZ-veb"/>
</constraints>
<viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
<viewLayoutGuide key="safeArea" id="k4r-ns-RCJ"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
</userDefinedRuntimeAttributes>
@ -323,6 +458,9 @@
</tapGestureRecognizer>
</objects>
<resources>
<image name="bookmarksSubscriptionBullet" width="16" height="16"/>
<image name="bookmarksSubscriptionClose" width="24" height="24"/>
<image name="bookmarksSubscriptionFooter" width="375" height="208"/>
<image name="bookmarksSubscriptionHeader" width="375" height="212.33332824707031"/>
</resources>
</document>

View file

@ -1,11 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@ -91,6 +89,9 @@
</constraints>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
</userDefinedRuntimeAttributes>
<point key="canvasLocation" x="47.200000000000003" y="143.02848575712144"/>
</view>
</objects>

View file

@ -26,7 +26,7 @@ class PaidRouteViewController: MWMViewController {
private var product: IStoreProduct?
private var subscription: ISubscription?
private let subscriptionManager: SubscriptionManager
private let subscriptionManager: ISubscriptionManager
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
get { return [.portrait] }

View file

@ -58,6 +58,10 @@
+ (UIColor *)subscriptionCellBorder;
+ (UIColor *)subscriptionCellBackground;
+ (UIColor *)subscriptionCellTitle;
+ (UIColor *)discountBackground;
+ (UIColor *)bookmarkSubscriptionScrollBackground;
+ (UIColor *)bookmarkSubscriptionBackground;
+ (UIColor *)bookmarkSubscriptionFooterBackground;
+ (UIColor *)colorWithName:(NSString *)colorName;
+ (UIColor *)colorFromHexString:(NSString *)hexString;

View file

@ -52,7 +52,11 @@ NSDictionary<NSString *, UIColor *> * night = @{
@"toastBackground": [UIColor colorWithWhite:0. alpha:alpha87],
@"statusBarBackground": [UIColor colorWithWhite:0. alpha:alpha32],
@"bannerBackground" : [UIColor colorWithRed:scaled(71) green:scaled(75) blue:scaled(79) alpha:alpha100],
@"border" : [UIColor colorWithWhite:1. alpha:alpha04]
@"border" : [UIColor colorWithWhite:1. alpha:alpha04],
@"discountBackground" : [UIColor colorWithRed:scaled(240) green:scaled(100) blue:scaled(60) alpha:alpha100],
@"bookmarkSubscriptionBackground" : [UIColor colorWithRed:scaled(60.) green:scaled(64.) blue:scaled(68.) alpha:alpha100],
@"bookmarkSubscriptionScrollBackground" : [UIColor colorWithRed:scaled(137) green:scaled(217) blue:scaled(255) alpha:alpha100],
@"bookmarkSubscriptionFooterBackground" : [UIColor colorWithRed:scaled(47) green:scaled(58) blue:scaled(73) alpha:alpha100],
};
NSDictionary<NSString *, UIColor *> * day = @{
@ -101,7 +105,11 @@ NSDictionary<NSString *, UIColor *> * day = @{
@"toastBackground" : [UIColor colorWithWhite:1. alpha:alpha87],
@"statusBarBackground" : [UIColor colorWithWhite:1. alpha:alpha36],
@"bannerBackground" : [UIColor colorWithRed:scaled(249) green:scaled(251) blue:scaled(231) alpha:alpha100],
@"border" : [UIColor colorWithWhite:0. alpha:alpha04]
@"border" : [UIColor colorWithWhite:0. alpha:alpha04],
@"discountBackground" : [UIColor colorWithRed:scaled(240) green:scaled(100) blue:scaled(60) alpha:alpha100],
@"bookmarkSubscriptionBackground" : [UIColor colorWithRed:scaled(240) green:scaled(252) blue:scaled(255) alpha:alpha100],
@"bookmarkSubscriptionScrollBackground" : [UIColor colorWithRed:scaled(137) green:scaled(217) blue:scaled(255) alpha:alpha100],
@"bookmarkSubscriptionFooterBackground" : [UIColor colorWithRed:scaled(47) green:scaled(58) blue:scaled(73) alpha:alpha100],
};
UIColor * color(SEL cmd)
@ -416,4 +424,24 @@ UIColor * color(SEL cmd)
}
+ (UIColor *)discountBackground
{
return color(_cmd);
}
+ (UIColor *)bookmarkSubscriptionScrollBackground
{
return color(_cmd);
}
+ (UIColor *)bookmarkSubscriptionBackground
{
return color(_cmd);
}
+ (UIColor *)bookmarkSubscriptionFooterBackground
{
return color(_cmd);
}
@end

View file

@ -42,6 +42,7 @@
+ (UIFont *)bold48;
+ (UIFont *)italic16;
+ (UIFont *)semibold14;
+ (UIFont *)semibold16;
+ (UIFont *)fontWithName:(NSString *)fontName;

View file

@ -47,6 +47,7 @@ NSString * const kLightFontName = @"HelveticaNeue-Light";
+ (UIFont *)bold48 { return [UIFont boldSystemFontOfSize:48]; }
+ (UIFont *)italic16 { return [UIFont italicSystemFontOfSize:16]; }
+ (UIFont *)semibold14 { return [UIFont systemFontOfSize:14 weight:UIFontWeightSemibold]; }
+ (UIFont *)semibold16 { return [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold]; }
+ (UIFont *)fontWithName:(NSString *)fontName
{
#pragma clang diagnostic push

View file

@ -10,4 +10,8 @@
self.tintColor = [UIColor colorWithName:colorName];
}
- (void) setBorderColorName:(NSString*) colorName {
self.layer.borderColor = [UIColor colorWithName:colorName].CGColor;
}
@end

View file

@ -27,13 +27,13 @@ final class InAppPurchase: NSObject {
return InAppBilling()
}
@objc static var adsRemovalSubscriptionManager: SubscriptionManager = {
@objc static var adsRemovalSubscriptionManager: ISubscriptionManager = {
return SubscriptionManager(productIds: MWMPurchaseManager.productIds(),
serverId: MWMPurchaseManager.adsRemovalServerId(),
vendorId: MWMPurchaseManager.adsRemovalVendorId())
} ()
@objc static var bookmarksSubscriptionManager: SubscriptionManager = {
@objc static var bookmarksSubscriptionManager: ISubscriptionManager = {
return SubscriptionManager(productIds: MWMPurchaseManager.bookmakrsProductIds(),
serverId: MWMPurchaseManager.bookmarksSubscriptionServerId(),
vendorId: MWMPurchaseManager.bookmarksSubscriptionVendorId())

View file

@ -1,3 +1,16 @@
@objc protocol ISubscriptionManager: class{
typealias SuscriptionsCompletion = ([ISubscription]?, Error?) -> Void
typealias ValidationCompletion = (MWMValidationResult) -> Void
@objc static func canMakePayments() -> Bool
@objc func getAvailableSubscriptions(_ completion: @escaping SuscriptionsCompletion)
@objc func subscribe(to subscription: ISubscription)
@objc func addListener(_ listener: SubscriptionManagerListener)
@objc func removeListener(_ listener: SubscriptionManagerListener)
@objc func validate(completion: ValidationCompletion?)
@objc func restore(_ callback: @escaping ValidationCompletion)
}
@objc protocol SubscriptionManagerListener: AnyObject {
func didFailToSubscribe(_ subscription: ISubscription, error: Error?)
func didSubscribe(_ subscription: ISubscription)
@ -6,10 +19,7 @@
func didValidate(_ isValid: Bool)
}
class SubscriptionManager: NSObject {
typealias SuscriptionsCompletion = ([ISubscription]?, Error?) -> Void
typealias ValidationCompletion = (MWMValidationResult) -> Void
class SubscriptionManager: NSObject, ISubscriptionManager {
private let paymentQueue = SKPaymentQueue.default()
private var productsRequest: SKProductsRequest?
private var subscriptionsComplection: SuscriptionsCompletion?

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 B

View file

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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Group 9.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Group 9@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "Group 9@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: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

View file

@ -366,8 +366,6 @@
470F5A5C2181DE7500754295 /* PaidRouteViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 470F5A5A2181DE7400754295 /* PaidRouteViewController.xib */; };
470F5A7D2189BB2F00754295 /* PaidRoutePurchase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470F5A7C2189BB2F00754295 /* PaidRoutePurchase.swift */; };
470F5A7F2189C30800754295 /* InAppPurchase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470F5A7E2189C30800754295 /* InAppPurchase.swift */; };
4710366522D3764600585272 /* BookmarksSubscriptionCellViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4710366322D3764600585272 /* BookmarksSubscriptionCellViewController.swift */; };
4710366622D3764600585272 /* BookmarksSubscriptionCellViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4710366422D3764600585272 /* BookmarksSubscriptionCellViewController.xib */; };
4716EABA21A325310029B886 /* IPaidRouteStatistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4716EAB921A325310029B886 /* IPaidRouteStatistics.swift */; };
4716EAC121A6E0570029B886 /* BookmarksVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4716EAC021A6E0570029B886 /* BookmarksVC.xib */; };
4719A643219CB61D009F9AA7 /* BillingPendingTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4719A642219CB61D009F9AA7 /* BillingPendingTransaction.swift */; };
@ -576,6 +574,7 @@
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 */; };
99865A1B234F629100127532 /* BookmarksSubscriptionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99865A1A234F629100127532 /* BookmarksSubscriptionButton.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 */; };
@ -1461,8 +1460,6 @@
470F5A5A2181DE7400754295 /* PaidRouteViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PaidRouteViewController.xib; sourceTree = "<group>"; };
470F5A7C2189BB2F00754295 /* PaidRoutePurchase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaidRoutePurchase.swift; sourceTree = "<group>"; };
470F5A7E2189C30800754295 /* InAppPurchase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppPurchase.swift; sourceTree = "<group>"; };
4710366322D3764600585272 /* BookmarksSubscriptionCellViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksSubscriptionCellViewController.swift; sourceTree = "<group>"; };
4710366422D3764600585272 /* BookmarksSubscriptionCellViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BookmarksSubscriptionCellViewController.xib; sourceTree = "<group>"; };
4716EAB921A325310029B886 /* IPaidRouteStatistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPaidRouteStatistics.swift; sourceTree = "<group>"; };
4716EAC021A6E0570029B886 /* BookmarksVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BookmarksVC.xib; sourceTree = "<group>"; };
4716EACA21B01C270029B886 /* MWMUGCReviewSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMUGCReviewSource.h; sourceTree = "<group>"; };
@ -1642,6 +1639,7 @@
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>"; };
99865A1A234F629100127532 /* BookmarksSubscriptionButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksSubscriptionButton.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>"; };
@ -3717,8 +3715,7 @@
45AC339022C4F57C004DC574 /* MWMUTM.h */,
4728F68E22CE430800E00028 /* BookmarksSubscriptionViewController.swift */,
4728F68F22CE430800E00028 /* BookmarksSubscriptionViewController.xib */,
4710366322D3764600585272 /* BookmarksSubscriptionCellViewController.swift */,
4710366422D3764600585272 /* BookmarksSubscriptionCellViewController.xib */,
99865A1A234F629100127532 /* BookmarksSubscriptionButton.swift */,
CD4A1F19230EADC100F2A6B6 /* CatalogConnectionErrorView.swift */,
CD4A1F1B230EB43B00F2A6B6 /* CatalogConnectionErrorView.xib */,
47E6688923196F0000057733 /* UIViewController+Subscription.swift */,
@ -4926,7 +4923,6 @@
F61757F11FC731F5000AD0D0 /* DiscoveryOnlineTemplateCell.xib in Resources */,
6741A95B1BF340DE002C974C /* 06_code2000.ttf in Resources */,
F603E05E1FDE9703006B84D6 /* DiscoverySearchCollectionHolderCell.xib in Resources */,
4710366622D3764600585272 /* BookmarksSubscriptionCellViewController.xib in Resources */,
6741A99F1BF340DE002C974C /* 07_roboto_medium.ttf in Resources */,
F6E2FE6D1E097BA00083EBEC /* _MWMOHHeaderCell.xib in Resources */,
F6E2FE701E097BA00083EBEC /* _MWMOHSubCell.xib in Resources */,
@ -5432,6 +5428,7 @@
34574A671E3B85F80061E839 /* ThemeManager.swift in Sources */,
34BF0CC71C31304A00D097EB /* MWMAuthorizationCommon.mm in Sources */,
34AB664D1FC5AA330078E451 /* RouteManagerFooterView.swift in Sources */,
99865A1B234F629100127532 /* BookmarksSubscriptionButton.swift in Sources */,
3DD1A20B22D8D93500B158F4 /* MWMPromoAfterBooking.mm in Sources */,
F6E2FD771E097BA00083EBEC /* MWMMapDownloaderDataSource.mm in Sources */,
6741A9E01BF340DE002C974C /* MWMDownloaderDialogHeader.mm in Sources */,
@ -5711,7 +5708,6 @@
47E3C72F2111F472008B3B27 /* CoverVerticalModalTransitioning.swift in Sources */,
471C448C2322A7C800C307EC /* BookmarksSubscriptionGoToCatalogViewController.swift in Sources */,
346DB83D1E5C4F6700E3123E /* GalleryModel.swift in Sources */,
4710366522D3764600585272 /* BookmarksSubscriptionCellViewController.swift in Sources */,
34E776101F14B165003040B3 /* VisibleArea.swift in Sources */,
330473EA21F7440C00DC4AEA /* MWMHotelParams.mm in Sources */,
47C8789922DF622400A772DA /* BookmarksSubscriptionFailViewController.swift in Sources */,