// File created from simpleScreenTemplate // $ createSimpleScreen.sh Dialpad Dialpad /* Copyright 2020 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ import UIKit import libPhoneNumber_iOS @objc protocol DialpadViewControllerDelegate: class { func dialpadViewControllerDidTapCall(_ viewController: DialpadViewController, withPhoneNumber phoneNumber: String) func dialpadViewControllerDidTapClose(_ viewController: DialpadViewController) } @objcMembers class DialpadViewController: UIViewController { // MARK: Outlets @IBOutlet private weak var closeButton: UIButton! @IBOutlet private weak var titleLabel: UILabel! @IBOutlet private weak var phoneNumberTextField: UITextField! { didSet { phoneNumberTextField.text = nil // avoid showing keyboard on text field phoneNumberTextField.inputView = UIView() phoneNumberTextField.inputAccessoryView = UIView() } } @IBOutlet private weak var lineView: UIView! @IBOutlet private weak var digitsStackView: UIStackView! @IBOutlet private weak var backspaceButton: DialpadActionButton! { didSet { backspaceButton.type = .backspace } } @IBOutlet private weak var callButton: DialpadActionButton! { didSet { callButton.type = .call } } // MARK: Private private enum Constants { static let sizeOniPad: CGSize = CGSize(width: 375, height: 667) } private var wasCursorAtTheEnd: Bool = true /// Phone number as formatted private var phoneNumber: String = "" { willSet { wasCursorAtTheEnd = isCursorAtTheEnd() } didSet { phoneNumberTextField.text = phoneNumber if wasCursorAtTheEnd { moveCursorToTheEnd() } } } /// Phone number as non-formatted private var rawPhoneNumber: String { return phoneNumber.vc_removingAllWhitespaces() } private var theme: Theme! // MARK: Public weak var delegate: DialpadViewControllerDelegate? // MARK: - Setup class func instantiate() -> DialpadViewController { let viewController = StoryboardScene.DialpadViewController.initialScene.instantiate() viewController.theme = ThemeService.shared().theme return viewController } // MARK: - Life cycle override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. titleLabel.text = VectorL10n.dialpadTitle self.registerThemeServiceDidChangeThemeNotification() self.update(theme: self.theme) } override var preferredStatusBarStyle: UIStatusBarStyle { return self.theme.statusBarStyle } // MARK: - Private private func isCursorAtTheEnd() -> Bool { guard let selectedRange = phoneNumberTextField.selectedTextRange else { return true } if !selectedRange.isEmpty { return false } let cursorEndPos = phoneNumberTextField.offset(from: phoneNumberTextField.beginningOfDocument, to: selectedRange.end) return cursorEndPos == phoneNumber.count } private func moveCursorToTheEnd() { guard let cursorPos = phoneNumberTextField.position(from: phoneNumberTextField.beginningOfDocument, offset: phoneNumber.count) else { return } phoneNumberTextField.selectedTextRange = phoneNumberTextField.textRange(from: cursorPos, to: cursorPos) } private func reformatPhoneNumber() { guard let phoneNumberUtil = NBPhoneNumberUtil.sharedInstance() else { // no formatter return } do { // try formatting the number if phoneNumber.hasPrefix("00") { let range = phoneNumber.startIndex.. CGSize { return Constants.sizeOniPad } }