Signal-iOS/Signal/src/ViewControllers/PdfViewController.swift
2019-06-12 12:27:16 -07:00

155 lines
4.6 KiB
Swift

//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
import Foundation
import SignalServiceKit
import YYImage
import PDFKit
@objc
public class PdfViewController: OWSViewController {
// MARK: Properties
private let attachmentStream: TSAttachmentStream
// MARK: Initializers
@available(*, unavailable, message:"use other constructor instead.")
required public init?(coder aDecoder: NSCoder) {
notImplemented()
}
@objc
public required init(attachmentStream: TSAttachmentStream) {
self.attachmentStream = attachmentStream
super.init(nibName: nil, bundle: nil)
self.modalPresentationStyle = .overFullScreen
}
@objc
public class var canRenderPdf: Bool {
if #available(iOS 11.0, *) {
return true
} else {
return false
}
}
// MARK: - View Lifecycle
override public func loadView() {
super.loadView()
view.backgroundColor = Theme.backgroundColor
self.navigationItem.title = NSLocalizedString("PDF_VIEW_TITLE", comment: "Navbar title for for PDF view.")
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .stop, target: self, action: #selector(didPressCloseButton))
var contentView = UIView()
if #available(iOS 11.0, *),
let url = attachmentStream.originalMediaURL,
let pdfDocument = PDFDocument(url: url) {
let pdfView = PDFView()
self.pdfView = pdfView
pdfView.displayMode = .singlePageContinuous
pdfView.scaleFactor = pdfView.scaleFactorForSizeToFit
pdfView.document = pdfDocument
contentView = pdfView
if let filename = attachmentStream.sourceFilename {
self.navigationItem.title = filename.filterForDisplay
}
} else {
let label = UILabel()
label.text = NSLocalizedString("PDF_VIEW_COULD_NOT_RENDER", comment: "Error indicating that a PDF could not be displayed.")
label.font = UIFont.ows_dynamicTypeBody
label.textColor = Theme.primaryColor
label.numberOfLines = 0
contentView.addSubview(label)
label.autoPinEdge(toSuperviewMargin: .leading)
label.autoPinEdge(toSuperviewMargin: .trailing)
label.autoVCenterInSuperview()
}
contentView.setCompressionResistanceLow()
contentView.setContentHuggingLow()
var arrangedSubviews: [UIView] = [
contentView
]
if pdfView != nil {
let footer = UIToolbar()
footer.items = [
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareButtonPressed)),
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
]
arrangedSubviews.append(footer)
}
let stackView = UIStackView(arrangedSubviews: arrangedSubviews)
stackView.axis = .vertical
stackView.alignment = .fill
view.addSubview(stackView)
stackView.autoPinWidthToSuperview()
stackView.autoPin(toTopLayoutGuideOf: self, withInset: 0)
stackView.autoPin(toBottomLayoutGuideOf: self, withInset: 0)
}
private var pdfView: UIView?
private var viewHasAppeared = false
public override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
guard #available(iOS 11.0, *),
let pdfView = pdfView as? PDFView else {
return
}
if !viewHasAppeared {
pdfView.scaleFactor = pdfView.scaleFactorForSizeToFit
pdfView.goToFirstPage(self)
}
}
override public func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.becomeFirstResponder()
}
override public func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.becomeFirstResponder()
viewHasAppeared = true
}
override public var canBecomeFirstResponder: Bool {
return true
}
override public var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
// MARK: - Actions
@objc func shareButtonPressed() {
AttachmentSharing.showShareUI(forAttachment: attachmentStream)
}
@objc
private func didPressCloseButton(sender: UIButton) {
Logger.info("")
// We'll ask again next time they launch
self.dismiss(animated: true)
}
}