diff --git a/iphone/Maps/Bookmarks/Catalog/Dialogs/SubscriptionGoToCatalogViewController.swift b/iphone/Maps/Bookmarks/Catalog/Dialogs/SubscriptionGoToCatalogViewController.swift index 5b7716fbfe..8b2b53c99d 100644 --- a/iphone/Maps/Bookmarks/Catalog/Dialogs/SubscriptionGoToCatalogViewController.swift +++ b/iphone/Maps/Bookmarks/Catalog/Dialogs/SubscriptionGoToCatalogViewController.swift @@ -6,8 +6,8 @@ @IBOutlet private var titleLabel: UILabel! @IBOutlet private var textLabel: UILabel! - - @objc init(_ screenType:SubscriptionGroupType, onOk: @escaping MWMVoidBlock, onCancel: @escaping MWMVoidBlock) { + + @objc init(_ screenType: SubscriptionGroupType, onOk: @escaping MWMVoidBlock, onCancel: @escaping MWMVoidBlock) { self.onOk = onOk self.onCancel = onCancel self.screenType = screenType diff --git a/iphone/Maps/Bookmarks/Catalog/Dialogs/SubscriptionSuccessViewController.swift b/iphone/Maps/Bookmarks/Catalog/Dialogs/SubscriptionSuccessViewController.swift index a93baa82f0..77f76630be 100644 --- a/iphone/Maps/Bookmarks/Catalog/Dialogs/SubscriptionSuccessViewController.swift +++ b/iphone/Maps/Bookmarks/Catalog/Dialogs/SubscriptionSuccessViewController.swift @@ -6,7 +6,7 @@ class SubscriptionSuccessViewController: UIViewController { @IBOutlet private var titleLabel: UILabel! @IBOutlet private var textLabel: UILabel! - init(_ screenType:SubscriptionGroupType, onOk: @escaping MWMVoidBlock) { + init(_ screenType: SubscriptionGroupType, onOk: @escaping MWMVoidBlock) { self.onOk = onOk self.screenType = screenType super.init(nibName: nil, bundle: nil) diff --git a/iphone/Maps/Bookmarks/Catalog/PaidRouteViewController.swift b/iphone/Maps/Bookmarks/Catalog/PaidRouteViewController.swift index 96a21190bb..0622e3de19 100644 --- a/iphone/Maps/Bookmarks/Catalog/PaidRouteViewController.swift +++ b/iphone/Maps/Bookmarks/Catalog/PaidRouteViewController.swift @@ -32,10 +32,8 @@ class PaidRouteViewController: MWMViewController { private let subscriptionType: SubscriptionGroupType private let paidRoutesSubscriptionCampaign = PromoCampaignManager.manager().paidRoutesSubscriptionCampaign - override var supportedInterfaceOrientations: UIInterfaceOrientationMask { - get { return [.portrait] } - } - + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return [.portrait] } + init(name: String, author: String?, imageUrl: URL?, @@ -50,13 +48,13 @@ class PaidRouteViewController: MWMViewController { self.subscriptionType = subscriptionType switch subscriptionType { case .city: - self.subscriptionManager = InAppPurchase.bookmarksSubscriptionManager + subscriptionManager = InAppPurchase.bookmarksSubscriptionManager case .allPass: - self.subscriptionManager = InAppPurchase.allPassSubscriptionManager + subscriptionManager = InAppPurchase.allPassSubscriptionManager } super.init(nibName: nil, bundle: nil) if paidRoutesSubscriptionCampaign.actionType == .instant { - self.subscriptionManager.addListener(self) + subscriptionManager.addListener(self) } } @@ -84,13 +82,13 @@ class PaidRouteViewController: MWMViewController { let dispatchGroup = DispatchGroup() dispatchGroup.enter() - purchase.requestStoreProduct { (p, error) in + purchase.requestStoreProduct { p, error in product = p dispatchGroup.leave() } dispatchGroup.enter() - subscriptionManager.getAvailableSubscriptions { (s, error) in + subscriptionManager.getAvailableSubscriptions { s, error in subscriptions = s dispatchGroup.leave() } @@ -124,15 +122,14 @@ class PaidRouteViewController: MWMViewController { case .window: titleFormat = subscriptionType == .allPass ? "buy_btn_for_subscription_version_3" : "buy_btn_for_subscription_ios_only_mo_version_2" - } let title = String(coreFormat: L(titleFormat), arguments: [formatter.string(from: subscriptionItem.price) ?? ""]) self?.subscribeButton.setTitle(title, for: .normal) self?.subscribeButton.isEnabled = true self?.subscription = subscriptionItem.subscription - Statistics.logEvent(kStatInappShow, withParameters: [kStatVendor : self?.subscriptionManager.vendorId ?? "", - kStatProduct : subscriptionItem.productId, - kStatPurchase : self?.subscriptionManager.serverId ?? "", + Statistics.logEvent(kStatInappShow, withParameters: [kStatVendor: self?.subscriptionManager.vendorId ?? "", + kStatProduct: subscriptionItem.productId, + kStatPurchase: self?.subscriptionManager.serverId ?? "", kStatTestGroup: self?.paidRoutesSubscriptionCampaign.testGroupStatName ?? ""], with: .realtime) } @@ -164,7 +161,7 @@ class PaidRouteViewController: MWMViewController { } private func pingServer(_ completion: @escaping (_ success: Bool) -> Void) { - BookmarksManager.shared().ping { (success) in + BookmarksManager.shared().ping { success in completion(success) } } @@ -174,7 +171,7 @@ class PaidRouteViewController: MWMViewController { @IBAction func onBuy(_ sender: UIButton) { statistics.logPay() loadingView.isHidden = false - pingServer { [weak self] (success) in + pingServer { [weak self] success in guard success else { self?.loadingView.isHidden = true let errorDialog = SubscriptionFailViewController { [weak self] in @@ -184,9 +181,9 @@ class PaidRouteViewController: MWMViewController { return } - self?.purchase.makePayment({ [weak self] (code, error) in + self?.purchase.makePayment { [weak self] code, error in self?.loadingView.isHidden = true - switch(code) { + switch code { case .success: self?.statistics.logPaymentSuccess() self?.statistics.logValidationSuccess() @@ -209,7 +206,7 @@ class PaidRouteViewController: MWMViewController { MWMAlertViewController.activeAlert().presentInfoAlert(L("bookmarks_convert_error_title"), text: L("purchase_error_subtitle")) } - }) + } } } @@ -230,7 +227,7 @@ class PaidRouteViewController: MWMViewController { } loadingView.isHidden = false - pingServer { [weak self] (success) in + pingServer { [weak self] success in guard success else { self?.loadingView.isHidden = true let errorDialog = SubscriptionFailViewController { [weak self] in @@ -240,9 +237,9 @@ class PaidRouteViewController: MWMViewController { return } - Statistics.logEvent(kStatInappSelect, withParameters: [kStatProduct : subscription.productId, - kStatPurchase : self?.subscriptionManager.serverId ?? ""]) - Statistics.logEvent(kStatInappPay, withParameters: [kStatPurchase : self?.subscriptionManager.serverId ?? ""], + Statistics.logEvent(kStatInappSelect, withParameters: [kStatProduct: subscription.productId, + kStatPurchase: self?.subscriptionManager.serverId ?? ""]) + Statistics.logEvent(kStatInappPay, withParameters: [kStatPurchase: self?.subscriptionManager.serverId ?? ""], with: .realtime) self?.subscriptionManager.subscribe(to: subscription) } @@ -252,34 +249,34 @@ class PaidRouteViewController: MWMViewController { let subscriptionView = SubscriptionViewBuilder.build(type: subscriptionType, parentViewController: self, source: kStatCard, - successDialog: .none) {[weak self] (success) in + successDialog: .none) { [weak self] success in if success, self != nil { self?.delegate?.didCompleteSubscription(self!) } } - self.present(subscriptionView, animated: true, completion: nil) + present(subscriptionView, animated: true, completion: nil) } @IBAction func onCancel(_ sender: UIButton) { statistics.logCancel() - Statistics.logEvent(kStatInappCancel, withParameters: [kStatPurchase : subscriptionManager.serverId]) + Statistics.logEvent(kStatInappCancel, withParameters: [kStatPurchase: subscriptionManager.serverId]) delegate?.didCancelPurchase(self) } @IBAction func onTerms(_ sender: UIButton) { guard let url = URL(string: User.termsOfUseLink()) else { return } let safari = SFSafariViewController(url: url) - self.present(safari, animated: true, completion: nil) + present(safari, animated: true, completion: nil) } @IBAction func onPrivacy(_ sender: UIButton) { guard let url = URL(string: User.privacyPolicyLink()) else { return } let safari = SFSafariViewController(url: url) - self.present(safari, animated: true, completion: nil) + present(safari, animated: true, completion: nil) } } -extension PaidRouteViewController : SubscriptionManagerListener { +extension PaidRouteViewController: SubscriptionManagerListener { func didFailToValidate() { loadingView.isHidden = true MWMAlertViewController.activeAlert().presentInfoAlert(L("bookmarks_convert_error_title"), @@ -288,7 +285,7 @@ extension PaidRouteViewController : SubscriptionManagerListener { func didValidate(_ isValid: Bool) { loadingView.isHidden = true - if (isValid) { + if isValid { delegate?.didCompleteSubscription(self) let successDialog = SubscriptionSuccessViewController(subscriptionType) { [weak self] in self?.dismiss(animated: true) diff --git a/iphone/Maps/Bookmarks/Catalog/UIViewController+Subscription.swift b/iphone/Maps/Bookmarks/Catalog/UIViewController+Subscription.swift index 5f43e41642..315f6eaca8 100644 --- a/iphone/Maps/Bookmarks/Catalog/UIViewController+Subscription.swift +++ b/iphone/Maps/Bookmarks/Catalog/UIViewController+Subscription.swift @@ -13,8 +13,8 @@ extension UIViewController { let subscriptionDialog = AllPassSubscriptionBuilder.build(parentViewController: parentViewController, source: kStatWebView, successDialog: .none, - subscriptionGroupType: .allPass) { (result) in - if (!result) { + subscriptionGroupType: .allPass) { result in + if !result { self?.checkInvalidSubscription(completion) } } @@ -31,4 +31,3 @@ extension UIViewController { } } } - diff --git a/iphone/Maps/Core/Subscriptions/SubscriptionGroup.swift b/iphone/Maps/Core/Subscriptions/SubscriptionGroup.swift index 27fdceb075..c68cea98fd 100644 --- a/iphone/Maps/Core/Subscriptions/SubscriptionGroup.swift +++ b/iphone/Maps/Core/Subscriptions/SubscriptionGroup.swift @@ -19,8 +19,8 @@ return } let subscriptionGroups = urlComponents.queryItems? - .filter({ $0.name == "groups" }) - .map({ $0.value ?? "" }) + .filter { $0.name == "groups" } + .map { $0.value ?? "" } if subscriptionGroups?.first(where: { $0 == MWMPurchaseManager.allPassSubscriptionServerId() }) != nil { self = .allPass @@ -57,28 +57,27 @@ class SubscriptionGroup: ISubscriptionGroup { formatter.locale = subscriptions.first?.priceLocale formatter.numberStyle = .currency - let weekCycle = NSDecimalNumber(value: 7.0) let mounthCycle = NSDecimalNumber(value: 30.0) let yearCycle = NSDecimalNumber(value: 12.0 * 30.0) - var rates:[NSDecimalNumber] = [] + var rates: [NSDecimalNumber] = [] var maxPriceRate: NSDecimalNumber = NSDecimalNumber.minimum - maxPriceRate = subscriptions.reduce(into: maxPriceRate) { (result, item) in + maxPriceRate = subscriptions.reduce(into: maxPriceRate) { result, item in let price = item.price var rate: NSDecimalNumber = NSDecimalNumber() switch item.period { case .year: - rate = price.dividing(by: yearCycle); + rate = price.dividing(by: yearCycle) case .month: - rate = price.dividing(by: mounthCycle); + rate = price.dividing(by: mounthCycle) case .week: - rate = price.dividing(by: weekCycle); + rate = price.dividing(by: weekCycle) case .unknown: rate = price } - result = rate.compare(result) == .orderedDescending ? rate : result; + result = rate.compare(result) == .orderedDescending ? rate : result rates.append(rate) } self.subscriptions = [] @@ -91,7 +90,7 @@ class SubscriptionGroup: ISubscriptionGroup { subscript(period: SubscriptionPeriod) -> ISubscriptionGroupItem? { return subscriptions.first { (item) -> Bool in - return item.period == period + item.period == period } } } diff --git a/xcode/geometry/Subscription/AllPass/AllPassSubscriptionViewController.swift b/xcode/geometry/Subscription/AllPass/AllPassSubscriptionViewController.swift index 4be2206198..e11eeb9e0c 100644 --- a/xcode/geometry/Subscription/AllPass/AllPassSubscriptionViewController.swift +++ b/xcode/geometry/Subscription/AllPass/AllPassSubscriptionViewController.swift @@ -1,6 +1,6 @@ class AllPassSubscriptionViewController: UIViewController { var presenter: SubscriptionPresenterProtocol! - + @IBOutlet private var backgroundImageView: ImageViewCrossDisolve! @IBOutlet private var annualSubscriptionButton: BookmarksSubscriptionButton! @IBOutlet private var annualDiscountLabel: InsetsLabel! @@ -10,27 +10,26 @@ class AllPassSubscriptionViewController: UIViewController { @IBOutlet private var statusBarBackgroundView: UIVisualEffectView! @IBOutlet private var descriptionSubtitles: [UILabel]! @IBOutlet private var loadingView: UIView! - + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return [.portrait] } override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } private let transitioning = FadeTransitioning() - + private var pageWidth: CGFloat { return descriptionPageScrollView.frame.width } - + private let maxPages = 3 private var currentPage: Int { return Int(descriptionPageScrollView.contentOffset.x / pageWidth) + 1 } - + private var animatingTask: DispatchWorkItem? private let animationDelay: TimeInterval = 2 private let animationDuration: TimeInterval = 0.75 private let animationBackDuration: TimeInterval = 0.3 private let statusBarBackVisibleThreshold: CGFloat = 60 - - + override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) if UIDevice.current.userInterfaceIdiom == .pad { @@ -40,22 +39,22 @@ class AllPassSubscriptionViewController: UIViewController { modalPresentationStyle = .fullScreen } } - + required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + override func viewDidLoad() { super.viewDidLoad() presenter?.configure() - + backgroundImageView.images = [ UIImage(named: "AllPassSubscriptionBg1"), UIImage(named: "AllPassSubscriptionBg2"), UIImage(named: "AllPassSubscriptionBg3") ] startAnimating() - + let fontSize: CGFloat = UIScreen.main.bounds.width > 320 ? 17.0 : 14.0 let fontFamily = UIFont.systemFont(ofSize: fontSize).familyName let css = "" @@ -64,26 +63,26 @@ class AllPassSubscriptionViewController: UIViewController { "all_pass_subscription_message_subtitle_2"]).forEach { title, loc in title.attributedText = NSAttributedString.string(withHtml: css + L(loc), defaultAttributes: [:]) } - + preferredContentSize = CGSize(width: 414, height: contentView.frame.height) } - + @IBAction func onAnnualButtonTap(_ sender: UIButton) { presenter.purchase(anchor: sender, period: .year) } - + @IBAction func onMonthlyButtonTap(_ sender: UIButton) { presenter.purchase(anchor: sender, period: .month) } - + @IBAction func onClose(_ sender: UIButton) { presenter.onClose() } - + @IBAction func onTerms(_ sender: UIButton) { presenter.onTermsPressed() } - + @IBAction func onPrivacy(_ sender: UIButton) { presenter.onPrivacyPressed() } @@ -98,7 +97,7 @@ extension AllPassSubscriptionViewController: SubscriptionViewProtocol { loadingView.isHidden = newValue } } - + func setModel(_ model: SubscriptionViewModel) { switch model { case .loading: @@ -109,7 +108,7 @@ extension AllPassSubscriptionViewController: SubscriptionViewProtocol { price: "...", enabled: false) annualDiscountLabel.isHidden = true - case .subsctiption(let subscriptionData): + case let .subsctiption(subscriptionData): for data in subscriptionData { if data.period == .month { monthlySubscriptionButton.config(title: data.title, @@ -124,7 +123,7 @@ extension AllPassSubscriptionViewController: SubscriptionViewProtocol { annualDiscountLabel.text = data.discount } } - case .trial(_): + case .trial: assertionFailure() } } @@ -136,14 +135,15 @@ extension AllPassSubscriptionViewController: UIAdaptivePresentationControllerDel } } -//MARK: Animation +// MARK: Animation + extension AllPassSubscriptionViewController { private func perform(withDelay: TimeInterval, execute: DispatchWorkItem?) { if let execute = execute { DispatchQueue.main.asyncAfter(deadline: .now() + withDelay, execute: execute) } } - + private func startAnimating() { if animatingTask != nil { animatingTask?.cancel() @@ -155,13 +155,13 @@ extension AllPassSubscriptionViewController { } perform(withDelay: animationDelay, execute: animatingTask) } - + private func stopAnimating() { animatingTask?.cancel() animatingTask = nil view.layer.removeAllAnimations() } - + private func scrollToWithAnimation(page: Int, completion: @escaping () -> Void) { var nextPage = page var duration = animationDuration @@ -169,7 +169,7 @@ extension AllPassSubscriptionViewController { nextPage = 1 duration = animationBackDuration } - + let xOffset = CGFloat(nextPage - 1) * pageWidth UIView.animate(withDuration: duration, delay: 0, @@ -192,11 +192,11 @@ extension AllPassSubscriptionViewController: UIScrollViewDelegate { statusBarBackgroundView.alpha = statusBarAlpha } } - + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { stopAnimating() } - + func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { startAnimating() } diff --git a/xcode/geometry/Subscription/City/CitySubscriptionBuilder.swift b/xcode/geometry/Subscription/City/CitySubscriptionBuilder.swift index b1a37ec515..d5f26caf92 100644 --- a/xcode/geometry/Subscription/City/CitySubscriptionBuilder.swift +++ b/xcode/geometry/Subscription/City/CitySubscriptionBuilder.swift @@ -1,4 +1,4 @@ -class CitySubscriptionBuilder { +class CitySubscriptionBuilder { static func build(parentViewController: UIViewController, source: String, successDialog: SubscriptionSuccessDialog, @@ -18,10 +18,10 @@ class CitySubscriptionBuilder { interactor: interactor, subscriptionManager: InAppPurchase.bookmarksSubscriptionManager, source: source) - + interactor.presenter = presenter viewController.presenter = presenter - + return viewController } } diff --git a/xcode/geometry/Subscription/City/CitySubscriptionViewController.swift b/xcode/geometry/Subscription/City/CitySubscriptionViewController.swift index 314e980bcc..329981eeea 100644 --- a/xcode/geometry/Subscription/City/CitySubscriptionViewController.swift +++ b/xcode/geometry/Subscription/City/CitySubscriptionViewController.swift @@ -1,16 +1,16 @@ class CitySubscriptionViewController: MWMViewController { var presenter: SubscriptionPresenterProtocol! - + @IBOutlet private var annualSubscriptionButton: BookmarksSubscriptionButton! @IBOutlet private var annualDiscountLabel: InsetsLabel! @IBOutlet private var monthlySubscriptionButton: BookmarksSubscriptionButton! @IBOutlet private var contentView: UIView! @IBOutlet private var loadingView: UIView! - + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return [.portrait] } override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } private var transitioning = FadeTransitioning() - + override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) if UIDevice.current.userInterfaceIdiom == .pad { @@ -20,32 +20,32 @@ class CitySubscriptionViewController: MWMViewController { modalPresentationStyle = .fullScreen } } - + required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + override func viewDidLoad() { super.viewDidLoad() presenter?.configure() } - + @IBAction func onAnnualButtonTap(_ sender: UIButton) { presenter.purchase(anchor: sender, period: .year) } - + @IBAction func onMonthlyButtonTap(_ sender: UIButton) { presenter.purchase(anchor: sender, period: .month) } - + @IBAction func onClose(_ sender: UIButton) { presenter.onClose() } - + @IBAction func onTerms(_ sender: UIButton) { presenter.onTermsPressed() } - + @IBAction func onPrivacy(_ sender: UIButton) { presenter.onPrivacyPressed() } @@ -60,7 +60,7 @@ extension CitySubscriptionViewController: SubscriptionViewProtocol { loadingView.isHidden = newValue } } - + func setModel(_ model: SubscriptionViewModel) { switch model { case .loading: @@ -71,7 +71,7 @@ extension CitySubscriptionViewController: SubscriptionViewProtocol { price: "...", enabled: false) annualDiscountLabel.isHidden = true - case .subsctiption(let subscriptionData): + case let .subsctiption(subscriptionData): for data in subscriptionData { if data.period == .month { monthlySubscriptionButton.config(title: data.title, @@ -86,7 +86,7 @@ extension CitySubscriptionViewController: SubscriptionViewProtocol { annualDiscountLabel.text = data.discount } } - case .trial(_): + case .trial: assertionFailure() } } diff --git a/xcode/geometry/Subscription/Components/BookmarksSubscriptionButton.swift b/xcode/geometry/Subscription/Components/BookmarksSubscriptionButton.swift index 696712cee1..d7c2670e65 100644 --- a/xcode/geometry/Subscription/Components/BookmarksSubscriptionButton.swift +++ b/xcode/geometry/Subscription/Components/BookmarksSubscriptionButton.swift @@ -1,26 +1,26 @@ 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; + 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 - + + descriptionLabel.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + descriptionLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16).isActive = true + priceLabel.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + priceLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16).isActive = true + setTitle("", for: .normal) } - + override func setTitleColor(_ color: UIColor?, for state: UIControl.State) { super.setTitleColor(color, for: state) if state == .normal { @@ -30,12 +30,12 @@ class BookmarksSubscriptionButton: UIButton { } override func setTitle(_ title: String?, for state: UIControl.State) { - super.setTitle("", for: state); + super.setTitle("", for: state) } - + func config(title: String, price: String, enabled: Bool) { descriptionLabel.text = title priceLabel.text = price - self.isEnabled = enabled + isEnabled = enabled } } diff --git a/xcode/geometry/Subscription/SubscriptionInteractor.swift b/xcode/geometry/Subscription/SubscriptionInteractor.swift index a4dde9194f..fc1afe7888 100644 --- a/xcode/geometry/Subscription/SubscriptionInteractor.swift +++ b/xcode/geometry/Subscription/SubscriptionInteractor.swift @@ -1,23 +1,23 @@ -protocol SubscriptionInteractorProtocol: class { +protocol SubscriptionInteractorProtocol: AnyObject { func purchase(anchor: UIView, subscription: ISubscription) func restore(anchor: UIView) } class SubscriptionInteractor { weak var presenter: SubscriptionPresenterProtocol! - + private weak var viewController: UIViewController? private let subscriptionManager: ISubscriptionManager private let bookmarksManager: BookmarksManager - - init (viewController: UIViewController, - subscriptionManager: ISubscriptionManager, - bookmarksManager: BookmarksManager) { + + init(viewController: UIViewController, + subscriptionManager: ISubscriptionManager, + bookmarksManager: BookmarksManager) { self.viewController = viewController self.subscriptionManager = subscriptionManager self.bookmarksManager = bookmarksManager } - + deinit { subscriptionManager.removeListener(self) } @@ -44,13 +44,13 @@ extension SubscriptionInteractor: SubscriptionInteractorProtocol { Statistics.logEvent(kStatInappSelect, withParameters: [kStatPurchase: subscriptionManager.serverId, kStatProduct: subscription.productId], with: .realtime) - Statistics.logEvent(kStatInappPay, withParameters: [kStatPurchase: subscriptionManager.serverId ], + Statistics.logEvent(kStatInappPay, withParameters: [kStatPurchase: subscriptionManager.serverId], with: .realtime) } - + func restore(anchor: UIView) { subscriptionManager.addListener(self) - Statistics.logEvent(kStatInappRestore, withParameters: [kStatPurchase: subscriptionManager.serverId ]) + Statistics.logEvent(kStatInappRestore, withParameters: [kStatPurchase: subscriptionManager.serverId]) viewController?.signup(anchor: anchor, source: .subscription) { [weak self] success in guard success else { return } self?.presenter.isLoadingHidden = false @@ -79,7 +79,7 @@ extension SubscriptionInteractor: SubscriptionManagerListener { MWMAlertViewController.activeAlert().presentInfoAlert(L("bookmarks_convert_error_title"), text: L("purchase_error_subtitle")) } - + func didValidate(_ isValid: Bool) { presenter.isLoadingHidden = true if isValid { @@ -89,19 +89,17 @@ extension SubscriptionInteractor: SubscriptionManagerListener { text: L("purchase_error_subtitle")) } } - + func didFailToSubscribe(_ subscription: ISubscription, error: Error?) { presenter.isLoadingHidden = true MWMAlertViewController.activeAlert().presentInfoAlert(L("bookmarks_convert_error_title"), text: L("purchase_error_subtitle")) } - + func didSubscribe(_ subscription: ISubscription) { subscriptionManager.setSubscriptionActive(true) bookmarksManager.resetInvalidCategories() } - - func didDefer(_ subscription: ISubscription) { - - } + + func didDefer(_ subscription: ISubscription) {} } diff --git a/xcode/geometry/Subscription/SubscriptionPresenter.swift b/xcode/geometry/Subscription/SubscriptionPresenter.swift index 929eb3f0db..145c57c668 100644 --- a/xcode/geometry/Subscription/SubscriptionPresenter.swift +++ b/xcode/geometry/Subscription/SubscriptionPresenter.swift @@ -1,4 +1,4 @@ -protocol SubscriptionPresenterProtocol: class { +protocol SubscriptionPresenterProtocol: AnyObject { var isLoadingHidden: Bool { get set } func configure() func purchase(anchor: UIView, period: SubscriptionPeriod) @@ -14,12 +14,12 @@ class SubscriptionPresenter { private weak var view: SubscriptionViewProtocol? private let router: SubscriptionRouterProtocol private let interactor: SubscriptionInteractorProtocol - + private var subscriptionGroup: ISubscriptionGroup? private let subscriptionManager: ISubscriptionManager private var source: String = kStatWebView - - init(view: SubscriptionViewProtocol, + + init(view: SubscriptionViewProtocol, router: SubscriptionRouterProtocol, interactor: SubscriptionInteractorProtocol, subscriptionManager: ISubscriptionManager, @@ -41,7 +41,7 @@ extension SubscriptionPresenter: SubscriptionPresenterProtocol { view?.isLoadingHidden = newValue } } - + func configure() { view?.setModel(SubscriptionViewModel.loading) subscriptionManager.getAvailableSubscriptions { [weak self] subscriptions, error in @@ -52,7 +52,7 @@ extension SubscriptionPresenter: SubscriptionPresenterProtocol { self?.onCancel() return } - + let group = SubscriptionGroup(subscriptions: subscriptions) self?.subscriptionGroup = group var data: [SubscriptionViewModel.SubscriptionData] = [] @@ -69,13 +69,13 @@ extension SubscriptionPresenter: SubscriptionPresenterProtocol { } self?.view?.setModel(SubscriptionViewModel.subsctiption(data)) } - + Statistics.logEvent(kStatInappShow, withParameters: [kStatVendor: subscriptionManager.vendorId, kStatPurchase: subscriptionManager.serverId, kStatProduct: subscriptionManager.productIds[0], kStatFrom: source], with: .realtime) } - + func purchase(anchor: UIView, period: SubscriptionPeriod) { guard let subscription = subscriptionGroup?[period]?.subscription else { return @@ -84,31 +84,31 @@ extension SubscriptionPresenter: SubscriptionPresenterProtocol { Statistics.logEvent(kStatInappSelect, withParameters: [kStatPurchase: subscriptionManager.serverId, kStatProduct: subscription.productId], with: .realtime) - Statistics.logEvent(kStatInappPay, withParameters: [kStatPurchase: subscriptionManager.serverId ], + Statistics.logEvent(kStatInappPay, withParameters: [kStatPurchase: subscriptionManager.serverId], with: .realtime) } - + func onTermsPressed() { router.showTerms() } - + func onPrivacyPressed() { router.showPrivacy() } - + func onClose() { router.cancel() Statistics.logEvent(kStatInappCancel, withParameters: [kStatPurchase: subscriptionManager.serverId]) } - + func restore(anchor: UIView) { interactor.restore(anchor: anchor) } - + func onSubscribe() { router.subscribe() } - + func onCancel() { router.cancel() } diff --git a/xcode/geometry/Subscription/SubscriptionRouter.swift b/xcode/geometry/Subscription/SubscriptionRouter.swift index f3a17702e4..cf0e60bfe2 100644 --- a/xcode/geometry/Subscription/SubscriptionRouter.swift +++ b/xcode/geometry/Subscription/SubscriptionRouter.swift @@ -1,6 +1,6 @@ import SafariServices -protocol SubscriptionRouterProtocol: class { +protocol SubscriptionRouterProtocol: AnyObject { func showTerms() func showPrivacy() func subscribe() @@ -17,9 +17,9 @@ class SubscriptionRouter { private weak var viewController: UIViewController? private weak var parentViewController: UIViewController? private var successDialog: SubscriptionSuccessDialog - private var completion:((Bool) -> Void)? + private var completion: ((Bool) -> Void)? private var subscriptionGroupType: SubscriptionGroupType - + init(viewController: UIViewController, parentViewController: UIViewController, successDialog: SubscriptionSuccessDialog, @@ -33,26 +33,26 @@ class SubscriptionRouter { } } -extension SubscriptionRouter: SubscriptionRouterProtocol{ +extension SubscriptionRouter: SubscriptionRouterProtocol { func showTerms() { guard let url = URL(string: User.termsOfUseLink()) else { return } let safari = SFSafariViewController(url: url) viewController?.present(safari, animated: true, completion: nil) } - + func showPrivacy() { guard let url = URL(string: User.privacyPolicyLink()) else { return } let safari = SFSafariViewController(url: url) viewController?.present(safari, animated: true, completion: nil) } - + func subscribe() { - parentViewController?.dismiss(animated: true) {[weak self] in - self?.completion?(true); + parentViewController?.dismiss(animated: true) { [weak self] in + self?.completion?(true) } switch successDialog { case .goToCatalog: - let successDialog = SubscriptionGoToCatalogViewController(subscriptionGroupType, onOk: {[weak self] in + let successDialog = SubscriptionGoToCatalogViewController(subscriptionGroupType, onOk: { [weak self] in self?.parentViewController?.dismiss(animated: true) let webViewController = CatalogWebViewController.catalogFromAbsoluteUrl(nil, utm: .none) self?.parentViewController?.navigationController?.pushViewController(webViewController, animated: true) @@ -61,15 +61,15 @@ extension SubscriptionRouter: SubscriptionRouterProtocol{ } parentViewController?.present(successDialog, animated: true) case .success: - let successDialog = SubscriptionSuccessViewController(subscriptionGroupType) {[weak self] in + let successDialog = SubscriptionSuccessViewController(subscriptionGroupType) { [weak self] in self?.parentViewController?.dismiss(animated: true) } parentViewController?.present(successDialog, animated: true) case .none: - break; + break } } - + func cancel() { parentViewController?.dismiss(animated: true) { [weak self] in self?.completion?(false) diff --git a/xcode/geometry/Subscription/SubscriptionViewProtocol.swift b/xcode/geometry/Subscription/SubscriptionViewProtocol.swift index 6910408234..5876e46661 100644 --- a/xcode/geometry/Subscription/SubscriptionViewProtocol.swift +++ b/xcode/geometry/Subscription/SubscriptionViewProtocol.swift @@ -1,14 +1,12 @@ -protocol SubscriptionViewProtocol: class { +protocol SubscriptionViewProtocol: AnyObject { var isLoadingHidden: Bool { get set } - var presenter: SubscriptionPresenterProtocol! { get set } + var presenter: SubscriptionPresenterProtocol! { get set } func setModel(_ model: SubscriptionViewModel) } enum SubscriptionViewModel { - struct TrialData { - - } - + struct TrialData {} + struct SubscriptionData { let price: String let title: String @@ -16,7 +14,7 @@ enum SubscriptionViewModel { let hasDiscount: Bool let discount: String } - + case loading case subsctiption([SubscriptionData]) case trial(TrialData)