From d7953470e30c3c7114a7be235e62f6a0979ae804 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sun, 26 Jan 2020 18:50:14 -0500 Subject: [PATCH] Add rudimentary support for audio attachments Closes #7 --- .../Gallery/GalleryViewController.swift | 2 +- Tusker/Views/Attachments/AttachmentView.swift | 51 ++++++++++++++----- .../AttachmentsContainerView.swift | 4 +- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/Tusker/Screens/Gallery/GalleryViewController.swift b/Tusker/Screens/Gallery/GalleryViewController.swift index da27a092ec..8c8bc2a2a9 100644 --- a/Tusker/Screens/Gallery/GalleryViewController.swift +++ b/Tusker/Screens/Gallery/GalleryViewController.swift @@ -52,7 +52,7 @@ class GalleryViewController: UIPageViewController, UIPageViewControllerDataSourc switch $0.kind { case .image: return AttachmentViewController(attachment: $0) - case .video: + case .video, .audio: let vc = AVPlayerViewController() vc.player = AVPlayer(url: $0.url) return vc diff --git a/Tusker/Views/Attachments/AttachmentView.swift b/Tusker/Views/Attachments/AttachmentView.swift index e64ad498dd..c634b417ce 100644 --- a/Tusker/Views/Attachments/AttachmentView.swift +++ b/Tusker/Views/Attachments/AttachmentView.swift @@ -19,7 +19,7 @@ class AttachmentView: UIImageView, GIFAnimatable { weak var delegate: AttachmentViewDelegate? - var playImageView: UIImageView! + var playImageView: UIImageView? var attachment: Attachment! var index: Int! @@ -54,25 +54,21 @@ class AttachmentView: UIImageView, GIFAnimatable { isUserInteractionEnabled = true addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(imagePressed))) - playImageView = UIImageView(image: UIImage(systemName: "play.circle.fill")) - playImageView.translatesAutoresizingMaskIntoConstraints = false - addSubview(playImageView) - NSLayoutConstraint.activate([ - playImageView.widthAnchor.constraint(equalToConstant: 50), - playImageView.heightAnchor.constraint(equalToConstant: 50), - playImageView.centerXAnchor.constraint(equalTo: centerXAnchor), - playImageView.centerYAnchor.constraint(equalTo: centerYAnchor) - ]) } func loadAttachment() { + guard AttachmentsContainerView.supportedAttachmentTypes.contains(attachment.kind) else { + preconditionFailure("invalid attachment type") + } switch attachment.kind { case .image: loadImage() case .video: loadVideo() + case .audio: + loadAudio() default: - fatalError() + preconditionFailure("invalid attachment type") } } @@ -89,8 +85,6 @@ class AttachmentView: UIImageView, GIFAnimatable { } } } - - playImageView.isHidden = true } func loadVideo() { @@ -106,7 +100,36 @@ class AttachmentView: UIImageView, GIFAnimatable { } } - playImageView.isHidden = false + let playImageView = UIImageView(image: UIImage(systemName: "play.circle.fill")) + playImageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(playImageView) + NSLayoutConstraint.activate([ + playImageView.widthAnchor.constraint(equalToConstant: 50), + playImageView.heightAnchor.constraint(equalToConstant: 50), + playImageView.centerXAnchor.constraint(equalTo: centerXAnchor), + playImageView.centerYAnchor.constraint(equalTo: centerYAnchor), + ]) + } + + func loadAudio() { + let label = UILabel() + label.text = "Audio Only" + let playImageView = UIImageView(image: UIImage(systemName: "play.circle.fill")) + let stack = UIStackView(arrangedSubviews: [ + label, + playImageView + ]) + stack.translatesAutoresizingMaskIntoConstraints = false + stack.axis = .vertical + stack.spacing = 8 + stack.alignment = .center + addSubview(stack) + NSLayoutConstraint.activate([ + stack.centerXAnchor.constraint(equalTo: centerXAnchor), + stack.centerYAnchor.constraint(equalTo: centerYAnchor), + playImageView.widthAnchor.constraint(equalToConstant: 50), + playImageView.heightAnchor.constraint(equalToConstant: 50), + ]) } override func display(_ layer: CALayer) { diff --git a/Tusker/Views/Attachments/AttachmentsContainerView.swift b/Tusker/Views/Attachments/AttachmentsContainerView.swift index d8e18f9c50..66ba78f208 100644 --- a/Tusker/Views/Attachments/AttachmentsContainerView.swift +++ b/Tusker/Views/Attachments/AttachmentsContainerView.swift @@ -11,6 +11,8 @@ import Pachyderm class AttachmentsContainerView: UIView { + static let supportedAttachmentTypes = [Attachment.Kind.image, .video, .audio] + weak var delegate: AttachmentViewDelegate? var statusID: String! @@ -47,7 +49,7 @@ class AttachmentsContainerView: UIView { func updateUI(status: Status) { self.statusID = status.id - attachments = status.attachments.filter { $0.kind == .image || $0.kind == .video } + attachments = status.attachments.filter { AttachmentsContainerView.supportedAttachmentTypes.contains($0.kind) } attachmentViews.allObjects.forEach { $0.removeFromSuperview() } attachmentViews.removeAllObjects()