155 lines
4.6 KiB
Swift
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)
|
|
}
|
|
}
|