From 4b2bdd9b527c7cf7f5914da1c6febf4185baa6f8 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 20 Apr 2017 11:09:51 -0400 Subject: [PATCH] Use audio attachment player in attachment preview dialog. // FREEBIE --- .../Contents.json | 23 +++ .../audio_pause_white_large@1x.png | Bin 0 -> 4115 bytes .../audio_pause_white_large@2x.png | Bin 0 -> 7648 bytes .../audio_pause_white_large@3x.png | Bin 0 -> 11987 bytes .../Contents.json | 23 +++ .../audio_play_white_large@1x.png | Bin 0 -> 4417 bytes .../audio_play_white_large@2x.png | Bin 0 -> 8574 bytes .../audio_play_white_large@3x.png | Bin 0 -> 13520 bytes Signal/src/Signal-Bridging-Header.h | 1 + .../AttachmentApprovalViewController.swift | 176 +++++++++++++++--- 10 files changed, 193 insertions(+), 30 deletions(-) create mode 100644 Signal/Images.xcassets/audio_pause_white_large.imageset/Contents.json create mode 100644 Signal/Images.xcassets/audio_pause_white_large.imageset/audio_pause_white_large@1x.png create mode 100644 Signal/Images.xcassets/audio_pause_white_large.imageset/audio_pause_white_large@2x.png create mode 100644 Signal/Images.xcassets/audio_pause_white_large.imageset/audio_pause_white_large@3x.png create mode 100644 Signal/Images.xcassets/audio_play_white_large.imageset/Contents.json create mode 100644 Signal/Images.xcassets/audio_play_white_large.imageset/audio_play_white_large@1x.png create mode 100644 Signal/Images.xcassets/audio_play_white_large.imageset/audio_play_white_large@2x.png create mode 100644 Signal/Images.xcassets/audio_play_white_large.imageset/audio_play_white_large@3x.png diff --git a/Signal/Images.xcassets/audio_pause_white_large.imageset/Contents.json b/Signal/Images.xcassets/audio_pause_white_large.imageset/Contents.json new file mode 100644 index 000000000..ae1d595fd --- /dev/null +++ b/Signal/Images.xcassets/audio_pause_white_large.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "audio_pause_white_large@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "audio_pause_white_large@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "audio_pause_white_large@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Signal/Images.xcassets/audio_pause_white_large.imageset/audio_pause_white_large@1x.png b/Signal/Images.xcassets/audio_pause_white_large.imageset/audio_pause_white_large@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4539bc0c1c2805a524727f7c7c402f563352dd9e GIT binary patch literal 4115 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 LWu#fAZWr`Fq9+O3 literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/audio_pause_white_large.imageset/audio_pause_white_large@2x.png b/Signal/Images.xcassets/audio_pause_white_large.imageset/audio_pause_white_large@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..27c7a8376ff3f568cffbaff7448e970b345a0a9c GIT binary patch literal 7648 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 N)s^oml`9}Z{|{e}tCj!& literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/audio_pause_white_large.imageset/audio_pause_white_large@3x.png b/Signal/Images.xcassets/audio_pause_white_large.imageset/audio_pause_white_large@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..abdc8097e739e63d84526e36cf811c485ef480a9 GIT binary patch literal 11987 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 UIView { + assert(subviews.count > 0) + + let stackView = UIView() + + var lastView: UIView? + for subview in subviews { + + stackView.addSubview(subview) + subview.autoHCenterInSuperview() + + if lastView == nil { + subview.autoPinEdge(toSuperviewEdge:.top) + } else { + subview.autoPinEdge(.top, to:.bottom, of:lastView!, withOffset:10) + } + + lastView = subview + } + + lastView?.autoPinEdge(toSuperviewEdge:.bottom) + + return stackView + } + private func createAudioPreview(attachmentPreviewView: UIView) { - // TODO: Add audio player. - createGenericPreview(attachmentPreviewView:attachmentPreviewView) + guard let dataUrl = attachment.getTemporaryDataUrl() else { + createGenericPreview(attachmentPreviewView:attachmentPreviewView) + return + } + + audioPlayer = OWSAudioAttachmentPlayer(mediaUrl: dataUrl, delegate: self) + + var subviews = [UIView]() + + let audioPlayButton = UIButton() + self.audioPlayButton = audioPlayButton + setAudioIconToPlay() + audioPlayButton.imageView?.layer.minificationFilter = kCAFilterTrilinear + audioPlayButton.imageView?.layer.magnificationFilter = kCAFilterTrilinear + audioPlayButton.addTarget(self, action:#selector(audioPlayButtonPressed), for:.touchUpInside) + let buttonSize = createHeroViewSize() + audioPlayButton.autoSetDimension(.width, toSize:buttonSize) + audioPlayButton.autoSetDimension(.height, toSize:buttonSize) + subviews.append(audioPlayButton) + + if let fileExtensionLabel = createFileExtensionLabel() { + subviews.append(fileExtensionLabel) + } + + let fileSizeLabel = createFileSizeLabel() + subviews.append(fileSizeLabel) + + let stackView = wrapViewsInVerticalStack(subviews:subviews) + attachmentPreviewView.addSubview(stackView) + stackView.autoPinWidthToSuperview() + stackView.autoVCenterInSuperview() } private func createAnimatedPreview(attachmentPreviewView: UIView) { @@ -148,42 +207,63 @@ class AttachmentApprovalViewController: UIViewController { } private func createGenericPreview(attachmentPreviewView: UIView) { - let stackView = UIView() + var subviews = [UIView]() + + let imageView = createHeroImageView(imageName: "file-icon-large") + subviews.append(imageView) + + if let fileExtensionLabel = createFileExtensionLabel() { + subviews.append(fileExtensionLabel) + } + + let fileSizeLabel = createFileSizeLabel() + subviews.append(fileSizeLabel) + + let stackView = wrapViewsInVerticalStack(subviews:subviews) attachmentPreviewView.addSubview(stackView) - stackView.autoCenterInSuperview() + stackView.autoPinWidthToSuperview() + stackView.autoVCenterInSuperview() + } + + private func createHeroViewSize() -> CGFloat { + return ScaleFromIPhone5To7Plus(175, 225) + } - let imageSize = ScaleFromIPhone5To7Plus(175, 225) - let image = UIImage(named:"file-icon-large") + private func createHeroImageView(imageName: String) -> UIView { + let imageSize = createHeroViewSize() + let image = UIImage(named:imageName) assert(image != nil) let imageView = UIImageView(image:image) imageView.layer.minificationFilter = kCAFilterTrilinear imageView.layer.magnificationFilter = kCAFilterTrilinear - stackView.addSubview(imageView) - imageView.autoHCenterInSuperview() - imageView.autoPinEdge(toSuperviewEdge:.top) imageView.autoSetDimension(.width, toSize:imageSize) imageView.autoSetDimension(.height, toSize:imageSize) - var lastView: UIView = imageView + return imageView + } - let labelFont = UIFont.ows_regularFont(withSize:ScaleFromIPhone5To7Plus(18, 24)) + private func labelFont() -> UIFont { + return UIFont.ows_regularFont(withSize:ScaleFromIPhone5To7Plus(18, 24)) + } - if let fileExtension = attachment.fileExtension { - let fileExtensionLabel = UILabel() - fileExtensionLabel.text = String(format:NSLocalizedString("ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT", - comment: "Format string for file extension label in call interstitial view"), - fileExtension.capitalized) + private func createFileExtensionLabel() -> UIView? { + guard let fileExtension = attachment.fileExtension else { + return nil + } - fileExtensionLabel.textColor = UIColor.white - fileExtensionLabel.font = labelFont - fileExtensionLabel.textAlignment = .center - stackView.addSubview(fileExtensionLabel) - fileExtensionLabel.autoHCenterInSuperview() - fileExtensionLabel.autoPinEdge(.top, to:.bottom, of:lastView, withOffset:10) + let fileExtensionLabel = UILabel() + fileExtensionLabel.text = String(format:NSLocalizedString("ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT", + comment: "Format string for file extension label in call interstitial view"), + fileExtension.capitalized) - lastView = fileExtensionLabel - } + fileExtensionLabel.textColor = UIColor.white + fileExtensionLabel.font = labelFont() + fileExtensionLabel.textAlignment = .center + return fileExtensionLabel + } + + private func createFileSizeLabel() -> UIView { let numberFormatter = NumberFormatter() numberFormatter.numberStyle = NumberFormatter.Style.decimal let fileSizeLabel = UILabel() @@ -200,12 +280,10 @@ class AttachmentApprovalViewController: UIViewController { fileSizeText) fileSizeLabel.textColor = UIColor.white - fileSizeLabel.font = labelFont + fileSizeLabel.font = labelFont() fileSizeLabel.textAlignment = .center - stackView.addSubview(fileSizeLabel) - fileSizeLabel.autoHCenterInSuperview() - fileSizeLabel.autoPinEdge(.top, to:.bottom, of:lastView, withOffset:10) - fileSizeLabel.autoPinEdge(toSuperviewEdge:.bottom) + + return fileSizeLabel } private func createButtonRow(attachmentPreviewView: UIView) { @@ -282,4 +360,42 @@ class AttachmentApprovalViewController: UIViewController { successCompletion?() }) } + + func audioPlayButtonPressed(sender: UIButton) { + audioPlayer?.togglePlayState() + } + + // MARK: - OWSAudioAttachmentPlayerDelegate + + public func isAudioPlaying() -> Bool { + return isAudioPlayingFlag + } + + public func setIsAudioPlaying(_ isAudioPlaying: Bool) { + isAudioPlayingFlag = isAudioPlaying + } + + public func isPaused() -> Bool { + return isAudioPaused + } + + public func setIsPaused(_ isPaused: Bool) { + isAudioPaused = isPaused + } + + public func setAudioProgressFrom(_ progress: Float) { + // Ignore + } + + public func setAudioIconToPlay() { + let image = UIImage(named:"audio_play_white_large") + assert(image != nil) + audioPlayButton?.setImage(image, for:.normal) + } + + public func setAudioIconToPause() { + let image = UIImage(named:"audio_pause_white_large") + assert(image != nil) + audioPlayButton?.setImage(image, for:.normal) + } }