// // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // import UIKit import PromiseKit @objc public class OnboardingPermissionsViewController: OnboardingBaseViewController { override public func loadView() { super.loadView() view.backgroundColor = Theme.backgroundColor view.layoutMargins = .zero navigationItem.rightBarButtonItem = UIBarButtonItem(title: NSLocalizedString("NAVIGATION_ITEM_SKIP_BUTTON", comment: "A button to skip a view."), style: .plain, target: self, action: #selector(skipWasPressed)) let titleLabel = self.titleLabel(text: NSLocalizedString("ONBOARDING_PERMISSIONS_TITLE", comment: "Title of the 'onboarding permissions' view.")) let explanationLabel = self.explanationLabel(explanationText: NSLocalizedString("ONBOARDING_PERMISSIONS_EXPLANATION", comment: "Explanation in the 'onboarding permissions' view.")) let giveAccessButton = self.button(title: NSLocalizedString("ONBOARDING_PERMISSIONS_ENABLE_PERMISSIONS_BUTTON", comment: "Label for the 'give access' button in the 'onboarding permissions' view."), selector: #selector(giveAccessPressed)) let notNowButton = self.linkButton(title: NSLocalizedString("ONBOARDING_PERMISSIONS_NOT_NOW_BUTTON", comment: "Label for the 'not now' button in the 'onboarding permissions' view."), selector: #selector(notNowPressed)) let topSpacer = UIView.vStretchingSpacer() let bottomSpacer = UIView.vStretchingSpacer() let stackView = UIStackView(arrangedSubviews: [ titleLabel, UIView.spacer(withHeight: 20), explanationLabel, topSpacer, giveAccessButton, UIView.spacer(withHeight: 12), notNowButton, bottomSpacer ]) stackView.axis = .vertical stackView.alignment = .fill stackView.layoutMargins = UIEdgeInsets(top: 32, left: 32, bottom: 32, right: 32) stackView.isLayoutMarginsRelativeArrangement = true view.addSubview(stackView) stackView.autoPinWidthToSuperview() stackView.autoPin(toTopLayoutGuideOf: self, withInset: 0) stackView.autoPin(toBottomLayoutGuideOf: self, withInset: 0) // Ensure whitespace is balanced, so inputs are vertically centered. topSpacer.autoMatch(.height, to: .height, of: bottomSpacer) } // MARK: Request Access private func requestAccess() { Logger.info("") requestContactsAccess().then { _ in return PushRegistrationManager.shared.registerUserNotificationSettings() }.done { [weak self] in guard let self = self else { return } self.onboardingController.onboardingPermissionsDidComplete(viewController: self) }.retainUntilComplete() } private func requestContactsAccess() -> Promise { Logger.info("") let (promise, resolver) = Promise.pending() CNContactStore().requestAccess(for: CNEntityType.contacts) { (granted, error) -> Void in if granted { Logger.info("Granted.") } else { Logger.error("Error: \(String(describing: error)).") } // Always fulfill. resolver.fulfill(()) } return promise } // MARK: - Events @objc func skipWasPressed() { Logger.info("") onboardingController.onboardingPermissionsWasSkipped(viewController: self) } @objc func giveAccessPressed() { Logger.info("") requestAccess() } @objc func notNowPressed() { Logger.info("") onboardingController.onboardingPermissionsWasSkipped(viewController: self) } }